The Events Calendar - Version 5.0.1.2

Version Description

= [5.0] =

Please see the changelog for the complete list of changes in this release. Previous versions of The Events Calendar are not cross-compatible with 5.X add-ons. Remember to always make a backup of your database and files before updating!

Download this release

Release Info

Developer bordoni
Plugin Icon The Events Calendar
Version 5.0.1.2
Comparing to
See all releases

Code changes from version 5.0.3.3 to 5.0.1.2

Files changed (280) hide show
  1. common/lang/readme.txt +0 -3
  2. common/lang/tribe-common-af.mo +0 -0
  3. common/lang/tribe-common-ar.mo +0 -0
  4. common/lang/tribe-common-bg_BG.mo +0 -0
  5. common/lang/tribe-common-ca.mo +0 -0
  6. common/lang/tribe-common-cs_CZ.mo +0 -0
  7. common/lang/tribe-common-da_DK.mo +0 -0
  8. common/lang/tribe-common-de_DE.mo +0 -0
  9. common/lang/tribe-common-el.mo +0 -0
  10. common/lang/tribe-common-en_GB.mo +0 -0
  11. common/lang/tribe-common-es_ES.mo +0 -0
  12. common/lang/tribe-common-et.mo +0 -0
  13. common/lang/tribe-common-fi.mo +0 -0
  14. common/lang/tribe-common-fr_CA.mo +0 -0
  15. common/lang/tribe-common-fr_FR.mo +0 -0
  16. common/lang/tribe-common-hu_HU.mo +0 -0
  17. common/lang/tribe-common-id_ID.mo +0 -0
  18. common/lang/tribe-common-is_IS.mo +0 -0
  19. common/lang/tribe-common-it_IT.mo +0 -0
  20. common/lang/tribe-common-ja.mo +0 -0
  21. common/lang/tribe-common-lt_LT.mo +0 -0
  22. common/lang/tribe-common-lv.mo +0 -0
  23. common/lang/tribe-common-nb_NO.mo +0 -0
  24. common/lang/tribe-common-nl_NL.mo +0 -0
  25. common/lang/tribe-common-pt_BR.mo +0 -0
  26. common/lang/tribe-common-pt_PT.mo +0 -0
  27. common/lang/tribe-common-ro_RO.mo +0 -0
  28. common/lang/tribe-common-ru_RU.mo +0 -0
  29. common/lang/tribe-common-sk_SK.mo +0 -0
  30. common/lang/tribe-common-sl_SI.mo +0 -0
  31. common/lang/tribe-common-sr_RS.mo +0 -0
  32. common/lang/tribe-common-sv_SE.mo +0 -0
  33. common/lang/tribe-common-tr_TR.mo +0 -0
  34. common/lang/tribe-common-zh_CN.mo +0 -0
  35. common/lang/tribe-common-zh_TW.mo +0 -0
  36. common/lang/tribe-common.pot +40 -51
  37. common/src/Tribe/Assets.php +9 -14
  38. common/src/Tribe/Cache.php +66 -121
  39. common/src/Tribe/Context.php +1 -4
  40. common/src/Tribe/Context/locations.php +2 -47
  41. common/src/Tribe/Date_Utils.php +1 -107
  42. common/src/Tribe/Debug_Bar/Panels/Json_Ld.php +0 -84
  43. common/src/Tribe/Dependency.php +26 -25
  44. common/src/Tribe/Dialog/View.php +2 -2
  45. common/src/Tribe/Freemius.php +2 -3
  46. common/src/Tribe/Image/Uploader.php +70 -148
  47. common/src/Tribe/Languages/Locations.php +2 -2
  48. common/src/Tribe/Log/File_Logger.php +1 -1
  49. common/src/Tribe/Main.php +83 -116
  50. common/src/Tribe/Process/Post_Thumbnail_Setter.php +15 -13
  51. common/src/Tribe/Promoter/Connector.php +1 -1
  52. common/src/Tribe/Repository/Query_Filters.php +3 -3
  53. common/src/Tribe/Rewrite.php +5 -54
  54. common/src/Tribe/Service_Providers/Debug_Bar.php +0 -2
  55. common/src/Tribe/Validate.php +1 -4
  56. common/src/Tribe/Validator/Base.php +1 -3
  57. common/src/functions/template-tags/general.php +1 -14
  58. common/src/functions/template-tags/post.php +12 -15
  59. common/src/functions/utils.php +1 -1
  60. common/src/modules/components/form/index.js +1 -0
  61. common/src/modules/components/form/select/component.js +116 -0
  62. common/src/modules/components/form/select/index.js +1 -0
  63. common/src/modules/components/form/select/style.pcss +56 -0
  64. common/src/modules/components/index.js +5 -0
  65. common/src/modules/components/plugin-block-hooks/__tests__/__snapshots__/plugin-block-hooks.spec.js.snap +131 -0
  66. common/src/modules/components/plugin-block-hooks/__tests__/plugin-block-hooks.spec.js +92 -0
  67. common/src/modules/components/plugin-block-hooks/component.js +138 -0
  68. common/src/modules/components/plugin-block-hooks/container.js +21 -0
  69. common/src/modules/components/plugin-block-hooks/index.js +1 -0
  70. common/src/modules/components/plugin-block-hooks/style.pcss +37 -0
  71. common/src/modules/components/prevent-block-close/__tests__/component.spec.js +15 -0
  72. common/src/modules/components/prevent-block-close/component.js +38 -0
  73. common/src/modules/components/prevent-block-close/index.js +1 -0
  74. common/src/modules/data/__tests__/utils.test.js +10 -0
  75. common/src/modules/data/editor/post-types.js +3 -0
  76. common/src/modules/data/forms/__tests__/__snapshots__/actions.test.js.snap +147 -0
  77. common/src/modules/data/forms/__tests__/actions.test.js +96 -0
  78. common/src/modules/data/forms/__tests__/reducer.test.js +88 -0
  79. common/src/modules/data/forms/__tests__/selectors.test.js +89 -0
  80. common/src/modules/data/forms/__tests__/types.js +19 -0
  81. common/src/modules/data/forms/actions.js +153 -0
  82. common/src/modules/data/forms/index.js +12 -0
  83. common/src/modules/data/forms/reducer.js +33 -0
  84. common/src/modules/data/forms/reducers/__tests__/__snapshots__/form.test.js.snap +84 -0
  85. common/src/modules/data/forms/reducers/__tests__/form.test.js +49 -0
  86. common/src/modules/data/forms/reducers/__tests__/volatile.test.js +23 -0
  87. common/src/modules/data/forms/reducers/form.js +58 -0
  88. common/src/modules/data/forms/reducers/index.js +2 -0
  89. common/src/modules/data/forms/reducers/volatile.js +15 -0
  90. common/src/modules/data/forms/selectors.js +39 -0
  91. common/src/modules/data/forms/types.js +15 -0
  92. common/src/modules/data/index.js +9 -0
  93. common/src/modules/data/plugins/__tests__/__snapshots__/actions.test.js.snap +19 -0
  94. common/src/modules/data/plugins/__tests__/actions.test.js +14 -0
  95. common/src/modules/data/plugins/__tests__/reducer.test.js +25 -0
  96. common/src/modules/data/plugins/__tests__/selectors.test.js +23 -0
  97. common/src/modules/data/plugins/__tests__/types.test.js +12 -0
  98. common/src/modules/data/plugins/actions.js +18 -0
  99. common/src/modules/data/plugins/constants.js +4 -0
  100. common/src/modules/data/plugins/index.js +12 -0
  101. common/src/modules/data/plugins/proptypes.js +15 -0
  102. common/src/modules/data/plugins/reducer.js +20 -0
  103. common/src/modules/data/plugins/selectors.js +9 -0
  104. common/src/modules/data/plugins/types.js +7 -0
  105. common/src/modules/data/reducers.js +15 -0
  106. common/src/modules/data/utils.js +1 -0
  107. common/src/modules/elements/accordion/__tests__/__snapshots__/element.test.js.snap +71 -0
  108. common/src/modules/elements/accordion/__tests__/element.test.js +45 -0
  109. common/src/modules/elements/accordion/element.js +58 -0
  110. common/src/modules/elements/accordion/row/__tests__/__snapshots__/template.test.js.snap +31 -0
  111. common/src/modules/elements/accordion/row/__tests__/template.test.js +56 -0
  112. common/src/modules/elements/accordion/row/template.js +129 -0
  113. common/src/modules/elements/accordion/style.pcss +8 -0
  114. common/src/modules/elements/block-icon/index.js +16 -0
  115. common/src/modules/elements/block-icon/style.pcss +24 -0
  116. common/src/modules/elements/button/__tests__/__snapshots__/element.test.js.snap +62 -0
  117. common/src/modules/elements/button/__tests__/element.test.js +60 -0
  118. common/src/modules/elements/button/element.js +56 -0
  119. common/src/modules/elements/button/style.pcss +58 -0
  120. common/src/modules/elements/checkbox-input/__tests__/__snapshots__/element.test.js.snap +47 -0
  121. common/src/modules/elements/checkbox-input/__tests__/element.test.js +39 -0
  122. common/src/modules/elements/checkbox-input/element.js +35 -0
  123. common/src/modules/elements/checkbox-input/style.pcss +25 -0
  124. common/src/modules/elements/checkbox/__tests__/__snapshots__/element.test.js.snap +168 -0
  125. common/src/modules/elements/checkbox/__tests__/element.test.js +70 -0
  126. common/src/modules/elements/checkbox/element.js +61 -0
  127. common/src/modules/elements/counter/__tests__/__snapshots__/element.test.js.snap +57 -0
  128. common/src/modules/elements/counter/__tests__/element.test.js +32 -0
  129. common/src/modules/elements/counter/element.js +37 -0
  130. common/src/modules/elements/counter/style.pcss +22 -0
  131. common/src/modules/elements/creatable-select/__tests__/__snapshots__/element.test.js.snap +241 -0
  132. common/src/modules/elements/creatable-select/__tests__/element.test.js +31 -0
  133. common/src/modules/elements/creatable-select/element.js +50 -0
  134. common/src/modules/elements/creatable-select/style.pcss +75 -0
  135. common/src/modules/elements/day-picker-input/element.js +34 -0
  136. common/src/modules/elements/day-picker-input/style.pcss +109 -0
  137. common/src/modules/elements/heading/__tests__/__snapshots__/element.test.js.snap +49 -0
  138. common/src/modules/elements/heading/__tests__/element.test.js +47 -0
  139. common/src/modules/elements/heading/element.js +32 -0
  140. common/src/modules/elements/heading/style.pcss +16 -0
  141. common/src/modules/elements/image-upload/__tests__/__snapshots__/element.test.js.snap +191 -0
  142. common/src/modules/elements/image-upload/__tests__/element.test.js +168 -0
  143. common/src/modules/elements/image-upload/element.js +114 -0
  144. common/src/modules/elements/image-upload/style.pcss +109 -0
  145. common/src/modules/elements/image/__tests__/__snapshots__/element.test.js.snap +27 -0
  146. common/src/modules/elements/image/__tests__/element.test.js +38 -0
  147. common/src/modules/elements/image/element.js +28 -0
  148. common/src/modules/elements/index.js +36 -0
  149. common/src/modules/elements/input/__tests__/__snapshots__/element.test.js.snap +23 -0
  150. common/src/modules/elements/input/__tests__/element.test.js +28 -0
  151. common/src/modules/elements/input/element.js +30 -0
  152. common/src/modules/elements/input/style.pcss +25 -0
  153. common/src/modules/elements/label-with-link/__tests__/__snapshots__/element.test.js.snap +51 -0
  154. common/src/modules/elements/label-with-link/__tests__/element.test.js +32 -0
  155. common/src/modules/elements/label-with-link/element.js +66 -0
  156. common/src/modules/elements/label-with-link/style.pcss +54 -0
  157. common/src/modules/elements/label-with-modal/__tests__/__snapshots__/element.test.js.snap +60 -0
  158. common/src/modules/elements/label-with-modal/__tests__/element.test.js +26 -0
  159. common/src/modules/elements/label-with-modal/element.js +71 -0
  160. common/src/modules/elements/label-with-modal/style.pcss +53 -0
  161. common/src/modules/elements/labeled-item/__tests__/__snapshots__/element.test.js.snap +50 -0
  162. common/src/modules/elements/labeled-item/__tests__/element.test.js +39 -0
  163. common/src/modules/elements/labeled-item/element.js +52 -0
  164. common/src/modules/elements/link/__tests__/__snapshots__/element.test.js.snap +40 -0
  165. common/src/modules/elements/link/__tests__/element.test.js +39 -0
  166. common/src/modules/elements/link/element.js +44 -0
  167. common/src/modules/elements/modal-button/__tests__/__snapshots__/element.test.js.snap +51 -0
  168. common/src/modules/elements/modal-button/__tests__/element.test.js +46 -0
  169. common/src/modules/elements/modal-button/element.js +107 -0
  170. common/src/modules/elements/number-input/__tests__/__snapshots__/element.test.js.snap +55 -0
  171. common/src/modules/elements/number-input/__tests__/element.test.js +47 -0
  172. common/src/modules/elements/number-input/element.js +40 -0
  173. common/src/modules/elements/paragraph/__tests__/__snapshots__/element.test.js.snap +17 -0
  174. common/src/modules/elements/paragraph/__tests__/element.test.js +19 -0
  175. common/src/modules/elements/paragraph/element.js +41 -0
  176. common/src/modules/elements/paragraph/style.pcss +24 -0
  177. common/src/modules/elements/placeholder/__tests__/__snapshots__/element.test.js.snap +17 -0
  178. common/src/modules/elements/placeholder/__tests__/element.test.js +18 -0
  179. common/src/modules/elements/placeholder/element.js +23 -0
  180. common/src/modules/elements/placeholder/style.pcss +12 -0
  181. common/src/modules/elements/radio-input/element.js +29 -0
  182. common/src/modules/elements/radio/element.js +50 -0
  183. common/src/modules/elements/select/__tests__/__snapshots__/element.test.js.snap +241 -0
  184. common/src/modules/elements/select/__tests__/element.test.js +31 -0
  185. common/src/modules/elements/select/element.js +41 -0
  186. common/src/modules/elements/select/style.pcss +78 -0
  187. common/src/modules/elements/style.pcss +3 -0
  188. common/src/modules/elements/textarea/element.js +20 -0
  189. common/src/modules/elements/time-picker/element.js +204 -0
  190. common/src/modules/elements/time-picker/style.pcss +86 -0
  191. common/src/modules/elements/tooltip/__tests__/__snapshots__/element.test.js.snap +22 -0
  192. common/src/modules/elements/tooltip/__tests__/element.test.js +33 -0
  193. common/src/modules/elements/tooltip/element.js +56 -0
  194. common/src/modules/elements/tooltip/style.pcss +14 -0
  195. common/src/modules/elements/url-input/element.js +27 -0
  196. common/src/modules/hoc/__tests__/__snapshots__/with-form.test.js.snap +19 -0
  197. common/src/modules/hoc/__tests__/__snapshots__/with-save-data.test.js.snap +62 -0
  198. common/src/modules/hoc/__tests__/__snapshots__/with-store.test.js.snap +18 -0
  199. common/src/modules/hoc/__tests__/with-form.test.js +89 -0
  200. common/src/modules/hoc/__tests__/with-save-data.test.js +191 -0
  201. common/src/modules/hoc/__tests__/with-selected.test.js +97 -0
  202. common/src/modules/hoc/__tests__/with-store.test.js +28 -0
  203. common/src/modules/hoc/index.js +5 -0
  204. common/src/modules/hoc/with-block-closer.js +129 -0
  205. common/src/modules/hoc/with-form.js +71 -0
  206. common/src/modules/hoc/with-save-data.js +155 -0
  207. common/src/modules/hoc/with-selected.js +64 -0
  208. common/src/modules/hoc/with-store.js +26 -0
  209. common/src/modules/package.json +17 -0
  210. common/src/modules/store/configure-store.js +37 -0
  211. common/src/modules/store/index.js +13 -0
  212. common/src/modules/store/middlewares/index.js +3 -0
  213. common/src/modules/store/middlewares/request/__tests__/__snapshots__/actions.test.js.snap +11 -0
  214. common/src/modules/store/middlewares/request/__tests__/actions.test.js +14 -0
  215. common/src/modules/store/middlewares/request/__tests__/types.test.js +11 -0
  216. common/src/modules/store/middlewares/request/__tests__/utils.test.js +61 -0
  217. common/src/modules/store/middlewares/request/__tests__/wp-request.test.js +169 -0
  218. common/src/modules/store/middlewares/request/actions.js +9 -0
  219. common/src/modules/store/middlewares/request/index.js +9 -0
  220. common/src/modules/store/middlewares/request/types.js +6 -0
  221. common/src/modules/store/middlewares/request/utils.js +32 -0
  222. common/src/modules/store/middlewares/request/wp-request.js +76 -0
  223. common/src/modules/utils/__tests__/__snapshots__/globals.test.js.snap +93 -0
  224. common/src/modules/utils/__tests__/__snapshots__/time.test.js.snap +33 -0
  225. common/src/modules/utils/__tests__/date.test.js +189 -0
  226. common/src/modules/utils/__tests__/dom.test.js +73 -0
  227. common/src/modules/utils/__tests__/globals.test.js +84 -0
  228. common/src/modules/utils/__tests__/input.test.js +20 -0
  229. common/src/modules/utils/__tests__/moment.test.js +332 -0
  230. common/src/modules/utils/__tests__/number.test.js +36 -0
  231. common/src/modules/utils/__tests__/proptypes.test.js +145 -0
  232. common/src/modules/utils/__tests__/range.test.js +65 -0
  233. common/src/modules/utils/__tests__/slide.test.js +12 -0
  234. common/src/modules/utils/__tests__/string.test.js +135 -0
  235. common/src/modules/utils/__tests__/time.test.js +222 -0
  236. common/src/modules/utils/api.js +57 -0
  237. common/src/modules/utils/date.js +151 -0
  238. common/src/modules/utils/dom.js +50 -0
  239. common/src/modules/utils/get-hidden-height.js +28 -0
  240. common/src/modules/utils/globals.js +37 -0
  241. common/src/modules/utils/index.js +27 -0
  242. common/src/modules/utils/input.js +12 -0
  243. common/src/modules/utils/moment.js +332 -0
  244. common/src/modules/utils/number.js +22 -0
  245. common/src/modules/utils/proptypes.js +73 -0
  246. common/src/modules/utils/range.js +89 -0
  247. common/src/modules/utils/slide.js +119 -0
  248. common/src/modules/utils/string.js +109 -0
  249. common/src/modules/utils/time.js +207 -0
  250. common/src/modules/utils/timezone.js +72 -0
  251. common/src/resources/css/accessibility.css +34 -0
  252. common/src/resources/css/app-shop.css +102 -0
  253. common/src/resources/css/app/components.css +2 -0
  254. common/src/resources/css/app/elements.css +20 -0
  255. common/src/resources/css/bumpdown.css +69 -0
  256. common/src/resources/css/buttonset.css +39 -0
  257. common/src/resources/css/common-full.css +2319 -0
  258. common/src/resources/css/common-skeleton.css +1774 -0
  259. common/src/resources/css/datatables.css +396 -0
  260. common/src/resources/css/datepicker.css +566 -0
  261. common/src/resources/css/dependency.css +30 -0
  262. common/src/resources/css/dialog.css +204 -0
  263. common/src/resources/css/dialog.min.css +1 -1
  264. common/src/resources/css/promoter.css +33 -0
  265. common/src/resources/css/tooltip.css +121 -0
  266. common/src/resources/css/tooltip.min.css +1 -1
  267. common/src/resources/css/tribe-common-admin.css +1387 -0
  268. common/src/resources/css/tribe-ui.css +36 -0
  269. common/src/resources/css/validation.css +18 -0
  270. common/src/resources/images/app-shop-community.jpg +0 -0
  271. common/src/resources/images/app-shop-eventbrite.jpg +0 -0
  272. common/src/resources/images/app-shop-ical.jpg +0 -0
  273. common/src/resources/images/app-shop-pro.jpg +0 -0
  274. common/src/resources/images/app-shop-promoter.jpg +0 -0
  275. common/src/resources/images/app-shop-tickets-plus.jpg +0 -0
  276. common/src/resources/images/donate-link-screenshot.png +0 -0
  277. common/src/resources/images/gutenberg-admin-notice-TEC.png +0 -0
  278. common/src/resources/images/gutenberg-admin-notice-tickets.png +0 -0
  279. common/src/resources/images/mascot.png +0 -0
  280. common/src/resources/js/app/components.js +11815 -0
common/lang/readme.txt DELETED
@@ -1,3 +0,0 @@
1
- If you are interested in contributing to translations, you can get started at https://translations.theeventscalendar.com/projects/tribe-common/
2
-
3
- On that site you can also find the .po translation files for doing local translations. We do not include these in the plugin itself to save space.
 
 
 
common/lang/tribe-common-af.mo CHANGED
Binary file
common/lang/tribe-common-ar.mo CHANGED
Binary file
common/lang/tribe-common-bg_BG.mo CHANGED
Binary file
common/lang/tribe-common-ca.mo CHANGED
Binary file
common/lang/tribe-common-cs_CZ.mo CHANGED
Binary file
common/lang/tribe-common-da_DK.mo CHANGED
Binary file
common/lang/tribe-common-de_DE.mo CHANGED
Binary file
common/lang/tribe-common-el.mo CHANGED
Binary file
common/lang/tribe-common-en_GB.mo CHANGED
Binary file
common/lang/tribe-common-es_ES.mo CHANGED
Binary file
common/lang/tribe-common-et.mo CHANGED
Binary file
common/lang/tribe-common-fi.mo CHANGED
Binary file
common/lang/tribe-common-fr_CA.mo CHANGED
Binary file
common/lang/tribe-common-fr_FR.mo CHANGED
Binary file
common/lang/tribe-common-hu_HU.mo CHANGED
Binary file
common/lang/tribe-common-id_ID.mo CHANGED
Binary file
common/lang/tribe-common-is_IS.mo CHANGED
Binary file
common/lang/tribe-common-it_IT.mo CHANGED
Binary file
common/lang/tribe-common-ja.mo CHANGED
Binary file
common/lang/tribe-common-lt_LT.mo CHANGED
Binary file
common/lang/tribe-common-lv.mo CHANGED
Binary file
common/lang/tribe-common-nb_NO.mo CHANGED
Binary file
common/lang/tribe-common-nl_NL.mo CHANGED
Binary file
common/lang/tribe-common-pt_BR.mo CHANGED
Binary file
common/lang/tribe-common-pt_PT.mo CHANGED
Binary file
common/lang/tribe-common-ro_RO.mo CHANGED
Binary file
common/lang/tribe-common-ru_RU.mo CHANGED
Binary file
common/lang/tribe-common-sk_SK.mo CHANGED
Binary file
common/lang/tribe-common-sl_SI.mo CHANGED
Binary file
common/lang/tribe-common-sr_RS.mo CHANGED
Binary file
common/lang/tribe-common-sv_SE.mo CHANGED
Binary file
common/lang/tribe-common-tr_TR.mo CHANGED
Binary file
common/lang/tribe-common-zh_CN.mo CHANGED
Binary file
common/lang/tribe-common-zh_TW.mo CHANGED
Binary file
common/lang/tribe-common.pot CHANGED
@@ -2,13 +2,13 @@
2
  # This file is distributed under the same license as the Tribe Common package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Tribe Common 4.11.5\n"
6
  "Report-Msgid-Bugs-To: http://m.tri.be/191x\n"
7
- "POT-Creation-Date: 2020-03-19 04:42:49+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
- "PO-Revision-Date: 2020-03-19 04:42\n"
12
  "Last-Translator: \n"
13
  "Language-Team: \n"
14
 
@@ -290,11 +290,6 @@ msgstr ""
290
  msgid "State"
291
  msgstr ""
292
 
293
- #: src/Tribe/Debug_Bar/Panels/Json_Ld.php:21
294
- #: src/Tribe/Debug_Bar/Panels/Json_Ld.php:40
295
- msgid "Modern Tribe JSON-LD Data"
296
- msgstr ""
297
-
298
  #: src/Tribe/Dialog/View.php:153
299
  msgid "Open the modal window"
300
  msgstr ""
@@ -833,8 +828,7 @@ msgstr ""
833
  msgid "Gambia"
834
  msgstr ""
835
 
836
- #: src/Tribe/Languages/Locations.php:138
837
- msgctxt "The country"
838
  msgid "Georgia"
839
  msgstr ""
840
 
@@ -1514,11 +1508,6 @@ msgstr ""
1514
  msgid "Florida"
1515
  msgstr ""
1516
 
1517
- #: src/Tribe/Languages/Locations.php:334
1518
- msgctxt "The US state Georgia"
1519
- msgid "Georgia"
1520
- msgstr ""
1521
-
1522
  #: src/Tribe/Languages/Locations.php:335
1523
  msgid "Hawaii"
1524
  msgstr ""
@@ -1721,87 +1710,87 @@ msgstr ""
1721
  msgid "Full debug (all events)"
1722
  msgstr ""
1723
 
1724
- #: src/Tribe/Main.php:283
1725
  msgid ": activate to sort column ascending"
1726
  msgstr ""
1727
 
1728
- #: src/Tribe/Main.php:284
1729
  msgid ": activate to sort column descending"
1730
  msgstr ""
1731
 
1732
- #: src/Tribe/Main.php:286
1733
  msgid "Show _MENU_ entries"
1734
  msgstr ""
1735
 
1736
- #: src/Tribe/Main.php:287
1737
  msgid "No data available in table"
1738
  msgstr ""
1739
 
1740
- #: src/Tribe/Main.php:288
1741
  msgid "Showing _START_ to _END_ of _TOTAL_ entries"
1742
  msgstr ""
1743
 
1744
- #: src/Tribe/Main.php:289
1745
  msgid "Showing 0 to 0 of 0 entries"
1746
  msgstr ""
1747
 
1748
- #: src/Tribe/Main.php:290
1749
  msgid "(filtered from _MAX_ total entries)"
1750
  msgstr ""
1751
 
1752
- #: src/Tribe/Main.php:291
1753
  msgid "No matching records found"
1754
  msgstr ""
1755
 
1756
- #: src/Tribe/Main.php:292
1757
  msgid "Search:"
1758
  msgstr ""
1759
 
1760
- #: src/Tribe/Main.php:293
1761
  msgid "All items on this page were selected. "
1762
  msgstr ""
1763
 
1764
- #: src/Tribe/Main.php:294
1765
  msgid "Select all pages"
1766
  msgstr ""
1767
 
1768
- #: src/Tribe/Main.php:295
1769
  msgid "Clear Selection."
1770
  msgstr ""
1771
 
1772
- #: src/Tribe/Main.php:297
1773
  msgid "All"
1774
  msgstr ""
1775
 
1776
- #: src/Tribe/Main.php:298 src/Tribe/Main.php:315
1777
  msgid "Next"
1778
  msgstr ""
1779
 
1780
- #: src/Tribe/Main.php:299
1781
  msgid "Previous"
1782
  msgstr ""
1783
 
1784
- #: src/Tribe/Main.php:304
1785
  msgid ": Selected %d rows"
1786
  msgstr ""
1787
 
1788
- #: src/Tribe/Main.php:305
1789
  msgid ": Selected 1 row"
1790
  msgstr ""
1791
 
1792
- #: src/Tribe/Main.php:316
1793
  msgid "Prev"
1794
  msgstr ""
1795
 
1796
- #: src/Tribe/Main.php:317 src/Tribe/Main.php:319
1797
  msgid "Today"
1798
  msgstr ""
1799
 
1800
- #: src/Tribe/Main.php:318
1801
  msgid "Done"
1802
  msgstr ""
1803
 
1804
- #: src/Tribe/Main.php:320
1805
  msgid "Clear"
1806
  msgstr ""
1807
 
@@ -2274,65 +2263,65 @@ msgstr ""
2274
  msgid "%s must be a whole number."
2275
  msgstr ""
2276
 
2277
- #: src/Tribe/Validate.php:250
2278
  msgid "%s must be a valid slug (numbers, letters, dashes, and underscores)."
2279
  msgstr ""
2280
 
2281
- #: src/Tribe/Validate.php:263
2282
  msgid "%s must be a valid URL."
2283
  msgstr ""
2284
 
2285
- #: src/Tribe/Validate.php:277 src/Tribe/Validate.php:289
2286
- #: src/Tribe/Validate.php:302 src/Tribe/Validate.php:322
2287
  msgid "%s must have a value that's part of its options."
2288
  msgstr ""
2289
 
2290
- #: src/Tribe/Validate.php:334
2291
  msgid ""
2292
  "Comparison validation failed because no comparison value was provided, for "
2293
  "field %s"
2294
  msgstr ""
2295
 
2296
- #: src/Tribe/Validate.php:341
2297
  msgid "%s cannot be the same as %s."
2298
  msgstr ""
2299
 
2300
- #: src/Tribe/Validate.php:343
2301
  msgid "%s cannot be a duplicate"
2302
  msgstr ""
2303
 
2304
- #: src/Tribe/Validate.php:357
2305
  msgid "%s must be a number or percentage."
2306
  msgstr ""
2307
 
2308
- #: src/Tribe/Validate.php:401
2309
  msgid "%s must be a number between 0 and 21."
2310
  msgstr ""
2311
 
2312
- #: src/Tribe/Validate.php:415
2313
  msgid ""
2314
  "%s must consist of letters, numbers, dashes, apostrophes, and spaces only."
2315
  msgstr ""
2316
 
2317
- #: src/Tribe/Validate.php:429
2318
  msgid "%s must consist of letters, spaces, apostrophes, and dashes."
2319
  msgstr ""
2320
 
2321
- #: src/Tribe/Validate.php:441
2322
  msgid "%s must consist of 5 numbers."
2323
  msgstr ""
2324
 
2325
- #: src/Tribe/Validate.php:453
2326
  msgid "%s must be a phone number."
2327
  msgstr ""
2328
 
2329
- #: src/Tribe/Validate.php:467
2330
  msgid ""
2331
  "Country List must be formatted as one country per line in the following "
2332
  "format: <br>US, United States <br> UK, United Kingdom."
2333
  msgstr ""
2334
 
2335
- #: src/Tribe/Validate.php:496
2336
  msgid "%s must be an email address."
2337
  msgstr ""
2338
 
2
  # This file is distributed under the same license as the Tribe Common package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Tribe Common 4.11.0\n"
6
  "Report-Msgid-Bugs-To: http://m.tri.be/191x\n"
7
+ "POT-Creation-Date: 2020-01-23 20:33:04+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2020-01-23 20:33\n"
12
  "Last-Translator: \n"
13
  "Language-Team: \n"
14
 
290
  msgid "State"
291
  msgstr ""
292
 
 
 
 
 
 
293
  #: src/Tribe/Dialog/View.php:153
294
  msgid "Open the modal window"
295
  msgstr ""
828
  msgid "Gambia"
829
  msgstr ""
830
 
831
+ #: src/Tribe/Languages/Locations.php:138 src/Tribe/Languages/Locations.php:334
 
832
  msgid "Georgia"
833
  msgstr ""
834
 
1508
  msgid "Florida"
1509
  msgstr ""
1510
 
 
 
 
 
 
1511
  #: src/Tribe/Languages/Locations.php:335
1512
  msgid "Hawaii"
1513
  msgstr ""
1710
  msgid "Full debug (all events)"
1711
  msgstr ""
1712
 
1713
+ #: src/Tribe/Main.php:284
1714
  msgid ": activate to sort column ascending"
1715
  msgstr ""
1716
 
1717
+ #: src/Tribe/Main.php:285
1718
  msgid ": activate to sort column descending"
1719
  msgstr ""
1720
 
1721
+ #: src/Tribe/Main.php:287
1722
  msgid "Show _MENU_ entries"
1723
  msgstr ""
1724
 
1725
+ #: src/Tribe/Main.php:288
1726
  msgid "No data available in table"
1727
  msgstr ""
1728
 
1729
+ #: src/Tribe/Main.php:289
1730
  msgid "Showing _START_ to _END_ of _TOTAL_ entries"
1731
  msgstr ""
1732
 
1733
+ #: src/Tribe/Main.php:290
1734
  msgid "Showing 0 to 0 of 0 entries"
1735
  msgstr ""
1736
 
1737
+ #: src/Tribe/Main.php:291
1738
  msgid "(filtered from _MAX_ total entries)"
1739
  msgstr ""
1740
 
1741
+ #: src/Tribe/Main.php:292
1742
  msgid "No matching records found"
1743
  msgstr ""
1744
 
1745
+ #: src/Tribe/Main.php:293
1746
  msgid "Search:"
1747
  msgstr ""
1748
 
1749
+ #: src/Tribe/Main.php:294
1750
  msgid "All items on this page were selected. "
1751
  msgstr ""
1752
 
1753
+ #: src/Tribe/Main.php:295
1754
  msgid "Select all pages"
1755
  msgstr ""
1756
 
1757
+ #: src/Tribe/Main.php:296
1758
  msgid "Clear Selection."
1759
  msgstr ""
1760
 
1761
+ #: src/Tribe/Main.php:298
1762
  msgid "All"
1763
  msgstr ""
1764
 
1765
+ #: src/Tribe/Main.php:299 src/Tribe/Main.php:316
1766
  msgid "Next"
1767
  msgstr ""
1768
 
1769
+ #: src/Tribe/Main.php:300
1770
  msgid "Previous"
1771
  msgstr ""
1772
 
1773
+ #: src/Tribe/Main.php:305
1774
  msgid ": Selected %d rows"
1775
  msgstr ""
1776
 
1777
+ #: src/Tribe/Main.php:306
1778
  msgid ": Selected 1 row"
1779
  msgstr ""
1780
 
1781
+ #: src/Tribe/Main.php:317
1782
  msgid "Prev"
1783
  msgstr ""
1784
 
1785
+ #: src/Tribe/Main.php:318 src/Tribe/Main.php:320
1786
  msgid "Today"
1787
  msgstr ""
1788
 
1789
+ #: src/Tribe/Main.php:319
1790
  msgid "Done"
1791
  msgstr ""
1792
 
1793
+ #: src/Tribe/Main.php:321
1794
  msgid "Clear"
1795
  msgstr ""
1796
 
2263
  msgid "%s must be a whole number."
2264
  msgstr ""
2265
 
2266
+ #: src/Tribe/Validate.php:247
2267
  msgid "%s must be a valid slug (numbers, letters, dashes, and underscores)."
2268
  msgstr ""
2269
 
2270
+ #: src/Tribe/Validate.php:260
2271
  msgid "%s must be a valid URL."
2272
  msgstr ""
2273
 
2274
+ #: src/Tribe/Validate.php:274 src/Tribe/Validate.php:286
2275
+ #: src/Tribe/Validate.php:299 src/Tribe/Validate.php:319
2276
  msgid "%s must have a value that's part of its options."
2277
  msgstr ""
2278
 
2279
+ #: src/Tribe/Validate.php:331
2280
  msgid ""
2281
  "Comparison validation failed because no comparison value was provided, for "
2282
  "field %s"
2283
  msgstr ""
2284
 
2285
+ #: src/Tribe/Validate.php:338
2286
  msgid "%s cannot be the same as %s."
2287
  msgstr ""
2288
 
2289
+ #: src/Tribe/Validate.php:340
2290
  msgid "%s cannot be a duplicate"
2291
  msgstr ""
2292
 
2293
+ #: src/Tribe/Validate.php:354
2294
  msgid "%s must be a number or percentage."
2295
  msgstr ""
2296
 
2297
+ #: src/Tribe/Validate.php:398
2298
  msgid "%s must be a number between 0 and 21."
2299
  msgstr ""
2300
 
2301
+ #: src/Tribe/Validate.php:412
2302
  msgid ""
2303
  "%s must consist of letters, numbers, dashes, apostrophes, and spaces only."
2304
  msgstr ""
2305
 
2306
+ #: src/Tribe/Validate.php:426
2307
  msgid "%s must consist of letters, spaces, apostrophes, and dashes."
2308
  msgstr ""
2309
 
2310
+ #: src/Tribe/Validate.php:438
2311
  msgid "%s must consist of 5 numbers."
2312
  msgstr ""
2313
 
2314
+ #: src/Tribe/Validate.php:450
2315
  msgid "%s must be a phone number."
2316
  msgstr ""
2317
 
2318
+ #: src/Tribe/Validate.php:464
2319
  msgid ""
2320
  "Country List must be formatted as one country per line in the following "
2321
  "format: <br>US, United States <br> UK, United Kingdom."
2322
  msgstr ""
2323
 
2324
+ #: src/Tribe/Validate.php:493
2325
  msgid "%s must be an email address."
2326
  msgstr ""
2327
 
common/src/Tribe/Assets.php CHANGED
@@ -327,24 +327,19 @@ class Tribe__Assets {
327
  // Strip the plugin URL and make this relative.
328
  $relative_location = str_replace( $base_url, '', $url );
329
 
330
- if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) {
331
- // Add the actual url after having the min file added.
332
- $urls[] = $relative_location;
333
- }
334
-
335
  // If needed add the Min Files.
336
- if ( substr( $relative_location, -3, 3 ) === '.js' ) {
337
- $urls[] = substr_replace( $relative_location, '.min', - 3, 0 );
338
- }
 
339
 
340
- if ( substr( $relative_location, -4, 4 ) === '.css' ) {
341
- $urls[] = substr_replace( $relative_location, '.min', - 4, 0 );
 
342
  }
343
 
344
- if ( ! defined( 'SCRIPT_DEBUG' ) || ( defined( 'SCRIPT_DEBUG' ) && ! SCRIPT_DEBUG ) ) {
345
- // Add the actual url after having the min file added.
346
- $urls[] = $relative_location;
347
- }
348
 
349
  // Check for all Urls added to the array.
350
  foreach ( $urls as $partial_path ) {
327
  // Strip the plugin URL and make this relative.
328
  $relative_location = str_replace( $base_url, '', $url );
329
 
 
 
 
 
 
330
  // If needed add the Min Files.
331
+ if ( ! defined( 'SCRIPT_DEBUG' ) || SCRIPT_DEBUG === false ) {
332
+ if ( substr( $relative_location, - 3, 3 ) === '.js' ) {
333
+ $urls[] = substr_replace( $relative_location, '.min', - 3, 0 );
334
+ }
335
 
336
+ if ( substr( $relative_location, - 4, 4 ) === '.css' ) {
337
+ $urls[] = substr_replace( $relative_location, '.min', - 4, 0 );
338
+ }
339
  }
340
 
341
+ // Add the actual url after having the min file added.
342
+ $urls[] = $relative_location;
 
 
343
 
344
  // Check for all Urls added to the array.
345
  foreach ( $urls as $partial_path ) {
common/src/Tribe/Cache.php CHANGED
@@ -11,15 +11,13 @@
11
  */
12
  class Tribe__Cache implements ArrayAccess {
13
  const SCHEDULED_EVENT_DELETE_TRANSIENT = 'tribe_schedule_transient_purge';
14
-
15
- const NO_EXPIRATION = 0;
16
-
17
- const NON_PERSISTENT = -1;
18
 
19
  /**
20
  * @var array
21
  */
22
- protected $non_persistent_keys = [];
23
 
24
  /**
25
  * Bootstrap hook
@@ -32,12 +30,10 @@ class Tribe__Cache implements ArrayAccess {
32
  }
33
 
34
  add_action( self::SCHEDULED_EVENT_DELETE_TRANSIENT, [ $this, 'delete_expired_transients' ] );
35
-
36
- add_action( 'shutdown', [ $this, 'maybe_delete_expired_transients' ] );
37
  }
38
 
39
  public static function setup() {
40
- wp_cache_add_non_persistent_groups( [ 'tribe-events-non-persistent' ] );
41
  }
42
 
43
  /**
@@ -55,13 +51,13 @@ class Tribe__Cache implements ArrayAccess {
55
  * Filters the expiration for cache objects to provide the ability
56
  * to make non-persistent objects be treated as persistent.
57
  *
58
- * @since 4.8
59
- *
60
  * @param int $expiration Cache expiration time.
61
  * @param string $id Cache ID.
62
  * @param mixed $value Cache value.
63
  * @param string|array $expiration_trigger Action that triggers automatic expiration.
64
  * @param string $key Unique cache key based on Cache ID and expiration trigger last run time.
 
 
65
  */
66
  $expiration = apply_filters( 'tribe_cache_expiration', $expiration, $id, $value, $expiration_trigger, $key );
67
 
@@ -103,9 +99,11 @@ class Tribe__Cache implements ArrayAccess {
103
  *
104
  * @return mixed
105
  */
106
- public function get( $id, $expiration_trigger = '', $default = false, $expiration = 0, $args = [] ) {
107
  $flipped = array_flip( $this->non_persistent_keys );
108
- $group = isset( $flipped[ $id ] ) ? 'tribe-events-non-persistent' : 'tribe-events';
 
 
109
  $value = wp_cache_get( $this->get_id( $id, $expiration_trigger ), $group );
110
 
111
  // Value found.
@@ -130,7 +128,7 @@ class Tribe__Cache implements ArrayAccess {
130
  }
131
 
132
  /**
133
- * @param string $id
134
  * @param string|array $expiration_trigger
135
  *
136
  * @return mixed
@@ -140,7 +138,7 @@ class Tribe__Cache implements ArrayAccess {
140
  }
141
 
142
  /**
143
- * @param string $id
144
  * @param string|array $expiration_trigger
145
  *
146
  * @return bool
@@ -150,7 +148,7 @@ class Tribe__Cache implements ArrayAccess {
150
  }
151
 
152
  /**
153
- * @param string $id
154
  * @param string|array $expiration_trigger
155
  *
156
  * @return bool
@@ -165,14 +163,8 @@ class Tribe__Cache implements ArrayAccess {
165
  * This uses a modification of the the query from https://core.trac.wordpress.org/ticket/20316
166
  *
167
  * @since 4.11.0
168
- *
169
- * @return void Just execute the database SQL no return required.
170
  */
171
  public function delete_expired_transients() {
172
- if ( tribe_get_var( 'has_deleted_expired_transients', false ) ) {
173
- return;
174
- }
175
-
176
  global $wpdb;
177
 
178
  $time = time();
@@ -184,63 +176,17 @@ class Tribe__Cache implements ArrayAccess {
184
  FROM
185
  {$wpdb->options} a
186
  INNER JOIN {$wpdb->options} b
187
- ON b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )
188
  AND b.option_value < {$time}
189
  WHERE
190
- a.option_name LIKE '\_transient\_tribe\_%'
191
- AND a.option_name NOT LIKE '\_transient\_timeout\_tribe\_%'
192
  ";
193
-
194
- /**
195
- * Allow third party filtering of the SQL used for deleting expired transients.
196
- *
197
- * @since 4.11.5
198
- *
199
- * @param string $sql The SQL we execute to delete all the expired transients.
200
- * @param int $time Time we are using to determine what is expired.
201
- */
202
- $sql = apply_filters( 'tribe_cache_delete_expired_transients_sql', $sql, $time );
203
-
204
- if ( empty( $sql ) ) {
205
- return;
206
- }
207
-
208
  $wpdb->query( $sql );
209
-
210
- // Set the variable to prevent this call from running twice.
211
- tribe_set_var( 'has_deleted_expired_transients', true );
212
- }
213
-
214
- /**
215
- * Flag if we should delete
216
- *
217
- * @since 4.11.5
218
- *
219
- * @param boolean $value If we should delete transients or not on shutdown.
220
- *
221
- * @return void No return for setting the flag.
222
- */
223
- public function flag_required_delete_transients( $value = true ) {
224
- tribe_set_var( 'should_delete_expired_transients', $value );
225
  }
226
 
227
  /**
228
- * Runs on hook `shutdown` and will delete transients on the end of the request.
229
- *
230
- * @since 4.11.5
231
- *
232
- * @return void No return for action hook method.
233
- */
234
- public function maybe_delete_expired_transients() {
235
- if ( ! tribe_get_var( 'should_delete_expired_transients', false ) ) {
236
- return;
237
- }
238
-
239
- $this->delete_expired_transients();
240
- }
241
-
242
- /**
243
- * @param string $key
244
  * @param string|array $expiration_trigger
245
  *
246
  * @return string
@@ -278,10 +224,10 @@ class Tribe__Cache implements ArrayAccess {
278
  /**
279
  * Returns the time of an action last occurrence.
280
  *
281
- * @since 4.9.14 Changed the return value type from `int` to `float`.
282
- *
283
  * @param string $action The action to return the time for.
284
  *
 
 
285
  * @return float The time (microtime) an action last occurred, or the current microtime if it never occurred.
286
  */
287
  public function get_last_occurrence( $action ) {
@@ -297,7 +243,8 @@ class Tribe__Cache implements ArrayAccess {
297
 
298
  if ( ! $last_action ) {
299
  $last_action = microtime( true );
300
- $this->set_last_occurrence( $action, $last_action );
 
301
  }
302
 
303
  $cache_last_actions[ $action ] = (float) $last_action;
@@ -312,23 +259,16 @@ class Tribe__Cache implements ArrayAccess {
312
  *
313
  * @since 4.9.14 Changed the type of the time stored from an `int` to a `float`.
314
  *
315
- * @param string $action The action to record the last occurrence of.
316
- * @param int|float $timestamp The timestamp to assign to the action last occurrence or the current time (microtime).
317
- *
318
- * @return boolean IF we were able to set the last occurrence or not.
319
  */
320
  public function set_last_occurrence( $action, $timestamp = 0 ) {
321
  if ( empty( $timestamp ) ) {
322
  $timestamp = microtime( true );
323
  }
324
- $updated = update_option( 'tribe_last_' . $action, (float) $timestamp );
325
 
326
- // For performance reasons we will only expire cache once per request, when needed.
327
- if ( $updated ) {
328
- $this->flag_required_delete_transients( true );
329
- }
330
-
331
- return $updated;
332
  }
333
 
334
  /**
@@ -336,14 +276,13 @@ class Tribe__Cache implements ArrayAccess {
336
  *
337
  * @param mixed $components Either a single component of the key or an array of key components.
338
  * @param string $prefix
339
- * @param bool $sort Whether component arrays should be sorted or not to generate the key; defaults to
340
- * `true`.
341
  *
342
  * @return string The resulting key.
343
  */
344
  public function make_key( $components, $prefix = '', $sort = true ) {
345
- $key = '';
346
- $components = is_array( $components ) ? $components : [ $components ];
347
  foreach ( $components as $component ) {
348
  if ( $sort && is_array( $component ) ) {
349
  $is_associative = count( array_filter( array_keys( $component ), 'is_numeric' ) ) < count( array_keys( $component ) );
@@ -360,15 +299,17 @@ class Tribe__Cache implements ArrayAccess {
360
  }
361
 
362
  /**
363
- * Whether a offset exists.
364
- *
365
- * @since 4.11.0
366
  *
367
  * @link http://php.net/manual/en/arrayaccess.offsetexists.php
368
- *
369
- * @param mixed $offset An offset to check for.
370
- *
371
- * @return boolean Whether the offset exists in the cache.
 
 
 
 
372
  */
373
  public function offsetExists( $offset ) {
374
  $flipped = array_flip( $this->non_persistent_keys );
@@ -377,46 +318,45 @@ class Tribe__Cache implements ArrayAccess {
377
  }
378
 
379
  /**
380
- * Offset to retrieve.
381
  *
382
  * @link http://php.net/manual/en/arrayaccess.offsetget.php
383
- *
384
- * @since 4.11.0
385
- *
386
- * @param mixed $offset The offset to retrieve.
387
- *
388
  * @return mixed Can return all value types.
 
389
  */
390
  public function offsetGet( $offset ) {
391
  return $this->get( $offset );
392
  }
393
 
394
  /**
395
- * Offset to set.
396
- *
397
- * @since 4.11.0
398
  *
399
  * @link http://php.net/manual/en/arrayaccess.offsetset.php
400
- *
401
- * @param mixed $offset The offset to assign the value to.
402
- * @param mixed $value The value to set.
403
- *
 
 
404
  * @return void
 
405
  */
406
  public function offsetSet( $offset, $value ) {
407
  $this->set( $offset, $value, self::NON_PERSISTENT );
408
  }
409
 
410
  /**
411
- * Offset to unset.
412
- *
413
- * @since 4.11.0
414
  *
415
  * @link http://php.net/manual/en/arrayaccess.offsetunset.php
416
- *
417
- * @param mixed $offset The offset to unset.
418
- *
419
  * @return void
 
420
  */
421
  public function offsetUnset( $offset ) {
422
  $this->delete( $offset );
@@ -453,8 +393,8 @@ class Tribe__Cache implements ArrayAccess {
453
  }
454
 
455
  /** @var Tribe__Feature_Detection $feature_detection */
456
- $feature_detection = tribe( 'feature-detection' );
457
- $limit = $feature_detection->mysql_limit_for_example( 'post_result' );
458
 
459
  /**
460
  * Filters the LIMIT that should be used to warm-up post caches and postmeta caches (if the
@@ -479,7 +419,7 @@ class Tribe__Cache implements ArrayAccess {
479
 
480
  do {
481
  $limit_clause = $limit < 0 ? sprintf( 'LIMIT %d,%d', $limit * $page, $limit ) : '';
482
- $page++;
483
  $these_ids = array_splice( $buffer, 0, $limit );
484
  $interval = implode( ',', array_map( 'absint', $these_ids ) );
485
  $posts_query = "SELECT * FROM {$wpdb->posts} WHERE ID IN ({$interval}) {$limit_clause}";
@@ -494,6 +434,11 @@ class Tribe__Cache implements ArrayAccess {
494
  update_meta_cache( 'post', $these_ids );
495
  }
496
  }
497
- } while ( ! empty( $post_objects ) && is_array( $post_objects ) && count( $post_objects ) < count( $post_ids ) );
498
- }
499
- }
 
 
 
 
 
11
  */
12
  class Tribe__Cache implements ArrayAccess {
13
  const SCHEDULED_EVENT_DELETE_TRANSIENT = 'tribe_schedule_transient_purge';
14
+ const NO_EXPIRATION = 0;
15
+ const NON_PERSISTENT = - 1;
 
 
16
 
17
  /**
18
  * @var array
19
  */
20
+ protected $non_persistent_keys = array();
21
 
22
  /**
23
  * Bootstrap hook
30
  }
31
 
32
  add_action( self::SCHEDULED_EVENT_DELETE_TRANSIENT, [ $this, 'delete_expired_transients' ] );
 
 
33
  }
34
 
35
  public static function setup() {
36
+ wp_cache_add_non_persistent_groups( array( 'tribe-events-non-persistent' ) );
37
  }
38
 
39
  /**
51
  * Filters the expiration for cache objects to provide the ability
52
  * to make non-persistent objects be treated as persistent.
53
  *
 
 
54
  * @param int $expiration Cache expiration time.
55
  * @param string $id Cache ID.
56
  * @param mixed $value Cache value.
57
  * @param string|array $expiration_trigger Action that triggers automatic expiration.
58
  * @param string $key Unique cache key based on Cache ID and expiration trigger last run time.
59
+ *
60
+ * @since 4.8
61
  */
62
  $expiration = apply_filters( 'tribe_cache_expiration', $expiration, $id, $value, $expiration_trigger, $key );
63
 
99
  *
100
  * @return mixed
101
  */
102
+ public function get( $id, $expiration_trigger = '', $default = false, $expiration = 0, $args = array() ) {
103
  $flipped = array_flip( $this->non_persistent_keys );
104
+ $group = isset( $flipped[ $id ] ) ?
105
+ 'tribe-events-non-persistent'
106
+ : 'tribe-events';
107
  $value = wp_cache_get( $this->get_id( $id, $expiration_trigger ), $group );
108
 
109
  // Value found.
128
  }
129
 
130
  /**
131
+ * @param string $id
132
  * @param string|array $expiration_trigger
133
  *
134
  * @return mixed
138
  }
139
 
140
  /**
141
+ * @param string $id
142
  * @param string|array $expiration_trigger
143
  *
144
  * @return bool
148
  }
149
 
150
  /**
151
+ * @param string $id
152
  * @param string|array $expiration_trigger
153
  *
154
  * @return bool
163
  * This uses a modification of the the query from https://core.trac.wordpress.org/ticket/20316
164
  *
165
  * @since 4.11.0
 
 
166
  */
167
  public function delete_expired_transients() {
 
 
 
 
168
  global $wpdb;
169
 
170
  $time = time();
176
  FROM
177
  {$wpdb->options} a
178
  INNER JOIN {$wpdb->options} b
179
+ ON b.option_name = CONCAT( '_transient_timeout_tribe_', SUBSTRING( a.option_name, 12 ) )
180
  AND b.option_value < {$time}
181
  WHERE
182
+ a.option_name LIKE '\_transient_tribe\_%'
183
+ AND a.option_name NOT LIKE '\_transient\_timeout_tribe\_%'
184
  ";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  $wpdb->query( $sql );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  }
187
 
188
  /**
189
+ * @param string $key
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  * @param string|array $expiration_trigger
191
  *
192
  * @return string
224
  /**
225
  * Returns the time of an action last occurrence.
226
  *
 
 
227
  * @param string $action The action to return the time for.
228
  *
229
+ * @since 4.9.14 Changed the return value type from `int` to `float`.
230
+ *
231
  * @return float The time (microtime) an action last occurred, or the current microtime if it never occurred.
232
  */
233
  public function get_last_occurrence( $action ) {
243
 
244
  if ( ! $last_action ) {
245
  $last_action = microtime( true );
246
+
247
+ update_option( 'tribe_last_' . $action, $last_action );
248
  }
249
 
250
  $cache_last_actions[ $action ] = (float) $last_action;
259
  *
260
  * @since 4.9.14 Changed the type of the time stored from an `int` to a `float`.
261
  *
262
+ * @param string $action The action to record the last occurrence of.
263
+ * @param int $timestamp The timestamp to assign to the action last occurrence or the current time (microtime).
 
 
264
  */
265
  public function set_last_occurrence( $action, $timestamp = 0 ) {
266
  if ( empty( $timestamp ) ) {
267
  $timestamp = microtime( true );
268
  }
269
+ update_option( 'tribe_last_' . $action, (float) $timestamp );
270
 
271
+ $this->delete_expired_transients();
 
 
 
 
 
272
  }
273
 
274
  /**
276
  *
277
  * @param mixed $components Either a single component of the key or an array of key components.
278
  * @param string $prefix
279
+ * @param bool $sort Whether component arrays should be sorted or not to generate the key; defaults to `true`.
 
280
  *
281
  * @return string The resulting key.
282
  */
283
  public function make_key( $components, $prefix = '', $sort = true ) {
284
+ $key = '';
285
+ $components = is_array( $components ) ? $components : array( $components );
286
  foreach ( $components as $component ) {
287
  if ( $sort && is_array( $component ) ) {
288
  $is_associative = count( array_filter( array_keys( $component ), 'is_numeric' ) ) < count( array_keys( $component ) );
299
  }
300
 
301
  /**
302
+ * Whether a offset exists
 
 
303
  *
304
  * @link http://php.net/manual/en/arrayaccess.offsetexists.php
305
+ * @param mixed $offset <p>
306
+ * An offset to check for.
307
+ * </p>
308
+ * @return boolean true on success or false on failure.
309
+ * </p>
310
+ * <p>
311
+ * The return value will be casted to boolean if non-boolean was returned.
312
+ * @since 4.11.0
313
  */
314
  public function offsetExists( $offset ) {
315
  $flipped = array_flip( $this->non_persistent_keys );
318
  }
319
 
320
  /**
321
+ * Offset to retrieve
322
  *
323
  * @link http://php.net/manual/en/arrayaccess.offsetget.php
324
+ * @param mixed $offset <p>
325
+ * The offset to retrieve.
326
+ * </p>
 
 
327
  * @return mixed Can return all value types.
328
+ * @since 4.11.0
329
  */
330
  public function offsetGet( $offset ) {
331
  return $this->get( $offset );
332
  }
333
 
334
  /**
335
+ * Offset to set
 
 
336
  *
337
  * @link http://php.net/manual/en/arrayaccess.offsetset.php
338
+ * @param mixed $offset <p>
339
+ * The offset to assign the value to.
340
+ * </p>
341
+ * @param mixed $value <p>
342
+ * The value to set.
343
+ * </p>
344
  * @return void
345
+ * @since 4.11.0
346
  */
347
  public function offsetSet( $offset, $value ) {
348
  $this->set( $offset, $value, self::NON_PERSISTENT );
349
  }
350
 
351
  /**
352
+ * Offset to unset
 
 
353
  *
354
  * @link http://php.net/manual/en/arrayaccess.offsetunset.php
355
+ * @param mixed $offset <p>
356
+ * The offset to unset.
357
+ * </p>
358
  * @return void
359
+ * @since 4.11.0
360
  */
361
  public function offsetUnset( $offset ) {
362
  $this->delete( $offset );
393
  }
394
 
395
  /** @var Tribe__Feature_Detection $feature_detection */
396
+ $feature_detection = tribe('feature-detection');
397
+ $limit = $feature_detection->mysql_limit_for_example( 'post_result' );
398
 
399
  /**
400
  * Filters the LIMIT that should be used to warm-up post caches and postmeta caches (if the
419
 
420
  do {
421
  $limit_clause = $limit < 0 ? sprintf( 'LIMIT %d,%d', $limit * $page, $limit ) : '';
422
+ $page ++;
423
  $these_ids = array_splice( $buffer, 0, $limit );
424
  $interval = implode( ',', array_map( 'absint', $these_ids ) );
425
  $posts_query = "SELECT * FROM {$wpdb->posts} WHERE ID IN ({$interval}) {$limit_clause}";
434
  update_meta_cache( 'post', $these_ids );
435
  }
436
  }
437
+ } while (
438
+ ! empty( $post_objects )
439
+ && is_array( $post_objects )
440
+ && count( $post_objects ) < count( $post_ids )
441
+ );
442
+
443
+ }
444
+ }
common/src/Tribe/Context.php CHANGED
@@ -376,7 +376,6 @@ class Tribe__Context {
376
 
377
  $value = $default;
378
  $locations = $this->get_locations();
379
- $found = false;
380
 
381
  if ( ! $force && isset( $this->request_cache[ $key ] ) ) {
382
  $value = $this->request_cache[ $key ];
@@ -385,7 +384,6 @@ class Tribe__Context {
385
  $the_value = $this->$location( (array) $keys, $default );
386
 
387
  if ( $default !== $the_value && static::NOT_FOUND !== $the_value ) {
388
- $found = true;
389
  $value = $the_value;
390
  break;
391
  }
@@ -403,8 +401,7 @@ class Tribe__Context {
403
  */
404
  $value = apply_filters( "tribe_context_{$key}", $value );
405
 
406
- // Only cache if the value was found.
407
- if ( $found ) {
408
  $this->request_cache[ $key ] = $value;
409
  }
410
 
376
 
377
  $value = $default;
378
  $locations = $this->get_locations();
 
379
 
380
  if ( ! $force && isset( $this->request_cache[ $key ] ) ) {
381
  $value = $this->request_cache[ $key ];
384
  $the_value = $this->$location( (array) $keys, $default );
385
 
386
  if ( $default !== $the_value && static::NOT_FOUND !== $the_value ) {
 
387
  $value = $the_value;
388
  break;
389
  }
401
  */
402
  $value = apply_filters( "tribe_context_{$key}", $value );
403
 
404
+ if ( $value !== static::NOT_FOUND ) {
 
405
  $this->request_cache[ $key ] = $value;
406
  }
407
 
common/src/Tribe/Context/locations.php CHANGED
@@ -9,6 +9,7 @@
9
  *
10
  * @since 4.9.11
11
  */
 
12
  return [
13
  'post_id' => [
14
  'read' => [
@@ -17,21 +18,6 @@ return [
17
  }
18
  ],
19
  ],
20
- 'permalink_structure' => [
21
- 'read' => [
22
- Tribe__Context::OPTION => [ 'permalink_structure' ],
23
- ],
24
- ],
25
- 'plain_permalink' => [
26
- 'read' => [
27
- Tribe__Context::LOCATION_FUNC => [
28
- 'permalink_structure',
29
- static function( $struct ){
30
- return empty( $struct );
31
- },
32
- ],
33
- ],
34
- ],
35
  'posts_per_page' => [
36
  'read' => [
37
  Tribe__Context::REQUEST_VAR => 'posts_per_page',
@@ -90,30 +76,6 @@ return [
90
  ],
91
  'post_type' => [
92
  'read' => [
93
- Tribe__Context::FUNC => static function() {
94
- $post_type_objs = get_post_types(
95
- [
96
- 'public' => true,
97
- '_builtin' => false,
98
- ],
99
- 'objects'
100
- );
101
-
102
- foreach( $post_type_objs as $post_type ) {
103
- if ( empty( $post_type->query_var ) ) {
104
- continue;
105
- }
106
-
107
- $url_value = tribe_get_request_var( $post_type->query_var, false );
108
- if ( empty( $url_value ) ) {
109
- continue;
110
- }
111
-
112
- return $post_type->name;
113
- }
114
-
115
- return Tribe__Context::NOT_FOUND;
116
- },
117
  Tribe__Context::QUERY_PROP => 'post_type',
118
  Tribe__Context::QUERY_VAR => 'post_type',
119
  Tribe__Context::REQUEST_VAR => 'post_type',
@@ -128,12 +90,5 @@ return [
128
  Tribe__Context::QUERY_VAR => [ 'taxonomy' ],
129
  Tribe__Context::REQUEST_VAR => [ 'taxonomy' ],
130
  ],
131
- ],
132
- 'post_tag' => [
133
- 'read' => [
134
- Tribe__Context::QUERY_PROP => [ 'post_tag', 'tag' ],
135
- Tribe__Context::QUERY_VAR => [ 'post_tag', 'tag' ],
136
- Tribe__Context::REQUEST_VAR => [ 'post_tag', 'tag' ],
137
- ],
138
- ],
139
  ];
9
  *
10
  * @since 4.9.11
11
  */
12
+
13
  return [
14
  'post_id' => [
15
  'read' => [
18
  }
19
  ],
20
  ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  'posts_per_page' => [
22
  'read' => [
23
  Tribe__Context::REQUEST_VAR => 'posts_per_page',
76
  ],
77
  'post_type' => [
78
  'read' => [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  Tribe__Context::QUERY_PROP => 'post_type',
80
  Tribe__Context::QUERY_VAR => 'post_type',
81
  Tribe__Context::REQUEST_VAR => 'post_type',
90
  Tribe__Context::QUERY_VAR => [ 'taxonomy' ],
91
  Tribe__Context::REQUEST_VAR => [ 'taxonomy' ],
92
  ],
93
+ ]
 
 
 
 
 
 
 
94
  ];
common/src/Tribe/Date_Utils.php CHANGED
@@ -69,7 +69,7 @@ if ( ! class_exists( 'Tribe__Date_Utils' ) ) {
69
  */
70
  public static function maybe_format_from_datepicker( $date, $datepicker = null ) {
71
  if ( ! is_numeric( $datepicker ) ) {
72
- $datepicker = self::get_datepicker_format_index();
73
  }
74
 
75
  if ( is_numeric( $datepicker ) ) {
@@ -1318,8 +1318,6 @@ if ( ! class_exists( 'Tribe__Date_Utils' ) ) {
1318
  *
1319
  * @since 4.9.21
1320
  *
1321
- * @throws Exception
1322
- *
1323
  * @param string|int|\DateTime $date The date string, timestamp or object.
1324
  * @param int|null $start_of_week The number representing the start of week day as handled by
1325
  * WordPress: `0` (for Sunday) through `6` (for Saturday).
@@ -1401,110 +1399,6 @@ if ( ! class_exists( 'Tribe__Date_Utils' ) ) {
1401
  return [ $week_start, $week_end ];
1402
  }
1403
 
1404
- /**
1405
- * Given a specific DateTime we determine the end of that day based on our Internal End of Day Cut-off.
1406
- *
1407
- * @since 4.11.2
1408
- *
1409
- * @param string|DateTimeInterface $date Date that we are getting the end of day from.
1410
- * @param null|string $cutoff Which cutoff to use.
1411
- *
1412
- * @return DateTimeInterface|false Returns a DateTimeInterface when a valid date is given or false.
1413
- */
1414
- public static function get_shifted_end_of_day( $date, $cutoff = null ) {
1415
- $date_obj = static::build_date_object( $date );
1416
-
1417
- if ( ! $date_obj ) {
1418
- return false;
1419
- }
1420
-
1421
- $start_of_day = clone $date_obj;
1422
- $end_of_day = clone $date_obj;
1423
-
1424
- if ( empty( $cutoff ) || ! is_string( $cutoff ) || false === strpos( $cutoff, ':' ) ) {
1425
- $cutoff = tribe_get_option( 'multiDayCutoff', '00:00' );
1426
- }
1427
-
1428
- list( $hours_to_add, $minutes_to_add ) = array_map( 'absint', explode( ':', $cutoff ) );
1429
-
1430
- $seconds_to_add = ( $hours_to_add * HOUR_IN_SECONDS ) + ( $minutes_to_add * MINUTE_IN_SECONDS );
1431
- if ( 0 !== $seconds_to_add ) {
1432
- $interval = static::interval( "PT{$seconds_to_add}S" );
1433
- }
1434
-
1435
- $start_of_day->setTime( '0', '0', '0' );
1436
- $end_of_day->setTime( '23', '59', '59' );
1437
-
1438
- if ( 0 !== $seconds_to_add ) {
1439
- $start_of_day->add( $interval );
1440
- $end_of_day->add( $interval );
1441
- }
1442
-
1443
- if ( $end_of_day >= $date_obj && $date_obj >= $start_of_day ) {
1444
- return $end_of_day;
1445
- }
1446
-
1447
- $start_of_day->sub( static::interval( 'P1D' ) );
1448
-
1449
- if ( $start_of_day < $date_obj ) {
1450
- $end_of_day->sub( static::interval( 'P1D' ) );
1451
- }
1452
-
1453
- return $end_of_day;
1454
- }
1455
-
1456
- /**
1457
- * Given a specific DateTime we determine the start of that day based on our Internal End of Day Cut-off.
1458
- *
1459
- * @since 4.11.2
1460
- *
1461
- * @param string|DateTimeInterface $date Date that we are getting the start of day from.
1462
- * @param null|string $cutoff Which cutoff to use.
1463
- *
1464
- * @return DateTimeInterface|false Returns a DateTimeInterface when a valid date is given or false.
1465
- */
1466
- public static function get_shifted_start_of_day( $date, $cutoff = null ) {
1467
- $date_obj = static::build_date_object( $date );
1468
-
1469
- if ( ! $date_obj ) {
1470
- return false;
1471
- }
1472
-
1473
- $start_of_day = clone $date_obj;
1474
- $end_of_day = clone $date_obj;
1475
-
1476
- if ( empty( $cutoff ) || ! is_string( $cutoff ) || false === strpos( $cutoff, ':' ) ) {
1477
- $cutoff = tribe_get_option( 'multiDayCutoff', '00:00' );
1478
- }
1479
-
1480
- list( $hours_to_add, $minutes_to_add ) = array_map( 'absint', explode( ':', $cutoff ) );
1481
-
1482
- $seconds_to_add = ( $hours_to_add * HOUR_IN_SECONDS ) + ( $minutes_to_add * MINUTE_IN_SECONDS );
1483
- if ( 0 !== $seconds_to_add ) {
1484
- $interval = static::interval( "PT{$seconds_to_add}S" );
1485
- }
1486
-
1487
- $start_of_day->setTime( '0', '0', '0' );
1488
- $end_of_day->setTime( '23', '59', '59' );
1489
-
1490
- if ( 0 !== $seconds_to_add ) {
1491
- $start_of_day->add( $interval );
1492
- $end_of_day->add( $interval );
1493
- }
1494
-
1495
- if ( $end_of_day <= $date_obj && $date_obj >= $start_of_day ) {
1496
- return $start_of_day;
1497
- }
1498
-
1499
- $end_of_day->sub( static::interval( 'P1D' ) );
1500
-
1501
- if ( $end_of_day > $date_obj ) {
1502
- $start_of_day->sub( static::interval( 'P1D' ) );
1503
- }
1504
-
1505
- return $start_of_day;
1506
- }
1507
-
1508
  /**
1509
  * Builds and returns a `DateInterval` object from the interval specification.
1510
  *
69
  */
70
  public static function maybe_format_from_datepicker( $date, $datepicker = null ) {
71
  if ( ! is_numeric( $datepicker ) ) {
72
+ $datepicker = tribe_get_option( 'datepickerFormat' );
73
  }
74
 
75
  if ( is_numeric( $datepicker ) ) {
1318
  *
1319
  * @since 4.9.21
1320
  *
 
 
1321
  * @param string|int|\DateTime $date The date string, timestamp or object.
1322
  * @param int|null $start_of_week The number representing the start of week day as handled by
1323
  * WordPress: `0` (for Sunday) through `6` (for Saturday).
1399
  return [ $week_start, $week_end ];
1400
  }
1401
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1402
  /**
1403
  * Builds and returns a `DateInterval` object from the interval specification.
1404
  *
common/src/Tribe/Debug_Bar/Panels/Json_Ld.php DELETED
@@ -1,84 +0,0 @@
1
- <?php
2
- /**
3
- * JSON-LD information Debug Bar panel.
4
- *
5
- * @since 4.11.2
6
- *
7
- * @package Tribe\Debug_Bar\Panels
8
- */
9
-
10
- class Tribe__Debug_Bar__Panels__Json_Ld extends Debug_Bar_Panel {
11
- /**
12
- * Returns the Panel name.
13
- *
14
- * @since 4.11.2
15
- *
16
- * @param null $title The panel input title.
17
- *
18
- * @return string The panel title
19
- */
20
- public function title( $title = null ) {
21
- return __( 'Modern Tribe JSON-LD Data', 'tribe-common' );
22
- }
23
-
24
- /**
25
- * Renders the panel contents.
26
- *
27
- * @since 4.9.5
28
- */
29
- public function render() {
30
- $html = '<style>
31
- #mt-debug-bar .mt-debug-bar-title {
32
- margin-bottom: 1em;
33
- }
34
- #mt-debug-bar .mt-debug-bar-section {
35
- padding: .5em .5em .5em 1em;
36
- }
37
- </style>';
38
- $html .= '<div id="mt-debug-bar" class="mt-debug-bar-json-ld">';
39
-
40
- $html .= '<header class="mt-debug-bar-title"><h2>' . esc_html__( 'Modern Tribe JSON-LD Data',
41
- 'tribe-common' ) . '</h2></header>';
42
-
43
-
44
- $json_ld_data = array_filter( (array) tribe_cache()['json-ld-data'] );
45
-
46
- if ( ! empty( $json_ld_data ) ) {
47
- $html .= '<div class="mt-debug-bar-section">';
48
- $html .= sprintf(
49
- '<header>The request produced %d JSON-LD data %s.</header><br>',
50
- count( $json_ld_data ),
51
- count( $json_ld_data ) > 1 ? 'scripts' : 'script'
52
- );
53
-
54
- $html .= '<p>Copy the code below and paste it into ' .
55
- '<a href="https://search.google.com/structured-data/testing-tool/u/0/" target="_blank">' .
56
- 'Google\'s Structured Data Testing Tool' .
57
- '</a>' .
58
- ' to test it using the Code Snippet option.</p><br>';
59
-
60
- foreach ( $json_ld_data as $full_entry ) {
61
- preg_match(
62
- '/(?<open>^\\s*<script[^>]*?>\\s*)(?<json>.*)(?<close>\\s<\\/script>)$/uism',
63
- $full_entry,
64
- $frags
65
- );
66
-
67
- if ( isset( $frags['open'], $frags['json'], $frags['close'] ) ) {
68
- // Let's try and format it if we've got all the pieces.
69
- $full_entry = $frags['open']
70
- . json_encode( json_decode( $frags['json'], true ), JSON_PRETTY_PRINT )
71
- . $frags['close'];
72
- }
73
-
74
- $html .= sprintf( '<pre><code>%s</code></pre>', esc_html( $full_entry ) );
75
- }
76
-
77
- $html .= '</div>';
78
- }
79
-
80
- $html .= '</div>';
81
-
82
- echo $html;
83
- }
84
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
common/src/Tribe/Dependency.php CHANGED
@@ -301,11 +301,11 @@ if ( ! class_exists( 'Tribe__Dependency' ) ) {
301
  *
302
  * @since 4.9
303
  *
304
- * @param array $plugin An array of data for given registered plugin.,
305
- * @param array $dependencies An array of dependencies for a plugin.
306
- * @param bool $addon Indicates if the plugin is an add-on for The Events Calendar or Event Tickets.
307
  *
308
- * @return true|int The number of failed dependency checks; `true` or `0` to indicate no checks failed.
309
  */
310
  public function has_valid_dependencies( $plugin, $dependencies = array(), $addon = false ) {
311
  if ( empty( $dependencies ) ) {
@@ -409,11 +409,11 @@ if ( ! class_exists( 'Tribe__Dependency' ) ) {
409
  *
410
  * @since 4.9
411
  *
412
- * @param string $file_path Full file path to the base plugin file.
413
- * @param string $main_class The Main/base class for this plugin.
414
- * @param string $version The plugin version.
415
- * @param array $classes_req Any Main class files/tribe plugins required for this to run.
416
- * @param array $dependencies an array of dependencies to check.
417
  */
418
  public function register_plugin( $file_path, $main_class, $version, $classes_req = array(), $dependencies = array() ) {
419
  /**
@@ -475,7 +475,11 @@ if ( ! class_exists( 'Tribe__Dependency' ) ) {
475
  *
476
  * @since 4.9
477
  *
 
478
  * @param string $main_class The Main/base class for this plugin
 
 
 
479
  *
480
  * @return bool Indicates if plugin should continue initialization
481
  */
@@ -483,25 +487,25 @@ if ( ! class_exists( 'Tribe__Dependency' ) ) {
483
 
484
  $parent_dependencies = $co_dependencies = $addon_dependencies = 0;
485
 
486
- // Check if plugin is registered, if not return false.
487
  $plugin = $this->get_registered_plugin( $main_class );
488
  if ( empty( $plugin ) ) {
489
  return false;
490
  }
491
 
492
- // Check parent dependencies in add-on.
493
  if ( ! empty( $plugin['dependencies']['parent-dependencies'] ) ) {
494
  $parent_dependencies = $this->has_valid_dependencies( $plugin, $plugin['dependencies']['parent-dependencies'] );
495
  }
496
- // Check co-dependencies in add-on.
497
  if ( ! empty( $plugin['dependencies']['co-dependencies'] ) ) {
498
  $co_dependencies = $this->has_valid_dependencies( $plugin, $plugin['dependencies']['co-dependencies'] );
499
  }
500
 
501
- // Check add-on dependencies from parent.
502
  $addon_dependencies = $this->check_addon_dependencies( $main_class );
503
 
504
- // If good then we set as active plugin and continue to load.
505
  if ( ! $parent_dependencies && ! $co_dependencies && ! $addon_dependencies ) {
506
  $this->add_active_plugin( $main_class, $plugin['version'], $plugin['path'] );
507
 
@@ -516,26 +520,23 @@ if ( ! class_exists( 'Tribe__Dependency' ) ) {
516
  *
517
  * @since 4.9
518
  *
519
- * @param string $main_class A string of the main class for the plugin being checked.
520
  *
521
- * @return bool Returns false if any dependency is invalid.
522
  */
523
  protected function check_addon_dependencies( $main_class ) {
 
 
 
524
  foreach ( $this->registered_plugins as $registered ) {
525
  if ( empty( $registered['dependencies']['addon-dependencies'][ $main_class ] ) ) {
526
  continue;
527
  }
528
 
529
- $dependencies = [ $main_class => $registered['dependencies']['addon-dependencies'][ $main_class ] ];
530
- $check = $this->has_valid_dependencies( $registered, $dependencies, true );
531
-
532
- // A value of `true` or `0` indicates there are no failing checks. So here we check for ints gt 0.
533
- if ( is_int( $check ) && $check > 0 ) {
534
- return true;
535
- }
536
  }
537
 
538
- return false;
539
  }
540
 
541
  /**
@@ -550,4 +551,4 @@ if ( ! class_exists( 'Tribe__Dependency' ) ) {
550
  }
551
  }
552
 
553
- }
301
  *
302
  * @since 4.9
303
  *
304
+ * @param array $plugin An array of data for given registered plugin
305
+ * @param array $dependencies An array of dependencies for a plugin
306
+ * @param bool $addon Indicates if the plugin is an add-on for The Events Calendar or Event Tickets
307
  *
308
+ * @return bool returns false if any dependency is invalid
309
  */
310
  public function has_valid_dependencies( $plugin, $dependencies = array(), $addon = false ) {
311
  if ( empty( $dependencies ) ) {
409
  *
410
  * @since 4.9
411
  *
412
+ * @param $file_path
413
+ * @param $main_class
414
+ * @param $version
415
+ * @param array $classes_req
416
+ * @param array $dependencies
417
  */
418
  public function register_plugin( $file_path, $main_class, $version, $classes_req = array(), $dependencies = array() ) {
419
  /**
475
  *
476
  * @since 4.9
477
  *
478
+ * @param string $file_path Full file path to the base plugin file
479
  * @param string $main_class The Main/base class for this plugin
480
+ * @param string $version The version
481
+ * @param array $classes_req Any Main class files/tribe plugins required for this to run
482
+ * @param array $dependencies an array of dependencies to check
483
  *
484
  * @return bool Indicates if plugin should continue initialization
485
  */
487
 
488
  $parent_dependencies = $co_dependencies = $addon_dependencies = 0;
489
 
490
+ //check if plugin is registered, if not return false
491
  $plugin = $this->get_registered_plugin( $main_class );
492
  if ( empty( $plugin ) ) {
493
  return false;
494
  }
495
 
496
+ // check parent dependencies in add-on
497
  if ( ! empty( $plugin['dependencies']['parent-dependencies'] ) ) {
498
  $parent_dependencies = $this->has_valid_dependencies( $plugin, $plugin['dependencies']['parent-dependencies'] );
499
  }
500
+ //check co-dependencies in add-on
501
  if ( ! empty( $plugin['dependencies']['co-dependencies'] ) ) {
502
  $co_dependencies = $this->has_valid_dependencies( $plugin, $plugin['dependencies']['co-dependencies'] );
503
  }
504
 
505
+ //check add-on dependencies from parent
506
  $addon_dependencies = $this->check_addon_dependencies( $main_class );
507
 
508
+ //if good then we set as active plugin and continue to load
509
  if ( ! $parent_dependencies && ! $co_dependencies && ! $addon_dependencies ) {
510
  $this->add_active_plugin( $main_class, $plugin['version'], $plugin['path'] );
511
 
520
  *
521
  * @since 4.9
522
  *
523
+ * @param string $main_class a string of the main class for the plugin being checked
524
  *
525
+ * @return bool returns false if any dependency is invalid
526
  */
527
  protected function check_addon_dependencies( $main_class ) {
528
+
529
+ $addon_dependencies = 0;
530
+
531
  foreach ( $this->registered_plugins as $registered ) {
532
  if ( empty( $registered['dependencies']['addon-dependencies'][ $main_class ] ) ) {
533
  continue;
534
  }
535
 
536
+ $addon_dependencies = $this->has_valid_dependencies( $registered, $registered['dependencies']['addon-dependencies'], true );
 
 
 
 
 
 
537
  }
538
 
539
+ return $addon_dependencies;
540
  }
541
 
542
  /**
551
  }
552
  }
553
 
554
+ }
common/src/Tribe/Dialog/View.php CHANGED
@@ -47,7 +47,7 @@ class View extends \Tribe__Template {
47
  * @type array $button_classes Any desired classes for the trigger button (optional).
48
  * @type boolean $button_disabled Should the button be disabled (optional).
49
  * @type string $button_text The text for the dialog trigger button ("Open the dialog window").
50
- * @type string $button_type The type for the trigger button (optional).
51
  * @type string $button_value The value for the trigger button (optional).
52
  * @type string $close_event The dialog close event hook name (`tribe_dialog_close_dialog`).
53
  * @type string $content_classes The dialog content classes ("tribe-dialog__content").
@@ -349,7 +349,7 @@ class View extends \Tribe__Template {
349
  private function build_dialog( $content, $id, $args ) {
350
  $default_args = [
351
  'button_classes' => '',
352
- 'button_disabled' => false,
353
  'button_id' => '',
354
  'button_name' => '',
355
  'button_text' => __( 'Open the dialog window', 'tribe-common' ),
47
  * @type array $button_classes Any desired classes for the trigger button (optional).
48
  * @type boolean $button_disabled Should the button be disabled (optional).
49
  * @type string $button_text The text for the dialog trigger button ("Open the dialog window").
50
+ * @type string $button_type The type for the trigger button (optinoal).
51
  * @type string $button_value The value for the trigger button (optional).
52
  * @type string $close_event The dialog close event hook name (`tribe_dialog_close_dialog`).
53
  * @type string $content_classes The dialog content classes ("tribe-dialog__content").
349
  private function build_dialog( $content, $id, $args ) {
350
  $default_args = [
351
  'button_classes' => '',
352
+ 'button_diabled' => false,
353
  'button_id' => '',
354
  'button_name' => '',
355
  'button_text' => __( 'Open the dialog window', 'tribe-common' ),
common/src/Tribe/Freemius.php CHANGED
@@ -15,9 +15,8 @@ class Tribe__Freemius {
15
  private $instances = [];
16
 
17
  /**
18
- * Load the vendor files for Freemius vendor.
19
- *
20
- * Freemius class should only be loaded once since it will be registered as a Singleton.
21
  *
22
  * @since 4.9.5
23
  */
15
  private $instances = [];
16
 
17
  /**
18
+ * Loading of the vendor files for Freemius vendor
19
+ * Freemius class should only be loaded once since it will be registred as a Singleton
 
20
  *
21
  * @since 4.9.5
22
  */
common/src/Tribe/Image/Uploader.php CHANGED
@@ -29,14 +29,13 @@ class Tribe__Image__Uploader {
29
  */
30
  public static function reset_cache() {
31
  self::$attachment_guids_cache = false;
32
- self::$original_urls_cache = false;
33
  }
34
 
35
  /**
36
  * Uploads a file and creates the media attachment or simply returns the attachment ID if existing.
37
  *
38
- * @return int|bool The attachment post ID if the uploading and attachment is successful or the ID refers to an
39
- * attachment;
40
  * `false` otherwise.
41
  */
42
  public function upload_and_get_attachment_id() {
@@ -47,13 +46,8 @@ class Tribe__Image__Uploader {
47
  $existing = false;
48
 
49
  if ( is_string( $this->featured_image ) && ! is_numeric( $this->featured_image ) ) {
50
- // Assume image exists in the local file system.
51
- $id = $this->get_attachment_ID_from_url( $this->featured_image );
52
- if ( ! $id ) {
53
- $id = $this->upload_file( $this->featured_image );
54
- $id = $this->maybe_retry_upload( $id );
55
- }
56
- $existing = (bool) $id;
57
  } elseif ( $post = get_post( $this->featured_image ) ) {
58
  $id = $post && 'attachment' === $post->post_type ? $this->featured_image : false;
59
  } else {
@@ -66,7 +60,7 @@ class Tribe__Image__Uploader {
66
  __CLASS__,
67
  [
68
  'featured_image' => $this->featured_image,
69
- 'exists' => $existing,
70
  'id' => $id,
71
  ]
72
  );
@@ -74,36 +68,6 @@ class Tribe__Image__Uploader {
74
  return $id;
75
  }
76
 
77
- /**
78
- * Retry to upload an image after it failed as was provided, try to decode the URL as in some cases the
79
- * original URL might be encoded HTML components such as: "&" and some CDNs does not handle well different URLs
80
- * as they were provided so we try to recreate the original URL where it might be required.
81
- *
82
- * @since 4.11.5
83
- *
84
- * @param int|bool $id The id of the attachment if was uploaded correctly, false otherwise.
85
- *
86
- * @return int The ID of the attachment after the upload retry.
87
- */
88
- protected function maybe_retry_upload( $id ) {
89
- if ( $id ) {
90
- do_action( 'tribe_log', 'debug', __CLASS__, [ 'message' => "ID: {$id} is already a valid one." ] );
91
-
92
- return $id;
93
- }
94
-
95
- $decoded = esc_url_raw( html_entity_decode( $this->featured_image ) );
96
-
97
- do_action( 'tribe_log', 'debug', __CLASS__, [
98
- 'message' => 'Retry upload decoding the URL of the image',
99
- 'url' => $this->featured_image,
100
- 'decoded' => $decoded,
101
- ] );
102
-
103
- // Maybe the URL was encoded and we need to convert it to a valid URL.
104
- return $this->upload_file( $decoded );
105
- }
106
-
107
  /**
108
  * @param string $file_url
109
  *
@@ -113,147 +77,105 @@ class Tribe__Image__Uploader {
113
  /**
114
  * Allow plugins to enable local URL uploads, mainly used for testing.
115
  *
116
- * @since 4.9.5
117
- *
118
  * @param bool $allow_local_urls Whether to allow local URLs.
119
  * @param string $file_url File URL.
 
 
120
  */
121
  $allow_local_urls = apply_filters( 'tribe_image_uploader_local_urls', false, $file_url );
122
 
123
- if ( ! $allow_local_urls && ! filter_var( $file_url, FILTER_VALIDATE_URL ) ) {
124
  return false;
125
  }
126
 
127
- // These files need to be included as dependencies
128
- require_once( ABSPATH . 'wp-admin/includes/image.php' );
129
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
130
- require_once( ABSPATH . 'wp-admin/includes/media.php' );
131
-
132
- $is_local = false;
133
- // This is a local file no need to fetch it from the wire.
134
- if ( $allow_local_urls && file_exists( $file_url ) ) {
135
- $file = $file_url;
136
- $is_local = true;
137
- } else {
138
- /**
139
- * Some CDN services will append query arguments to the image URL; removing
140
- * them now has the potential of blocking the image fetching completely so we
141
- * let them be here.
142
- */
143
- $file = download_url( $file_url );
144
- if ( is_wp_error( $file ) ) {
145
- do_action( 'tribe_log', 'error', __CLASS__, [
146
- 'message' => $file->get_error_message(),
147
- 'url' => $file_url,
148
- 'error' => $file,
149
- ] );
150
-
151
- return false;
152
- }
153
- }
154
-
155
- // Upload file into WP and leave WP handle the resize and such.
156
- $attachment_id = media_handle_sideload( [
157
- 'name' => $this->create_file_name( $file ),
158
- 'tmp_name' => $file,
159
- 'post_mime_type' => 'image',
160
- ] );
161
 
162
- // Remove the temporary file as is no longer required at this point.
163
- if ( ! $is_local && file_exists( $file ) ) {
164
- @unlink( $file );
165
- }
 
 
 
 
 
 
166
 
167
- if ( is_wp_error( $attachment_id ) ) {
168
- do_action( 'tribe_log', 'error', __CLASS__, [
169
- 'message' => $attachment_id->get_error_message(),
170
- 'url' => $file_url,
171
- 'error' => $attachment_id,
172
- ] );
173
 
174
  return false;
175
  }
176
 
177
- update_post_meta( $attachment_id, '_tribe_importer_original_url', $file_url );
178
 
179
- $this->maybe_init_attachment_guids_cache();
180
- $this->maybe_init_attachment_original_urls_cache();
 
181
 
182
- $attachment_post = get_post( $attachment_id );
183
- // Only update the cache if is a valid attachment.
184
- if ( $attachment_post instanceof WP_Post ) {
185
- self::$attachment_guids_cache[ $attachment_post->guid ] = $attachment_id;
186
- self::$original_urls_cache[ $file_url ] = $attachment_id;
187
  }
188
 
189
- return $attachment_id;
190
- }
191
-
192
- /**
193
- * WordPress requires to have an extension in all all files as uses `wp_check_filetype` which uses the extension
194
- * of the file to define if a file is valid or not, in this case the extension might not be present in some URLs of
195
- * attachments or media files, in those cases we try to guess the right extension using the mime of the file as
196
- * an alternative, if the $filename is a path we can verify the mime type using native WP functions.
197
- *
198
- * @since 4.11.5
199
- *
200
- * @param string $filename The name of the file or URL.
201
- *
202
- * @return string Returned a file name with an extension if is not already part of the file name.
203
- */
204
- protected function create_file_name( $filename ) {
205
- /**
206
  * We use the path basename only here to provided WordPress with a good filename
207
  * that will allow it to correctly detect and validate the extension.
208
  */
209
- $path = wp_parse_url( $filename, PHP_URL_PATH );
 
210
 
211
- $name = basename( $path );
212
- $properties = wp_check_filetype( $name );
 
213
 
214
- // Type can be defined from the name use that one instead.
215
- if ( ! empty( $properties['type'] ) ) {
216
- return $name;
217
  }
218
 
219
- // This is not a file that exists on the system, use the name instead.
220
- if ( ! file_exists( $filename ) ) {
221
- return $name;
 
 
 
 
 
222
  }
223
 
224
- $mime = wp_get_image_mime( $filename );
 
 
 
 
 
 
225
 
226
- // There's no mime defined for the file use the plain name instead.
227
- if ( $mime === '' ) {
228
- return $name;
229
- }
230
 
231
- // create an array with the mimes as the keys and extensions as values.
232
- $mime_to_extensions = array_flip( wp_get_mime_types() );
233
 
234
- // No mime was found for the file on the array of allowed mime types, fallback to the name.
235
- if ( ! isset( $mime_to_extensions[ $mime ] ) ) {
236
- return $name;
237
- }
238
 
239
- // If there are more than one extension just ose one.
240
- $parts = explode( '|', $mime_to_extensions[ $mime ] );
 
 
 
241
 
242
- // Create a new name with extension.
243
- return implode( '.', [ $name, reset( $parts ) ] );
244
  }
245
 
246
  protected function get_attachment_ID_from_url( $featured_image ) {
247
  $this->maybe_init_attachment_guids_cache();
248
  $this->maybe_init_attachment_original_urls_cache();
249
 
250
- $guids_cache = self::$attachment_guids_cache;
251
  $original_urls_cache = self::$original_urls_cache;
252
  if ( isset( $guids_cache[ $featured_image ] ) ) {
253
  return $guids_cache[ $featured_image ];
254
- }
255
-
256
- if ( isset( $original_urls_cache[ $featured_image ] ) ) {
257
  return $original_urls_cache[ $featured_image ];
258
  }
259
 
@@ -267,11 +189,11 @@ class Tribe__Image__Uploader {
267
  $guids = $wpdb->get_results( "SELECT ID, guid FROM $wpdb->posts where post_type = 'attachment'" );
268
 
269
  if ( $guids ) {
270
- $keys = wp_list_pluck( $guids, 'guid' );
271
- $values = wp_list_pluck( $guids, 'ID' );
272
  self::$attachment_guids_cache = array_combine( $keys, $values );
273
  } else {
274
- self::$attachment_guids_cache = [];
275
  }
276
  }
277
  }
@@ -289,11 +211,11 @@ class Tribe__Image__Uploader {
289
  " );
290
 
291
  if ( $original_urls ) {
292
- $keys = wp_list_pluck( $original_urls, 'meta_value' );
293
- $values = wp_list_pluck( $original_urls, 'ID' );
294
  self::$original_urls_cache = array_combine( $keys, $values );
295
  } else {
296
- self::$original_urls_cache = [];
297
  }
298
  }
299
  }
@@ -305,7 +227,7 @@ class Tribe__Image__Uploader {
305
  * @since 4.7.22
306
  *
307
  * @param string $unused_error_code The error numeric code.
308
- * @param string $message The error message.
309
  *
310
  * @throws RuntimeException To pass the error as an exception to
311
  * the handler.
29
  */
30
  public static function reset_cache() {
31
  self::$attachment_guids_cache = false;
32
+ self::$original_urls_cache = false;
33
  }
34
 
35
  /**
36
  * Uploads a file and creates the media attachment or simply returns the attachment ID if existing.
37
  *
38
+ * @return int|bool The attachment post ID if the uploading and attachment is successful or the ID refers to an attachment;
 
39
  * `false` otherwise.
40
  */
41
  public function upload_and_get_attachment_id() {
46
  $existing = false;
47
 
48
  if ( is_string( $this->featured_image ) && ! is_numeric( $this->featured_image ) ) {
49
+ $existing = $this->get_attachment_ID_from_url( $this->featured_image );
50
+ $id = $existing ? $existing : $this->upload_file( $this->featured_image );
 
 
 
 
 
51
  } elseif ( $post = get_post( $this->featured_image ) ) {
52
  $id = $post && 'attachment' === $post->post_type ? $this->featured_image : false;
53
  } else {
60
  __CLASS__,
61
  [
62
  'featured_image' => $this->featured_image,
63
+ 'exists' => (bool) $existing,
64
  'id' => $id,
65
  ]
66
  );
68
  return $id;
69
  }
70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  /**
72
  * @param string $file_url
73
  *
77
  /**
78
  * Allow plugins to enable local URL uploads, mainly used for testing.
79
  *
 
 
80
  * @param bool $allow_local_urls Whether to allow local URLs.
81
  * @param string $file_url File URL.
82
+ *
83
+ * @since 4.9.5
84
  */
85
  $allow_local_urls = apply_filters( 'tribe_image_uploader_local_urls', false, $file_url );
86
 
87
+ if ( ! filter_var( $file_url, FILTER_VALIDATE_URL ) && ! $allow_local_urls ) {
88
  return false;
89
  }
90
 
91
+ /*
92
+ * Since `file_get_contents` would fail silently we set an explicit
93
+ * error handler to catch the content of error.s.
94
+ */
95
+ set_error_handler( array( $this, 'handle_error' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
+ /*
98
+ * Some CDN services will append query arguments to the image URL; removing
99
+ * them now has the potential of blocking the image fetching completely so we
100
+ * let them be here.
101
+ */
102
+ try {
103
+ $contents = file_get_contents( $file_url );
104
+ } catch ( Exception $e ) {
105
+ $message = sprintf( 'Could not upload image file "%s": with message "%s"', $file_url, $e->getMessage() );
106
+ tribe( 'logger' )->log_error( $message, 'Image Uploader' );
107
 
108
+ restore_error_handler();
 
 
 
 
 
109
 
110
  return false;
111
  }
112
 
113
+ restore_error_handler();
114
 
115
+ if ( false === $contents ) {
116
+ $message = sprintf( 'Could not upload image file "%s": failed getting the contents.', $file_url );
117
+ tribe( 'logger' )->log_error( $message, 'Image Uploader' );
118
 
119
+ return false;
 
 
 
 
120
  }
121
 
122
+ /*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  * We use the path basename only here to provided WordPress with a good filename
124
  * that will allow it to correctly detect and validate the extension.
125
  */
126
+ $path = parse_url( $file_url, PHP_URL_PATH );
127
+ $upload = wp_upload_bits( basename( $path ), null, $contents );
128
 
129
+ if ( isset( $upload['error'] ) && $upload['error'] ) {
130
+ $message = sprintf( 'Could not upload image file "%s" with message "%s"', $file_url, $upload['error'] );
131
+ tribe( 'logger' )->log_error( $message, 'Image Uploader' );
132
 
133
+ return false;
 
 
134
  }
135
 
136
+ $type = '';
137
+ if ( ! empty( $upload['type'] ) ) {
138
+ $type = $upload['type'];
139
+ } else {
140
+ $mime = wp_check_filetype( $upload['file'] );
141
+ if ( $mime ) {
142
+ $type = $mime['type'];
143
+ }
144
  }
145
 
146
+ $attachment = array(
147
+ 'post_title' => basename( $upload['file'] ),
148
+ 'post_content' => '',
149
+ 'post_type' => 'attachment',
150
+ 'post_mime_type' => $type,
151
+ 'guid' => $upload['url'],
152
+ );
153
 
154
+ $id = wp_insert_attachment( $attachment, $upload['file'] );
 
 
 
155
 
156
+ require_once( ABSPATH . 'wp-admin/includes/image.php' );
 
157
 
158
+ wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) );
159
+ update_post_meta( $id, '_tribe_importer_original_url', $file_url );
 
 
160
 
161
+ $this->maybe_init_attachment_guids_cache();
162
+ $this->maybe_init_attachment_original_urls_cache();
163
+
164
+ self::$attachment_guids_cache[ get_post( $id )->guid ] = $id;
165
+ self::$original_urls_cache[ $file_url ] = $id;
166
 
167
+ return $id;
 
168
  }
169
 
170
  protected function get_attachment_ID_from_url( $featured_image ) {
171
  $this->maybe_init_attachment_guids_cache();
172
  $this->maybe_init_attachment_original_urls_cache();
173
 
174
+ $guids_cache = self::$attachment_guids_cache;
175
  $original_urls_cache = self::$original_urls_cache;
176
  if ( isset( $guids_cache[ $featured_image ] ) ) {
177
  return $guids_cache[ $featured_image ];
178
+ } elseif ( isset( $original_urls_cache[ $featured_image ] ) ) {
 
 
179
  return $original_urls_cache[ $featured_image ];
180
  }
181
 
189
  $guids = $wpdb->get_results( "SELECT ID, guid FROM $wpdb->posts where post_type = 'attachment'" );
190
 
191
  if ( $guids ) {
192
+ $keys = wp_list_pluck( $guids, 'guid' );
193
+ $values = wp_list_pluck( $guids, 'ID' );
194
  self::$attachment_guids_cache = array_combine( $keys, $values );
195
  } else {
196
+ self::$attachment_guids_cache = array();
197
  }
198
  }
199
  }
211
  " );
212
 
213
  if ( $original_urls ) {
214
+ $keys = wp_list_pluck( $original_urls, 'meta_value' );
215
+ $values = wp_list_pluck( $original_urls, 'ID' );
216
  self::$original_urls_cache = array_combine( $keys, $values );
217
  } else {
218
+ self::$original_urls_cache = array();
219
  }
220
  }
221
  }
227
  * @since 4.7.22
228
  *
229
  * @param string $unused_error_code The error numeric code.
230
+ * @param string $message The error message.
231
  *
232
  * @throws RuntimeException To pass the error as an exception to
233
  * the handler.
common/src/Tribe/Languages/Locations.php CHANGED
@@ -135,7 +135,7 @@ class Tribe__Languages__Locations {
135
  'TF' => esc_html__( 'French Southern Territories', 'tribe-common' ),
136
  'GA' => esc_html__( 'Gabon', 'tribe-common' ),
137
  'GM' => esc_html__( 'Gambia', 'tribe-common' ),
138
- 'GE' => esc_html_x( 'Georgia', 'The country', 'tribe-common' ),
139
  'DE' => esc_html__( 'Germany', 'tribe-common' ),
140
  'GH' => esc_html__( 'Ghana', 'tribe-common' ),
141
  'GI' => esc_html__( 'Gibraltar', 'tribe-common' ),
@@ -331,7 +331,7 @@ class Tribe__Languages__Locations {
331
  'DE' => esc_html__( 'Delaware', 'tribe-common' ),
332
  'DC' => esc_html__( 'District of Columbia', 'tribe-common' ),
333
  'FL' => esc_html__( 'Florida', 'tribe-common' ),
334
- 'GA' => esc_html_x( 'Georgia', 'The US state Georgia','tribe-common' ),
335
  'HI' => esc_html__( 'Hawaii', 'tribe-common' ),
336
  'ID' => esc_html__( 'Idaho', 'tribe-common' ),
337
  'IL' => esc_html__( 'Illinois', 'tribe-common' ),
135
  'TF' => esc_html__( 'French Southern Territories', 'tribe-common' ),
136
  'GA' => esc_html__( 'Gabon', 'tribe-common' ),
137
  'GM' => esc_html__( 'Gambia', 'tribe-common' ),
138
+ 'GE' => esc_html__( 'Georgia', 'tribe-common' ),
139
  'DE' => esc_html__( 'Germany', 'tribe-common' ),
140
  'GH' => esc_html__( 'Ghana', 'tribe-common' ),
141
  'GI' => esc_html__( 'Gibraltar', 'tribe-common' ),
331
  'DE' => esc_html__( 'Delaware', 'tribe-common' ),
332
  'DC' => esc_html__( 'District of Columbia', 'tribe-common' ),
333
  'FL' => esc_html__( 'Florida', 'tribe-common' ),
334
+ 'GA' => esc_html__( 'Georgia', 'tribe-common' ),
335
  'HI' => esc_html__( 'Hawaii', 'tribe-common' ),
336
  'ID' => esc_html__( 'Idaho', 'tribe-common' ),
337
  'IL' => esc_html__( 'Illinois', 'tribe-common' ),
common/src/Tribe/Log/File_Logger.php CHANGED
@@ -27,7 +27,7 @@ class Tribe__Log__File_Logger implements Tribe__Log__Logger {
27
  *
28
  * @var string $log_dir
29
  */
30
- $this->log_dir = apply_filters( 'tribe_file_logger_directory', get_temp_dir() );
31
  }
32
 
33
  /**
27
  *
28
  * @var string $log_dir
29
  */
30
+ $this->log_dir = apply_filters( 'tribe_file_logger_directory', sys_get_temp_dir() );
31
  }
32
 
33
  /**
common/src/Tribe/Main.php CHANGED
@@ -17,7 +17,7 @@ class Tribe__Main {
17
  const OPTIONNAME = 'tribe_events_calendar_options';
18
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
19
 
20
- const VERSION = '4.11.5.1';
21
 
22
  const FEED_URL = 'https://theeventscalendar.com/feed/';
23
 
@@ -55,6 +55,7 @@ class Tribe__Main {
55
  /**
56
  * Constructor for Common Class
57
  *
 
58
  * We are using a `public` constructor here for backwards compatibility.
59
  *
60
  * The way our code used to work we would have `new Tribe__Main()` called directly
@@ -87,8 +88,8 @@ class Tribe__Main {
87
 
88
  $this->promoter_connector();
89
 
90
- add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ], 1 );
91
- add_action( 'tribe_common_loaded', [ $this, 'tribe_common_app_store' ], 10 );
92
  }
93
 
94
  /**
@@ -129,7 +130,7 @@ class Tribe__Main {
129
 
130
  $autoloader = Tribe__Autoloader::instance();
131
 
132
- $prefixes = [ 'Tribe__' => dirname( __FILE__ ) ];
133
  $autoloader->register_prefixes( $prefixes );
134
 
135
  foreach ( glob( $this->plugin_path . 'src/deprecated/*.php' ) as $file ) {
@@ -225,21 +226,21 @@ class Tribe__Main {
225
  // These ones will be enqueued on `admin_enqueue_scripts` if the conditional method on filter is met
226
  tribe_assets(
227
  $this,
228
- [
229
- [ 'tribe-buttonset', 'buttonset.js', [ 'jquery', 'underscore' ] ],
230
- [ 'tribe-common-admin', 'tribe-common-admin.css', [ 'tribe-dependency-style', 'tribe-bumpdown-css', 'tribe-buttonset-style', 'tribe-select2-css' ] ],
231
- [ 'tribe-validation', 'validation.js', [ 'jquery', 'underscore', 'tribe-common', 'tribe-utils-camelcase', 'tribe-tooltipster' ] ],
232
- [ 'tribe-validation-style', 'validation.css', [ 'tribe-tooltipster-css' ] ],
233
- [ 'tribe-dependency', 'dependency.js', [ 'jquery', 'underscore', 'tribe-common' ] ],
234
- [ 'tribe-dependency-style', 'dependency.css', [ 'tribe-select2-css' ] ],
235
- [ 'tribe-pue-notices', 'pue-notices.js', [ 'jquery' ] ],
236
- [ 'tribe-datepicker', 'datepicker.css' ],
237
- ],
238
  'admin_enqueue_scripts',
239
- [
240
- 'conditionals' => [ $this, 'should_load_common_admin_css' ],
241
  'priority' => 5,
242
- ]
243
  );
244
 
245
  tribe_asset(
@@ -278,11 +279,11 @@ class Tribe__Main {
278
  public function load_localize_data() {
279
  $datepicker_months = array_values( Tribe__Date_Utils::get_localized_months_full() );
280
 
281
- tribe( 'asset.data' )->add( 'tribe_l10n_datatables', [
282
- 'aria' => [
283
  'sort_ascending' => __( ': activate to sort column ascending', 'tribe-common' ),
284
  'sort_descending' => __( ': activate to sort column descending', 'tribe-common' ),
285
- ],
286
  'length_menu' => __( 'Show _MENU_ entries', 'tribe-common' ),
287
  'empty_table' => __( 'No data available in table', 'tribe-common' ),
288
  'info' => __( 'Showing _START_ to _END_ of _TOTAL_ entries', 'tribe-common' ),
@@ -293,19 +294,19 @@ class Tribe__Main {
293
  'all_selected_text' => __( 'All items on this page were selected. ', 'tribe-common' ),
294
  'select_all_link' => __( 'Select all pages', 'tribe-common' ),
295
  'clear_selection' => __( 'Clear Selection.', 'tribe-common' ),
296
- 'pagination' => [
297
  'all' => __( 'All', 'tribe-common' ),
298
  'next' => __( 'Next', 'tribe-common' ),
299
  'previous' => __( 'Previous', 'tribe-common' ),
300
- ],
301
- 'select' => [
302
- 'rows' => [
303
  0 => '',
304
  '_' => __( ': Selected %d rows', 'tribe-common' ),
305
  1 => __( ': Selected 1 row', 'tribe-common' ),
306
- ],
307
- ],
308
- 'datepicker' => [
309
  'dayNames' => Tribe__Date_Utils::get_localized_weekdays_full(),
310
  'dayNamesShort' => Tribe__Date_Utils::get_localized_weekdays_short(),
311
  'dayNamesMin' => Tribe__Date_Utils::get_localized_weekdays_initial(),
@@ -318,37 +319,28 @@ class Tribe__Main {
318
  'closeText' => esc_html__( 'Done', 'the-events-calendar' ),
319
  'today' => esc_html__( 'Today', 'the-events-calendar' ),
320
  'clear' => esc_html__( 'Clear', 'the-events-calendar' ),
321
- ],
322
- ] );
323
  }
324
 
325
  /**
326
  * Adds core hooks
327
  */
328
  public function add_hooks() {
329
- add_action( 'plugins_loaded', [ 'Tribe__App_Shop', 'instance' ] );
330
- add_action( 'plugins_loaded', [ $this, 'tribe_plugins_loaded' ], PHP_INT_MAX );
331
 
332
  // Register for the assets to be available everywhere
333
- add_action( 'tribe_common_loaded', [ $this, 'load_assets' ], 1 );
334
- add_action( 'init', [ $this, 'load_localize_data' ] );
335
- add_action( 'plugins_loaded', [ 'Tribe__Admin__Notices', 'instance' ], 1 );
336
- add_action( 'admin_enqueue_scripts', [ $this, 'store_admin_notices' ] );
337
 
338
- add_filter( 'body_class', [ $this, 'add_js_class' ] );
339
- add_action( 'wp_footer', [ $this, 'toggle_js_class' ] );
340
  }
341
 
342
- /**
343
- * Adds `tribe-no-js` class to all pages when common is active.
344
- *
345
- * @since 4.3.4
346
- *
347
- * @param array|string $classes Previous classes on body.
348
- *
349
- * @return array All classes that will be printed on `<body>`.
350
- */
351
- public function add_js_class( $classes = [] ) {
352
  if ( ! is_array( $classes ) ) {
353
  $classes = explode( ' ', $classes );
354
  }
@@ -358,13 +350,6 @@ class Tribe__Main {
358
  return array_filter( array_unique( $classes ) );
359
  }
360
 
361
- /**
362
- * Removes `tribe-no-js` and replaces with `tribe-js` when the Javascript of the page is enabled.
363
- *
364
- * @since 4.3.4
365
- *
366
- * @return void This method only prints HTML to the screen no return.
367
- */
368
  public function toggle_js_class() {
369
  ?>
370
  <script>
@@ -384,7 +369,7 @@ class Tribe__Main {
384
  *
385
  * @since 4.5.7
386
  *
387
- * @return bool Whether we should load Common Admin CSS or not.
388
  */
389
  public function should_load_common_admin_css() {
390
  $helper = Tribe__Admin__Helpers::instance();
@@ -404,15 +389,13 @@ class Tribe__Main {
404
 
405
  /**
406
  * A Helper method to load text domain
407
- * First it tries to load the wp-content/languages translation then if falls to the try to load $dir language files.
 
408
  *
409
- * @since 4.0.1 Introduced.
410
- * @since 4.2 Included $domain and $dir params.
411
  *
412
- * @param string $domain The text domain that will be loaded.
413
- * @param string|false $dir What directory should be used to try to load if the default doesnt work.
414
- *
415
- * @return bool If it was able to load the text domain.
416
  */
417
  public function load_text_domain( $domain, $dir = false ) {
418
  // Added safety just in case this runs twice...
@@ -424,13 +407,13 @@ class Tribe__Main {
424
  $plugin_rel_path = WP_LANG_DIR . '/plugins/';
425
 
426
  /**
427
- * Allows users to filter the file location for a given text domain..
428
  * Be careful when using this filter, it will apply across the whole plugin suite.
429
  *
430
- * @param string $plugin_rel_path The relative path for the language files.
431
- * @param string $domain Which plugin domain we are trying to load.
432
- * @param string $locale Which Language we will load.
433
- * @param string|bool $dir If there was a custom directory passed on the method call.
434
  */
435
  $plugin_rel_path = apply_filters( 'tribe_load_text_domain', $plugin_rel_path, $domain, $locale, $dir );
436
 
@@ -444,21 +427,11 @@ class Tribe__Main {
444
  }
445
 
446
  /**
447
- * Returns the post types registered by Tribe plugins.
448
- *
449
- * @since 4.0.1 Introduced the method.
450
- *
451
- * @return array Slugs for all Post Types registered.
452
  */
453
  public static function get_post_types() {
454
- /**
455
- * We default the post type array to empty in tribe-common. Plugins like TEC add to it.
456
- *
457
- * @since 4.0.1
458
- *
459
- * @param array Slugs for all Post Types registered.
460
- */
461
- return apply_filters( 'tribe_post_types', [] );
462
  }
463
 
464
  /**
@@ -469,6 +442,7 @@ class Tribe__Main {
469
  * @param $insert_array
470
  *
471
  * @return array
 
472
  */
473
  public static function array_insert_after_key( $key, $source_array, $insert_array ) {
474
  if ( array_key_exists( $key, $source_array ) ) {
@@ -520,6 +494,26 @@ class Tribe__Main {
520
  return $candidate_post instanceof WP_Post ? $candidate_post->ID : false;
521
  }
522
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
523
  /**
524
  * Adds a hook
525
  *
@@ -537,7 +531,6 @@ class Tribe__Main {
537
  */
538
  public function tribe_plugins_loaded() {
539
  tribe( 'admin.notice.php.version' );
540
- tribe( 'cache' );
541
  tribe_singleton( 'feature-detection', 'Tribe__Feature_Detection' );
542
  tribe_register_provider( 'Tribe__Service_Providers__Processes' );
543
 
@@ -555,26 +548,22 @@ class Tribe__Main {
555
 
556
  /**
557
  * Registers the slug bound to the implementations in the container.
558
- *
559
- * @since 4.4
560
- *
561
- * @return void Implementation of components loader doesnt return anything.
562
  */
563
  public function bind_implementations() {
564
  tribe_singleton( 'settings.manager', 'Tribe__Settings_Manager' );
565
- tribe_singleton( 'settings', 'Tribe__Settings', [ 'hook' ] );
566
- tribe_singleton( 'ajax.dropdown', 'Tribe__Ajax__Dropdown', [ 'hook' ] );
567
  tribe_singleton( 'assets', 'Tribe__Assets' );
568
- tribe_singleton( 'assets.pipeline', 'Tribe__Assets_Pipeline', [ 'hook' ] );
569
- tribe_singleton( 'asset.data', 'Tribe__Asset__Data', [ 'hook' ] );
570
  tribe_singleton( 'admin.helpers', 'Tribe__Admin__Helpers' );
571
- tribe_singleton( 'tracker', 'Tribe__Tracker', [ 'hook' ] );
572
- tribe_singleton( 'chunker', 'Tribe__Meta__Chunker', [ 'set_post_types', 'hook' ] );
573
  tribe_singleton( 'cache', 'Tribe__Cache', [ 'hook' ] );
574
  tribe_singleton( 'languages.locations', 'Tribe__Languages__Locations' );
575
  tribe_singleton( 'plugins.api', new Tribe__Plugins_API );
576
  tribe_singleton( 'logger', 'Tribe__Log' );
577
- tribe_singleton( 'cost-utils', [ 'Tribe__Cost_Utils', 'instance' ] );
578
  tribe_singleton( 'post-duplicate.strategy-factory', 'Tribe__Duplicate__Strategy_Factory' );
579
  tribe_singleton( 'post-duplicate', 'Tribe__Duplicate__Post' );
580
  tribe_singleton( 'context', 'Tribe__Context' );
@@ -589,8 +578,8 @@ class Tribe__Main {
589
 
590
  tribe_singleton( Tribe__Admin__Help_Page::class, Tribe__Admin__Help_Page::class );
591
 
592
- tribe_singleton( 'admin.notice.php.version', 'Tribe__Admin__Notice__Php_Version', [ 'hook' ] );
593
- tribe_singleton( 'admin.notice.marketing', 'Tribe__Admin__Notice__Marketing', [ 'hook' ] );
594
 
595
  tribe_register_provider( Tribe__Editor__Provider::class );
596
  tribe_register_provider( Tribe__Service_Providers__Debug_Bar::class );
@@ -607,8 +596,6 @@ class Tribe__Main {
607
  * Add a filter to determine_current_user during the setup of common library.
608
  *
609
  * @since 4.9.20
610
- *
611
- * @return void Internal method without any return.
612
  */
613
  public function promoter_connector() {
614
  tribe_singleton( 'promoter.connector', 'Tribe__Promoter__Connector' );
@@ -627,26 +614,6 @@ class Tribe__Main {
627
  ************************/
628
  // @codingStandardsIgnoreStart
629
 
630
- /**
631
- * Helper function to indicate whether the current execution context is AJAX
632
- *
633
- * This method exists to allow us test code that behaves differently depending on the execution
634
- * context.
635
- *
636
- * @since 4.0
637
- *
638
- * @todo Add warning with '_deprecated_function'
639
- *
640
- * @param bool $doing_ajax An injectable status to override the `DOING_AJAX` check.
641
- *
642
- * @deprecated 4.7.12
643
- *
644
- * @return boolean
645
- */
646
- public function doing_ajax( $doing_ajax = null ) {
647
- return tribe( 'context' )->doing_ajax( $doing_ajax );
648
- }
649
-
650
  /**
651
  * Manages PUE license key notifications.
652
  *
17
  const OPTIONNAME = 'tribe_events_calendar_options';
18
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
19
 
20
+ const VERSION = '4.11.1';
21
 
22
  const FEED_URL = 'https://theeventscalendar.com/feed/';
23
 
55
  /**
56
  * Constructor for Common Class
57
  *
58
+ * @access public
59
  * We are using a `public` constructor here for backwards compatibility.
60
  *
61
  * The way our code used to work we would have `new Tribe__Main()` called directly
88
 
89
  $this->promoter_connector();
90
 
91
+ add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ), 1 );
92
+ add_action( 'tribe_common_loaded', array( $this, 'tribe_common_app_store' ), 10 );
93
  }
94
 
95
  /**
130
 
131
  $autoloader = Tribe__Autoloader::instance();
132
 
133
+ $prefixes = array( 'Tribe__' => dirname( __FILE__ ) );
134
  $autoloader->register_prefixes( $prefixes );
135
 
136
  foreach ( glob( $this->plugin_path . 'src/deprecated/*.php' ) as $file ) {
226
  // These ones will be enqueued on `admin_enqueue_scripts` if the conditional method on filter is met
227
  tribe_assets(
228
  $this,
229
+ array(
230
+ array( 'tribe-buttonset', 'buttonset.js', array( 'jquery', 'underscore' ) ),
231
+ array( 'tribe-common-admin', 'tribe-common-admin.css', array( 'tribe-dependency-style', 'tribe-bumpdown-css', 'tribe-buttonset-style', 'tribe-select2-css' ) ),
232
+ array( 'tribe-validation', 'validation.js', array( 'jquery', 'underscore', 'tribe-common', 'tribe-utils-camelcase', 'tribe-tooltipster' ) ),
233
+ array( 'tribe-validation-style', 'validation.css', array( 'tribe-tooltipster-css' ) ),
234
+ array( 'tribe-dependency', 'dependency.js', array( 'jquery', 'underscore', 'tribe-common' ) ),
235
+ array( 'tribe-dependency-style', 'dependency.css', array( 'tribe-select2-css' ) ),
236
+ array( 'tribe-pue-notices', 'pue-notices.js', array( 'jquery' ) ),
237
+ array( 'tribe-datepicker', 'datepicker.css' ),
238
+ ),
239
  'admin_enqueue_scripts',
240
+ array(
241
+ 'conditionals' => array( $this, 'should_load_common_admin_css' ),
242
  'priority' => 5,
243
+ )
244
  );
245
 
246
  tribe_asset(
279
  public function load_localize_data() {
280
  $datepicker_months = array_values( Tribe__Date_Utils::get_localized_months_full() );
281
 
282
+ tribe( 'asset.data' )->add( 'tribe_l10n_datatables', array(
283
+ 'aria' => array(
284
  'sort_ascending' => __( ': activate to sort column ascending', 'tribe-common' ),
285
  'sort_descending' => __( ': activate to sort column descending', 'tribe-common' ),
286
+ ),
287
  'length_menu' => __( 'Show _MENU_ entries', 'tribe-common' ),
288
  'empty_table' => __( 'No data available in table', 'tribe-common' ),
289
  'info' => __( 'Showing _START_ to _END_ of _TOTAL_ entries', 'tribe-common' ),
294
  'all_selected_text' => __( 'All items on this page were selected. ', 'tribe-common' ),
295
  'select_all_link' => __( 'Select all pages', 'tribe-common' ),
296
  'clear_selection' => __( 'Clear Selection.', 'tribe-common' ),
297
+ 'pagination' => array(
298
  'all' => __( 'All', 'tribe-common' ),
299
  'next' => __( 'Next', 'tribe-common' ),
300
  'previous' => __( 'Previous', 'tribe-common' ),
301
+ ),
302
+ 'select' => array(
303
+ 'rows' => array(
304
  0 => '',
305
  '_' => __( ': Selected %d rows', 'tribe-common' ),
306
  1 => __( ': Selected 1 row', 'tribe-common' ),
307
+ ),
308
+ ),
309
+ 'datepicker' => array(
310
  'dayNames' => Tribe__Date_Utils::get_localized_weekdays_full(),
311
  'dayNamesShort' => Tribe__Date_Utils::get_localized_weekdays_short(),
312
  'dayNamesMin' => Tribe__Date_Utils::get_localized_weekdays_initial(),
319
  'closeText' => esc_html__( 'Done', 'the-events-calendar' ),
320
  'today' => esc_html__( 'Today', 'the-events-calendar' ),
321
  'clear' => esc_html__( 'Clear', 'the-events-calendar' ),
322
+ ),
323
+ ) );
324
  }
325
 
326
  /**
327
  * Adds core hooks
328
  */
329
  public function add_hooks() {
330
+ add_action( 'plugins_loaded', array( 'Tribe__App_Shop', 'instance' ) );
331
+ add_action( 'plugins_loaded', array( $this, 'tribe_plugins_loaded' ), PHP_INT_MAX );
332
 
333
  // Register for the assets to be available everywhere
334
+ add_action( 'tribe_common_loaded', array( $this, 'load_assets' ), 1 );
335
+ add_action( 'init', array( $this, 'load_localize_data' ) );
336
+ add_action( 'plugins_loaded', array( 'Tribe__Admin__Notices', 'instance' ), 1 );
337
+ add_action( 'admin_enqueue_scripts', array( $this, 'store_admin_notices' ) );
338
 
339
+ add_filter( 'body_class', array( $this, 'add_js_class' ) );
340
+ add_action( 'wp_footer', array( $this, 'toggle_js_class' ) );
341
  }
342
 
343
+ public function add_js_class( $classes = array() ) {
 
 
 
 
 
 
 
 
 
344
  if ( ! is_array( $classes ) ) {
345
  $classes = explode( ' ', $classes );
346
  }
350
  return array_filter( array_unique( $classes ) );
351
  }
352
 
 
 
 
 
 
 
 
353
  public function toggle_js_class() {
354
  ?>
355
  <script>
369
  *
370
  * @since 4.5.7
371
  *
372
+ * @return bool
373
  */
374
  public function should_load_common_admin_css() {
375
  $helper = Tribe__Admin__Helpers::instance();
389
 
390
  /**
391
  * A Helper method to load text domain
392
+ * First it tries to load the wp-content/languages translation then if falls to the
393
+ * try to load $dir language files
394
  *
395
+ * @param string $domain The text domain that will be loaded
396
+ * @param string $dir What directory should be used to try to load if the default doenst work
397
  *
398
+ * @return bool If it was able to load the text domain
 
 
 
399
  */
400
  public function load_text_domain( $domain, $dir = false ) {
401
  // Added safety just in case this runs twice...
407
  $plugin_rel_path = WP_LANG_DIR . '/plugins/';
408
 
409
  /**
410
+ * Allows users to filter the file location for a given text domain
411
  * Be careful when using this filter, it will apply across the whole plugin suite.
412
  *
413
+ * @param string $plugin_rel_path The relative path for the language files
414
+ * @param string $domain Which plugin domain we are trying to load
415
+ * @param string $locale Which Language we will load
416
+ * @param string|bool $dir If there was a custom directory passed on the method call
417
  */
418
  $plugin_rel_path = apply_filters( 'tribe_load_text_domain', $plugin_rel_path, $domain, $locale, $dir );
419
 
427
  }
428
 
429
  /**
430
+ * Returns the post types registered by Tribe plugins
 
 
 
 
431
  */
432
  public static function get_post_types() {
433
+ // we default the post type array to empty in tribe-common. Plugins like TEC add to it
434
+ return apply_filters( 'tribe_post_types', array() );
 
 
 
 
 
 
435
  }
436
 
437
  /**
442
  * @param $insert_array
443
  *
444
  * @return array
445
+ *
446
  */
447
  public static function array_insert_after_key( $key, $source_array, $insert_array ) {
448
  if ( array_key_exists( $key, $source_array ) ) {
494
  return $candidate_post instanceof WP_Post ? $candidate_post->ID : false;
495
  }
496
 
497
+ /**
498
+ * Helper function to indicate whether the current execution context is AJAX
499
+ *
500
+ * This method exists to allow us test code that behaves differently depending on the execution
501
+ * context.
502
+ *
503
+ * @since 4.0
504
+ *
505
+ * @todo Add warning with '_deprecated_function'
506
+ *
507
+ * @param bool $doing_ajax An injectable status to override the `DOING_AJAX` check.
508
+ *
509
+ * @deprecated 4.7.12
510
+ *
511
+ * @return boolean
512
+ */
513
+ public function doing_ajax( $doing_ajax = null ) {
514
+ return tribe( 'context' )->doing_ajax( $doing_ajax );
515
+ }
516
+
517
  /**
518
  * Adds a hook
519
  *
531
  */
532
  public function tribe_plugins_loaded() {
533
  tribe( 'admin.notice.php.version' );
 
534
  tribe_singleton( 'feature-detection', 'Tribe__Feature_Detection' );
535
  tribe_register_provider( 'Tribe__Service_Providers__Processes' );
536
 
548
 
549
  /**
550
  * Registers the slug bound to the implementations in the container.
 
 
 
 
551
  */
552
  public function bind_implementations() {
553
  tribe_singleton( 'settings.manager', 'Tribe__Settings_Manager' );
554
+ tribe_singleton( 'settings', 'Tribe__Settings', array( 'hook' ) );
555
+ tribe_singleton( 'ajax.dropdown', 'Tribe__Ajax__Dropdown', array( 'hook' ) );
556
  tribe_singleton( 'assets', 'Tribe__Assets' );
557
+ tribe_singleton( 'assets.pipeline', 'Tribe__Assets_Pipeline', array( 'hook' ) );
558
+ tribe_singleton( 'asset.data', 'Tribe__Asset__Data', array( 'hook' ) );
559
  tribe_singleton( 'admin.helpers', 'Tribe__Admin__Helpers' );
560
+ tribe_singleton( 'tracker', 'Tribe__Tracker', array( 'hook' ) );
561
+ tribe_singleton( 'chunker', 'Tribe__Meta__Chunker', array( 'set_post_types', 'hook' ) );
562
  tribe_singleton( 'cache', 'Tribe__Cache', [ 'hook' ] );
563
  tribe_singleton( 'languages.locations', 'Tribe__Languages__Locations' );
564
  tribe_singleton( 'plugins.api', new Tribe__Plugins_API );
565
  tribe_singleton( 'logger', 'Tribe__Log' );
566
+ tribe_singleton( 'cost-utils', array( 'Tribe__Cost_Utils', 'instance' ) );
567
  tribe_singleton( 'post-duplicate.strategy-factory', 'Tribe__Duplicate__Strategy_Factory' );
568
  tribe_singleton( 'post-duplicate', 'Tribe__Duplicate__Post' );
569
  tribe_singleton( 'context', 'Tribe__Context' );
578
 
579
  tribe_singleton( Tribe__Admin__Help_Page::class, Tribe__Admin__Help_Page::class );
580
 
581
+ tribe_singleton( 'admin.notice.php.version', 'Tribe__Admin__Notice__Php_Version', array( 'hook' ) );
582
+ tribe_singleton( 'admin.notice.marketing', 'Tribe__Admin__Notice__Marketing', array( 'hook' ) );
583
 
584
  tribe_register_provider( Tribe__Editor__Provider::class );
585
  tribe_register_provider( Tribe__Service_Providers__Debug_Bar::class );
596
  * Add a filter to determine_current_user during the setup of common library.
597
  *
598
  * @since 4.9.20
 
 
599
  */
600
  public function promoter_connector() {
601
  tribe_singleton( 'promoter.connector', 'Tribe__Promoter__Connector' );
614
  ************************/
615
  // @codingStandardsIgnoreStart
616
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
617
  /**
618
  * Manages PUE license key notifications.
619
  *
common/src/Tribe/Process/Post_Thumbnail_Setter.php CHANGED
@@ -2,6 +2,7 @@
2
 
3
  /**
4
  * Class Tribe__Process__Post_Thumbnail_Setter
 
5
  *
6
  * Handles upload and setting of a post thumbnail in an async process.
7
  * Example usage:
@@ -48,7 +49,7 @@ class Tribe__Process__Post_Thumbnail_Setter extends Tribe__Process__Handler {
48
 
49
  $this->data( $data );
50
 
51
- do_action( 'tribe_log', 'debug', $this->identifier, $data );
52
 
53
  return parent::dispatch();
54
  }
@@ -85,11 +86,10 @@ class Tribe__Process__Post_Thumbnail_Setter extends Tribe__Process__Handler {
85
  *
86
  * @since 4.7.12
87
  *
88
- * @param array|null $data_source An optional source of data.
89
- *
90
  * @see Tribe__Process__Post_Thumbnail_Setter::sync_handle()
91
  *
92
- * @see tribe_upload_image()
93
  */
94
  protected function handle( array $data_source = null ) {
95
  $this->sync_handle( $data_source );
@@ -99,7 +99,11 @@ class Tribe__Process__Post_Thumbnail_Setter extends Tribe__Process__Handler {
99
  * {@inheritdoc}
100
  */
101
  public function sync_handle( array $data_source = null ) {
102
- do_action( 'tribe_log', 'debug', $this->identifier, [ 'status' => 'handling request' ] );
 
 
 
 
103
 
104
  $data_source = isset( $data_source ) ? $data_source : $_POST;
105
 
@@ -112,11 +116,7 @@ class Tribe__Process__Post_Thumbnail_Setter extends Tribe__Process__Handler {
112
  $id = filter_var( $data_source['post_id'], FILTER_SANITIZE_NUMBER_INT );
113
  $post_thumbnail = filter_var( $data_source['post_thumbnail'], FILTER_SANITIZE_STRING );
114
 
115
- do_action( 'tribe_log', 'debug', $this->identifier, [
116
- 'status' => 'fetching thumbnail',
117
- 'post_thumbnail' => $post_thumbnail,
118
- 'post_id' => $id,
119
- ] );
120
 
121
  $thumbnail_id = tribe_upload_image( $post_thumbnail );
122
 
@@ -129,9 +129,9 @@ class Tribe__Process__Post_Thumbnail_Setter extends Tribe__Process__Handler {
129
  'action' => 'fetch',
130
  'post_thumbnail' => $post_thumbnail,
131
  'post_id' => $id,
132
- 'status' => 'could not fetch',
133
  ]
134
  );
 
135
 
136
  return 0;
137
  }
@@ -151,10 +151,11 @@ class Tribe__Process__Post_Thumbnail_Setter extends Tribe__Process__Handler {
151
  'post_thumbnail' => $post_thumbnail,
152
  'attachment_id' => $thumbnail_id,
153
  'post_id' => $id,
154
- 'status' => 'unable to set thumbnail',
155
  ]
156
  );
157
 
 
 
158
  return $thumbnail_id;
159
  }
160
 
@@ -167,10 +168,11 @@ class Tribe__Process__Post_Thumbnail_Setter extends Tribe__Process__Handler {
167
  'post_thumbnail' => $post_thumbnail,
168
  'attachment_id' => $thumbnail_id,
169
  'post_id' => $id,
170
- 'status' => 'completed - attachment created and linked to the post',
171
  ]
172
  );
173
 
 
 
174
  return $thumbnail_id;
175
  }
176
  }
2
 
3
  /**
4
  * Class Tribe__Process__Post_Thumbnail_Setter
5
+
6
  *
7
  * Handles upload and setting of a post thumbnail in an async process.
8
  * Example usage:
49
 
50
  $this->data( $data );
51
 
52
+ do_action( 'tribe_log', 'debug', __CLASS__, $data );
53
 
54
  return parent::dispatch();
55
  }
86
  *
87
  * @since 4.7.12
88
  *
89
+ * @see tribe_upload_image()
 
90
  * @see Tribe__Process__Post_Thumbnail_Setter::sync_handle()
91
  *
92
+ * @param array|null $data_source An optional source of data.
93
  */
94
  protected function handle( array $data_source = null ) {
95
  $this->sync_handle( $data_source );
99
  * {@inheritdoc}
100
  */
101
  public function sync_handle( array $data_source = null ) {
102
+ /** @var Tribe__Log $logger */
103
+ $logger = tribe( 'logger' );
104
+ $log_src = 'Featured image setter';
105
+
106
+ $logger->log_debug( "(ID: {$this->identifier}) - handling request.", $log_src );
107
 
108
  $data_source = isset( $data_source ) ? $data_source : $_POST;
109
 
116
  $id = filter_var( $data_source['post_id'], FILTER_SANITIZE_NUMBER_INT );
117
  $post_thumbnail = filter_var( $data_source['post_thumbnail'], FILTER_SANITIZE_STRING );
118
 
119
+ $logger->log_debug( "(ID: {$this->identifier}) - fetching {$post_thumbnail} for post {$id}", $log_src );
 
 
 
 
120
 
121
  $thumbnail_id = tribe_upload_image( $post_thumbnail );
122
 
129
  'action' => 'fetch',
130
  'post_thumbnail' => $post_thumbnail,
131
  'post_id' => $id,
 
132
  ]
133
  );
134
+ $logger->log_debug( "(ID: {$this->identifier}) - could not fetch {$post_thumbnail} for post {$id}, done.", $log_src );
135
 
136
  return 0;
137
  }
151
  'post_thumbnail' => $post_thumbnail,
152
  'attachment_id' => $thumbnail_id,
153
  'post_id' => $id,
 
154
  ]
155
  );
156
 
157
+ $logger->log_debug( "(ID: {$this->identifier}) - fetched {$post_thumbnail}, created attachment with ID {$thumbnail_id}, unable to set thumbnail for post {$id}, done.", $log_src );
158
+
159
  return $thumbnail_id;
160
  }
161
 
168
  'post_thumbnail' => $post_thumbnail,
169
  'attachment_id' => $thumbnail_id,
170
  'post_id' => $id,
 
171
  ]
172
  );
173
 
174
+ $logger->log_debug( "(ID: {$this->identifier}) - fetched {$post_thumbnail}, created attachment with ID {$thumbnail_id}, set thumbnail for post {$id}, done.", $log_src );
175
+
176
  return $thumbnail_id;
177
  }
178
  }
common/src/Tribe/Promoter/Connector.php CHANGED
@@ -192,7 +192,7 @@ class Tribe__Promoter__Connector {
192
 
193
  $payload = [
194
  'licenseKey' => $license_key,
195
- 'sourceId' => $post_id instanceof WP_Post ? $post_id->ID : $post_id,
196
  ];
197
 
198
  $token = \Firebase\JWT\JWT::encode( $payload, $secret_key );
192
 
193
  $payload = [
194
  'licenseKey' => $license_key,
195
+ 'sourceId' => $post_id,
196
  ];
197
 
198
  $token = \Firebase\JWT\JWT::encode( $payload, $secret_key );
common/src/Tribe/Repository/Query_Filters.php CHANGED
@@ -973,10 +973,10 @@ class Tribe__Repository__Query_Filters {
973
  *
974
  * @since 4.9.5
975
  *
976
- * @param string $orderby The `ORDER BY` clause of the query being filtered.
977
- * @param WP_Query $query The query object currently being filtered.
978
  *
979
- * @return string The filtered `ORDER BY` clause.
980
  */
981
  public function filter_posts_orderby( $orderby, WP_Query $query ) {
982
  if ( $query !== $this->current_query ) {
973
  *
974
  * @since 4.9.5
975
  *
976
+ * @param string $orderby
977
+ * @param WP_Query $query
978
  *
979
+ * @return string
980
  */
981
  public function filter_posts_orderby( $orderby, WP_Query $query ) {
982
  if ( $query !== $this->current_query ) {
common/src/Tribe/Rewrite.php CHANGED
@@ -26,14 +26,6 @@ class Tribe__Rewrite {
26
  * @var static
27
  */
28
  public static $instance;
29
- /**
30
- * A delimiter used to separate a localized matcher from its base in the format `<loc_matcher><delim><base>`.
31
- *
32
- * @since 4.11.5
33
- *
34
- * @var string
35
- */
36
- protected static $localized_matcher_delimiter = '~';
37
 
38
  /**
39
  * WP_Rewrite Instance
@@ -197,17 +189,6 @@ class Tribe__Rewrite {
197
  remove_action( 'shutdown', [ $this, 'dump_cache' ] );
198
  }
199
 
200
- /**
201
- * Determines if we have plain permalink.
202
- *
203
- * @since 4.11.2
204
- *
205
- * @return bool If we use plain permalink or not.
206
- */
207
- public static function is_plain_permalink() {
208
- return tribe_context()->is( 'plain_permalink' );
209
- }
210
-
211
  /**
212
  * Get the base slugs for the rewrite rules.
213
  *
@@ -426,9 +407,6 @@ class Tribe__Rewrite {
426
  $query = (string) parse_url( $url, PHP_URL_QUERY );
427
  wp_parse_str( $query, $query_vars );
428
 
429
- // Drop any query var that is not a scalar; it should not be handled.
430
- $query_vars = array_filter( $query_vars, 'is_scalar' );
431
-
432
  if ( isset( $query_vars['paged'] ) && 1 === (int) $query_vars['paged'] ) {
433
  // Remove the `paged` query var if it's 1.
434
  unset( $query_vars['paged'] );
@@ -516,30 +494,13 @@ class Tribe__Rewrite {
516
  /*
517
  * We use `end` as, by default, the localized version of the slug in the current language will be at the
518
  * end of the array.
 
519
  */
520
  return end( $localized_matcher['localized_slugs'] );
521
  }, $localized_matchers );
522
 
523
  // Include dynamic matchers now.
524
  $replace = array_merge( $dynamic_matchers, $replace );
525
-
526
- /*
527
- * Prune from the replacements the empty values. This will resolve conflicts (e.g. single and archive w/
528
- * same slug) as no two can be true at the same time.
529
- * Remove the `<delim><base>` prefix added to localized matchers, if any.
530
- */
531
- $replace = array_filter( $replace );
532
- $replace = array_combine(
533
- array_map( static function ( $key ) {
534
- return preg_replace(
535
- '/' . preg_quote( Tribe__Rewrite::$localized_matcher_delimiter ) . '\\w*$/',
536
- '',
537
- $key
538
- );
539
- }, array_keys( $replace ) ),
540
- $replace
541
- );
542
-
543
  $replaced = str_replace( array_keys( $replace ), $replace, $link_template );
544
 
545
  // Remove trailing chars.
@@ -647,22 +608,17 @@ class Tribe__Rewrite {
647
  static $cache_var_name = __METHOD__;
648
 
649
  $bases = (array) $this->get_bases();
650
-
651
  $query_var_map = $this->get_matcher_to_query_var_map();
652
 
653
  $localized_matchers = tribe_get_var( $cache_var_name, [] );
654
 
655
  foreach ( $bases as $base => $localized_matcher ) {
656
- // Use the base too to allow possible conflicts if the slugs are the same for single and archive.
657
- $localized_matcher_key = $localized_matcher . static::$localized_matcher_delimiter . $base;
658
-
659
- if ( isset( $localized_matchers[ $localized_matcher_key ] ) ) {
660
  continue;
661
  }
662
 
663
  if ( isset( $query_var_map[ $base ] ) ) {
664
- $localized_matchers[ $localized_matcher_key ] = [
665
- 'base' => $base,
666
  'query_var' => $query_var_map[ $base ],
667
  'en_slug' => $base,
668
  'localized_slugs' => [ $base ],
@@ -672,7 +628,7 @@ class Tribe__Rewrite {
672
  if ( ! empty( $buffer['slugs'] ) ) {
673
  $slugs = explode( '|', $buffer['slugs'] );
674
 
675
- $localized_matchers[ $localized_matcher_key ]['localized_slugs'] = array_map(
676
  static function ( $localized_slug ) {
677
  return str_replace( '\-', '-', $localized_slug );
678
  },
@@ -680,7 +636,7 @@ class Tribe__Rewrite {
680
  );
681
 
682
  // The English version is the first.
683
- $localized_matchers[ $localized_matcher_key ]['en_slug'] = reset( $slugs );
684
  }
685
  }
686
  }
@@ -1013,11 +969,6 @@ class Tribe__Rewrite {
1013
  $query_vars = array_merge( $url_query_vars, $query_vars );
1014
  }
1015
 
1016
- // Prune the query vars to drop the empty `page` or `paged` ones.
1017
- $query_vars = array_filter( $query_vars, static function ( $value, $key ) {
1018
- return ! in_array( $key, [ 'paged', 'page' ] ) || (int) $value !== 0;
1019
- }, ARRAY_FILTER_USE_BOTH );
1020
-
1021
  /**
1022
  * Filters the array of parsed query variables after the class logic has been applied to it.
1023
  *
26
  * @var static
27
  */
28
  public static $instance;
 
 
 
 
 
 
 
 
29
 
30
  /**
31
  * WP_Rewrite Instance
189
  remove_action( 'shutdown', [ $this, 'dump_cache' ] );
190
  }
191
 
 
 
 
 
 
 
 
 
 
 
 
192
  /**
193
  * Get the base slugs for the rewrite rules.
194
  *
407
  $query = (string) parse_url( $url, PHP_URL_QUERY );
408
  wp_parse_str( $query, $query_vars );
409
 
 
 
 
410
  if ( isset( $query_vars['paged'] ) && 1 === (int) $query_vars['paged'] ) {
411
  // Remove the `paged` query var if it's 1.
412
  unset( $query_vars['paged'] );
494
  /*
495
  * We use `end` as, by default, the localized version of the slug in the current language will be at the
496
  * end of the array.
497
+ * @todo here we should keep a map, that has to generated at permalink flush time, to map locales/slugs.
498
  */
499
  return end( $localized_matcher['localized_slugs'] );
500
  }, $localized_matchers );
501
 
502
  // Include dynamic matchers now.
503
  $replace = array_merge( $dynamic_matchers, $replace );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
504
  $replaced = str_replace( array_keys( $replace ), $replace, $link_template );
505
 
506
  // Remove trailing chars.
608
  static $cache_var_name = __METHOD__;
609
 
610
  $bases = (array) $this->get_bases();
 
611
  $query_var_map = $this->get_matcher_to_query_var_map();
612
 
613
  $localized_matchers = tribe_get_var( $cache_var_name, [] );
614
 
615
  foreach ( $bases as $base => $localized_matcher ) {
616
+ if ( isset( $localized_matchers[ $localized_matcher ] ) ) {
 
 
 
617
  continue;
618
  }
619
 
620
  if ( isset( $query_var_map[ $base ] ) ) {
621
+ $localized_matchers[ $localized_matcher ] = [
 
622
  'query_var' => $query_var_map[ $base ],
623
  'en_slug' => $base,
624
  'localized_slugs' => [ $base ],
628
  if ( ! empty( $buffer['slugs'] ) ) {
629
  $slugs = explode( '|', $buffer['slugs'] );
630
 
631
+ $localized_matchers[ $localized_matcher ]['localized_slugs'] = array_map(
632
  static function ( $localized_slug ) {
633
  return str_replace( '\-', '-', $localized_slug );
634
  },
636
  );
637
 
638
  // The English version is the first.
639
+ $localized_matchers[ $localized_matcher ]['en_slug'] = reset( $slugs );
640
  }
641
  }
642
  }
969
  $query_vars = array_merge( $url_query_vars, $query_vars );
970
  }
971
 
 
 
 
 
 
972
  /**
973
  * Filters the array of parsed query variables after the class logic has been applied to it.
974
  *
common/src/Tribe/Service_Providers/Debug_Bar.php CHANGED
@@ -1,5 +1,4 @@
1
  <?php
2
-
3
  /**
4
  * Hooks and manages the plugins Debug Bar integrations.
5
  *
@@ -35,7 +34,6 @@ class Tribe__Service_Providers__Debug_Bar extends tad_DI52_ServiceProvider {
35
  */
36
  $tribe_panels = apply_filters( 'tribe_debug_bar_panels', array(
37
  new Tribe__Debug_Bar__Panels__Context(),
38
- new Tribe__Debug_Bar__Panels__Json_Ld(),
39
  ) );
40
 
41
  if ( count( $tribe_panels ) > 0 ) {
1
  <?php
 
2
  /**
3
  * Hooks and manages the plugins Debug Bar integrations.
4
  *
34
  */
35
  $tribe_panels = apply_filters( 'tribe_debug_bar_panels', array(
36
  new Tribe__Debug_Bar__Panels__Context(),
 
37
  ) );
38
 
39
  if ( count( $tribe_panels ) > 0 ) {
common/src/Tribe/Validate.php CHANGED
@@ -239,10 +239,7 @@ if ( ! class_exists( 'Tribe__Validate' ) ) {
239
 
240
  // esc_url_raw does the work of validating chars, but returns the checked string with a
241
  // prepended URL protocol; so let's use strpos to match the values.
242
- if (
243
- ! empty( $maybe_valid_value )
244
- && false !== strpos( $maybe_valid_value, $this->value )
245
- ) {
246
  $this->result->valid = true;
247
  $this->value = sanitize_title( $this->value );
248
  } else {
239
 
240
  // esc_url_raw does the work of validating chars, but returns the checked string with a
241
  // prepended URL protocol; so let's use strpos to match the values.
242
+ if ( false !== strpos( $maybe_valid_value, $this->value ) ) {
 
 
 
243
  $this->result->valid = true;
244
  $this->value = sanitize_title( $this->value );
245
  } else {
common/src/Tribe/Validator/Base.php CHANGED
@@ -158,9 +158,7 @@ class Tribe__Validator__Base implements Tribe__Validator__Interface {
158
  public function is_image( $image ) {
159
  if ( $this->is_numeric( $image ) ) {
160
  return wp_attachment_is_image( $image );
161
- }
162
-
163
- if ( is_string( $image ) ) {
164
  $response = wp_remote_head( $image );
165
 
166
  if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
158
  public function is_image( $image ) {
159
  if ( $this->is_numeric( $image ) ) {
160
  return wp_attachment_is_image( $image );
161
+ } elseif ( is_string( $image ) ) {
 
 
162
  $response = wp_remote_head( $image );
163
 
164
  if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
common/src/functions/template-tags/general.php CHANGED
@@ -765,17 +765,4 @@ if ( ! function_exists( 'tribe_context' ) ) {
765
 
766
  return $context;
767
  }
768
- }
769
-
770
- if ( ! function_exists( 'tribe_cache' ) ) {
771
- /**
772
- * Returns the current Tribe Cache instance.
773
- *
774
- * @since 4.11.2
775
- *
776
- * @return Tribe__Cache The current cache instance.
777
- */
778
- function tribe_cache() {
779
- return tribe( 'cache' );
780
- }
781
- }
765
 
766
  return $context;
767
  }
768
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
common/src/functions/template-tags/post.php CHANGED
@@ -11,9 +11,9 @@
11
  *
12
  * @param string $more_link_text Optional. Content for when there is more text.
13
  * @param bool $strip_teaser Optional. Strip teaser content before the more text. Default is false.
14
- * @param WP_Post|object|int $post_id Optional. WP_Post instance or Post ID/object. Default is null.
15
  *
16
- * @return string
17
  */
18
  function tribe_get_the_content( $more_link_text = null, $strip_teaser = false, $post_id = null ) {
19
  global $post, $wp_version;
@@ -30,17 +30,14 @@ function tribe_get_the_content( $more_link_text = null, $strip_teaser = false, $
30
  $content = get_the_content( $more_link_text, $strip_teaser );
31
  }
32
 
33
- if ( ! doing_filter( 'the_content' ) ) {
34
- /**
35
- * Filters the post content.
36
- *
37
- * @since 0.71 of WordPress
38
- *
39
- * @param string $content Content of the current post.
40
- */
41
- $content = apply_filters( 'the_content', $content );
42
- }
43
-
44
  $content = str_replace( ']]>', ']]&gt;', $content );
45
 
46
  $post = $previous_post;
@@ -58,7 +55,7 @@ function tribe_get_the_content( $more_link_text = null, $strip_teaser = false, $
58
  *
59
  * @param string $more_link_text Optional. Content for when there is more text.
60
  * @param bool $strip_teaser Optional. Strip teaser content before the more text. Default is false.
61
- * @param WP_Post|object|int $post_id Optional. WP_Post instance or Post ID/object. Default is null.
62
  *
63
  * @return void
64
  */
@@ -72,7 +69,7 @@ function tribe_the_content( $more_link_text = null, $strip_teaser = false, $post
72
  * @since 4.11.0
73
  *
74
  * @param string|string[] $class Space-separated string or array of class names to add to the class list.
75
- * @param int|WP_Post $post Optional. Post ID or post object.
76
  *
77
  * @return string[] Array of class names.
78
  */
11
  *
12
  * @param string $more_link_text Optional. Content for when there is more text.
13
  * @param bool $strip_teaser Optional. Strip teaser content before the more text. Default is false.
14
+ * @param WP_Post|object|int $post Optional. WP_Post instance or Post ID/object. Default is null.
15
  *
16
+ * @return void
17
  */
18
  function tribe_get_the_content( $more_link_text = null, $strip_teaser = false, $post_id = null ) {
19
  global $post, $wp_version;
30
  $content = get_the_content( $more_link_text, $strip_teaser );
31
  }
32
 
33
+ /**
34
+ * Filters the post content.
35
+ *
36
+ * @since 0.71 of WordPress
37
+ *
38
+ * @param string $content Content of the current post.
39
+ */
40
+ $content = apply_filters( 'the_content', $content );
 
 
 
41
  $content = str_replace( ']]>', ']]&gt;', $content );
42
 
43
  $post = $previous_post;
55
  *
56
  * @param string $more_link_text Optional. Content for when there is more text.
57
  * @param bool $strip_teaser Optional. Strip teaser content before the more text. Default is false.
58
+ * @param WP_Post|object|int $post Optional. WP_Post instance or Post ID/object. Default is null.
59
  *
60
  * @return void
61
  */
69
  * @since 4.11.0
70
  *
71
  * @param string|string[] $class Space-separated string or array of class names to add to the class list.
72
+ * @param int|WP_Post $post_id Optional. Post ID or post object.
73
  *
74
  * @return string[] Array of class names.
75
  */
common/src/functions/utils.php CHANGED
@@ -156,7 +156,7 @@ if ( ! function_exists( 'tribe_get_global_query_object' ) ) {
156
  *
157
  * @since 4.7.8
158
  *
159
- * @return WP_Query The $wp_query, the $wp_the_query if $wp_query empty, null otherwise.
160
  */
161
  function tribe_get_global_query_object() {
162
  global $wp_query;
156
  *
157
  * @since 4.7.8
158
  *
159
+ * @return object The $wp_query, the $wp_the_query if $wp_query empty, null otherwise.
160
  */
161
  function tribe_get_global_query_object() {
162
  global $wp_query;
common/src/modules/components/form/index.js ADDED
@@ -0,0 +1 @@
 
1
+ export { default as Select } from './select';
common/src/modules/components/form/select/component.js ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { PureComponent } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import { noop, partial, find } from 'lodash';
7
+ import classnames from 'classnames';
8
+ import {
9
+ Dropdown,
10
+ Dashicon,
11
+ } from '@wordpress/components';
12
+ import { ScrollTo, ScrollArea } from 'react-scroll-to';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import { PreventBlockClose } from '@moderntribe/common/components';
18
+ import './style.pcss';
19
+
20
+ export default class Select extends PureComponent {
21
+ static propTypes = {
22
+ options: PropTypes.shape( {
23
+ label: PropTypes.string,
24
+ value: PropTypes.any,
25
+ } ),
26
+ onOptionClick: PropTypes.func.isRequired,
27
+ optionClassName: PropTypes.string,
28
+ isOpen: PropTypes.bool.isRequired,
29
+ value: PropTypes.any,
30
+ className: PropTypes.string,
31
+ }
32
+
33
+ static defaultProps = {
34
+ onOptionClick: noop,
35
+ isOpen: true,
36
+ optionClassName: '',
37
+ }
38
+
39
+ _onOptionClick = ( onClose, value, e ) => {
40
+ this.props.onOptionClick( value, e );
41
+ onClose();
42
+ }
43
+
44
+ get selected() {
45
+ return find( this.props.options, option => option.value === this.props.value );
46
+ }
47
+
48
+ get label() {
49
+ const selected = this.selected;
50
+ return selected && selected.label;
51
+ }
52
+
53
+ renderOptions = ( onClose ) => (
54
+ this.props.options.map( ( option ) => (
55
+ <button
56
+ className={ classnames(
57
+ 'tribe-common-form-select__options__option',
58
+ this.props.optionClassName
59
+ ) }
60
+ key={ option.value }
61
+ onClick={ partial( this._onOptionClick, onClose, option.value ) }
62
+ role="menuitem"
63
+ type="button"
64
+ value={ option.value }
65
+ >
66
+ { option.label }
67
+ </button>
68
+ ) )
69
+ )
70
+
71
+ renderToggle = ( { onToggle, isOpen } ) => (
72
+ <div className="tribe-common-form-select__toggle">
73
+ <button
74
+ type="button"
75
+ aria-expanded={ isOpen }
76
+ onClick={ onToggle }
77
+ >
78
+ <span>{ this.label }</span>
79
+ <Dashicon
80
+ className="btn--icon"
81
+ icon={ isOpen ? 'arrow-up' : 'arrow-down' }
82
+ />
83
+ </button>
84
+ </div>
85
+ )
86
+
87
+ renderContent = ( { onClose } ) => (
88
+ <ScrollTo>
89
+ { () => (
90
+ <PreventBlockClose>
91
+ <ScrollArea
92
+ role="menu"
93
+ className={ classnames( 'tribe-common-form-select__options' ) }
94
+ >
95
+ { this.renderOptions( onClose ) }
96
+ </ScrollArea>
97
+ </PreventBlockClose>
98
+ ) }
99
+ </ScrollTo>
100
+
101
+ );
102
+
103
+ render() {
104
+ return (
105
+ <Dropdown
106
+ className={ classnames( 'tribe-common-form-select',
107
+ this.props.className
108
+ ) }
109
+ position="bottom center"
110
+ contentClassName="tribe-common-form-select__content"
111
+ renderToggle={ this.renderToggle }
112
+ renderContent={ this.renderContent }
113
+ />
114
+ );
115
+ }
116
+ }
common/src/modules/components/form/select/index.js ADDED
@@ -0,0 +1 @@
 
1
+ export { default } from './component';
common/src/modules/components/form/select/style.pcss ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-common-form-select {
2
+ display: flex;
3
+
4
+ & > div {
5
+ flex: 0 0 auto;
6
+ min-width: 193px;
7
+ }
8
+
9
+ &__toggle {
10
+ background-color: #FFF;
11
+ border-radius: 2px;
12
+ border: 2px solid #EAEBEC;
13
+
14
+ & button {
15
+ align-items: center;
16
+ background-color: #FEFFFE;
17
+ border: none;
18
+ color: #545D66;
19
+ display: flex;
20
+ font-family: Helvetica, sans-serif;
21
+ font-size: 16px;
22
+ font-weight: 400;
23
+ font-weight: normal;
24
+ justify-content: center;
25
+ line-height: 1.5;
26
+ padding: 6px 10px;
27
+ text-align: left;
28
+ text-decoration: none;
29
+ width: 100%;
30
+
31
+ & > span {
32
+ flex: 1;
33
+ }
34
+ }
35
+ }
36
+
37
+ &__options {
38
+
39
+ &__option {
40
+ background: transparent;
41
+ border: 0;
42
+ color: #555d66;
43
+ cursor: pointer;
44
+ display: block;
45
+ line-height: 20px;
46
+ padding: 5px 12px;
47
+ text-align: left;
48
+ width: 100%;
49
+
50
+ &:hover {
51
+ background-color: #009fd4;
52
+ color: #fff;
53
+ }
54
+ }
55
+ }
56
+ }
common/src/modules/components/index.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /* eslint-disable max-len */
2
+ export { default as PluginBlockHooks } from '@moderntribe/common/components/plugin-block-hooks';
3
+ export { default as PreventBlockClose } from '@moderntribe/common/components/prevent-block-close';
4
+ export * from './form';
5
+
common/src/modules/components/plugin-block-hooks/__tests__/__snapshots__/plugin-block-hooks.spec.js.snap ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`PluginBlockHooks should match snapshot 1`] = `
4
+ <div
5
+ className="tribe-common__plugin-block-hook"
6
+ >
7
+ <InnerBlocks
8
+ template={
9
+ Array [
10
+ Array [
11
+ "tribe/event-datetime",
12
+ Object {},
13
+ ],
14
+ Array [
15
+ "tribe/event-pro-recurring",
16
+ Object {},
17
+ ],
18
+ Array [
19
+ "tribe/event-pro-exclusion",
20
+ Object {},
21
+ ],
22
+ ]
23
+ }
24
+ templateInsertUpdatesSelection={false}
25
+ />
26
+ </div>
27
+ `;
28
+
29
+ exports[`PluginBlockHooks should not hook in unregistered blocks 1`] = `
30
+ <div
31
+ className="tribe-common__plugin-block-hook"
32
+ >
33
+ <InnerBlocks
34
+ template={
35
+ Array [
36
+ Array [
37
+ "tribe/event-datetime",
38
+ Object {},
39
+ ],
40
+ Array [
41
+ "tribe/event-pro-recurring",
42
+ Object {},
43
+ ],
44
+ Array [
45
+ "tribe/event-pro-exclusion",
46
+ Object {},
47
+ ],
48
+ ]
49
+ }
50
+ templateInsertUpdatesSelection={false}
51
+ />
52
+ </div>
53
+ `;
54
+
55
+ exports[`PluginBlockHooks should only render events templates 1`] = `
56
+ <div
57
+ className="tribe-common__plugin-block-hook"
58
+ >
59
+ <InnerBlocks
60
+ template={
61
+ Array [
62
+ Array [
63
+ "tribe/event-datetime",
64
+ Object {},
65
+ ],
66
+ ]
67
+ }
68
+ templateInsertUpdatesSelection={false}
69
+ />
70
+ </div>
71
+ `;
72
+
73
+ exports[`PluginBlockHooks should only render events-pro templates 1`] = `
74
+ <div
75
+ className="tribe-common__plugin-block-hook"
76
+ >
77
+ <InnerBlocks
78
+ template={
79
+ Array [
80
+ Array [
81
+ "tribe/event-pro-recurring",
82
+ Object {},
83
+ ],
84
+ Array [
85
+ "tribe/event-pro-exclusion",
86
+ Object {},
87
+ ],
88
+ ]
89
+ }
90
+ templateInsertUpdatesSelection={false}
91
+ />
92
+ </div>
93
+ `;
94
+
95
+ exports[`PluginBlockHooks should recursively hook blocks 1`] = `
96
+ <div
97
+ className="tribe-common__plugin-block-hook"
98
+ >
99
+ <InnerBlocks
100
+ template={
101
+ Array [
102
+ Array [
103
+ "tribe/event-pro-recurring",
104
+ Object {},
105
+ ],
106
+ Array [
107
+ "tribe/event-cool-container1",
108
+ Object {},
109
+ Array [
110
+ Array [
111
+ "tribe/event-pro-recurring",
112
+ Object {},
113
+ ],
114
+ Array [
115
+ "tribe/event-cool-container2",
116
+ Object {},
117
+ Array [
118
+ Array [
119
+ "tribe/event-pro-recurring",
120
+ Object {},
121
+ ],
122
+ ],
123
+ ],
124
+ ],
125
+ ],
126
+ ]
127
+ }
128
+ templateInsertUpdatesSelection={false}
129
+ />
130
+ </div>
131
+ `;
common/src/modules/components/plugin-block-hooks/__tests__/plugin-block-hooks.spec.js ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import React from 'react';
5
+ import renderer from 'react-test-renderer';
6
+
7
+ /**
8
+ * Internal Dependencies
9
+ */
10
+ import PluginBlockHooks from '../component';
11
+
12
+ jest.mock( '@wordpress/editor', () => ( {
13
+ InnerBlocks: 'InnerBlocks',
14
+ } ) );
15
+ jest.mock( '@wordpress/data', () => ( {
16
+ select: jest.fn( () => ( {
17
+ getBlockTypes: jest.fn( () => ( [
18
+ { name: 'tribe/event-datetime' },
19
+ { name: 'tribe/event-pro-recurring' },
20
+ { name: 'tribe/event-pro-exclusion' },
21
+ { name: 'tribe/event-cool-container1' },
22
+ { name: 'tribe/event-cool-container2' },
23
+ ] ) ),
24
+ } ) ),
25
+ } ) );
26
+
27
+ describe( 'PluginBlockHooks', () => {
28
+ let props;
29
+ beforeEach( () => {
30
+ props = {
31
+ plugins: [ 'events', 'events-pro', 'events-cool' ],
32
+ pluginTemplates: {
33
+ 'events': [
34
+ [ 'tribe/event-datetime', {}],
35
+ ],
36
+ 'events-pro': [
37
+ [ 'tribe/event-pro-recurring', {}],
38
+ [ 'tribe/event-pro-exclusion', {}],
39
+ ],
40
+ },
41
+ };
42
+ } );
43
+
44
+ test( 'should match snapshot', () => {
45
+ const component = renderer.create(
46
+ <PluginBlockHooks { ...props } />
47
+ );
48
+ expect( component.toJSON() ).toMatchSnapshot();
49
+ } );
50
+ test( 'should only render events templates', () => {
51
+ props.plugins = props.plugins.filter( plugin => plugin === 'events' );
52
+ const component = renderer.create(
53
+ <PluginBlockHooks { ...props } />
54
+ );
55
+ expect( component.toJSON() ).toMatchSnapshot();
56
+ } );
57
+ test( 'should only render events-pro templates', () => {
58
+ props.plugins = props.plugins.filter( plugin => plugin === 'events-pro' );
59
+ const component = renderer.create(
60
+ <PluginBlockHooks { ...props } />
61
+ );
62
+ expect( component.toJSON() ).toMatchSnapshot();
63
+ } );
64
+ test( 'should not hook in unregistered blocks', () => {
65
+ props.pluginTemplates.events.push( [ 'i-dont-exist', {}] );
66
+ const component = renderer.create(
67
+ <PluginBlockHooks { ...props } />
68
+ );
69
+ expect( component.toJSON() ).toMatchSnapshot();
70
+ } );
71
+ test( 'should recursively hook blocks', () => {
72
+ delete props.pluginTemplates.events;
73
+ delete props.pluginTemplates[ 'events-pro' ];
74
+ props.pluginTemplates[ 'events-cool' ] = [
75
+ [ 'tribe/event-pro-recurring', {}],
76
+ [ 'tribe/event-cool-container1', {}, [
77
+ [ 'tribe/event-pro-recurring', {}],
78
+ [ 'tribe/event-cool-container2', {}, [
79
+ [ 'tribe/event-pro-recurring', {}],
80
+ [ 'dont-register-me', {}],
81
+ ] ],
82
+ [ 'dont-register-2me', {}],
83
+ ],
84
+ [ 'dont-register-me', {}],
85
+ ],
86
+ ];
87
+ const component = renderer.create(
88
+ <PluginBlockHooks { ...props } />
89
+ );
90
+ expect( component.toJSON() ).toMatchSnapshot();
91
+ } );
92
+ } );
common/src/modules/components/plugin-block-hooks/component.js ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { PureComponent } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import { map, reduce, includes, isArray } from 'lodash';
7
+ import { InnerBlocks } from '@wordpress/editor';
8
+ import { select } from '@wordpress/data';
9
+ import './style.pcss';
10
+
11
+ /**
12
+ * Allows for dynamic plugin templates based on current plugins available
13
+ * utilizing InnerBlocks api
14
+ *
15
+ * @export
16
+ * @class PluginBlockHooks
17
+ * @extends {PureComponent}
18
+ */
19
+ export default class PluginBlockHooks extends PureComponent {
20
+ static propTypes = {
21
+ allowedBlocks: PropTypes.arrayOf( PropTypes.string ),
22
+ layouts: PropTypes.oneOfType( [
23
+ PropTypes.object,
24
+ PropTypes.arrayOf( PropTypes.object ),
25
+ ] ),
26
+ /**
27
+ * Plugins to be used
28
+ */
29
+ plugins: PropTypes.arrayOf( PropTypes.string ).isRequired,
30
+ /**
31
+ * Plugin template structure needed to properly
32
+ * register new templates for each plugin
33
+ *
34
+ *
35
+ * ```js
36
+ * {
37
+ * 'events': [
38
+ * [ 'tribe/event-datetime', {}],
39
+ * ],
40
+ * 'events-pro': [
41
+ * [ 'tribe/event-pro-recurring', {}],
42
+ * [ 'tribe/event-pro-exclusion', {}],
43
+ * ],
44
+ * 'events-cool': [
45
+ * [ 'tribe/event-cool-container', {}, [
46
+ * [ 'tribe/event-cool-column', {}],
47
+ * [ 'tribe/event-cool-column', {}],
48
+ * ]]
49
+ * ],
50
+ * }
51
+ * ```
52
+ */
53
+ pluginTemplates: PropTypes.objectOf( PropTypes.arrayOf( PropTypes.array ) ),
54
+ templateInsertUpdatesSelection: PropTypes.bool.isRequired,
55
+ templateLock: PropTypes.oneOf( [
56
+ 'all',
57
+ 'insert',
58
+ false,
59
+ ] ),
60
+ }
61
+
62
+ static defaultProps = {
63
+ templateInsertUpdatesSelection: false,
64
+ }
65
+
66
+ /**
67
+ * Registered block names from core
68
+ *
69
+ * @readonly
70
+ * @memberof PluginBlockHooks
71
+ * @returns {Array} block names
72
+ */
73
+ get registeredBlockNames() {
74
+ const blockTypes = select( 'core/blocks' ).getBlockTypes();
75
+ return map( blockTypes, block => block.name );
76
+ }
77
+
78
+ /**
79
+ * Template for InnerBlocks
80
+ *
81
+ * @readonly
82
+ * @memberof PluginBlockHooks
83
+ * @returns {Array} template
84
+ */
85
+ get template() {
86
+ const blockNames = this.registeredBlockNames;
87
+ return this.props.plugins.reduce( ( acc, plugin ) => {
88
+ const pluginTemplate = this.props.pluginTemplates[ plugin ];
89
+ if ( pluginTemplate ) {
90
+ // Block needs to be registered, otherwise it's dropped
91
+ const blockTemplates = this.filterPluginTemplates( blockNames, pluginTemplate );
92
+ return [
93
+ ...acc,
94
+ ...blockTemplates,
95
+ ];
96
+ }
97
+ return acc;
98
+ }, [] );
99
+ }
100
+
101
+ /**
102
+ * Recursively filters out unregistered blocks
103
+ *
104
+ * @param {Array} blockNames block names currently registered
105
+ * @param {Array} pluginTemplate Template for plugins
106
+ * @returns {Array} Array of plugin template
107
+ */
108
+ filterPluginTemplates( blockNames, pluginTemplate ) {
109
+ return reduce( pluginTemplate, ( acc, [ name, attributes, nestedBlockTemplates ] ) => {
110
+ if ( includes( blockNames, name ) ) {
111
+ const blockTemplate = isArray( nestedBlockTemplates )
112
+ ? [ name, attributes, /* Recursive call */ this.filterPluginTemplates( blockNames, nestedBlockTemplates ) ] // eslint-disable-line max-len
113
+ : [ name, attributes ];
114
+
115
+ return [
116
+ ...acc,
117
+ blockTemplate,
118
+ ];
119
+ }
120
+
121
+ return acc;
122
+ }, [] );
123
+ }
124
+
125
+ render() {
126
+ return (
127
+ <div className="tribe-common__plugin-block-hook">
128
+ <InnerBlocks
129
+ allowedBlocks={ this.props.allowedBlocks }
130
+ layouts={ this.props.layouts }
131
+ template={ this.template }
132
+ templateInsertUpdatesSelection={ this.props.templateInsertUpdatesSelection }
133
+ templateLock={ this.props.templateLock }
134
+ />
135
+ </div>
136
+ );
137
+ }
138
+ }
common/src/modules/components/plugin-block-hooks/container.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { connect } from 'react-redux';
5
+ import { compose } from 'redux';
6
+
7
+ /**
8
+ * Internal Dependencies
9
+ */
10
+ import { selectors } from '@moderntribe/common/data/plugins';
11
+ import { withStore } from '@moderntribe/common/hoc';
12
+ import PluginBlockHooks from './component';
13
+
14
+ const mapStateToProps = ( state, ownProps ) => ( {
15
+ plugins: selectors.getPlugins( state ),
16
+ } );
17
+
18
+ export default compose(
19
+ withStore(),
20
+ connect( mapStateToProps ),
21
+ )( PluginBlockHooks );
common/src/modules/components/plugin-block-hooks/index.js ADDED
@@ -0,0 +1 @@
 
1
+ export { default } from './container';
common/src/modules/components/plugin-block-hooks/style.pcss ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-common__plugin-block-hook {
2
+
3
+ & .editor-inner-blocks {
4
+
5
+ & .editor-block-list__layout {
6
+ margin: 0;
7
+
8
+ & .editor-block-list__block {
9
+ margin: 0;
10
+ max-width: 100% !important;
11
+ padding: 0;
12
+
13
+ &.is-selected > .editor-block-list__block-edit:before,
14
+ &.is-selected-parent > .editor-block-list__block-edit:before,
15
+ &.is-hovered > .editor-block-list__block-edit:before {
16
+ outline: none;
17
+ }
18
+
19
+ & .editor-block-list__block-edit {
20
+ margin: 0;
21
+
22
+ &:before {
23
+ outline: none;
24
+ }
25
+
26
+ & .editor-block-contextual-toolbar {
27
+ display: none;
28
+ }
29
+ }
30
+
31
+ {
32
+ outline: none;
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
common/src/modules/components/prevent-block-close/__tests__/component.spec.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import PreventBlockClose from '../component';
3
+
4
+ describe( 'PreventBlockClose', () => {
5
+ test( 'should match snapshot', () => {
6
+ const component = mount(
7
+ <PreventBlockClose>
8
+ <span>Test children</span>
9
+ </PreventBlockClose>
10
+ );
11
+ const child = component.find( 'span' );
12
+ expect( child ).toHaveLength( 1 );
13
+ expect( child.text() ).toEqual( "Test children" );
14
+ } );
15
+ } );
common/src/modules/components/prevent-block-close/component.js ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import React, { PureComponent } from 'react';
5
+ import PropTypes from 'prop-types';
6
+
7
+ /**
8
+ * Internal Dependencies
9
+ */
10
+ import { intercept, EVENT_NAMESPACE } from '@moderntribe/common/hoc/with-block-closer';
11
+
12
+ export default class PreventBlockClose extends PureComponent {
13
+ static propTypes = {
14
+ children: PropTypes.node.isRequired,
15
+ }
16
+
17
+ nodeRef = React.createRef();
18
+
19
+ componentDidMount() {
20
+ this.node.addEventListener( EVENT_NAMESPACE, intercept );
21
+ }
22
+
23
+ componentWillUnmount() {
24
+ this.node.removeEventListener( EVENT_NAMESPACE, intercept );
25
+ }
26
+
27
+ get node() {
28
+ return this.nodeRef.current;
29
+ }
30
+
31
+ render() {
32
+ return (
33
+ <div ref={ this.nodeRef }>
34
+ { this.props.children }
35
+ </div>
36
+ );
37
+ }
38
+ }
common/src/modules/components/prevent-block-close/index.js ADDED
@@ -0,0 +1 @@
 
1
+ export { default } from './component';
common/src/modules/data/__tests__/utils.test.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { PREFIX_COMMON_STORE } from '@moderntribe/common/data/utils';
5
+
6
+ describe( 'prefix', () => {
7
+ it( 'Should return the prefix', () => {
8
+ expect( PREFIX_COMMON_STORE ).toBe('@@MT/COMMON');
9
+ } );
10
+ } );
common/src/modules/data/editor/post-types.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ export const EVENT = 'tribe_events';
2
+ export const VENUE = 'tribe_venue';
3
+ export const ORGANIZER = 'tribe_organizer';
common/src/modules/data/forms/__tests__/__snapshots__/actions.test.js.snap ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`[STORE] - Form actions Add volatile action 1`] = `
4
+ Object {
5
+ "payload": Object {
6
+ "id": 20,
7
+ },
8
+ "type": "@@MT/COMMON/ADD_VOLATILE_ID",
9
+ }
10
+ `;
11
+
12
+ exports[`[STORE] - Form actions Clear form action 1`] = `
13
+ Object {
14
+ "payload": Object {
15
+ "id": 20,
16
+ },
17
+ "type": "@@MT/COMMON/CLEAR_FORM",
18
+ }
19
+ `;
20
+
21
+ exports[`[STORE] - Form actions Create draft entry 1`] = `
22
+ Object {
23
+ "payload": Object {
24
+ "fields": Object {
25
+ "title": "Modern Tribe",
26
+ },
27
+ "id": 20,
28
+ },
29
+ "type": "@@MT/COMMON/CREATE_FORM_DRAFT",
30
+ }
31
+ `;
32
+
33
+ exports[`[STORE] - Form actions Edit the entry action 1`] = `
34
+ Object {
35
+ "payload": Object {
36
+ "fields": Object {
37
+ "title": "Tribe",
38
+ },
39
+ "id": 20,
40
+ },
41
+ "type": "@@MT/COMMON/EDIT_FORM_ENTRY",
42
+ }
43
+ `;
44
+
45
+ exports[`[STORE] - Form actions Register form action 1`] = `
46
+ Object {
47
+ "payload": Object {
48
+ "id": 20,
49
+ "type": "tribe_organizers",
50
+ },
51
+ "type": "@@MT/COMMON/ADD_FORM",
52
+ }
53
+ `;
54
+
55
+ exports[`[STORE] - Form actions Remove volatile action 1`] = `
56
+ Object {
57
+ "payload": Object {
58
+ "id": 20,
59
+ },
60
+ "type": "@@MT/COMMON/REMOVE_VOLATILE_ID",
61
+ }
62
+ `;
63
+
64
+ exports[`[STORE] - Form actions Set saving action 1`] = `
65
+ Object {
66
+ "payload": Object {
67
+ "id": 20,
68
+ "saving": true,
69
+ },
70
+ "type": "@@MT/COMMON/SET_SAVING_FORM",
71
+ }
72
+ `;
73
+
74
+ exports[`[STORE] - Form actions Set saving action 2`] = `
75
+ Object {
76
+ "payload": Object {
77
+ "id": 20,
78
+ "saving": false,
79
+ },
80
+ "type": "@@MT/COMMON/SET_SAVING_FORM",
81
+ }
82
+ `;
83
+
84
+ exports[`[STORE] - Form actions Set submit form 1`] = `
85
+ Object {
86
+ "payload": Object {
87
+ "id": 20,
88
+ },
89
+ "type": "@@MT/COMMON/SUBMIT_FORM",
90
+ }
91
+ `;
92
+
93
+ exports[`[STORE] - form thunk actions Maybe remove entry action with details 1`] = `
94
+ Array [
95
+ Object {
96
+ "meta": Object {
97
+ "actions": Object {
98
+ "success": [Function],
99
+ },
100
+ "path": "tribe_venue/21",
101
+ },
102
+ "type": "@@MT/COMMON/WP_REQUEST",
103
+ },
104
+ ]
105
+ `;
106
+
107
+ exports[`[STORE] - form thunk actions Maybe remove entry action without details 1`] = `Array []`;
108
+
109
+ exports[`[STORE] - form thunk actions Send the form action when creating 1`] = `
110
+ Array [
111
+ Object {
112
+ "meta": Object {
113
+ "actions": Object {
114
+ "error": [Function],
115
+ "start": [Function],
116
+ "success": [Function],
117
+ },
118
+ "params": Object {
119
+ "body": "{\\"title\\":\\"Modern Tribe\\"}",
120
+ "method": "POST",
121
+ },
122
+ "path": "tribe_organizer",
123
+ },
124
+ "type": "@@MT/COMMON/WP_REQUEST",
125
+ },
126
+ ]
127
+ `;
128
+
129
+ exports[`[STORE] - form thunk actions Send the form when editing 1`] = `
130
+ Array [
131
+ Object {
132
+ "meta": Object {
133
+ "actions": Object {
134
+ "error": [Function],
135
+ "start": [Function],
136
+ "success": [Function],
137
+ },
138
+ "params": Object {
139
+ "body": "{\\"title\\":\\"Tribe\\"}",
140
+ "method": "PUT",
141
+ },
142
+ "path": "tribe_venue/21",
143
+ },
144
+ "type": "@@MT/COMMON/WP_REQUEST",
145
+ },
146
+ ]
147
+ `;
common/src/modules/data/forms/__tests__/actions.test.js ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import configureStore from 'redux-mock-store';
5
+ import thunk from 'redux-thunk';
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { actions } from '@moderntribe/common/data/forms';
10
+
11
+ const middlewares = [ thunk ];
12
+ const mockStore = configureStore( middlewares );
13
+
14
+ describe( '[STORE] - Form actions', () => {
15
+ test( 'Register form action', () => {
16
+ expect( actions.registerForm( 20, 'tribe_organizers' ) ).toMatchSnapshot();
17
+ } );
18
+
19
+ test( 'Create draft entry', () => {
20
+ expect( actions.createDraft( 20, { title: 'Modern Tribe' } ) ).toMatchSnapshot();
21
+ } );
22
+
23
+ test( 'Edit the entry action', () => {
24
+ expect( actions.editEntry( 20, { title: 'Tribe' } ) ).toMatchSnapshot();
25
+ } );
26
+
27
+ test( 'Clear form action', () => {
28
+ expect( actions.clearForm( 20 ) ).toMatchSnapshot();
29
+ } );
30
+
31
+ test( 'Set submit form', () => {
32
+ expect( actions.setSubmit( 20 ) ).toMatchSnapshot();
33
+ } );
34
+
35
+ test( 'Set saving action', () => {
36
+ expect( actions.setSaving( 20, true ) ).toMatchSnapshot();
37
+ expect( actions.setSaving( 20, false ) ).toMatchSnapshot();
38
+ } );
39
+
40
+ test( 'Add volatile action', () => {
41
+ expect( actions.addVolatile( 20 ) ).toMatchSnapshot();
42
+ } );
43
+
44
+ test( 'Remove volatile action', () => {
45
+ expect( actions.removeVolatile( 20 ) ).toMatchSnapshot();
46
+ } );
47
+ } );
48
+
49
+ describe( '[STORE] - form thunk actions', () => {
50
+ let store = {};
51
+ beforeAll( () => {
52
+ store = mockStore( {
53
+ events: {
54
+ },
55
+ forms: {
56
+ byId: {
57
+ 20: {
58
+ create: true,
59
+ type: 'tribe_organizer',
60
+ fields: {},
61
+ },
62
+ 21: {
63
+ create: false,
64
+ type: 'tribe_venue',
65
+ fields: {
66
+ id: 21,
67
+ },
68
+ },
69
+ },
70
+ volatile: [],
71
+ },
72
+ } );
73
+ } );
74
+
75
+ afterEach( () => store.clearActions() );
76
+
77
+ test( 'Send the form action when creating', () => {
78
+ store.dispatch( actions.sendForm( 20, { title: 'Modern Tribe' } ) );
79
+ expect( store.getActions() ).toMatchSnapshot();
80
+ } );
81
+
82
+ test( 'Send the form when editing', () => {
83
+ store.dispatch( actions.sendForm( 21, { title: 'Tribe' } ) );
84
+ expect( store.getActions() ).toMatchSnapshot();
85
+ } );
86
+
87
+ test( 'Maybe remove entry action without details', () => {
88
+ store.dispatch( actions.maybeRemoveEntry( 20, {} ) );
89
+ expect( store.getActions() ).toMatchSnapshot();
90
+ } );
91
+
92
+ test( 'Maybe remove entry action with details', () => {
93
+ store.dispatch( actions.maybeRemoveEntry( 21, { id: 21, title: 'Modern Tribe' } ) );
94
+ expect( store.getActions() ).toMatchSnapshot();
95
+ } );
96
+ } );
common/src/modules/data/forms/__tests__/reducer.test.js ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import reducer, { actions } from '@moderntribe/common/data/forms';
5
+ import form, { DEFAULT_STATE } from '@moderntribe/common/data/forms/reducers/form';
6
+
7
+ jest.mock( '@moderntribe/common/data/forms/reducers/form', () => {
8
+ const original = require.requireActual( '@moderntribe/common/data/forms/reducers/form' );
9
+ return {
10
+ __esModule: true,
11
+ ...original,
12
+ default: jest.fn( ( state = original.DEFAULT_STATE ) => state ),
13
+ };
14
+ } );
15
+
16
+ jest.mock( '@moderntribe/common/data/forms/reducers/volatile', () => {
17
+ return {
18
+ __esModule: true,
19
+ default: jest.fn( ( state = [] ) => state ),
20
+ };
21
+ } );
22
+
23
+ describe( '[STORE] - form reducer', () => {
24
+ beforeEach( () => {
25
+ form.mockClear();
26
+ } );
27
+
28
+ it( 'Should return the default state', () => {
29
+ expect( reducer( undefined, {} ) ).toEqual( { byId: {}, volatile: [] } );
30
+ } );
31
+
32
+ it( 'Should add a new form', () => {
33
+ const state = {
34
+ byId: {},
35
+ volatile: [],
36
+ };
37
+ expect( reducer( state, actions.registerForm( 20, 'tribe_organizer' ) ) ).toEqual( {
38
+ byId: {
39
+ 20: DEFAULT_STATE,
40
+ },
41
+ volatile: [],
42
+ } );
43
+ } );
44
+
45
+ it( 'Should pass the actions to the child reducer when block not present', () => {
46
+ const groupAction = [
47
+ actions.registerForm( 10, 'tribe_venue' ),
48
+ actions.editEntry( 20, { title: 'Modern tribe' } ),
49
+ actions.createDraft( 20, { title: 'Tribe' } ),
50
+ actions.setSubmit( 20 ),
51
+ actions.clearForm( 20 ),
52
+ actions.setSaving( 20, true ),
53
+ ];
54
+
55
+ groupAction.forEach( ( action ) => {
56
+ reducer( {}, action );
57
+ expect( form ).toHaveBeenCalledWith( undefined, action );
58
+ expect( form ).toHaveBeenCalledTimes( 1 );
59
+ form.mockClear();
60
+ } );
61
+ } );
62
+
63
+ it( 'It should pass the block to the child reducer', () => {
64
+ const groupAction = [
65
+ actions.registerForm( 10, 'tribe_venue' ),
66
+ actions.editEntry( 20, { title: 'Modern tribe' } ),
67
+ actions.createDraft( 20, { title: 'Tribe' } ),
68
+ actions.setSubmit( 20 ),
69
+ actions.clearForm( 20 ),
70
+ actions.setSaving( 20, true ),
71
+ ];
72
+
73
+ const state = {
74
+ byId: {
75
+ 10: DEFAULT_STATE,
76
+ 20: DEFAULT_STATE,
77
+ },
78
+ };
79
+
80
+ groupAction.forEach( ( action ) => {
81
+ reducer( state, action );
82
+ expect( form ).toHaveBeenCalledWith( DEFAULT_STATE, action );
83
+ expect( form ).toHaveBeenCalledTimes( 1 );
84
+ form.mockClear();
85
+ } );
86
+ } );
87
+ } );
88
+
common/src/modules/data/forms/__tests__/selectors.test.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { selectors } from '@moderntribe/common/data/forms';
5
+ import { DEFAULT_STATE } from '@moderntribe/common/data/forms/reducers/form';
6
+
7
+ const state = {
8
+ events: {
9
+ },
10
+ forms: {
11
+ byId: {
12
+ 99: {
13
+ ...DEFAULT_STATE,
14
+ type: 'tribe_organizers',
15
+ create: true,
16
+ fields: {
17
+ name: 'Modern Tribe',
18
+ description: 'The Next Generation of Digital Agency',
19
+ },
20
+ },
21
+ 100: {
22
+ ...DEFAULT_STATE,
23
+ edit: true,
24
+ },
25
+ 101: {
26
+ ...DEFAULT_STATE,
27
+ submit: true,
28
+ },
29
+ 102: {
30
+ ...DEFAULT_STATE,
31
+ saving: true,
32
+ },
33
+ },
34
+ volatile: [ 100, 102 ],
35
+ },
36
+ };
37
+
38
+ describe( '[STORE] - Forms selectors', () => {
39
+ it( 'Should return the forms blocks', () => {
40
+ expect( selectors.formSelector( state, { name: 99 } ) ).toEqual( state.forms.byId[ '99' ] );
41
+ expect( selectors.formSelector( state, { name: 100 } ) ).toEqual( state.forms.byId[ '100' ] );
42
+ expect( selectors.formSelector( state, { name: 200 } ) ).toBe( undefined );
43
+ } );
44
+
45
+ it( 'Should return the form type', () => {
46
+ expect( selectors.getFormType( state, { name: 99 } ) ).toBe( 'tribe_organizers' );
47
+ expect( selectors.getFormType( state, { name: 100 } ) ).toBe( DEFAULT_STATE.type );
48
+ } );
49
+
50
+ it( 'Should return the edit value', () => {
51
+ expect( selectors.getFormEdit( state, { name: 100 } ) ).toBe( true );
52
+ expect( selectors.getFormEdit( state, { name: 99 } ) ).toBe( false );
53
+ expect( selectors.getFormEdit( state, { name: 101 } ) ).toBe( false );
54
+ expect( selectors.getFormEdit( state, { name: 102 } ) ).toBe( false );
55
+ } );
56
+
57
+ it( 'Should return the create value', () => {
58
+ expect( selectors.getFormCreate( state, { name: 99 } ) ).toBe( true );
59
+ expect( selectors.getFormCreate( state, { name: 100 } ) ).toBe( false );
60
+ expect( selectors.getFormCreate( state, { name: 101 } ) ).toBe( false );
61
+ expect( selectors.getFormCreate( state, { name: 102 } ) ).toBe( false );
62
+ } );
63
+
64
+ it( 'Should return the submit value', () => {
65
+ expect( selectors.getFormSubmit( state, { name: 101 } ) ).toBe( true );
66
+ expect( selectors.getFormSubmit( state, { name: 99 } ) ).toBe( false );
67
+ expect( selectors.getFormSubmit( state, { name: 100 } ) ).toBe( false );
68
+ expect( selectors.getFormSubmit( state, { name: 102 } ) ).toBe( false );
69
+ } );
70
+
71
+ it( 'Should return the saving value', () => {
72
+ expect( selectors.getFormSaving( state, { name: 102 } ) ).toBe( true );
73
+ expect( selectors.getFormSaving( state, { name: 99 } ) ).toBe( false );
74
+ expect( selectors.getFormSaving( state, { name: 100 } ) ).toBe( false );
75
+ expect( selectors.getFormSaving( state, { name: 101 } ) ).toBe( false );
76
+ } );
77
+
78
+ it( 'Should return the form fields', () => {
79
+ expect( selectors.getFormFields( state, { name: 99 } ) )
80
+ .toEqual( state.forms.byId[ '99' ].fields );
81
+ expect( selectors.getFormFields( state, { name: 100 } ) ).toEqual( {} );
82
+ expect( selectors.getFormFields( state, { name: 101 } ) ).toEqual( {} );
83
+ expect( selectors.getFormFields( state, { name: 102 } ) ).toEqual( {} );
84
+ } );
85
+
86
+ it( 'Should return the volatile fields', () => {
87
+ expect( selectors.getVolatile( state ) ).toEqual( [ 100, 102 ] );
88
+ } );
89
+ } );
common/src/modules/data/forms/__tests__/types.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { types } from '@moderntribe/common/data/forms';
5
+ import { PREFIX_COMMON_STORE } from '@moderntribe/common/data/utils';
6
+
7
+ describe( '[STORE] - Form types', () => {
8
+ it( 'Should return the types values', () => {
9
+ expect( types.REMOVE_VOLATILE_ID ).toBe( `${ PREFIX_COMMON_STORE }/REMOVE_VOLATILE_ID` );
10
+ expect( types.ADD_VOLATILE_ID ).toBe( `${ PREFIX_COMMON_STORE }/ADD_VOLATILE_ID` );
11
+ expect( types.ADD_FORM ).toBe( `${ PREFIX_COMMON_STORE }/ADD_FORM` );
12
+ expect( types.SET_SAVING_FORM ).toBe( `${ PREFIX_COMMON_STORE }/SET_SAVING_FORM` );
13
+ expect( types.SUBMIT_FORM ).toBe( `${ PREFIX_COMMON_STORE }/SUBMIT_FORM` );
14
+ expect( types.CREATE_FORM_DRAFT ).toBe( `${ PREFIX_COMMON_STORE }/CREATE_FORM_DRAFT` );
15
+ expect( types.EDIT_FORM_ENTRY ).toBe( `${ PREFIX_COMMON_STORE }/EDIT_FORM_ENTRY` );
16
+ expect( types.SET_FORM_FIELDS ).toBe( `${ PREFIX_COMMON_STORE }/SET_FORM_FIELDS` );
17
+ expect( types.CLEAR_FORM ).toBe( `${ PREFIX_COMMON_STORE }/CLEAR_FORM` );
18
+ } );
19
+ } );
common/src/modules/data/forms/actions.js ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { isEmpty, get } from 'lodash';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { actions as requestActions } from '@moderntribe/common/store/middlewares/request';
10
+
11
+ import * as types from './types';
12
+ import * as selectors from './selectors';
13
+
14
+ export const registerForm = ( id, type ) => ( {
15
+ type: types.ADD_FORM,
16
+ payload: {
17
+ id,
18
+ type,
19
+ },
20
+ } );
21
+
22
+ export const clearForm = ( id ) => ( {
23
+ type: types.CLEAR_FORM,
24
+ payload: {
25
+ id,
26
+ },
27
+ } );
28
+
29
+ export const createDraft = ( id, fields ) => ( {
30
+ type: types.CREATE_FORM_DRAFT,
31
+ payload: {
32
+ id,
33
+ fields,
34
+ },
35
+ } );
36
+
37
+ export const editEntry = ( id, fields ) => ( {
38
+ type: types.EDIT_FORM_ENTRY,
39
+ payload: {
40
+ id,
41
+ fields,
42
+ },
43
+ } );
44
+
45
+ export const setSubmit = ( id ) => ( {
46
+ type: types.SUBMIT_FORM,
47
+ payload: {
48
+ id,
49
+ },
50
+ } );
51
+
52
+ export const setSaving = ( id, saving ) => ( {
53
+ type: types.SET_SAVING_FORM,
54
+ payload: {
55
+ id,
56
+ saving,
57
+ },
58
+ } );
59
+
60
+ export const addVolatile = ( id ) => ( {
61
+ type: types.ADD_VOLATILE_ID,
62
+ payload: {
63
+ id,
64
+ },
65
+ } );
66
+
67
+ export const removeVolatile = ( id ) => ( {
68
+ type: types.REMOVE_VOLATILE_ID,
69
+ payload: {
70
+ id,
71
+ },
72
+ } );
73
+
74
+ export const sendForm = ( id, fields = {}, completed ) => ( dispatch, getState ) => {
75
+ const state = getState();
76
+ const props = { name: id };
77
+ const type = selectors.getFormType( state, props );
78
+ const create = selectors.getFormCreate( state, props );
79
+ const details = selectors.getFormFields( state, props );
80
+ const saving = selectors.getFormSaving( state, props );
81
+
82
+ if ( saving ) {
83
+ return;
84
+ }
85
+
86
+ const path = create
87
+ ? `${ type }`
88
+ : `${ type }/${ details.id }`;
89
+
90
+ const options = {
91
+ path,
92
+ params: {
93
+ method: create ? 'POST' : 'PUT',
94
+ body: JSON.stringify( fields ),
95
+ },
96
+ actions: {
97
+ start: () => dispatch( setSaving( id, true ) ),
98
+ success: ( { body } ) => {
99
+ const postID = get( body, 'id', '' );
100
+
101
+ if ( create && postID ) {
102
+ dispatch( addVolatile( postID ) );
103
+ }
104
+ completed( body );
105
+ dispatch( clearForm( id ) );
106
+ dispatch( setSaving( id, false ) );
107
+ },
108
+ error: () => {
109
+ dispatch( clearForm( id ) );
110
+ dispatch( setSaving( id, false ) );
111
+ },
112
+ },
113
+ };
114
+ dispatch( requestActions.wpRequest( options ) );
115
+ };
116
+
117
+ const deleteEntry = ( dispatch ) => ( path ) => ( { body } ) => {
118
+ const { id, status } = body;
119
+
120
+ if ( 'draft' !== status ) {
121
+ dispatch( removeVolatile( id ) );
122
+ return;
123
+ }
124
+
125
+ const options = {
126
+ path,
127
+ params: {
128
+ method: 'DELETE',
129
+ },
130
+ actions: {
131
+ success: () => dispatch( removeVolatile( id ) ),
132
+ },
133
+ };
134
+ dispatch( requestActions.wpRequest( options ) );
135
+ };
136
+
137
+ export const maybeRemoveEntry = ( id, details = {} ) => ( dispatch, getState ) => {
138
+ const state = getState();
139
+ const type = selectors.getFormType( state, { name: id } );
140
+
141
+ if ( isEmpty( details ) ) {
142
+ return;
143
+ }
144
+
145
+ const path = `${ type }/${ details.id }`;
146
+ const options = {
147
+ path,
148
+ actions: {
149
+ success: deleteEntry( dispatch )( path ),
150
+ },
151
+ };
152
+ dispatch( requestActions.wpRequest( options ) );
153
+ };
common/src/modules/data/forms/index.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import reducer from './reducer';
5
+
6
+ import * as types from './types';
7
+ import * as actions from './actions';
8
+ import * as selectors from './selectors';
9
+
10
+ export default reducer;
11
+
12
+ export { types, actions, selectors };
common/src/modules/data/forms/reducer.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { combineReducers } from 'redux';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import * as types from './types';
10
+ import { form, volatile } from './reducers';
11
+
12
+ const byId = ( state = {}, action ) => {
13
+ switch ( action.type ) {
14
+ case types.ADD_FORM:
15
+ case types.CLEAR_FORM:
16
+ case types.SET_FORM_FIELDS:
17
+ case types.CREATE_FORM_DRAFT:
18
+ case types.EDIT_FORM_ENTRY:
19
+ case types.SUBMIT_FORM:
20
+ case types.SET_SAVING_FORM:
21
+ return {
22
+ ...state,
23
+ [ action.payload.id ]: form( state[ action.payload.id ], action ),
24
+ };
25
+ default:
26
+ return state;
27
+ }
28
+ };
29
+
30
+ export default combineReducers( {
31
+ byId,
32
+ volatile,
33
+ } );
common/src/modules/data/forms/reducers/__tests__/__snapshots__/form.test.js.snap ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`[STORE] - form reducer Should add a new form 1`] = `
4
+ Object {
5
+ "create": false,
6
+ "edit": false,
7
+ "fields": Object {},
8
+ "saving": false,
9
+ "submit": false,
10
+ "type": "tribe_organizers",
11
+ }
12
+ `;
13
+
14
+ exports[`[STORE] - form reducer Should clear a form 1`] = `
15
+ Object {
16
+ "create": false,
17
+ "edit": false,
18
+ "fields": Object {},
19
+ "saving": false,
20
+ "submit": false,
21
+ "type": "tribe_organizers",
22
+ }
23
+ `;
24
+
25
+ exports[`[STORE] - form reducer Should create a form draft 1`] = `
26
+ Object {
27
+ "create": true,
28
+ "edit": false,
29
+ "fields": Object {
30
+ "id": 20,
31
+ "title": "Modern Tribe",
32
+ },
33
+ "saving": false,
34
+ "submit": false,
35
+ "type": "tribe_events",
36
+ }
37
+ `;
38
+
39
+ exports[`[STORE] - form reducer Should edit the form entry 1`] = `
40
+ Object {
41
+ "create": false,
42
+ "edit": true,
43
+ "fields": Object {
44
+ "description": "",
45
+ "title": "Tribe",
46
+ },
47
+ "saving": false,
48
+ "submit": false,
49
+ "type": "tribe_events",
50
+ }
51
+ `;
52
+
53
+ exports[`[STORE] - form reducer Should submit the form 1`] = `
54
+ Object {
55
+ "create": false,
56
+ "edit": false,
57
+ "fields": Object {},
58
+ "saving": false,
59
+ "submit": true,
60
+ "type": "tribe_events",
61
+ }
62
+ `;
63
+
64
+ exports[`[STORE] - form reducer Should toggle the saving form flag 1`] = `
65
+ Object {
66
+ "create": false,
67
+ "edit": false,
68
+ "fields": Object {},
69
+ "saving": true,
70
+ "submit": false,
71
+ "type": "tribe_events",
72
+ }
73
+ `;
74
+
75
+ exports[`[STORE] - form reducer Should toggle the saving form flag 2`] = `
76
+ Object {
77
+ "create": false,
78
+ "edit": false,
79
+ "fields": Object {},
80
+ "saving": false,
81
+ "submit": false,
82
+ "type": "tribe_events",
83
+ }
84
+ `;
common/src/modules/data/forms/reducers/__tests__/form.test.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { form } from '@moderntribe/common/data/forms/reducers';
5
+ import { actions } from '@moderntribe/common/data/forms';
6
+ import { DEFAULT_STATE } from '@moderntribe/common/data/forms/reducers/form';
7
+
8
+ describe( '[STORE] - form reducer', () => {
9
+ it( 'Should return the default state', () => {
10
+ expect( form( undefined, {} ) ).toEqual( DEFAULT_STATE );
11
+ } );
12
+
13
+ it( 'Should add a new form', () => {
14
+ expect( form( DEFAULT_STATE, actions.registerForm( 20, 'tribe_organizers' ) ) ).toMatchSnapshot();
15
+ } );
16
+
17
+ it( 'Should clear a form', () => {
18
+ const state = {
19
+ ...DEFAULT_STATE,
20
+ type: 'tribe_organizers',
21
+ };
22
+ expect( form( state, actions.clearForm( 20 ) ) ).toMatchSnapshot();
23
+ } );
24
+
25
+ it( 'Should create a form draft', () => {
26
+ const fields = {
27
+ id: 20,
28
+ title: 'Modern Tribe',
29
+ };
30
+ expect( form( DEFAULT_STATE, actions.createDraft( 20, fields ) ) ).toMatchSnapshot();
31
+ } );
32
+
33
+ it( 'Should toggle the saving form flag', () => {
34
+ expect( form( DEFAULT_STATE, actions.setSaving( 20, true ) ) ).toMatchSnapshot();
35
+ expect( form( DEFAULT_STATE, actions.setSaving( 20, false ) ) ).toMatchSnapshot();
36
+ } );
37
+
38
+ it( 'Should edit the form entry', () => {
39
+ const fields = {
40
+ title: 'Tribe',
41
+ description: '',
42
+ };
43
+ expect( form( DEFAULT_STATE, actions.editEntry( 20, fields ) ) ).toMatchSnapshot();
44
+ } );
45
+
46
+ it( 'Should submit the form', () => {
47
+ expect( form( DEFAULT_STATE, actions.setSubmit( 20 ) ) ).toMatchSnapshot();
48
+ } );
49
+ } );
common/src/modules/data/forms/reducers/__tests__/volatile.test.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { volatile } from '@moderntribe/common/data/forms/reducers';
5
+ import { actions } from '@moderntribe/common/data/forms';
6
+
7
+ describe( '[STORE] - Volatile reducer', () => {
8
+ it( 'Should return the default state', () => {
9
+ expect( volatile( undefined, {} ) ).toEqual( [] );
10
+ } );
11
+
12
+ it( 'Should add a new volatile value', () => {
13
+ expect( volatile( [], actions.addVolatile( 20 ) ) ).toEqual( [ 20 ] );
14
+ expect( volatile( [ 20 ], actions.addVolatile( 10 ) ) ).toEqual( [ 20, 10 ] );
15
+ } );
16
+
17
+ it( 'Should remove a volatile value', () => {
18
+ expect( volatile( [], actions.removeVolatile( 20 ) ) ).toEqual( [] );
19
+ expect( volatile( [ 20, 10 ], actions.removeVolatile( 20 ) ) ).toEqual( [ 10 ] );
20
+ expect( volatile( [ 20, 10 ], actions.removeVolatile( 10 ) ) ).toEqual( [ 20 ] );
21
+ expect( volatile( [ 10 ], actions.removeVolatile( 10 ) ) ).toEqual( [] );
22
+ } );
23
+ } );
common/src/modules/data/forms/reducers/form.js ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { EVENT } from '@moderntribe/common/data/editor/post-types';
5
+ import * as types from '@moderntribe/common/data/forms/types';
6
+
7
+ export const DEFAULT_STATE = {
8
+ edit: false,
9
+ create: false,
10
+ submit: false,
11
+ saving: false,
12
+ fields: {},
13
+ type: EVENT,
14
+ };
15
+
16
+ export default ( state = DEFAULT_STATE, action ) => {
17
+ switch ( action.type ) {
18
+ case types.ADD_FORM:
19
+ return {
20
+ ...state,
21
+ type: action.payload.type,
22
+ };
23
+ case types.CLEAR_FORM:
24
+ return {
25
+ ...state,
26
+ ...DEFAULT_STATE,
27
+ type: state.type,
28
+ };
29
+ case types.CREATE_FORM_DRAFT:
30
+ return {
31
+ ...state,
32
+ submit: false,
33
+ edit: false,
34
+ create: true,
35
+ fields: action.payload.fields,
36
+ };
37
+ case types.SET_SAVING_FORM:
38
+ return {
39
+ ...state,
40
+ saving: action.payload.saving,
41
+ };
42
+ case types.EDIT_FORM_ENTRY:
43
+ return {
44
+ ...state,
45
+ create: false,
46
+ submit: false,
47
+ edit: true,
48
+ fields: action.payload.fields,
49
+ };
50
+ case types.SUBMIT_FORM:
51
+ return {
52
+ ...state,
53
+ submit: true,
54
+ };
55
+ default:
56
+ return state;
57
+ }
58
+ };
common/src/modules/data/forms/reducers/index.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ export { default as form } from './form';
2
+ export { default as volatile } from './volatile';
common/src/modules/data/forms/reducers/volatile.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import * as types from '@moderntribe/common/data/forms/types';
5
+
6
+ export default ( state = [], action ) => {
7
+ switch ( action.type ) {
8
+ case types.ADD_VOLATILE_ID:
9
+ return [ ...state, action.payload.id ];
10
+ case types.REMOVE_VOLATILE_ID:
11
+ return state.filter( ( id ) => id !== action.payload.id );
12
+ default:
13
+ return state;
14
+ }
15
+ };
common/src/modules/data/forms/selectors.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { createSelector } from 'reselect';
5
+ import { DEFAULT_STATE } from './reducers/form';
6
+
7
+ export const formSelector = ( state, props ) => state.forms.byId[ props.name ];
8
+
9
+ export const getFormType = createSelector(
10
+ [ formSelector ],
11
+ ( block ) => block ? block.type : DEFAULT_STATE.type
12
+ );
13
+
14
+ export const getFormEdit = createSelector(
15
+ [ formSelector ],
16
+ ( block ) => block ? block.edit : DEFAULT_STATE.edit
17
+ );
18
+
19
+ export const getFormCreate = createSelector(
20
+ [ formSelector ],
21
+ ( block ) => block ? block.create : DEFAULT_STATE.create,
22
+ );
23
+
24
+ export const getFormSubmit = createSelector(
25
+ [ formSelector ],
26
+ ( block ) => block ? block.submit : DEFAULT_STATE.submit
27
+ );
28
+
29
+ export const getFormFields = createSelector(
30
+ [ formSelector ],
31
+ ( block ) => block ? block.fields : DEFAULT_STATE.fields,
32
+ );
33
+
34
+ export const getFormSaving = createSelector(
35
+ [ formSelector ],
36
+ ( block ) => block ? block.saving : DEFAULT_STATE.saving
37
+ );
38
+
39
+ export const getVolatile = ( state ) => state.forms.volatile;
common/src/modules/data/forms/types.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { PREFIX_COMMON_STORE } from '@moderntribe/common/data/utils';
5
+
6
+ export const ADD_FORM = `${ PREFIX_COMMON_STORE }/ADD_FORM`;
7
+ export const SET_FORM_FIELDS = `${ PREFIX_COMMON_STORE }/SET_FORM_FIELDS`;
8
+ export const CREATE_FORM_DRAFT = `${ PREFIX_COMMON_STORE }/CREATE_FORM_DRAFT`;
9
+ export const EDIT_FORM_ENTRY = `${ PREFIX_COMMON_STORE }/EDIT_FORM_ENTRY`;
10
+ export const SUBMIT_FORM = `${ PREFIX_COMMON_STORE }/SUBMIT_FORM`;
11
+ export const CLEAR_FORM = `${ PREFIX_COMMON_STORE }/CLEAR_FORM`;
12
+ export const SET_SAVING_FORM = `${ PREFIX_COMMON_STORE }/SET_SAVING_FORM`;
13
+
14
+ export const ADD_VOLATILE_ID = `${ PREFIX_COMMON_STORE }/ADD_VOLATILE_ID`;
15
+ export const REMOVE_VOLATILE_ID = `${ PREFIX_COMMON_STORE }/REMOVE_VOLATILE_ID`;
common/src/modules/data/index.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal Dependencies
3
+ */
4
+ import * as editor from './editor/post-types';
5
+ import * as forms from './forms';
6
+ import * as plugins from './plugins';
7
+ export { default } from './reducers';
8
+
9
+ export { editor, forms, plugins };
common/src/modules/data/plugins/__tests__/__snapshots__/actions.test.js.snap ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Plugin actions Add Plugin 1`] = `
4
+ Object {
5
+ "payload": Object {
6
+ "name": "events",
7
+ },
8
+ "type": "@@MT/COMMON/ADD_PLUGIN",
9
+ }
10
+ `;
11
+
12
+ exports[`Plugin actions Remove Plugin 1`] = `
13
+ Object {
14
+ "payload": Object {
15
+ "name": "events",
16
+ },
17
+ "type": "@@MT/COMMON/REMOVE_PLUGIN",
18
+ }
19
+ `;
common/src/modules/data/plugins/__tests__/actions.test.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { actions } from '@moderntribe/common/data/plugins';
5
+
6
+ describe( 'Plugin actions', () => {
7
+ test( 'Add Plugin', () => {
8
+ expect( actions.addPlugin( 'events' ) ).toMatchSnapshot();
9
+ } );
10
+
11
+ test( 'Remove Plugin', () => {
12
+ expect( actions.removePlugin( 'events' ) ).toMatchSnapshot();
13
+ } );
14
+ } );
common/src/modules/data/plugins/__tests__/reducer.test.js ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import reducer, { actions } from '@moderntribe/common/data/plugins';
5
+
6
+ describe( 'Plugins reducer', () => {
7
+ it( 'Should return the default state', () => {
8
+ expect( reducer( undefined, {} ) ).toEqual( [] );
9
+ } );
10
+
11
+ it( 'Should add a new plugin as active', () => {
12
+ expect( reducer( {}, actions.addPlugin( 'events' ) ) ).toEqual( [ 'events' ] );
13
+ } );
14
+
15
+ it( 'Should avoid adding duplicates entries', () => {
16
+ const state = reducer( {}, actions.addPlugin( 'events' ) );
17
+ expect( reducer( state, actions.addPlugin( 'events' ) ) ).toEqual( [ 'events' ] );
18
+ } );
19
+
20
+ it( 'Should remove the plugin from the reducer', () => {
21
+ const state = reducer( {}, actions.addPlugin( 'events' ) );
22
+ expect( state ).toEqual( [ 'events' ] );
23
+ expect( reducer( state, actions.removePlugin( 'events' ) ) ).toEqual( [] );
24
+ } );
25
+ } );
common/src/modules/data/plugins/__tests__/selectors.test.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { selectors } from '@moderntribe/common/data/plugins';
5
+
6
+ describe( 'Plugin selectors', () => {
7
+ let state;
8
+
9
+ beforeEach( () => {
10
+ state = {
11
+ plugins: [ 'events' ],
12
+ };
13
+ } );
14
+
15
+ it( 'should have plugin', () => {
16
+ expect( selectors.hasPlugin( state, 'events' ) ).toEqual( true );
17
+ expect( selectors.hasPlugin( state )( 'events' ) ).toEqual( true );
18
+ } );
19
+ it( 'should not have plugin', () => {
20
+ expect( selectors.hasPlugin( state, 'events-pro' ) ).toEqual( false );
21
+ expect( selectors.hasPlugin( state )( 'events-pro' ) ).toEqual( false );
22
+ } );
23
+ } );
common/src/modules/data/plugins/__tests__/types.test.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { PREFIX_COMMON_STORE } from '@moderntribe/common/data/utils';
5
+ import { types } from '@moderntribe/common/data/plugins';
6
+
7
+ describe( 'Plugin types', () => {
8
+ it( 'Should return the types with a prefix', () => {
9
+ expect( types.ADD_PLUGIN ).toBe( `${ PREFIX_COMMON_STORE }/ADD_PLUGIN` );
10
+ expect( types.REMOVE_PLUGIN ).toBe( `${ PREFIX_COMMON_STORE }/REMOVE_PLUGIN` );
11
+ } );
12
+ } );
common/src/modules/data/plugins/actions.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import * as types from './types';
5
+
6
+ export const addPlugin = ( name ) => ( {
7
+ type: types.ADD_PLUGIN,
8
+ payload: {
9
+ name,
10
+ },
11
+ } );
12
+
13
+ export const removePlugin = ( name ) => ( {
14
+ type: types.REMOVE_PLUGIN,
15
+ payload: {
16
+ name,
17
+ },
18
+ } );
common/src/modules/data/plugins/constants.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ export const EVENTS_PLUGIN = 'events';
2
+ export const EVENTS_PRO_PLUGIN = 'events-pro';
3
+ export const TICKETS = 'tickets';
4
+ export const TICKETS_PLUS = 'tickets-plus';
common/src/modules/data/plugins/index.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import reducer from './reducer';
5
+ import * as types from './types';
6
+ import * as actions from './actions';
7
+ import * as selectors from './selectors';
8
+ import * as constants from './constants';
9
+ import * as proptypes from './proptypes';
10
+
11
+ export default reducer;
12
+ export { types, actions, selectors, constants, proptypes };
common/src/modules/data/plugins/proptypes.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+
6
+ //
7
+ // ─── VENDOR ─────────────────────────────────────────────────────────────────────
8
+ //
9
+
10
+ export const ReactSelectOption = PropTypes.shape( {
11
+ label: PropTypes.string.isRequired,
12
+ value: PropTypes.any.isRequired,
13
+ } );
14
+
15
+ export const ReactSelectOptions = PropTypes.arrayOf( ReactSelectOption );
common/src/modules/data/plugins/reducer.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { uniq } from 'lodash';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { types } from '@moderntribe/common/data/plugins';
10
+
11
+ export default ( state = [], action ) => {
12
+ switch ( action.type ) {
13
+ case types.ADD_PLUGIN:
14
+ return uniq( [ ...state, action.payload.name ] );
15
+ case types.REMOVE_PLUGIN:
16
+ return [ ...state ].filter( ( pluginName ) => pluginName !== action.payload.name );
17
+ default:
18
+ return state;
19
+ }
20
+ };
common/src/modules/data/plugins/selectors.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { includes } from 'lodash';
5
+ import { curry } from 'lodash/fp';
6
+
7
+ export const getPlugins = ( state ) => state.plugins;
8
+
9
+ export const hasPlugin = curry( ( state, plugin ) => includes( getPlugins( state ), plugin ) );
common/src/modules/data/plugins/types.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { PREFIX_COMMON_STORE } from '@moderntribe/common/data/utils';
5
+
6
+ export const ADD_PLUGIN = `${ PREFIX_COMMON_STORE }/ADD_PLUGIN`;
7
+ export const REMOVE_PLUGIN = `${ PREFIX_COMMON_STORE }/REMOVE_PLUGIN`;
common/src/modules/data/reducers.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { setupCreateReducer } from '@nfen/redux-reducer-injector';
5
+ import forms from './forms';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import plugins from './plugins';
11
+
12
+ export default setupCreateReducer( {
13
+ plugins,
14
+ forms,
15
+ } );
common/src/modules/data/utils.js ADDED
@@ -0,0 +1 @@
 
1
+ export const PREFIX_COMMON_STORE = '@@MT/COMMON';
common/src/modules/elements/accordion/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Accordion Element renders an accordion 1`] = `
4
+ <div
5
+ aria-multiselectable="true"
6
+ className="tribe-editor__accordion"
7
+ role="tablist"
8
+ >
9
+ <article
10
+ className="tribe-editor__accordion__row"
11
+ >
12
+ <button
13
+ aria-controls="accordion-content-123"
14
+ aria-expanded="false"
15
+ aria-selected="false"
16
+ className="tribe-editor__button tribe-editor__accordion__row-header header-class"
17
+ id="accordion-header-123"
18
+ onClick={[Function]}
19
+ role="tab"
20
+ type="button"
21
+ >
22
+ this is header
23
+ </button>
24
+ <div
25
+ aria-hidden="true"
26
+ aria-labelledby="accordion-header-123"
27
+ className="tribe-editor__accordion__row-content content-class"
28
+ id="accordion-content-123"
29
+ role="tabpanel"
30
+ >
31
+ this is a content
32
+ </div>
33
+ </article>
34
+ </div>
35
+ `;
36
+
37
+ exports[`Accordion Element renders an accordion with wrapper class 1`] = `
38
+ <div
39
+ aria-multiselectable="true"
40
+ className="tribe-editor__accordion test-class"
41
+ role="tablist"
42
+ >
43
+ <article
44
+ className="tribe-editor__accordion__row"
45
+ >
46
+ <button
47
+ aria-controls="accordion-content-123"
48
+ aria-expanded="false"
49
+ aria-selected="false"
50
+ className="tribe-editor__button tribe-editor__accordion__row-header header-class"
51
+ id="accordion-header-123"
52
+ onClick={[Function]}
53
+ role="tab"
54
+ type="button"
55
+ >
56
+ this is header
57
+ </button>
58
+ <div
59
+ aria-hidden="true"
60
+ aria-labelledby="accordion-header-123"
61
+ className="tribe-editor__accordion__row-content content-class"
62
+ id="accordion-content-123"
63
+ role="tabpanel"
64
+ >
65
+ this is a content
66
+ </div>
67
+ </article>
68
+ </div>
69
+ `;
70
+
71
+ exports[`Accordion Element renders null 1`] = `null`;
common/src/modules/elements/accordion/__tests__/element.test.js ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import renderer from 'react-test-renderer';
6
+ import { noop } from 'lodash';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import { Accordion } from '@moderntribe/common/elements';
12
+
13
+ let rows;
14
+
15
+ describe( 'Accordion Element', () => {
16
+ beforeEach( () => {
17
+ rows = [
18
+ {
19
+ accordionId: '123',
20
+ content: 'this is a content',
21
+ contentClassName: 'content-class',
22
+ header: 'this is header',
23
+ headerClassName: 'header-class',
24
+ onClick: noop,
25
+ onClose: noop,
26
+ onOpen: noop,
27
+ },
28
+ ];
29
+ } );
30
+
31
+ it( 'renders null', () => {
32
+ const component = renderer.create( <Accordion /> );
33
+ expect( component.toJSON() ).toMatchSnapshot();
34
+ } );
35
+
36
+ it( 'renders an accordion', () => {
37
+ const component = renderer.create( <Accordion rows={ rows } /> );
38
+ expect( component.toJSON() ).toMatchSnapshot();
39
+ } );
40
+
41
+ it( 'renders an accordion with wrapper class', () => {
42
+ const component = renderer.create( <Accordion className="test-class" rows={ rows } /> );
43
+ expect( component.toJSON() ).toMatchSnapshot();
44
+ } );
45
+ } );
common/src/modules/elements/accordion/element.js ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import Row from './row/template';
12
+ import './style.pcss';
13
+
14
+ const Accordion = ( {
15
+ className,
16
+ containerAttrs,
17
+ rows,
18
+ } ) => (
19
+ rows.length
20
+ ? (
21
+ <div
22
+ aria-multiselectable="true"
23
+ className={ classNames(
24
+ 'tribe-editor__accordion',
25
+ className,
26
+ ) }
27
+ role="tablist"
28
+ { ...containerAttrs }
29
+ >
30
+ { rows.map( ( row, index ) => (
31
+ <Row key={ index } { ...row } />
32
+ ) ) }
33
+ </div>
34
+ )
35
+ : null
36
+ );
37
+
38
+ Accordion.defaultProps = {
39
+ containerAttrs: {},
40
+ rows: [],
41
+ };
42
+
43
+ Accordion.propTypes = {
44
+ className: PropTypes.string,
45
+ containerAttrs: PropTypes.object,
46
+ rows: PropTypes.arrayOf( PropTypes.shape( {
47
+ accordionId: PropTypes.string.isRequired,
48
+ content: PropTypes.node,
49
+ contentClassName: PropTypes.string,
50
+ header: PropTypes.node,
51
+ headerClassName: PropTypes.string,
52
+ onClick: PropTypes.func,
53
+ onClose: PropTypes.func,
54
+ onOpen: PropTypes.func,
55
+ } ).isRequired ).isRequired,
56
+ };
57
+
58
+ export default Accordion;
common/src/modules/elements/accordion/row/__tests__/__snapshots__/template.test.js.snap ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Accordion Row Element renders an accordion row 1`] = `
4
+ <article
5
+ className="tribe-editor__accordion__row"
6
+ >
7
+ <button
8
+ aria-controls="accordion-content-123"
9
+ aria-expanded="false"
10
+ aria-selected="false"
11
+ className="tribe-editor__button tribe-editor__accordion__row-header header-class"
12
+ data-attr="header-attr-value"
13
+ id="accordion-header-123"
14
+ onClick={[Function]}
15
+ role="tab"
16
+ type="button"
17
+ >
18
+ this is header
19
+ </button>
20
+ <div
21
+ aria-hidden="true"
22
+ aria-labelledby="accordion-header-123"
23
+ className="tribe-editor__accordion__row-content content-class"
24
+ data-attr="content-attr-value"
25
+ id="accordion-content-123"
26
+ role="tabpanel"
27
+ >
28
+ this is a content
29
+ </div>
30
+ </article>
31
+ `;
common/src/modules/elements/accordion/row/__tests__/template.test.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import Row from '@moderntribe/common/elements/accordion/row/template';
10
+
11
+ let row;
12
+
13
+ describe( 'Accordion Row Element', () => {
14
+ beforeEach( () => {
15
+ row = {
16
+ accordionId: '123',
17
+ content: 'this is a content',
18
+ contentAttrs: { 'data-attr': 'content-attr-value' },
19
+ contentClassName: 'content-class',
20
+ header: 'this is header',
21
+ headerAttrs: { 'data-attr': 'header-attr-value' },
22
+ headerClassName: 'header-class',
23
+ onClick: jest.fn(),
24
+ onClose: jest.fn(),
25
+ onOpen: jest.fn(),
26
+ };
27
+ } );
28
+
29
+ it( 'renders an accordion row', () => {
30
+ const component = renderer.create( <Row { ...row } /> );
31
+ expect( component.toJSON() ).toMatchSnapshot();
32
+ } );
33
+
34
+ it( 'executes onClick handler', () => {
35
+ const component = mount( <Row { ...row } /> );
36
+ component.find( 'button' ).simulate( 'click' );
37
+ expect( row.onClick ).toHaveBeenCalled();
38
+ expect( row.onClick ).toHaveBeenCalledTimes( 1 );
39
+ } );
40
+
41
+ it( 'executes onOpen and onClose handlers', async () => {
42
+ const component = mount( <Row { ...row } /> );
43
+ component.find( 'button' ).simulate( 'click' );
44
+ await setTimeout( () => {
45
+ component.find( 'button' ).simulate( 'click' );
46
+ setTimeout( () => {
47
+ expect( row.onOpen ).toHaveBeenCalled();
48
+ expect( row.onOpen ).toHaveBeenCalledTimes( 1 );
49
+ expect( row.onClose ).toHaveBeenCalled();
50
+ expect( row.onClose ).toHaveBeenCalledTimes( 1 );
51
+ expect( row.onClick ).toHaveBeenCalled();
52
+ expect( row.onClick ).toHaveBeenCalledTimes( 2 );
53
+ }, 250 );
54
+ }, 250 );
55
+ } );
56
+ } );
common/src/modules/elements/accordion/row/template.js ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { PureComponent } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import Button from '@moderntribe/common/elements/button/element';
12
+ import { slide } from '@moderntribe/common/utils';
13
+
14
+ class Row extends PureComponent {
15
+ static propTypes = {
16
+ accordionId: PropTypes.string.isRequired,
17
+ content: PropTypes.node,
18
+ contentAttrs: PropTypes.object,
19
+ contentClassName: PropTypes.string,
20
+ header: PropTypes.node,
21
+ headerAttrs: PropTypes.object,
22
+ headerClassName: PropTypes.string,
23
+ onClick: PropTypes.func,
24
+ onClose: PropTypes.func,
25
+ onOpen: PropTypes.func,
26
+ };
27
+
28
+ static defaultProps = {
29
+ contentAttrs: {},
30
+ headerAttrs: {},
31
+ };
32
+
33
+ constructor( props ) {
34
+ super( props );
35
+ this.state = {
36
+ isActive: false,
37
+ };
38
+ this.headerId = `accordion-header-${ this.props.accordionId }`;
39
+ this.contentId = `accordion-content-${ this.props.accordionId }`;
40
+ }
41
+
42
+ getHeaderAttrs = () => {
43
+ const _isActive = this.state.isActive ? 'true' : 'false';
44
+ return {
45
+ 'aria-controls': this.contentId,
46
+ 'aria-expanded': _isActive,
47
+ 'aria-selected': _isActive,
48
+ id: this.headerId,
49
+ role: 'tab',
50
+ ...this.props.headerAttrs,
51
+ };
52
+ };
53
+
54
+ getContentAttrs = () => ( {
55
+ 'aria-hidden': this.state.isActive ? 'false' : 'true',
56
+ 'aria-labelledby': this.headerId,
57
+ id: this.contentId,
58
+ role: 'tabpanel',
59
+ ...this.props.contentAttrs,
60
+ } );
61
+
62
+ onClose = ( parent, e ) => () => {
63
+ parent.classList.remove( 'closing' );
64
+ parent.classList.add( 'closed' );
65
+ this.props.onClose && this.props.onClose( e );
66
+ };
67
+
68
+ onOpen = ( parent, e ) => () => {
69
+ parent.classList.remove( 'opening' );
70
+ parent.classList.add( 'open' );
71
+ this.props.onOpen && this.props.onOpen( e );
72
+ };
73
+
74
+ onClick = ( e ) => {
75
+ const { contentId, onClick } = this.props;
76
+ const parent = e.currentTarget.parentNode;
77
+ const content = e.currentTarget.nextElementSibling;
78
+
79
+ this.state.isActive
80
+ ? parent.classList.add( 'closing' )
81
+ : parent.classList.add( 'opening' );
82
+ this.state.isActive
83
+ ? slide.up( content, contentId, 200, this.onClose( parent, e ) )
84
+ : slide.down( content, contentId, 200, this.onOpen( parent, e ) );
85
+
86
+ onClick && onClick( e );
87
+ this.setState( ( state ) => ( { isActive: ! state.isActive } ) );
88
+ };
89
+
90
+ render() {
91
+ const {
92
+ content,
93
+ contentClassName,
94
+ header,
95
+ headerClassName,
96
+ } = this.props;
97
+
98
+ return (
99
+ <article
100
+ className={ classNames(
101
+ 'tribe-editor__accordion__row',
102
+ { active: this.state.isActive },
103
+ ) }
104
+ >
105
+ <Button
106
+ className={ classNames(
107
+ 'tribe-editor__accordion__row-header',
108
+ headerClassName,
109
+ ) }
110
+ onClick={ ( e ) => this.onClick( e ) }
111
+ { ...this.getHeaderAttrs() }
112
+ >
113
+ { header }
114
+ </Button>
115
+ <div
116
+ className={ classNames(
117
+ 'tribe-editor__accordion__row-content',
118
+ contentClassName,
119
+ ) }
120
+ { ...this.getContentAttrs() }
121
+ >
122
+ { content }
123
+ </div>
124
+ </article>
125
+ );
126
+ }
127
+ }
128
+
129
+ export default Row;
common/src/modules/elements/accordion/style.pcss ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ .tribe-editor__accordion__row-content {
2
+ max-height: 0;
3
+ overflow: hidden;
4
+
5
+ &.active {
6
+ max-height: none;
7
+ }
8
+ }
common/src/modules/elements/block-icon/index.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { TEC } from '@moderntribe/common/icons';
10
+ import './style.pcss';
11
+
12
+ export default () => (
13
+ <div className="tribe-editor__icons__container tribe-editor__icons--tec">
14
+ <TEC />
15
+ </div>
16
+ );
common/src/modules/elements/block-icon/style.pcss ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .editor-block-inspector__card {
2
+ .tribe-editor__icons__container {
3
+ padding: 4px;
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+
8
+ svg {
9
+ width: 28px;
10
+ height: 28px;
11
+ }
12
+ }
13
+
14
+ .tribe-editor__icons--tec {
15
+ background-color: #199FD1;
16
+ }
17
+ }
18
+
19
+
20
+ button[class^='editor-block-list-item-tribe-'], button[class*=' editor-block-list-item-tribe-'] {
21
+ svg {
22
+ color: #16a0d6;
23
+ }
24
+ }
common/src/modules/elements/button/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Button Element renders button 1`] = `
4
+ <button
5
+ className="tribe-editor__button"
6
+ onClick={[Function]}
7
+ type="button"
8
+ />
9
+ `;
10
+
11
+ exports[`Button Element renders button with class 1`] = `
12
+ <button
13
+ className="tribe-editor__button test-class"
14
+ onClick={[Function]}
15
+ type="button"
16
+ />
17
+ `;
18
+
19
+ exports[`Button Element renders button with extra attributes 1`] = `
20
+ <button
21
+ className="tribe-editor__button"
22
+ hello="world"
23
+ onClick={[Function]}
24
+ test="one-two-three"
25
+ type="button"
26
+ />
27
+ `;
28
+
29
+ exports[`Button Element renders button with label 1`] = `
30
+ <button
31
+ className="tribe-editor__button"
32
+ onClick={[Function]}
33
+ type="button"
34
+ >
35
+ Hello
36
+ </button>
37
+ `;
38
+
39
+ exports[`Button Element renders button with onClick handler 1`] = `
40
+ <button
41
+ className="tribe-editor__button"
42
+ onClick={[MockFunction]}
43
+ type="button"
44
+ />
45
+ `;
46
+
47
+ exports[`Button Element renders button with set type 1`] = `
48
+ <button
49
+ className="tribe-editor__button"
50
+ onClick={[Function]}
51
+ type="submit"
52
+ />
53
+ `;
54
+
55
+ exports[`Button Element renders disabled button 1`] = `
56
+ <button
57
+ className="tribe-editor__button"
58
+ disabled={true}
59
+ onClick={[Function]}
60
+ type="button"
61
+ />
62
+ `;
common/src/modules/elements/button/__tests__/element.test.js ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import renderer from 'react-test-renderer';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { Button } from '@moderntribe/common/elements';
11
+
12
+ describe( 'Button Element', () => {
13
+ it( 'renders button', () => {
14
+ const component = renderer.create( <Button /> );
15
+ expect( component.toJSON() ).toMatchSnapshot();
16
+ } );
17
+
18
+ it( 'renders button with class', () => {
19
+ const component = renderer.create( <Button className="test-class" /> );
20
+ expect( component.toJSON() ).toMatchSnapshot();
21
+ } );
22
+
23
+ it( 'renders disabled button', () => {
24
+ const component = renderer.create( <Button isDisabled={ true } /> );
25
+ expect( component.toJSON() ).toMatchSnapshot();
26
+ } );
27
+
28
+ it( 'renders button with label', () => {
29
+ const component = renderer.create( <Button>Hello</Button> );
30
+ expect( component.toJSON() ).toMatchSnapshot();
31
+ } );
32
+
33
+ it( 'renders button with onClick handler', () => {
34
+ const onClick = jest.fn();
35
+ const component = renderer.create( <Button onClick={ onClick } /> );
36
+ expect( component.toJSON() ).toMatchSnapshot();
37
+ } );
38
+
39
+ it( 'executes the onClick handler', () => {
40
+ const onClick = jest.fn();
41
+ const component = mount( <Button onClick={ onClick } /> );
42
+ component.find( 'button' ).simulate( 'click' );
43
+ expect( onClick ).toHaveBeenCalled();
44
+ expect( onClick ).toHaveBeenCalledTimes( 1 );
45
+ } );
46
+
47
+ it( 'renders button with set type', () => {
48
+ const component = renderer.create( <Button type="submit" /> );
49
+ expect( component.toJSON() ).toMatchSnapshot();
50
+ } );
51
+
52
+ it( 'renders button with extra attributes', () => {
53
+ const attrs = {
54
+ test: 'one-two-three',
55
+ hello: 'world',
56
+ };
57
+ const component = renderer.create( <Button { ...attrs } /> );
58
+ expect( component.toJSON() ).toMatchSnapshot();
59
+ } );
60
+ } );
common/src/modules/elements/button/element.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { PureComponent } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+ import { noop } from 'lodash';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import './style.pcss';
13
+
14
+ class Button extends PureComponent {
15
+ static defaultProps = {
16
+ onClick: noop,
17
+ type: 'button',
18
+ };
19
+
20
+ static propTypes = {
21
+ className: PropTypes.oneOfType( [
22
+ PropTypes.string,
23
+ PropTypes.arrayOf( PropTypes.string ),
24
+ PropTypes.object,
25
+ ] ),
26
+ isDisabled: PropTypes.bool,
27
+ children: PropTypes.node,
28
+ onClick: PropTypes.func,
29
+ type: PropTypes.string,
30
+ };
31
+
32
+ render() {
33
+ const {
34
+ children,
35
+ className,
36
+ isDisabled,
37
+ onClick,
38
+ type,
39
+ ...rest
40
+ } = this.props;
41
+
42
+ return (
43
+ <button
44
+ className={ classNames( 'tribe-editor__button', className ) }
45
+ disabled={ isDisabled }
46
+ type={ type }
47
+ onClick={ onClick }
48
+ { ...rest }
49
+ >
50
+ { children }
51
+ </button>
52
+ );
53
+ }
54
+ }
55
+
56
+ export default Button;
common/src/modules/elements/button/style.pcss ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* basic styles are in .tribe-editor__btn, this is kepted for backward compatibility */
2
+ .tribe-editor__btn--label {
3
+ background-color: transparent;
4
+ border: none;
5
+ padding: 0;
6
+ margin: 0;
7
+ text-align: left;
8
+ }
9
+
10
+ .tribe-editor__button {
11
+
12
+ &,
13
+ /* extra editor-styles-wrapper class to override gutenberg styles */
14
+ .editor-styles-wrapper & {
15
+
16
+ background-color: transparent;
17
+ border: none;
18
+ padding: 0;
19
+ margin: 0;
20
+ font-family: 'Helvetica', 'sans-serif';
21
+ cursor: pointer;
22
+
23
+ &[disabled] {
24
+ cursor: default;
25
+ }
26
+ }
27
+ }
28
+
29
+ .tribe-editor__button--sm {
30
+
31
+ &,
32
+ /* extra editor-styles-wrapper class to override gutenberg styles */
33
+ .editor-styles-wrapper & {
34
+
35
+ background-color: #009fd4;
36
+ color: #ffffff;
37
+ padding: 11px 16px 9px;
38
+ font-size: 15px;
39
+ font-weight: bold;
40
+ line-height: 18px;
41
+ transition: background-color 0.2s ease;
42
+
43
+ &:hover,
44
+ &:focus {
45
+ background-color: #007bb4;
46
+ }
47
+
48
+ &[disabled] {
49
+
50
+ &,
51
+ &:hover,
52
+ &:focus {
53
+ background-color: #f3f4f5;
54
+ color: #8d949b;
55
+ }
56
+ }
57
+ }
58
+ }
common/src/modules/elements/checkbox-input/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Input element Should render the component 1`] = `
4
+ <input
5
+ className="tribe-editor__input tribe-editor__input--checkbox"
6
+ type="checkbox"
7
+ />
8
+ `;
9
+
10
+ exports[`Input element Should render the component with checked 1`] = `
11
+ <input
12
+ checked={true}
13
+ className="tribe-editor__input tribe-editor__input--checkbox"
14
+ type="checkbox"
15
+ />
16
+ `;
17
+
18
+ exports[`Input element Should render the component with checked 2`] = `
19
+ <input
20
+ checked={false}
21
+ className="tribe-editor__input tribe-editor__input--checkbox"
22
+ type="checkbox"
23
+ />
24
+ `;
25
+
26
+ exports[`Input element Should render the component with class 1`] = `
27
+ <input
28
+ className="tribe-editor__input tribe-editor__input--checkbox checkbox-class"
29
+ type="checkbox"
30
+ />
31
+ `;
32
+
33
+ exports[`Input element Should render the component with extra props 1`] = `
34
+ <input
35
+ className="tribe-editor__input tribe-editor__input--checkbox"
36
+ id="checkbox-id"
37
+ type="checkbox"
38
+ />
39
+ `;
40
+
41
+ exports[`Input element Should render the component with onChange handler 1`] = `
42
+ <input
43
+ className="tribe-editor__input tribe-editor__input--checkbox"
44
+ onChange={[Function]}
45
+ type="checkbox"
46
+ />
47
+ `;
common/src/modules/elements/checkbox-input/__tests__/element.test.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import { noop } from 'lodash';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import CheckboxInput from '../element.js';
11
+
12
+ describe( 'Input element', () => {
13
+ it( 'Should render the component', () => {
14
+ const component = renderer.create( <CheckboxInput /> );
15
+ expect( component.toJSON() ).toMatchSnapshot();
16
+ } );
17
+
18
+ it( 'Should render the component with checked', () => {
19
+ const component1 = renderer.create( <CheckboxInput checked={ true } /> );
20
+ expect( component1.toJSON() ).toMatchSnapshot();
21
+ const component2 = renderer.create( <CheckboxInput checked={ false } /> );
22
+ expect( component2.toJSON() ).toMatchSnapshot();
23
+ } );
24
+
25
+ it( 'Should render the component with class', () => {
26
+ const component = renderer.create( <CheckboxInput className="checkbox-class" /> );
27
+ expect( component.toJSON() ).toMatchSnapshot();
28
+ } );
29
+
30
+ it( 'Should render the component with onChange handler', () => {
31
+ const component = renderer.create( <CheckboxInput onChange={ noop } /> );
32
+ expect( component.toJSON() ).toMatchSnapshot();
33
+ } );
34
+
35
+ it( 'Should render the component with extra props', () => {
36
+ const component = renderer.create( <CheckboxInput id="checkbox-id" /> );
37
+ expect( component.toJSON() ).toMatchSnapshot();
38
+ } );
39
+ } );
common/src/modules/elements/checkbox-input/element.js ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import Input from '@moderntribe/common/elements/input/element';
12
+ import './style.pcss';
13
+
14
+ const CheckboxInput = ( {
15
+ checked,
16
+ className,
17
+ onChange,
18
+ ...rest
19
+ } ) => (
20
+ <Input
21
+ checked={ checked }
22
+ className={ classNames( 'tribe-editor__input--checkbox', className ) }
23
+ onChange={ onChange }
24
+ type="checkbox"
25
+ { ...rest }
26
+ />
27
+ );
28
+
29
+ CheckboxInput.propTypes = {
30
+ checked: PropTypes.bool,
31
+ className: PropTypes.string,
32
+ onChange: PropTypes.func,
33
+ };
34
+
35
+ export default CheckboxInput;
common/src/modules/elements/checkbox-input/style.pcss ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* increased specificity required to override gutenberg editor styles */
2
+ input[type=checkbox].tribe-editor__input--checkbox {
3
+ background-color: #ffffff;
4
+ border: 1px solid #E0E5E9;
5
+ border-radius: 0;
6
+
7
+ &:focus {
8
+ border: 1px solid #E0E5E9;
9
+ box-shadow: 0 0 0 1px #E0E5E9;
10
+ }
11
+
12
+ &:checked {
13
+ background-color: #ffffff;
14
+ border: 1px solid #E0E5E9;
15
+
16
+ &:focus {
17
+ border: 1px solid #E0E5E9;
18
+ box-shadow: 0 0 0 1px #E0E5E9;
19
+ }
20
+
21
+ &:before {
22
+ color: #11A0D2;
23
+ }
24
+ }
25
+ }
common/src/modules/elements/checkbox/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Checkbox Element renders checkbox 1`] = `
4
+ <div
5
+ className="tribe-editor__checkbox"
6
+ >
7
+ <input
8
+ checked={false}
9
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
10
+ onChange={[Function]}
11
+ type="checkbox"
12
+ />
13
+ <label
14
+ className="tribe-editor__checkbox__label"
15
+ />
16
+ </div>
17
+ `;
18
+
19
+ exports[`Checkbox Element renders checkbox with class 1`] = `
20
+ <div
21
+ className="tribe-editor__checkbox test-class"
22
+ >
23
+ <input
24
+ checked={false}
25
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
26
+ onChange={[Function]}
27
+ type="checkbox"
28
+ />
29
+ <label
30
+ className="tribe-editor__checkbox__label"
31
+ />
32
+ </div>
33
+ `;
34
+
35
+ exports[`Checkbox Element renders checkbox with id 1`] = `
36
+ <div
37
+ className="tribe-editor__checkbox"
38
+ >
39
+ <input
40
+ checked={false}
41
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
42
+ id="test-id"
43
+ onChange={[Function]}
44
+ type="checkbox"
45
+ />
46
+ <label
47
+ className="tribe-editor__checkbox__label"
48
+ htmlFor="test-id"
49
+ />
50
+ </div>
51
+ `;
52
+
53
+ exports[`Checkbox Element renders checkbox with label 1`] = `
54
+ <div
55
+ className="tribe-editor__checkbox"
56
+ >
57
+ <input
58
+ checked={false}
59
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
60
+ onChange={[Function]}
61
+ type="checkbox"
62
+ />
63
+ <label
64
+ className="tribe-editor__checkbox__label"
65
+ >
66
+ Test Label
67
+ </label>
68
+ </div>
69
+ `;
70
+
71
+ exports[`Checkbox Element renders checkbox with name 1`] = `
72
+ <div
73
+ className="tribe-editor__checkbox"
74
+ >
75
+ <input
76
+ checked={false}
77
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
78
+ name="test-name"
79
+ onChange={[Function]}
80
+ type="checkbox"
81
+ />
82
+ <label
83
+ className="tribe-editor__checkbox__label"
84
+ />
85
+ </div>
86
+ `;
87
+
88
+ exports[`Checkbox Element renders checkbox with onChange handler 1`] = `
89
+ <div
90
+ className="tribe-editor__checkbox"
91
+ >
92
+ <input
93
+ checked={false}
94
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
95
+ onChange={[MockFunction]}
96
+ type="checkbox"
97
+ />
98
+ <label
99
+ className="tribe-editor__checkbox__label"
100
+ />
101
+ </div>
102
+ `;
103
+
104
+ exports[`Checkbox Element renders checkbox with value 1`] = `
105
+ <div
106
+ className="tribe-editor__checkbox"
107
+ >
108
+ <input
109
+ checked={false}
110
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
111
+ onChange={[Function]}
112
+ type="checkbox"
113
+ value="Test Value"
114
+ />
115
+ <label
116
+ className="tribe-editor__checkbox__label"
117
+ />
118
+ </div>
119
+ `;
120
+
121
+ exports[`Checkbox Element renders checked checkbox 1`] = `
122
+ <div
123
+ className="tribe-editor__checkbox"
124
+ >
125
+ <input
126
+ checked={true}
127
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
128
+ onChange={[Function]}
129
+ type="checkbox"
130
+ />
131
+ <label
132
+ className="tribe-editor__checkbox__label"
133
+ />
134
+ </div>
135
+ `;
136
+
137
+ exports[`Checkbox Element renders disabled checkbox 1`] = `
138
+ <div
139
+ className="tribe-editor__checkbox"
140
+ >
141
+ <input
142
+ checked={false}
143
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
144
+ disabled={true}
145
+ onChange={[Function]}
146
+ type="checkbox"
147
+ />
148
+ <label
149
+ className="tribe-editor__checkbox__label"
150
+ />
151
+ </div>
152
+ `;
153
+
154
+ exports[`Checkbox Element renders unchecked checkbox 1`] = `
155
+ <div
156
+ className="tribe-editor__checkbox"
157
+ >
158
+ <input
159
+ checked={false}
160
+ className="tribe-editor__input tribe-editor__input--checkbox tribe-editor__checkbox__input"
161
+ onChange={[Function]}
162
+ type="checkbox"
163
+ />
164
+ <label
165
+ className="tribe-editor__checkbox__label"
166
+ />
167
+ </div>
168
+ `;
common/src/modules/elements/checkbox/__tests__/element.test.js ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { Checkbox } from '@moderntribe/common/elements';
10
+
11
+ describe( 'Checkbox Element', () => {
12
+ it( 'renders checkbox', () => {
13
+ const component = renderer.create( <Checkbox /> );
14
+ expect( component.toJSON() ).toMatchSnapshot();
15
+ } );
16
+
17
+ it( 'renders checked checkbox', () => {
18
+ const component = renderer.create( <Checkbox checked={ true } /> );
19
+ expect( component.toJSON() ).toMatchSnapshot();
20
+ } );
21
+
22
+ it( 'renders unchecked checkbox', () => {
23
+ const component = renderer.create( <Checkbox checked={ false } /> );
24
+ expect( component.toJSON() ).toMatchSnapshot();
25
+ } );
26
+
27
+ it( 'renders checkbox with class', () => {
28
+ const component = renderer.create( <Checkbox className="test-class" /> );
29
+ expect( component.toJSON() ).toMatchSnapshot();
30
+ } );
31
+
32
+ it( 'renders disabled checkbox', () => {
33
+ const component = renderer.create( <Checkbox disabled={ true } /> );
34
+ expect( component.toJSON() ).toMatchSnapshot();
35
+ } );
36
+
37
+ it( 'renders checkbox with id', () => {
38
+ const component = renderer.create( <Checkbox id="test-id" /> );
39
+ expect( component.toJSON() ).toMatchSnapshot();
40
+ } );
41
+
42
+ it( 'renders checkbox with label', () => {
43
+ const component = renderer.create( <Checkbox label="Test Label" /> );
44
+ expect( component.toJSON() ).toMatchSnapshot();
45
+ } );
46
+
47
+ it( 'renders checkbox with name', () => {
48
+ const component = renderer.create( <Checkbox name="test-name" /> );
49
+ expect( component.toJSON() ).toMatchSnapshot();
50
+ } );
51
+
52
+ it( 'renders checkbox with value', () => {
53
+ const component = renderer.create( <Checkbox value="Test Value" /> );
54
+ expect( component.toJSON() ).toMatchSnapshot();
55
+ } );
56
+
57
+ it( 'renders checkbox with onChange handler', () => {
58
+ const onChange = jest.fn();
59
+ const component = renderer.create( <Checkbox onChange={ onChange } /> );
60
+ expect( component.toJSON() ).toMatchSnapshot();
61
+ } );
62
+
63
+ it( 'executes checkbox with onChange handler', () => {
64
+ const onChange = jest.fn();
65
+ const component = mount( <Checkbox onChange={ onChange } /> );
66
+ component.find( 'input' ).simulate( 'change' );
67
+ expect( onChange ).toHaveBeenCalled();
68
+ expect( onChange ).toHaveBeenCalledTimes( 1 );
69
+ } );
70
+ } );
common/src/modules/elements/checkbox/element.js ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+ import { noop } from 'lodash';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import { CheckboxInput } from '@moderntribe/common/elements';
13
+
14
+ const Checkbox = ( {
15
+ checked,
16
+ className,
17
+ disabled,
18
+ id,
19
+ label,
20
+ onChange,
21
+ name,
22
+ value,
23
+ } ) => {
24
+ return (
25
+ <div className={ classNames( 'tribe-editor__checkbox', className ) }>
26
+ <CheckboxInput
27
+ checked={ checked }
28
+ className="tribe-editor__checkbox__input"
29
+ disabled={ disabled }
30
+ id={ id }
31
+ name={ name }
32
+ onChange={ onChange }
33
+ value={ value }
34
+ />
35
+ <label
36
+ className="tribe-editor__checkbox__label"
37
+ htmlFor={ id }
38
+ >
39
+ { label }
40
+ </label>
41
+ </div>
42
+ );
43
+ };
44
+
45
+ Checkbox.defaultProps = {
46
+ checked: false,
47
+ onChange: noop,
48
+ }
49
+
50
+ Checkbox.propTypes = {
51
+ checked: PropTypes.bool.isRequired,
52
+ className: PropTypes.string,
53
+ disabled: PropTypes.bool,
54
+ id: PropTypes.string,
55
+ label: PropTypes.node,
56
+ name: PropTypes.string,
57
+ onChange: PropTypes.func,
58
+ value: PropTypes.string,
59
+ };
60
+
61
+ export default Checkbox;
common/src/modules/elements/counter/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Counter Element renders counter 1`] = `
4
+ <div
5
+ className="tribe-editor__counter"
6
+ >
7
+ <span
8
+ className="tribe-editor__counter__count"
9
+ />
10
+ <span
11
+ className="tribe-editor__counter__label"
12
+ />
13
+ </div>
14
+ `;
15
+
16
+ exports[`Counter Element renders counter with class 1`] = `
17
+ <div
18
+ className="tribe-editor__counter test-class"
19
+ >
20
+ <span
21
+ className="tribe-editor__counter__count"
22
+ />
23
+ <span
24
+ className="tribe-editor__counter__label"
25
+ />
26
+ </div>
27
+ `;
28
+
29
+ exports[`Counter Element renders counter with count 1`] = `
30
+ <div
31
+ className="tribe-editor__counter"
32
+ >
33
+ <span
34
+ className="tribe-editor__counter__count"
35
+ >
36
+ 42
37
+ </span>
38
+ <span
39
+ className="tribe-editor__counter__label"
40
+ />
41
+ </div>
42
+ `;
43
+
44
+ exports[`Counter Element renders counter with label 1`] = `
45
+ <div
46
+ className="tribe-editor__counter"
47
+ >
48
+ <span
49
+ className="tribe-editor__counter__count"
50
+ />
51
+ <span
52
+ className="tribe-editor__counter__label"
53
+ >
54
+ test-label
55
+ </span>
56
+ </div>
57
+ `;
common/src/modules/elements/counter/__tests__/element.test.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import renderer from 'react-test-renderer';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { Counter } from '@moderntribe/common/elements';
11
+
12
+ describe( 'Counter Element', () => {
13
+ it( 'renders counter', () => {
14
+ const component = renderer.create( <Counter /> );
15
+ expect( component.toJSON() ).toMatchSnapshot();
16
+ } );
17
+
18
+ it( 'renders counter with class', () => {
19
+ const component = renderer.create( <Counter className="test-class" /> );
20
+ expect( component.toJSON() ).toMatchSnapshot();
21
+ } );
22
+
23
+ it( 'renders counter with count', () => {
24
+ const component = renderer.create( <Counter count={ 42 } /> );
25
+ expect( component.toJSON() ).toMatchSnapshot();
26
+ } );
27
+
28
+ it( 'renders counter with label', () => {
29
+ const component = renderer.create( <Counter label="test-label" /> );
30
+ expect( component.toJSON() ).toMatchSnapshot();
31
+ } );
32
+ } );
common/src/modules/elements/counter/element.js ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.pcss';
12
+
13
+ const Counter = ( {
14
+ className,
15
+ count,
16
+ label,
17
+ } ) => (
18
+ <div className={ classNames(
19
+ 'tribe-editor__counter',
20
+ className,
21
+ ) }>
22
+ <span className="tribe-editor__counter__count">
23
+ { count }
24
+ </span>
25
+ <span className="tribe-editor__counter__label">
26
+ { label }
27
+ </span>
28
+ </div>
29
+ );
30
+
31
+ Counter.propTypes = {
32
+ className: PropTypes.string,
33
+ count: PropTypes.number,
34
+ label: PropTypes.string,
35
+ };
36
+
37
+ export default Counter;
common/src/modules/elements/counter/style.pcss ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__counter {
2
+ display: flex;
3
+ flex-direction: column;
4
+ align-items: center;
5
+ }
6
+
7
+ .tribe-editor__counter__count {
8
+ flex: none;
9
+ color: #AEB4BB;
10
+ font-size: 32px;
11
+ font-weight: bold;
12
+ line-height: 40px;
13
+ margin-bottom: 10px;
14
+ }
15
+
16
+ .tribe-editor__counter__label {
17
+ flex: none;
18
+ color: #AEB4BB;
19
+ font-size: 12px;
20
+ line-height: 14px;
21
+ letter-spacing: 0.04px;
22
+ }
common/src/modules/elements/creatable-select/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`CreatableSelect element Should render the component 1`] = `
4
+ <div
5
+ className="css-10nd86i tribe-editor__creatable-select"
6
+ onKeyDown={[Function]}
7
+ >
8
+ <div
9
+ className="css-vj8t7z tribe-editor__creatable-select__control"
10
+ onMouseDown={[Function]}
11
+ onTouchEnd={[Function]}
12
+ >
13
+ <div
14
+ className="css-1hwfws3 tribe-editor__creatable-select__value-container"
15
+ >
16
+ <div
17
+ className="css-1492t68 tribe-editor__creatable-select__placeholder"
18
+ >
19
+ Select...
20
+ </div>
21
+ <div
22
+ className="css-1g6gooi"
23
+ >
24
+ <div
25
+ className="tribe-editor__creatable-select__input"
26
+ style={
27
+ Object {
28
+ "display": "inline-block",
29
+ }
30
+ }
31
+ >
32
+ <input
33
+ aria-autocomplete="list"
34
+ autoCapitalize="none"
35
+ autoComplete="off"
36
+ autoCorrect="off"
37
+ disabled={false}
38
+ id="react-select-2-input"
39
+ onBlur={[Function]}
40
+ onChange={[Function]}
41
+ onFocus={[Function]}
42
+ spellCheck="false"
43
+ style={
44
+ Object {
45
+ "background": 0,
46
+ "border": 0,
47
+ "boxSizing": "content-box",
48
+ "color": "inherit",
49
+ "fontSize": "inherit",
50
+ "opacity": 1,
51
+ "outline": 0,
52
+ "padding": 0,
53
+ "width": "1px",
54
+ }
55
+ }
56
+ tabIndex="0"
57
+ type="text"
58
+ value=""
59
+ />
60
+ <div
61
+ style={
62
+ Object {
63
+ "height": 0,
64
+ "left": 0,
65
+ "overflow": "scroll",
66
+ "position": "absolute",
67
+ "top": 0,
68
+ "visibility": "hidden",
69
+ "whiteSpace": "pre",
70
+ }
71
+ }
72
+ >
73
+
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ <div
79
+ className="css-1wy0on6 tribe-editor__creatable-select__indicators"
80
+ >
81
+ <div
82
+ aria-hidden="true"
83
+ className="css-1ep9fjw tribe-editor__creatable-select__indicator tribe-editor__creatable-select__dropdown-indicator"
84
+ onMouseDown={[Function]}
85
+ onTouchEnd={[Function]}
86
+ >
87
+ <span
88
+ className="tribe-editor__creatable-select__dropdown-indicator"
89
+ >
90
+ arrow-down
91
+ </span>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ `;
97
+
98
+ exports[`CreatableSelect element Should render the component with class 1`] = `
99
+ <div
100
+ className="css-10nd86i tribe-editor__creatable-select test-class"
101
+ onKeyDown={[Function]}
102
+ >
103
+ <div
104
+ className="css-vj8t7z tribe-editor__creatable-select__control"
105
+ onMouseDown={[Function]}
106
+ onTouchEnd={[Function]}
107
+ >
108
+ <div
109
+ className="css-1hwfws3 tribe-editor__creatable-select__value-container"
110
+ >
111
+ <div
112
+ className="css-1492t68 tribe-editor__creatable-select__placeholder"
113
+ >
114
+ Select...
115
+ </div>
116
+ <div
117
+ className="css-1g6gooi"
118
+ >
119
+ <div
120
+ className="tribe-editor__creatable-select__input"
121
+ style={
122
+ Object {
123
+ "display": "inline-block",
124
+ }
125
+ }
126
+ >
127
+ <input
128
+ aria-autocomplete="list"
129
+ autoCapitalize="none"
130
+ autoComplete="off"
131
+ autoCorrect="off"
132
+ disabled={false}
133
+ id="react-select-3-input"
134
+ onBlur={[Function]}
135
+ onChange={[Function]}
136
+ onFocus={[Function]}
137
+ spellCheck="false"
138
+ style={
139
+ Object {
140
+ "background": 0,
141
+ "border": 0,
142
+ "boxSizing": "content-box",
143
+ "color": "inherit",
144
+ "fontSize": "inherit",
145
+ "opacity": 1,
146
+ "outline": 0,
147
+ "padding": 0,
148
+ "width": "1px",
149
+ }
150
+ }
151
+ tabIndex="0"
152
+ type="text"
153
+ value=""
154
+ />
155
+ <div
156
+ style={
157
+ Object {
158
+ "height": 0,
159
+ "left": 0,
160
+ "overflow": "scroll",
161
+ "position": "absolute",
162
+ "top": 0,
163
+ "visibility": "hidden",
164
+ "whiteSpace": "pre",
165
+ }
166
+ }
167
+ >
168
+
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ <div
174
+ className="css-1wy0on6 tribe-editor__creatable-select__indicators"
175
+ >
176
+ <div
177
+ aria-hidden="true"
178
+ className="css-1ep9fjw tribe-editor__creatable-select__indicator tribe-editor__creatable-select__dropdown-indicator"
179
+ onMouseDown={[Function]}
180
+ onTouchEnd={[Function]}
181
+ >
182
+ <span
183
+ className="tribe-editor__creatable-select__dropdown-indicator"
184
+ >
185
+ arrow-down
186
+ </span>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ `;
192
+
193
+ exports[`CreatableSelect element Should render the component with extra props 1`] = `
194
+ <div
195
+ className="css-10nd86i tribe-editor__creatable-select"
196
+ onKeyDown={[Function]}
197
+ >
198
+ <div
199
+ className="css-vj8t7z tribe-editor__creatable-select__control"
200
+ onMouseDown={[Function]}
201
+ onTouchEnd={[Function]}
202
+ >
203
+ <div
204
+ className="css-1hwfws3 tribe-editor__creatable-select__value-container"
205
+ >
206
+ <div
207
+ className="css-1492t68 tribe-editor__creatable-select__placeholder"
208
+ >
209
+ Select...
210
+ </div>
211
+ <input
212
+ className="css-14uuagi"
213
+ disabled={false}
214
+ id="react-select-4-input"
215
+ onBlur={[Function]}
216
+ onChange={[Function]}
217
+ onFocus={[Function]}
218
+ readOnly={true}
219
+ tabIndex="0"
220
+ value=""
221
+ />
222
+ </div>
223
+ <div
224
+ className="css-1wy0on6 tribe-editor__creatable-select__indicators"
225
+ >
226
+ <div
227
+ aria-hidden="true"
228
+ className="css-1ep9fjw tribe-editor__creatable-select__indicator tribe-editor__creatable-select__dropdown-indicator"
229
+ onMouseDown={[Function]}
230
+ onTouchEnd={[Function]}
231
+ >
232
+ <span
233
+ className="tribe-editor__creatable-select__dropdown-indicator"
234
+ >
235
+ arrow-down
236
+ </span>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ `;
common/src/modules/elements/creatable-select/__tests__/element.test.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import CreatableSelect from '../element.js';
10
+
11
+ const options = [
12
+ { label: 'Test 1', value: 'test-1' },
13
+ { label: 'Test 2', value: 'test-2' },
14
+ ];
15
+
16
+ describe( 'CreatableSelect element', () => {
17
+ it( 'Should render the component', () => {
18
+ const component = renderer.create( <CreatableSelect options={ options } /> );
19
+ expect( component.toJSON() ).toMatchSnapshot();
20
+ } );
21
+
22
+ it( 'Should render the component with class', () => {
23
+ const component = renderer.create( <CreatableSelect options={ options } className="test-class" /> );
24
+ expect( component.toJSON() ).toMatchSnapshot();
25
+ } );
26
+
27
+ it( 'Should render the component with extra props', () => {
28
+ const component = renderer.create( <CreatableSelect options={ options } isSearchable={ false } /> );
29
+ expect( component.toJSON() ).toMatchSnapshot();
30
+ } );
31
+ } );
common/src/modules/elements/creatable-select/element.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+ import { components } from 'react-select';
8
+ import ReactCreatableSelect from 'react-select/lib/Creatable';
9
+ import { Dashicon } from '@wordpress/components';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import './style.pcss';
15
+
16
+ const DropdownIndicator = ( props ) => (
17
+ components.DropdownIndicator && (
18
+ <components.DropdownIndicator { ...props }>
19
+ <Dashicon
20
+ className="tribe-editor__creatable-select__dropdown-indicator"
21
+ icon={ 'arrow-down' }
22
+ />
23
+ </components.DropdownIndicator>
24
+ )
25
+ );
26
+
27
+ const IndicatorSeparator = () => null;
28
+
29
+ /**
30
+ * There seems to be an issue with Creatable and a custom isValidNewOption
31
+ * prop needs to be passed in for this to work.
32
+ *
33
+ * See:
34
+ * - https://github.com/JedWatson/react-select/issues/2630
35
+ * - https://github.com/JedWatson/react-select/issues/2944
36
+ */
37
+ const CreatableSelect = ( { className, ...rest } ) => (
38
+ <ReactCreatableSelect
39
+ className={ classNames( 'tribe-editor__creatable-select', className ) }
40
+ classNamePrefix="tribe-editor__creatable-select"
41
+ components={ { DropdownIndicator, IndicatorSeparator } }
42
+ { ...rest }
43
+ />
44
+ );
45
+
46
+ CreatableSelect.propTypes = {
47
+ className: PropTypes.string,
48
+ };
49
+
50
+ export default CreatableSelect;
common/src/modules/elements/creatable-select/style.pcss ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__creatable-select {
2
+
3
+ .tribe-editor__creatable-select__control {
4
+ height: 40px;
5
+ border: 1px solid #E1E3E6;
6
+ border-radius: 3px;
7
+ background-color: #FFFFFF;
8
+
9
+ &:hover {
10
+ border: 1px solid #E1E3E6;
11
+ }
12
+
13
+ &--is-focused {
14
+ box-shadow: none;
15
+ }
16
+ }
17
+
18
+ .tribe-editor__creatable-select__value-container {
19
+ padding: 2px 5px 2px 15px;
20
+ }
21
+
22
+ .tribe-editor__creatable-select__single-value {
23
+ margin: 0;
24
+ max-width: calc(100% - 15px);
25
+ font-size: 16px;
26
+ line-height: 1.5;
27
+ }
28
+
29
+ .tribe-editor__creatable-select__input {
30
+ font-size: 16px;
31
+
32
+ & > input {
33
+ margin: 0;
34
+ line-height: 1.5;
35
+
36
+ &,
37
+ &:focus {
38
+ box-shadow: none;
39
+ }
40
+ }
41
+ }
42
+
43
+ svg.tribe-editor__creatable-select__dropdown-indicator {
44
+ fill: #555D66;
45
+ }
46
+
47
+ .tribe-editor__creatable-select__menu {
48
+ margin: 0;
49
+ border: 1px solid #E1E3E6;
50
+ border-top: none;
51
+ border-radius: 0;
52
+ border-bottom-left-radius: 3px;
53
+ border-bottom-right-radius: 3px;
54
+ box-shadow: none;
55
+ transform: translateY(-7px);
56
+ }
57
+
58
+ .tribe-editor__creatable-select__menu-list {
59
+ padding: 0;
60
+ }
61
+
62
+ .tribe-editor__creatable-select__option {
63
+ font-size: 16px;
64
+ line-height: 1.5;
65
+ padding: 3px 15px;
66
+
67
+ &--is-focused {
68
+ background-color: #E7F5FA;
69
+ }
70
+
71
+ &--is-selected {
72
+ background-color: #11A0D2;
73
+ }
74
+ }
75
+ }
common/src/modules/elements/day-picker-input/element.js ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import classNames from 'classnames';
6
+ import 'react-day-picker/lib/style.css';
7
+ import ReactDayPickerInput from 'react-day-picker/DayPickerInput';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import './style.pcss';
13
+
14
+ const DayPickerInput = ( props ) => (
15
+ <ReactDayPickerInput
16
+ classNames={ {
17
+ container: classNames(
18
+ 'tribe-editor__day-picker-input',
19
+ 'DayPickerInput',
20
+ ),
21
+ overlayWrapper: classNames(
22
+ 'tribe-editor__day-picker-input__overlay-wrapper',
23
+ 'DayPickerInput-OverlayWrapper',
24
+ ),
25
+ overlay: classNames(
26
+ 'tribe-editor__day-picker-input__overlay',
27
+ 'DayPickerInput-Overlay',
28
+ ),
29
+ } }
30
+ { ...props }
31
+ />
32
+ );
33
+
34
+ export default DayPickerInput;
common/src/modules/elements/day-picker-input/style.pcss ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__day-picker-input.DayPickerInput {
2
+
3
+ & > input {
4
+ border: 1px solid #e1e3e6;
5
+ color: #545d66;
6
+ font-size: 16px;
7
+ line-height: 24px;
8
+ padding: 7px 15px;
9
+ width: 100%;
10
+ height: 40px;
11
+
12
+ &:disabled {
13
+ color: #AEB4BB;
14
+ }
15
+ }
16
+ }
17
+
18
+ /* -----------------------------------------------------------
19
+ DayPicker Input Calender Styles
20
+ ----------------------------------------------------------- */
21
+
22
+ .tribe-editor__day-picker-input {
23
+
24
+ .DayPickerInput-Overlay {
25
+ padding: 20px;
26
+ z-index: 10;
27
+ }
28
+
29
+ .DayPicker {
30
+ width: 100%;
31
+ }
32
+
33
+ .DayPicker-Month {
34
+ margin: 0;
35
+ }
36
+
37
+ .DayPicker-Caption > div,
38
+ .DayPicker-Weekday,
39
+ .DayPicker-Day {
40
+ color: #545d66;
41
+ font-family: 'Helvetica', 'sans-serif';
42
+ font-weight: normal;
43
+ }
44
+
45
+ .DayPicker-Caption > div {
46
+ font-size: 16px;
47
+ margin-bottom: 12px;
48
+ text-align: center;
49
+ }
50
+
51
+ .DayPicker-Weekday {
52
+ font-size: 12px;
53
+ }
54
+
55
+ .DayPicker-Day {
56
+ font-size: 14px;
57
+
58
+ &:hover {
59
+ color: #007bb4;
60
+ background-color: #ffffff;
61
+ }
62
+ }
63
+
64
+ .DayPicker-Day--today {
65
+ color: #545D66;
66
+ }
67
+
68
+ .DayPicker-Day--disabled {
69
+ pointer-events: none;
70
+ color: #cccccc;
71
+ }
72
+
73
+ .DayPicker-Day--selected:not(.DayPicker-Day--outside) {
74
+ border-radius: 0;
75
+ background-color: #009fd4;
76
+ color: #ffffff;
77
+
78
+ &:hover {
79
+ background-color: #007bb4;
80
+ color: #ffffff;
81
+ }
82
+ }
83
+
84
+ .DayPicker-NavButton--prev {
85
+ left: 0;
86
+ top: 0;
87
+ }
88
+
89
+ .DayPicker-NavButton--next {
90
+ right: 0;
91
+ top: 0;
92
+ }
93
+
94
+ .DayPicker:not(.DayPicker--interactionDisabled) .DayPicker-Day:not(.DayPicker-Day--disabled):not(.DayPicker-Day--selected):not(.DayPicker-Day--outside) {
95
+
96
+ &:hover {
97
+ background-color: #ffffff;
98
+ }
99
+ }
100
+
101
+ .DayPicker-Day--selected:not(.DayPicker-Day--start):not(.DayPicker-Day--end):not(.DayPicker-Day--outside) {
102
+ background-color: #e7f5fa;
103
+ color: #545d66;
104
+
105
+ &:hover {
106
+ color: #007bb4;
107
+ }
108
+ }
109
+ }
common/src/modules/elements/heading/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<Heading> <h1> 1`] = `
4
+ <h1
5
+ className="tribe-editor__heading tribe-editor__heading--h1"
6
+ >
7
+ Modern Tribe
8
+ </h1>
9
+ `;
10
+
11
+ exports[`<Heading> <h2> 1`] = `
12
+ <h2
13
+ className="tribe-editor__heading tribe-editor__heading--h2"
14
+ >
15
+ Modern Tribe
16
+ </h2>
17
+ `;
18
+
19
+ exports[`<Heading> <h3> 1`] = `
20
+ <h3
21
+ className="tribe-editor__heading tribe-editor__heading--h3"
22
+ >
23
+ Modern Tribe
24
+ </h3>
25
+ `;
26
+
27
+ exports[`<Heading> <h4> 1`] = `
28
+ <h4
29
+ className="tribe-editor__heading tribe-editor__heading--h4"
30
+ >
31
+ Modern Tribe
32
+ </h4>
33
+ `;
34
+
35
+ exports[`<Heading> <h5> 1`] = `
36
+ <h5
37
+ className="tribe-editor__heading tribe-editor__heading--h5"
38
+ >
39
+ Modern Tribe
40
+ </h5>
41
+ `;
42
+
43
+ exports[`<Heading> <h6> 1`] = `
44
+ <h6
45
+ className="tribe-editor__heading tribe-editor__heading--h6"
46
+ >
47
+ Modern Tribe
48
+ </h6>
49
+ `;
common/src/modules/elements/heading/__tests__/element.test.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ import Heading from '../element';
4
+
5
+ describe( '<Heading>', () => {
6
+ test( '<h1>', () => {
7
+ const component = renderer.create(
8
+ <Heading level={ 1 }>Modern Tribe</Heading>,
9
+ );
10
+ expect( component.toJSON() ).toMatchSnapshot();
11
+ } );
12
+
13
+ test( '<h2>', () => {
14
+ const component = renderer.create(
15
+ <Heading level={ 2 }>Modern Tribe</Heading>,
16
+ );
17
+ expect( component.toJSON() ).toMatchSnapshot();
18
+ } );
19
+
20
+ test( '<h3>', () => {
21
+ const component = renderer.create(
22
+ <Heading level={ 3 }>Modern Tribe</Heading>,
23
+ );
24
+ expect( component.toJSON() ).toMatchSnapshot();
25
+ } );
26
+
27
+ test( '<h4>', () => {
28
+ const component = renderer.create(
29
+ <Heading level={ 4 }>Modern Tribe</Heading>,
30
+ );
31
+ expect( component.toJSON() ).toMatchSnapshot();
32
+ } );
33
+
34
+ test( '<h5>', () => {
35
+ const component = renderer.create(
36
+ <Heading level={ 5 }>Modern Tribe</Heading>,
37
+ );
38
+ expect( component.toJSON() ).toMatchSnapshot();
39
+ } );
40
+
41
+ test( '<h6>', () => {
42
+ const component = renderer.create(
43
+ <Heading level={ 6 }>Modern Tribe</Heading>,
44
+ );
45
+ expect( component.toJSON() ).toMatchSnapshot();
46
+ } );
47
+ } );
common/src/modules/elements/heading/element.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.pcss';
12
+
13
+ const Heading = ( { level, children, className } ) => {
14
+ const HeadingLevel = `h${ level }`;
15
+ const headingClassName = classNames(
16
+ 'tribe-editor__heading',
17
+ `tribe-editor__heading--h${ level }`,
18
+ className,
19
+ );
20
+ return (
21
+ <HeadingLevel className={ headingClassName }>
22
+ { children }
23
+ </HeadingLevel>
24
+ );
25
+ };
26
+
27
+ Heading.propTypes = {
28
+ children: PropTypes.node.isRequired,
29
+ level: PropTypes.oneOf( [ 1, 2, 3, 4, 5, 6 ] ).isRequired,
30
+ };
31
+
32
+ export default Heading;
common/src/modules/elements/heading/style.pcss ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__heading {
2
+ font-family: 'Helvetica', 'Arial', 'sans-serif';
3
+ color: #000;
4
+ }
5
+
6
+ .tribe-editor__heading--h1 {
7
+ font-size: 2.375rem; /* 38pts */
8
+ }
9
+
10
+ .tribe-editor__heading--h2 {
11
+ font-size: 1.3125rem; /* 21pts */
12
+ }
13
+
14
+ .tribe-editor__heading--h3 {
15
+ font-size: 1rem; /* 16pts */
16
+ }
common/src/modules/elements/image-upload/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`ImageUpload renders the component 1`] = `
4
+ <div
5
+ className="tribe-editor__image-upload"
6
+ >
7
+ <div
8
+ className="tribe-editor__image-upload__content"
9
+ >
10
+ <button>
11
+ Media Upload
12
+ </button>
13
+ </div>
14
+ </div>
15
+ `;
16
+
17
+ exports[`ImageUpload renders upload image button 1`] = `
18
+ <div
19
+ className="tribe-editor__image-upload"
20
+ >
21
+ <div
22
+ className="tribe-editor__image-upload__content"
23
+ >
24
+ <button>
25
+ Media Upload
26
+ </button>
27
+ </div>
28
+ </div>
29
+ `;
30
+
31
+ exports[`ImageUpload renders uploaded image 1`] = `
32
+ <div
33
+ className="tribe-editor__image-upload tribe-editor__image-upload--has-image"
34
+ >
35
+ <div
36
+ className="tribe-editor__image-upload__content"
37
+ >
38
+ <div
39
+ className="tribe-editor__image-upload__image-wrapper"
40
+ >
41
+ <img
42
+ alt="test-alt"
43
+ className="tribe-editor__image tribe-editor__image-upload__image"
44
+ src="test-src"
45
+ />
46
+ <button
47
+ className="tribe-editor__button tribe-editor__image-upload__remove-button"
48
+ onClick={[MockFunction]}
49
+ type="button"
50
+ >
51
+ <span>
52
+ icon
53
+ </span>
54
+ <span
55
+ className="tribe-editor__image-upload__remove-button-text"
56
+ >
57
+ remove
58
+ </span>
59
+ </button>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ `;
64
+
65
+ exports[`ImageUpload renders with class 1`] = `
66
+ <div
67
+ className="tribe-editor__image-upload test-class"
68
+ >
69
+ <div
70
+ className="tribe-editor__image-upload__content"
71
+ >
72
+ <button>
73
+ Media Upload
74
+ </button>
75
+ </div>
76
+ </div>
77
+ `;
78
+
79
+ exports[`ImageUpload renders with description 1`] = `
80
+ <div
81
+ className="tribe-editor__image-upload"
82
+ >
83
+ <div
84
+ className="tribe-editor__image-upload__content"
85
+ >
86
+ <p
87
+ className="tribe-editor__image-upload__description"
88
+ >
89
+ The Next Generation of Digital Agency
90
+ </p>
91
+ <button>
92
+ Media Upload
93
+ </button>
94
+ </div>
95
+ </div>
96
+ `;
97
+
98
+ exports[`ImageUpload renders with title 1`] = `
99
+ <div
100
+ className="tribe-editor__image-upload"
101
+ >
102
+ <h3
103
+ className="tribe-editor__image-upload__title"
104
+ >
105
+ Modern Tribe
106
+ </h3>
107
+ <div
108
+ className="tribe-editor__image-upload__content"
109
+ >
110
+ <button>
111
+ Media Upload
112
+ </button>
113
+ </div>
114
+ </div>
115
+ `;
116
+
117
+ exports[`renderImage renders the image and button 1`] = `
118
+ <div
119
+ className="tribe-editor__image-upload__image-wrapper"
120
+ >
121
+ <img
122
+ alt="test-alt"
123
+ className="tribe-editor__image tribe-editor__image-upload__image"
124
+ src="test-src"
125
+ />
126
+ <button
127
+ className="tribe-editor__button tribe-editor__image-upload__remove-button"
128
+ disabled={false}
129
+ onClick={[MockFunction]}
130
+ type="button"
131
+ >
132
+ <span>
133
+ icon
134
+ </span>
135
+ <span
136
+ className="tribe-editor__image-upload__remove-button-text"
137
+ >
138
+ remove
139
+ </span>
140
+ </button>
141
+ </div>
142
+ `;
143
+
144
+ exports[`renderImage renders the image and disabled button 1`] = `
145
+ <div
146
+ className="tribe-editor__image-upload__image-wrapper"
147
+ >
148
+ <img
149
+ alt="test-alt"
150
+ className="tribe-editor__image tribe-editor__image-upload__image"
151
+ src="test-src"
152
+ />
153
+ <button
154
+ className="tribe-editor__button tribe-editor__image-upload__remove-button"
155
+ disabled={true}
156
+ onClick={[MockFunction]}
157
+ type="button"
158
+ >
159
+ <span>
160
+ icon
161
+ </span>
162
+ <span
163
+ className="tribe-editor__image-upload__remove-button-text"
164
+ >
165
+ remove
166
+ </span>
167
+ </button>
168
+ </div>
169
+ `;
170
+
171
+ exports[`renderImageUploadButton renders the button 1`] = `
172
+ <button
173
+ className="tribe-editor__button tribe-editor__button--sm tribe-editor__image-upload__upload-button"
174
+ disabled={false}
175
+ onClick={[MockFunction]}
176
+ type="button"
177
+ >
178
+ label
179
+ </button>
180
+ `;
181
+
182
+ exports[`renderImageUploadButton renders the button disabled 1`] = `
183
+ <button
184
+ className="tribe-editor__button tribe-editor__button--sm tribe-editor__image-upload__upload-button"
185
+ disabled={true}
186
+ onClick={[MockFunction]}
187
+ type="button"
188
+ >
189
+ label
190
+ </button>
191
+ `;
common/src/modules/elements/image-upload/__tests__/element.test.js ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import ImageUpload, {
10
+ renderImageUploadButton,
11
+ renderImage,
12
+ } from '@moderntribe/common/elements/image-upload/element';
13
+
14
+ jest.mock( '@wordpress/editor', () => ( {
15
+ MediaUpload: () => ( <button>Media Upload</button> ),
16
+ } ) );
17
+
18
+ jest.mock( '@moderntribe/common/icons', () => ( {
19
+ Close: () => <span>icon</span>,
20
+ } ) );
21
+
22
+ describe( 'renderImageUploadButton', () => {
23
+ const open = jest.fn();
24
+
25
+ afterEach( () => {
26
+ open.mockClear();
27
+ } );
28
+
29
+ it( 'renders the button', () => {
30
+ const component = renderer.create( renderImageUploadButton( false, 'label' )( { open } ) );
31
+ expect( component.toJSON() ).toMatchSnapshot();
32
+ } );
33
+
34
+ it( 'renders the button disabled', () => {
35
+ const component = renderer.create( renderImageUploadButton( true, 'label' )( { open } ) );
36
+ expect( component.toJSON() ).toMatchSnapshot();
37
+ } );
38
+
39
+ it( 'executes the open action when the mediaUpload is fired', () => {
40
+ const component = mount( renderImageUploadButton( false, 'label' )( { open } ) );
41
+ component.find( 'button' ).simulate( 'click' );
42
+ expect( open ).toHaveBeenCalled();
43
+ expect( open ).toHaveBeenCalledTimes( 1 );
44
+ } );
45
+ } );
46
+
47
+ describe( 'renderImage', () => {
48
+ const onRemove = jest.fn();
49
+ const image = {
50
+ id: 42,
51
+ src: 'test-src',
52
+ alt: 'test-alt',
53
+ };
54
+
55
+ afterEach( () => {
56
+ onRemove.mockClear();
57
+ } );
58
+
59
+ it( 'renders the image and button', () => {
60
+ const component = renderer.create( renderImage( false, image, onRemove ) );
61
+ expect( component.toJSON() ).toMatchSnapshot();
62
+ } );
63
+
64
+ it( 'renders the image and disabled button', () => {
65
+ const component = renderer.create( renderImage( true, image, onRemove ) );
66
+ expect( component.toJSON() ).toMatchSnapshot();
67
+ } );
68
+
69
+ it( 'executes onRemove on click', () => {
70
+ const component = mount( renderImage( false, image, onRemove ) );
71
+ component.find( 'button' ).simulate( 'click' );
72
+ expect( onRemove ).toHaveBeenCalled();
73
+ expect( onRemove ).toHaveBeenCalledTimes( 1 );
74
+ } );
75
+ } );
76
+
77
+ describe( 'ImageUpload', () => {
78
+ const onRemove = jest.fn();
79
+ const onSelect = jest.fn();
80
+ let image;
81
+
82
+ beforeEach( () => {
83
+ image = {
84
+ id: 0,
85
+ src: '',
86
+ alt: '',
87
+ };
88
+ } );
89
+
90
+ afterEach( () => {
91
+ onRemove.mockClear();
92
+ onSelect.mockClear();
93
+ } );
94
+
95
+ it( 'renders the component', () => {
96
+ const component = renderer.create(
97
+ <ImageUpload
98
+ image={ image }
99
+ onSelect={ onSelect }
100
+ onRemove={ onRemove }
101
+ />
102
+ );
103
+ expect( component.toJSON() ).toMatchSnapshot();
104
+ } );
105
+
106
+ it( 'renders with title', () => {
107
+ const component = renderer.create(
108
+ <ImageUpload
109
+ image={ image }
110
+ onSelect={ onSelect }
111
+ onRemove={ onRemove }
112
+ title="Modern Tribe"
113
+ />
114
+ );
115
+ expect( component.toJSON() ).toMatchSnapshot();
116
+ } );
117
+
118
+ it( 'renders with description', () => {
119
+ const component = renderer.create(
120
+ <ImageUpload
121
+ image={ image }
122
+ onSelect={ onSelect}
123
+ onRemove={ onRemove }
124
+ description="The Next Generation of Digital Agency"
125
+ />
126
+ );
127
+ expect( component.toJSON() ).toMatchSnapshot();
128
+ } );
129
+
130
+ it( 'renders with class', () => {
131
+ const component = renderer.create(
132
+ <ImageUpload
133
+ image={ image }
134
+ onSelect={ onSelect }
135
+ onRemove={ onRemove }
136
+ className="test-class"
137
+ />
138
+ );
139
+ expect( component.toJSON() ).toMatchSnapshot();
140
+ } );
141
+
142
+ it( 'renders uploaded image', () => {
143
+ image = {
144
+ id: 42,
145
+ src: 'test-src',
146
+ alt: 'test-alt',
147
+ };
148
+ const component = renderer.create(
149
+ <ImageUpload
150
+ image={ image }
151
+ onSelect={ onSelect }
152
+ onRemove={ onRemove }
153
+ />
154
+ );
155
+ expect( component.toJSON() ).toMatchSnapshot();
156
+ } );
157
+
158
+ it( 'renders upload image button', () => {
159
+ const component = renderer.create(
160
+ <ImageUpload
161
+ image={ image }
162
+ onSelect={ onSelect }
163
+ onRemove={ onRemove }
164
+ />
165
+ );
166
+ expect( component.toJSON() ).toMatchSnapshot();
167
+ } );
168
+ } );
common/src/modules/elements/image-upload/element.js ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+ import { noop } from 'lodash';
8
+
9
+ /**
10
+ * WordPress dependencies
11
+ */
12
+ import { __ } from '@wordpress/i18n';
13
+ import { MediaUpload } from '@wordpress/editor';
14
+
15
+ /**
16
+ * Internal dependencies
17
+ */
18
+ import { Button, Image } from '@moderntribe/common/elements';
19
+ import { Close as CloseIcon } from '@moderntribe/common/icons';
20
+ import './style.pcss';
21
+
22
+ export const renderImageUploadButton = ( disabled, label ) => ( { open } ) => (
23
+ <Button
24
+ onClick={ open }
25
+ className={ [ 'tribe-editor__button--sm', 'tribe-editor__image-upload__upload-button' ] }
26
+ disabled={ disabled }
27
+ >
28
+ { label }
29
+ </Button>
30
+ );
31
+
32
+ export const renderImage = ( disabled, image, onRemove ) => (
33
+ <div className="tribe-editor__image-upload__image-wrapper">
34
+ <Image
35
+ src={ image.src }
36
+ alt={ image.alt }
37
+ className="tribe-editor__image-upload__image"
38
+ />
39
+ <Button
40
+ className="tribe-editor__image-upload__remove-button"
41
+ onClick={ onRemove }
42
+ disabled={ disabled }
43
+ >
44
+ <CloseIcon />
45
+ <span className="tribe-editor__image-upload__remove-button-text">
46
+ { __( 'remove', 'tribe-common' ) }
47
+ </span>
48
+ </Button>
49
+ </div>
50
+ );
51
+
52
+ const ImageUpload = ( {
53
+ buttonDisabled,
54
+ buttonLabel,
55
+ className,
56
+ description,
57
+ image,
58
+ onRemove,
59
+ onSelect,
60
+ removeButtonDisabled,
61
+ title,
62
+ } ) => {
63
+ const hasImageClass = { 'tribe-editor__image-upload--has-image': image.id };
64
+
65
+ return (
66
+ <div className={ classNames(
67
+ 'tribe-editor__image-upload',
68
+ hasImageClass,
69
+ className,
70
+ ) }>
71
+ { title && <h3 className="tribe-editor__image-upload__title">{ title }</h3> }
72
+ <div className="tribe-editor__image-upload__content">
73
+ { description && (
74
+ <p className="tribe-editor__image-upload__description">{ description }</p>
75
+ ) }
76
+ {
77
+ image.id
78
+ ? renderImage( removeButtonDisabled, image, onRemove )
79
+ : (
80
+ <MediaUpload
81
+ onSelect={ onSelect }
82
+ type="image"
83
+ render={ renderImageUploadButton( buttonDisabled, buttonLabel ) }
84
+ value={ image.id }
85
+ />
86
+ )
87
+ }
88
+ </div>
89
+ </div>
90
+ );
91
+ };
92
+
93
+ ImageUpload.propTypes = {
94
+ buttonDisabled: PropTypes.bool,
95
+ buttonLabel: PropTypes.string,
96
+ className: PropTypes.string,
97
+ description: PropTypes.string,
98
+ image: PropTypes.shape( {
99
+ alt: PropTypes.string.isRequired,
100
+ id: PropTypes.number.isRequired,
101
+ src: PropTypes.string.isRequired,
102
+ } ).isRequired,
103
+ onRemove: PropTypes.func.isRequired,
104
+ onSelect: PropTypes.func.isRequired,
105
+ removeButtonDisabled: PropTypes.bool,
106
+ title: PropTypes.string,
107
+ };
108
+
109
+ ImageUpload.defaultProps = {
110
+ onRemove: noop,
111
+ onSelect: noop,
112
+ };
113
+
114
+ export default ImageUpload;
common/src/modules/elements/image-upload/style.pcss ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__image-upload {}
2
+
3
+ .tribe-editor__image-upload__title {
4
+
5
+ /* extra classes to override gutenberg styles for h3 */
6
+ .edit-post-visual-editor .editor-block-list__block & {
7
+ padding: 0;
8
+ margin: 0 0 12px;
9
+ color: #000000;
10
+ font-size: 15px;
11
+ font-weight: bold;
12
+ line-height: 18px;
13
+ }
14
+ }
15
+
16
+ .tribe-editor__image-upload__content {
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+
21
+ .tribe-editor__image-upload--has-image & {
22
+ align-items: flex-start;
23
+ }
24
+ }
25
+
26
+ p.tribe-editor__image-upload__description {
27
+
28
+ .tribe-editor__image-upload__content & {
29
+ flex: none;
30
+ width: 52%;
31
+ font-family: Helvetica, sans-serif, arial;
32
+ font-size: 14px;
33
+ color: #545D66;
34
+ line-height: 18px;
35
+ margin: 0;
36
+ }
37
+ }
38
+
39
+ .tribe-editor__image-upload__upload-button {
40
+ flex: none;
41
+ margin-right: 10px;
42
+ }
43
+
44
+ .tribe-editor__image-upload__image-wrapper {
45
+ flex: none;
46
+ width: 42%;
47
+ max-width: 325px;
48
+ padding-left: 25px;
49
+ position: relative;
50
+ }
51
+
52
+ .tribe-editor__image-upload__remove-button {
53
+ position: absolute;
54
+ top: 10px;
55
+ right: 10px;
56
+ width: 32px;
57
+ height: 32px;
58
+ padding: 8px;
59
+ border-radius: 50%;
60
+ background-color: #F8F9FB;
61
+
62
+ & > svg {
63
+
64
+ &,
65
+ & path {
66
+ fill: #545D66;
67
+ }
68
+ }
69
+
70
+ &:hover,
71
+ &:focus {
72
+
73
+ & > svg {
74
+
75
+ &,
76
+ & path {
77
+ fill: #009FD4;
78
+ }
79
+ }
80
+ }
81
+
82
+ &:disabled {
83
+
84
+ &,
85
+ &:hover,
86
+ &:focus {
87
+
88
+ & > svg {
89
+
90
+ &,
91
+ & path {
92
+ fill: #AEB4BB;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+
99
+ /* visually hide remove button text */
100
+ .tribe-editor__image-upload__remove-button-text {
101
+ border: 0;
102
+ clip: rect(0 0 0 0);
103
+ height: 1px;
104
+ margin: -1px;
105
+ overflow: hidden;
106
+ padding: 0;
107
+ position: absolute;
108
+ width: 1px;
109
+ }
common/src/modules/elements/image/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Image Element renders image 1`] = `
4
+ <img
5
+ alt="test-alt"
6
+ className="tribe-editor__image"
7
+ src="test-src"
8
+ />
9
+ `;
10
+
11
+ exports[`Image Element renders image with class 1`] = `
12
+ <img
13
+ alt="test-alt"
14
+ className="tribe-editor__image test-class"
15
+ src="test-src"
16
+ />
17
+ `;
18
+
19
+ exports[`Image Element renders image with extra props 1`] = `
20
+ <img
21
+ alt="test-alt"
22
+ className="tribe-editor__image"
23
+ height="42"
24
+ src="test-src"
25
+ width="42"
26
+ />
27
+ `;
common/src/modules/elements/image/__tests__/element.test.js ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { Image } from '@moderntribe/common/elements';
10
+
11
+ let imageProps;
12
+
13
+ describe( 'Image Element', () => {
14
+ beforeEach( () => {
15
+ imageProps = {
16
+ src: 'test-src',
17
+ alt: 'test-alt',
18
+ };
19
+ } );
20
+
21
+ it( 'renders image', () => {
22
+ const component = renderer.create( <Image { ...imageProps } /> );
23
+ expect( component.toJSON() ).toMatchSnapshot();
24
+ } );
25
+
26
+ it( 'renders image with class', () => {
27
+ imageProps.className = 'test-class';
28
+ const component = renderer.create( <Image { ...imageProps } /> );
29
+ expect( component.toJSON() ).toMatchSnapshot();
30
+ } );
31
+
32
+ it( 'renders image with extra props', () => {
33
+ imageProps.width = "42";
34
+ imageProps.height = "42";
35
+ const component = renderer.create( <Image { ...imageProps } /> );
36
+ expect( component.toJSON() ).toMatchSnapshot();
37
+ } );
38
+ } );
common/src/modules/elements/image/element.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ const Image = ( {
9
+ alt,
10
+ className,
11
+ src,
12
+ ...rest,
13
+ } ) => (
14
+ <img
15
+ src={ src }
16
+ alt={ alt }
17
+ className={ classNames( 'tribe-editor__image', className ) }
18
+ { ...rest }
19
+ />
20
+ );
21
+
22
+ Image.propTypes = {
23
+ alt: PropTypes.string.isRequired,
24
+ className: PropTypes.string,
25
+ src: PropTypes.string.isRequired,
26
+ };
27
+
28
+ export default Image;
common/src/modules/elements/index.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export { default as Accordion } from './accordion/element';
2
+ export { default as BlockIcon } from '@moderntribe/common/elements/block-icon';
3
+ export { default as Button } from './button/element';
4
+
5
+ export { default as Counter } from './counter/element';
6
+ export { default as Image } from './image/element';
7
+ export { default as ImageUpload } from './image-upload/element';
8
+ export { default as LabeledItem } from './labeled-item/element';
9
+ export { default as LabelWithLink } from './label-with-link/element';
10
+ export { default as LabelWithModal } from './label-with-modal/element';
11
+ export { default as Link } from './link/element';
12
+ export { default as ModalButton } from './modal-button/element';
13
+ export { default as TimePicker } from './time-picker/element';
14
+ export { default as Tooltip } from './tooltip/element';
15
+ export { default as DayPickerInput } from './day-picker-input/element';
16
+ export { default as CreatableSelect } from './creatable-select/element';
17
+ export { default as Placeholder } from './placeholder/element';
18
+ export { default as Heading } from './heading/element';
19
+ export { default as Paragraph } from './paragraph/element';
20
+
21
+ // Inputs
22
+ export { default as Input } from './input/element';
23
+ export { default as UrlInput } from './url-input/element';
24
+ export { default as NumberInput } from './number-input/element';
25
+ export { default as Radio } from './radio/element';
26
+ export { default as RadioInput } from './radio-input/element';
27
+ export { default as Checkbox } from './checkbox/element';
28
+ export { default as CheckboxInput } from './checkbox-input/element';
29
+ export { default as Select } from './select/element';
30
+ export { default as Textarea } from './textarea/element';
31
+
32
+ /**
33
+ * @todo move this into Editor Module
34
+ */
35
+
36
+ import './style.pcss'
common/src/modules/elements/input/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Input element Should render the component 1`] = `
4
+ <input
5
+ className="tribe-editor__input"
6
+ type="text"
7
+ />
8
+ `;
9
+
10
+ exports[`Input element Should render the component with class 1`] = `
11
+ <input
12
+ className="tribe-editor__input input-class"
13
+ type="text"
14
+ />
15
+ `;
16
+
17
+ exports[`Input element Should render the component with extra props 1`] = `
18
+ <input
19
+ className="tribe-editor__input"
20
+ onChange={[Function]}
21
+ type="text"
22
+ />
23
+ `;
common/src/modules/elements/input/__tests__/element.test.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import renderer from 'react-test-renderer';
6
+ import { noop } from 'lodash';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import Input from '../element.js';
12
+
13
+ describe( 'Input element', () => {
14
+ it( 'Should render the component', () => {
15
+ const component = renderer.create( <Input type="text" /> );
16
+ expect( component.toJSON() ).toMatchSnapshot();
17
+ } );
18
+
19
+ it( 'Should render the component with class', () => {
20
+ const component = renderer.create( <Input type="text" className="input-class" /> );
21
+ expect( component.toJSON() ).toMatchSnapshot();
22
+ } );
23
+
24
+ it( 'Should render the component with extra props', () => {
25
+ const component = renderer.create( <Input type="text" onChange={ noop } /> );
26
+ expect( component.toJSON() ).toMatchSnapshot();
27
+ } );
28
+ } );
common/src/modules/elements/input/element.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.pcss';
12
+
13
+ const Input = ( {
14
+ className,
15
+ type,
16
+ ...rest,
17
+ } ) => (
18
+ <input
19
+ className={ classNames( 'tribe-editor__input', className ) }
20
+ type={ type }
21
+ { ...rest }
22
+ />
23
+ );
24
+
25
+ Input.propTypes = {
26
+ className: PropTypes.string,
27
+ type: PropTypes.string.isRequired,
28
+ };
29
+
30
+ export default Input;
common/src/modules/elements/input/style.pcss ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* increased specificity required to override gutenberg editor styles */
2
+ input.tribe-editor__input {
3
+
4
+ /* this list will grow with more input types used */
5
+ &[type=number],
6
+ &[type=text] {
7
+ color: #000000;
8
+ font-size: 16px;
9
+ line-height: 24px;
10
+ border: 1px solid #E1E3E6;
11
+ padding: 7px 15px;
12
+ margin: 0;
13
+ height: 40px;
14
+
15
+ &:focus {
16
+ color: #000000;
17
+ box-shadow: none;
18
+ outline: none;
19
+ }
20
+
21
+ &:disabled {
22
+ color: #AEB4BB;
23
+ }
24
+ }
25
+ }
common/src/modules/elements/label-with-link/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Label With Link Element renders a label with link 1`] = `
4
+ <div
5
+ className="tribe-editor__labeled-item tribe-editor__label-with-link"
6
+ >
7
+ <span
8
+ className="tribe-editor__labeled-item__label"
9
+ />
10
+ <a
11
+ className="tribe-editor__link tribe-editor__label-with-link__link"
12
+ href="#"
13
+ >
14
+ test-text
15
+ </a>
16
+ </div>
17
+ `;
18
+
19
+ exports[`Label With Link Element renders a label with link with class 1`] = `
20
+ <div
21
+ className="tribe-editor__labeled-item tribe-editor__label-with-link test-class"
22
+ >
23
+ <span
24
+ className="tribe-editor__labeled-item__label"
25
+ />
26
+ <a
27
+ className="tribe-editor__link tribe-editor__label-with-link__link"
28
+ href="#"
29
+ >
30
+ test-text
31
+ </a>
32
+ </div>
33
+ `;
34
+
35
+ exports[`Label With Link Element renders a label with link with label 1`] = `
36
+ <div
37
+ className="tribe-editor__labeled-item tribe-editor__label-with-link"
38
+ >
39
+ <span
40
+ className="tribe-editor__labeled-item__label"
41
+ >
42
+ test label
43
+ </span>
44
+ <a
45
+ className="tribe-editor__link tribe-editor__label-with-link__link"
46
+ href="#"
47
+ >
48
+ test-text
49
+ </a>
50
+ </div>
51
+ `;
common/src/modules/elements/label-with-link/__tests__/element.test.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import LabelWithLink from '../element';
10
+
11
+ describe( 'Label With Link Element', () => {
12
+ it( 'renders a label with link', () => {
13
+ const component = renderer.create(
14
+ <LabelWithLink linkHref="#" linkText="test-text" />
15
+ );
16
+ expect( component.toJSON() ).toMatchSnapshot();
17
+ } );
18
+
19
+ it( 'renders a label with link with class', () => {
20
+ const component = renderer.create(
21
+ <LabelWithLink linkHref="#" linkText="test-text" className="test-class" />
22
+ );
23
+ expect( component.toJSON() ).toMatchSnapshot();
24
+ } );
25
+
26
+ it( 'renders a label with link with label', () => {
27
+ const component = renderer.create(
28
+ <LabelWithLink linkHref="#" linkText="test-text" label="test label" />
29
+ );
30
+ expect( component.toJSON() ).toMatchSnapshot();
31
+ } );
32
+ } );
common/src/modules/elements/label-with-link/element.js ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import Button from '@moderntribe/common/elements/button/element';
12
+ import LabeledItem from '@moderntribe/common/elements/labeled-item/element';
13
+ import Link from '@moderntribe/common/elements/link/element';
14
+ import './style.pcss';
15
+
16
+ const LabelWithLink = ( {
17
+ className,
18
+ label,
19
+ linkDisabled,
20
+ linkHref,
21
+ linkTarget,
22
+ linkText,
23
+ } ) => {
24
+ const getLink = () => {
25
+ const linkClass = 'tribe-editor__label-with-link__link';
26
+
27
+ return linkDisabled
28
+ ? (
29
+ <Button
30
+ className={ classNames( linkClass, `${ linkClass }--disabled` ) }
31
+ disabled={ true }
32
+ >
33
+ { linkText }
34
+ </Button>
35
+ )
36
+ : (
37
+ <Link
38
+ className={ linkClass }
39
+ href={ linkHref }
40
+ target={ linkTarget }
41
+ >
42
+ { linkText }
43
+ </Link>
44
+ );
45
+ };
46
+
47
+ return (
48
+ <LabeledItem
49
+ className={ classNames( 'tribe-editor__label-with-link', className ) }
50
+ label={ label }
51
+ >
52
+ { getLink() }
53
+ </LabeledItem>
54
+ );
55
+ };
56
+
57
+ LabelWithLink.propTypes = {
58
+ className: PropTypes.string,
59
+ label: PropTypes.node,
60
+ linkDisabled: PropTypes.bool,
61
+ linkHref: PropTypes.string.isRequired,
62
+ linkTarget: PropTypes.string,
63
+ linkText: PropTypes.string,
64
+ };
65
+
66
+ export default LabelWithLink;
common/src/modules/elements/label-with-link/style.pcss ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__label-with-link {
2
+
3
+ .tribe-editor__rsvp &,
4
+ .tribe-editor__ticket & {
5
+ display: flex;
6
+ align-items: center;
7
+ background-color: #FFFFFF;
8
+ padding: 10px 17px;
9
+ border: 1px solid #E1E3E6;
10
+ }
11
+
12
+ .tribe-editor__labeled-item__label {
13
+
14
+ .tribe-editor__rsvp &,
15
+ .tribe-editor__ticket & {
16
+ flex: auto;
17
+ color: #545D66;
18
+ font-size: 15px;
19
+ font-weight: bold;
20
+ line-height: 18px;
21
+ letter-spacing: 0.38px;
22
+ padding-right: 10px;
23
+ }
24
+ }
25
+
26
+ .tribe-editor__label-with-link__link {
27
+
28
+ .tribe-editor__rsvp &,
29
+ .tribe-editor__ticket & {
30
+ flex: none;
31
+ color: #009FD4;
32
+ font-size: 15px;
33
+ font-weight: bold;
34
+ line-height: 18px;
35
+ letter-spacing: 0.38px;
36
+ text-decoration: none;
37
+ box-shadow: none;
38
+ transition: color 0.2s ease;
39
+
40
+ &:hover,
41
+ &:focus {
42
+ color: #007BB4;
43
+ }
44
+ }
45
+ }
46
+
47
+ .tribe-editor__label-with-link__link.tribe-editor__label-with-link__link--disabled {
48
+
49
+ .tribe-editor__rsvp &,
50
+ .tribe-editor__ticket & {
51
+ color: #AEB4BB;
52
+ }
53
+ }
54
+ }
common/src/modules/elements/label-with-modal/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Label With Modal Element renders a label with modal 1`] = `
4
+ <div
5
+ className="tribe-editor__labeled-item tribe-editor__label-with-modal"
6
+ >
7
+ <span
8
+ className="tribe-editor__labeled-item__label"
9
+ />
10
+ <div
11
+ className="tribe-editor__modal-button tribe-editor__label-with-modal__modal-button"
12
+ >
13
+ <button
14
+ className="tribe-editor__button tribe-editor__modal-button__button"
15
+ onClick={[Function]}
16
+ type="button"
17
+ />
18
+ </div>
19
+ </div>
20
+ `;
21
+
22
+ exports[`Label With Modal Element renders a label with modal with class 1`] = `
23
+ <div
24
+ className="tribe-editor__labeled-item tribe-editor__label-with-modal test-class"
25
+ >
26
+ <span
27
+ className="tribe-editor__labeled-item__label"
28
+ />
29
+ <div
30
+ className="tribe-editor__modal-button tribe-editor__label-with-modal__modal-button"
31
+ >
32
+ <button
33
+ className="tribe-editor__button tribe-editor__modal-button__button"
34
+ onClick={[Function]}
35
+ type="button"
36
+ />
37
+ </div>
38
+ </div>
39
+ `;
40
+
41
+ exports[`Label With Modal Element renders a label with modal with label 1`] = `
42
+ <div
43
+ className="tribe-editor__labeled-item tribe-editor__label-with-modal"
44
+ >
45
+ <span
46
+ className="tribe-editor__labeled-item__label"
47
+ >
48
+ test label
49
+ </span>
50
+ <div
51
+ className="tribe-editor__modal-button tribe-editor__label-with-modal__modal-button"
52
+ >
53
+ <button
54
+ className="tribe-editor__button tribe-editor__modal-button__button"
55
+ onClick={[Function]}
56
+ type="button"
57
+ />
58
+ </div>
59
+ </div>
60
+ `;
common/src/modules/elements/label-with-modal/__tests__/element.test.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import LabelWithModal from '@moderntribe/common/elements/label-with-modal/element';
10
+
11
+ describe( 'Label With Modal Element', () => {
12
+ it( 'renders a label with modal', () => {
13
+ const component = renderer.create( <LabelWithModal /> );
14
+ expect( component.toJSON() ).toMatchSnapshot();
15
+ } );
16
+
17
+ it( 'renders a label with modal with class', () => {
18
+ const component = renderer.create( <LabelWithModal className="test-class" /> );
19
+ expect( component.toJSON() ).toMatchSnapshot();
20
+ } );
21
+
22
+ it( 'renders a label with modal with label', () => {
23
+ const component = renderer.create( <LabelWithModal label="test label" /> );
24
+ expect( component.toJSON() ).toMatchSnapshot();
25
+ } );
26
+ } );
common/src/modules/elements/label-with-modal/element.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+ import { noop } from 'lodash';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import LabeledItem from '@moderntribe/common/elements/labeled-item/element';
13
+ import ModalButton from '@moderntribe/common/elements/modal-button/element';
14
+ import './style.pcss';
15
+
16
+ const LabelWithModal = ( {
17
+ className,
18
+ isOpen,
19
+ label,
20
+ modalButtonDisabled,
21
+ modalButtonLabel,
22
+ modalClassName,
23
+ modalContent,
24
+ modalOverlayClassName,
25
+ modalTitle,
26
+ onClick,
27
+ onClose,
28
+ onOpen,
29
+ } ) => (
30
+ <LabeledItem
31
+ className={ classNames( 'tribe-editor__label-with-modal', className ) }
32
+ label={ label }
33
+ >
34
+ <ModalButton
35
+ className="tribe-editor__label-with-modal__modal-button"
36
+ disabled={ modalButtonDisabled }
37
+ isOpen={ isOpen }
38
+ label={ modalButtonLabel }
39
+ modalClassName={ modalClassName }
40
+ modalContent={ modalContent }
41
+ modalOverlayClassName={ modalOverlayClassName }
42
+ modalTitle={ modalTitle }
43
+ onClick={ onClick }
44
+ onClose={ onClose }
45
+ onOpen={ onOpen }
46
+ />
47
+ </LabeledItem>
48
+ );
49
+
50
+ LabelWithModal.defaultProps = {
51
+ onClick: noop,
52
+ onClose: noop,
53
+ onOpen: noop,
54
+ };
55
+
56
+ LabelWithModal.propTypes = {
57
+ className: PropTypes.string,
58
+ isOpen: PropTypes.bool,
59
+ label: PropTypes.node,
60
+ modalButtonDisabled: PropTypes.bool,
61
+ modalButtonLabel: PropTypes.string,
62
+ modalClassName: PropTypes.string,
63
+ modalContent: PropTypes.node,
64
+ modalOverlayClassName: PropTypes.string,
65
+ modalTitle: PropTypes.string,
66
+ onClick: PropTypes.func,
67
+ onClose: PropTypes.func,
68
+ onOpen: PropTypes.func,
69
+ };
70
+
71
+ export default LabelWithModal;
common/src/modules/elements/label-with-modal/style.pcss ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__label-with-modal {
2
+ display: flex;
3
+ align-items: center;
4
+ background-color: #FFFFFF;
5
+ padding: 11px 17px;
6
+ border: 1px solid #E1E3E6;
7
+ height: 40px;
8
+ }
9
+
10
+ .tribe-editor__labeled-item__label {
11
+
12
+ .tribe-editor__label-with-modal & {
13
+ flex: auto;
14
+ color: #545D66;
15
+ font-size: 15px;
16
+ font-weight: bold;
17
+ line-height: 18px;
18
+ letter-spacing: 0.38px;
19
+ }
20
+ }
21
+
22
+ .tribe-editor__label-with-modal__modal-button {
23
+
24
+ .tribe-editor__label-with-modal & {
25
+ flex: none;
26
+ }
27
+ }
28
+
29
+ .tribe-editor__modal-button__button {
30
+
31
+ .tribe-editor__label-with-modal & {
32
+ color: #009FD4;
33
+ font-size: 15px;
34
+ font-weight: bold;
35
+ line-height: 18px;
36
+ letter-spacing: 0.38px;
37
+ transition: color 0.2s ease;
38
+
39
+ &:hover,
40
+ &:focus {
41
+ color: #007BB4;
42
+ }
43
+
44
+ &:disabled {
45
+
46
+ &,
47
+ &:hover,
48
+ &:focus {
49
+ color: #AEB4BB;
50
+ }
51
+ }
52
+ }
53
+ }
common/src/modules/elements/labeled-item/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Labeled Item Element renders labeled item 1`] = `
4
+ <div
5
+ className="tribe-editor__labeled-item"
6
+ >
7
+ <span
8
+ className="tribe-editor__labeled-item__label"
9
+ />
10
+ Test
11
+ </div>
12
+ `;
13
+
14
+ exports[`Labeled Item Element renders labeled item with class 1`] = `
15
+ <div
16
+ className="tribe-editor__labeled-item test-class"
17
+ >
18
+ <span
19
+ className="tribe-editor__labeled-item__label"
20
+ />
21
+ Test
22
+ </div>
23
+ `;
24
+
25
+ exports[`Labeled Item Element renders labeled item with label 1`] = `
26
+ <div
27
+ className="tribe-editor__labeled-item"
28
+ >
29
+ <span
30
+ className="tribe-editor__labeled-item__label"
31
+ >
32
+ test label
33
+ </span>
34
+ Test
35
+ </div>
36
+ `;
37
+
38
+ exports[`Labeled Item Element renders labeled item with label element and for id 1`] = `
39
+ <div
40
+ className="tribe-editor__labeled-item"
41
+ >
42
+ <label
43
+ className="tribe-editor__labeled-item__label"
44
+ htmlFor="test-id"
45
+ >
46
+ test label
47
+ </label>
48
+ Test
49
+ </div>
50
+ `;
common/src/modules/elements/labeled-item/__tests__/element.test.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { LabeledItem } from '@moderntribe/common/elements';
10
+
11
+ describe( 'Labeled Item Element', () => {
12
+ it( 'renders labeled item', () => {
13
+ const component = renderer.create( <LabeledItem>Test</LabeledItem> );
14
+ expect( component.toJSON() ).toMatchSnapshot();
15
+ } );
16
+
17
+ it( 'renders labeled item with class', () => {
18
+ const component = renderer.create( <LabeledItem className="test-class">Test</LabeledItem> );
19
+ expect( component.toJSON() ).toMatchSnapshot();
20
+ } );
21
+
22
+ it( 'renders labeled item with label', () => {
23
+ const component = renderer.create( <LabeledItem label="test label">Test</LabeledItem> );
24
+ expect( component.toJSON() ).toMatchSnapshot();
25
+ } );
26
+
27
+ it( 'renders labeled item with label element and for id', () => {
28
+ const component = renderer.create(
29
+ <LabeledItem
30
+ label="test label"
31
+ isLabel={ true }
32
+ forId="test-id"
33
+ >
34
+ Test
35
+ </LabeledItem>
36
+ );
37
+ expect( component.toJSON() ).toMatchSnapshot();
38
+ } );
39
+ } );
common/src/modules/elements/labeled-item/element.js ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ const LabeledItem = ( {
9
+ className,
10
+ forId,
11
+ isLabel,
12
+ label,
13
+ children,
14
+ } ) => {
15
+ const renderLabel = (
16
+ isLabel
17
+ ? (
18
+ <label className="tribe-editor__labeled-item__label" htmlFor={ forId }>
19
+ { label }
20
+ </label>
21
+ )
22
+ : (
23
+ <span className="tribe-editor__labeled-item__label">
24
+ { label }
25
+ </span>
26
+ )
27
+ );
28
+
29
+ return (
30
+ <div className={ classNames(
31
+ 'tribe-editor__labeled-item',
32
+ className,
33
+ ) }>
34
+ { renderLabel }
35
+ { children }
36
+ </div>
37
+ );
38
+ };
39
+
40
+ LabeledItem.defaultProps = {
41
+ isLabel: false,
42
+ };
43
+
44
+ LabeledItem.propTypes = {
45
+ className: PropTypes.string,
46
+ isLabel: PropTypes.bool.isRequired,
47
+ forId: PropTypes.string,
48
+ label: PropTypes.node,
49
+ children: PropTypes.node.isRequired,
50
+ };
51
+
52
+ export default LabeledItem;
common/src/modules/elements/link/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Link Element renders button with class 1`] = `
4
+ <a
5
+ className="tribe-editor__link test-class"
6
+ href="#"
7
+ >
8
+ label
9
+ </a>
10
+ `;
11
+
12
+ exports[`Link Element renders button with prop 1`] = `
13
+ <a
14
+ className="tribe-editor__link"
15
+ href="#"
16
+ title="title"
17
+ >
18
+ label
19
+ </a>
20
+ `;
21
+
22
+ exports[`Link Element renders button with target 1`] = `
23
+ <a
24
+ className="tribe-editor__link"
25
+ href="#"
26
+ rel="noopener noreferrer"
27
+ target="_blank"
28
+ >
29
+ label
30
+ </a>
31
+ `;
32
+
33
+ exports[`Link Element renders link 1`] = `
34
+ <a
35
+ className="tribe-editor__link"
36
+ href="#"
37
+ >
38
+ label
39
+ </a>
40
+ `;
common/src/modules/elements/link/__tests__/element.test.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import Link from '../element.js';
10
+
11
+ describe( 'Link Element', () => {
12
+ it( 'renders link', () => {
13
+ const component = renderer.create(
14
+ <Link href="#">label</Link>
15
+ );
16
+ expect( component.toJSON() ).toMatchSnapshot();
17
+ } );
18
+
19
+ it( 'renders button with class', () => {
20
+ const component = renderer.create(
21
+ <Link className="test-class" href="#">label</Link>
22
+ );
23
+ expect( component.toJSON() ).toMatchSnapshot();
24
+ } );
25
+
26
+ it( 'renders button with target', () => {
27
+ const component = renderer.create(
28
+ <Link href="#" target="_blank">label</Link>
29
+ );
30
+ expect( component.toJSON() ).toMatchSnapshot();
31
+ } );
32
+
33
+ it( 'renders button with prop', () => {
34
+ const component = renderer.create(
35
+ <Link href="#" title="title">label</Link>
36
+ );
37
+ expect( component.toJSON() ).toMatchSnapshot();
38
+ } );
39
+ } );
common/src/modules/elements/link/element.js ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ const Link = ( {
9
+ children,
10
+ className,
11
+ href,
12
+ target,
13
+ ...props,
14
+ } ) => {
15
+ const getProps = () => {
16
+ const elemProps = { ...props };
17
+
18
+ if ( target === '_blank' ) {
19
+ elemProps.rel = 'noopener noreferrer';
20
+ }
21
+
22
+ return elemProps;
23
+ };
24
+
25
+ return (
26
+ <a
27
+ className={ classNames( 'tribe-editor__link', className ) }
28
+ href={ href }
29
+ target={ target }
30
+ { ...getProps() }
31
+ >
32
+ { children }
33
+ </a>
34
+ );
35
+ };
36
+
37
+ Link.propTypes = {
38
+ children: PropTypes.node,
39
+ className: PropTypes.string,
40
+ href: PropTypes.string.isRequired,
41
+ target: PropTypes.string,
42
+ };
43
+
44
+ export default Link;
common/src/modules/elements/modal-button/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Modal Button Element renders a modal button 1`] = `
4
+ <div
5
+ className="tribe-editor__modal-button"
6
+ >
7
+ <button
8
+ className="tribe-editor__button tribe-editor__modal-button__button"
9
+ onClick={[Function]}
10
+ type="button"
11
+ />
12
+ </div>
13
+ `;
14
+
15
+ exports[`Modal Button Element renders a modal button with class 1`] = `
16
+ <div
17
+ className="tribe-editor__modal-button test-class"
18
+ >
19
+ <button
20
+ className="tribe-editor__button tribe-editor__modal-button__button"
21
+ onClick={[Function]}
22
+ type="button"
23
+ />
24
+ </div>
25
+ `;
26
+
27
+ exports[`Modal Button Element renders a modal button with label 1`] = `
28
+ <div
29
+ className="tribe-editor__modal-button"
30
+ >
31
+ <button
32
+ className="tribe-editor__button tribe-editor__modal-button__button"
33
+ onClick={[Function]}
34
+ type="button"
35
+ >
36
+ Test Label
37
+ </button>
38
+ </div>
39
+ `;
40
+
41
+ exports[`Modal Button Element renders a modal button with onClick handler 1`] = `
42
+ <div
43
+ className="tribe-editor__modal-button"
44
+ >
45
+ <button
46
+ className="tribe-editor__button tribe-editor__modal-button__button"
47
+ onClick={[Function]}
48
+ type="button"
49
+ />
50
+ </div>
51
+ `;
common/src/modules/elements/modal-button/__tests__/element.test.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import { noop } from 'lodash';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import ModalButton from '@moderntribe/common/elements/modal-button/element';
11
+
12
+ describe( 'Modal Button Element', () => {
13
+ it( 'renders a modal button', () => {
14
+ const component = renderer.create( <ModalButton /> );
15
+ expect( component.toJSON() ).toMatchSnapshot();
16
+ } );
17
+
18
+ it( 'renders a modal button with class', () => {
19
+ const component = renderer.create( <ModalButton className="test-class" /> );
20
+ expect( component.toJSON() ).toMatchSnapshot();
21
+ } );
22
+
23
+ it( 'renders a modal button with onClick handler', () => {
24
+ const component = renderer.create( <ModalButton onClick={ noop } /> );
25
+ expect( component.toJSON() ).toMatchSnapshot();
26
+ } );
27
+
28
+ it( 'renders a modal button with label', () => {
29
+ const component = renderer.create( <ModalButton label="Test Label" /> );
30
+ expect( component.toJSON() ).toMatchSnapshot();
31
+ } );
32
+
33
+ it( 'executes onClick and onOpen handlers', () => {
34
+ const props = {
35
+ onClick: jest.fn(),
36
+ onOpen: jest.fn(),
37
+ };
38
+
39
+ const component = mount( <ModalButton { ...props } /> );
40
+ component.find( 'button.tribe-editor__modal-button__button' ).simulate( 'click' );
41
+ expect( props.onClick ).toHaveBeenCalled();
42
+ expect( props.onClick ).toHaveBeenCalledTimes( 1 );
43
+ expect( props.onOpen ).toHaveBeenCalled();
44
+ expect( props.onOpen ).toHaveBeenCalledTimes( 1 );
45
+ } );
46
+ } );
common/src/modules/elements/modal-button/element.js ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { PureComponent } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * WordPress dependencies
10
+ */
11
+ import { Modal } from '@wordpress/components';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import Button from '@moderntribe/common/elements/button/element';
17
+
18
+ class ModalButton extends PureComponent {
19
+ static propTypes = {
20
+ className: PropTypes.string,
21
+ disabled: PropTypes.bool,
22
+ isOpen: PropTypes.bool,
23
+ label: PropTypes.string,
24
+ modalClassName: PropTypes.string,
25
+ modalContent: PropTypes.node,
26
+ modalOverlayClassName: PropTypes.string,
27
+ modalTitle: PropTypes.string,
28
+ onClick: PropTypes.func,
29
+ onClose: PropTypes.func,
30
+ onOpen: PropTypes.func,
31
+ };
32
+
33
+ constructor( props ) {
34
+ super( props );
35
+ this.state = {
36
+ isOpen: false,
37
+ };
38
+ }
39
+
40
+ onClick = ( e ) => {
41
+ this.props.onClick && this.props.onClick( e );
42
+ this.onOpen();
43
+ this.props.isOpen === undefined && this.setState( { isOpen: true } );
44
+ };
45
+
46
+ onRequestClose = (e) => {
47
+ this.onClose(e);
48
+ this.props.isOpen === undefined && this.setState( { isOpen: false } );
49
+ }
50
+
51
+ onOpen = () => this.props.onOpen && this.props.onOpen();
52
+
53
+ onClose = (e) => this.props.onClose && this.props.onClose(e);
54
+
55
+ preventClick = (e) => e.stopPropagation();
56
+
57
+ preventBlur = (e) => e.stopPropagation();
58
+
59
+ renderModal = () => {
60
+ const {
61
+ modalClassName,
62
+ modalContent,
63
+ modalOverlayClassName,
64
+ modalTitle,
65
+ } = this.props;
66
+
67
+ const isOpen = this.props.isOpen !== undefined ? this.props.isOpen : this.state.isOpen;
68
+
69
+ return ( isOpen && (
70
+ <Modal
71
+ className={ classNames(
72
+ 'tribe-editor__modal-button__modal-content',
73
+ modalClassName,
74
+ ) }
75
+ onRequestClose={ this.onRequestClose }
76
+ overlayClassName={ classNames(
77
+ 'tribe-editor__modal-button__modal-overlay',
78
+ modalOverlayClassName,
79
+ ) }
80
+ title={ modalTitle }
81
+ >
82
+ { modalContent }
83
+ </Modal>
84
+ ) );
85
+ };
86
+
87
+ render() {
88
+ const { className, disabled, label } = this.props;
89
+ return (
90
+ <div className={ classNames(
91
+ 'tribe-editor__modal-button',
92
+ className,
93
+ ) }>
94
+ <Button
95
+ className="tribe-editor__modal-button__button"
96
+ onClick={ this.onClick }
97
+ disabled={ disabled }
98
+ >
99
+ { label }
100
+ </Button>
101
+ { this.renderModal() }
102
+ </div>
103
+ );
104
+ }
105
+ }
106
+
107
+ export default ModalButton;
common/src/modules/elements/number-input/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Input element Should render the component 1`] = `
4
+ <input
5
+ className="tribe-editor__input tribe-editor__input--number"
6
+ type="number"
7
+ />
8
+ `;
9
+
10
+ exports[`Input element Should render the component with class 1`] = `
11
+ <input
12
+ className="tribe-editor__input tribe-editor__input--number input-class"
13
+ type="number"
14
+ />
15
+ `;
16
+
17
+ exports[`Input element Should render the component with extra props 1`] = `
18
+ <input
19
+ className="tribe-editor__input tribe-editor__input--number"
20
+ id="input-id"
21
+ type="number"
22
+ />
23
+ `;
24
+
25
+ exports[`Input element Should render the component with max 1`] = `
26
+ <input
27
+ className="tribe-editor__input tribe-editor__input--number"
28
+ max={42}
29
+ type="number"
30
+ />
31
+ `;
32
+
33
+ exports[`Input element Should render the component with min 1`] = `
34
+ <input
35
+ className="tribe-editor__input tribe-editor__input--number"
36
+ min={-42}
37
+ type="number"
38
+ />
39
+ `;
40
+
41
+ exports[`Input element Should render the component with onChange handler 1`] = `
42
+ <input
43
+ className="tribe-editor__input tribe-editor__input--number"
44
+ onChange={[Function]}
45
+ type="number"
46
+ />
47
+ `;
48
+
49
+ exports[`Input element Should render the component with step 1`] = `
50
+ <input
51
+ className="tribe-editor__input tribe-editor__input--number"
52
+ step={10}
53
+ type="number"
54
+ />
55
+ `;
common/src/modules/elements/number-input/__tests__/element.test.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import { noop } from 'lodash';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import NumberInput from '../element.js';
11
+
12
+ describe( 'Input element', () => {
13
+ it( 'Should render the component', () => {
14
+ const component = renderer.create( <NumberInput /> );
15
+ expect( component.toJSON() ).toMatchSnapshot();
16
+ } );
17
+
18
+ it( 'Should render the component with class', () => {
19
+ const component = renderer.create( <NumberInput className="input-class" /> );
20
+ expect( component.toJSON() ).toMatchSnapshot();
21
+ } );
22
+
23
+ it( 'Should render the component with max', () => {
24
+ const component = renderer.create( <NumberInput max={ 42 } /> );
25
+ expect( component.toJSON() ).toMatchSnapshot();
26
+ } );
27
+
28
+ it( 'Should render the component with min', () => {
29
+ const component = renderer.create( <NumberInput min={ -42 } /> );
30
+ expect( component.toJSON() ).toMatchSnapshot();
31
+ } );
32
+
33
+ it( 'Should render the component with onChange handler', () => {
34
+ const component = renderer.create( <NumberInput onChange={ noop } /> );
35
+ expect( component.toJSON() ).toMatchSnapshot();
36
+ } );
37
+
38
+ it( 'Should render the component with step', () => {
39
+ const component = renderer.create( <NumberInput step={ 10 } /> );
40
+ expect( component.toJSON() ).toMatchSnapshot();
41
+ } );
42
+
43
+ it( 'Should render the component with extra props', () => {
44
+ const component = renderer.create( <NumberInput id="input-id" /> );
45
+ expect( component.toJSON() ).toMatchSnapshot();
46
+ } );
47
+ } );
common/src/modules/elements/number-input/element.js ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import Input from '@moderntribe/common/elements/input/element';
12
+
13
+ const NumberInput = ( {
14
+ className,
15
+ max,
16
+ min,
17
+ onChange,
18
+ step,
19
+ ...rest
20
+ } ) => (
21
+ <Input
22
+ className={ classNames( 'tribe-editor__input--number', className ) }
23
+ max={ max }
24
+ min={ min }
25
+ onChange={ onChange }
26
+ step={ step }
27
+ type="number"
28
+ { ...rest }
29
+ />
30
+ );
31
+
32
+ NumberInput.propTypes = {
33
+ className: PropTypes.string,
34
+ max: PropTypes.number,
35
+ min: PropTypes.number,
36
+ onChange: PropTypes.func,
37
+ step: PropTypes.number,
38
+ };
39
+
40
+ export default NumberInput;
common/src/modules/elements/paragraph/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<Paragraph> default paragraph 1`] = `
4
+ <p
5
+ className="tribe-editor__paragraph tribe-editor__paragraph--medium"
6
+ >
7
+ Modern Tribe
8
+ </p>
9
+ `;
10
+
11
+ exports[`<Paragraph> smaller paragraph 1`] = `
12
+ <p
13
+ className="tribe-editor__paragraph tribe-editor__paragraph--small"
14
+ >
15
+ Modern Tribe
16
+ </p>
17
+ `;
common/src/modules/elements/paragraph/__tests__/element.test.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ import Paragraph, { SIZES } from '../element';
4
+
5
+ describe( '<Paragraph>', () => {
6
+ test( 'default paragraph', () => {
7
+ const component = renderer.create(
8
+ <Paragraph>Modern Tribe</Paragraph>,
9
+ );
10
+ expect( component.toJSON() ).toMatchSnapshot();
11
+ } );
12
+
13
+ test( 'smaller paragraph', () => {
14
+ const component = renderer.create(
15
+ <Paragraph size={ SIZES.small }>Modern Tribe</Paragraph>,
16
+ );
17
+ expect( component.toJSON() ).toMatchSnapshot();
18
+ } );
19
+ } );
common/src/modules/elements/paragraph/element.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.pcss';
12
+
13
+ export const SIZES = {
14
+ medium: 'medium',
15
+ small: 'small',
16
+ };
17
+
18
+ const Paragraph = ( { children, size, className } ) => (
19
+ <p
20
+ className={
21
+ classNames(
22
+ 'tribe-editor__paragraph',
23
+ `tribe-editor__paragraph--${ size }`,
24
+ className,
25
+ )
26
+ }
27
+ >
28
+ { children }
29
+ </p>
30
+ );
31
+
32
+ Paragraph.propTypes = {
33
+ children: PropTypes.node.isRequired,
34
+ size: PropTypes.oneOf( Object.keys( SIZES ) ),
35
+ };
36
+
37
+ Paragraph.defaultProps = {
38
+ size: SIZES.medium,
39
+ };
40
+
41
+ export default Paragraph;
common/src/modules/elements/paragraph/style.pcss ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__paragraph {
2
+ font-family: 'Helvetica', 'Arial', 'sans-serif';
3
+ line-height: 1.5;
4
+ font-weight: normal;
5
+
6
+ &--medium {
7
+ /* 16pt */
8
+ font-size: 1rem;
9
+ }
10
+
11
+ &--small {
12
+ /* 14pt */
13
+ font-size: 0.875rem;
14
+ }
15
+
16
+ a {
17
+ color: #11A0D2;
18
+
19
+ &:hover {
20
+ text-decoration: none;
21
+ color: #007BB4;
22
+ }
23
+ }
24
+ }
common/src/modules/elements/placeholder/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<Placeholder> component Custom Class name attached 1`] = `
4
+ <div
5
+ className="tribe-editor__placeholder custom-class-name"
6
+ >
7
+ Custom Text
8
+ </div>
9
+ `;
10
+
11
+ exports[`<Placeholder> component Default behavior 1`] = `
12
+ <div
13
+ className="tribe-editor__placeholder"
14
+ >
15
+ Custom Text
16
+ </div>
17
+ `;
common/src/modules/elements/placeholder/__tests__/element.test.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import Placeholder from '../element';
3
+
4
+ describe( '<Placeholder> component', () => {
5
+ test( 'Default behavior', () => {
6
+ const component = renderer.create(
7
+ <Placeholder>Custom Text</Placeholder>
8
+ );
9
+ expect( component.toJSON() ).toMatchSnapshot();
10
+ } );
11
+
12
+ test( 'Custom Class name attached', () => {
13
+ const component = renderer.create(
14
+ <Placeholder className='custom-class-name'>Custom Text</Placeholder>
15
+ );
16
+ expect( component.toJSON() ).toMatchSnapshot();
17
+ } );
18
+ } );
common/src/modules/elements/placeholder/element.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.pcss';
12
+
13
+ const Placeholder = ( { children, className } ) => (
14
+ <div className={ classNames( 'tribe-editor__placeholder', className ) }>
15
+ { children }
16
+ </div>
17
+ );
18
+
19
+ Placeholder.propTypes = {
20
+ children: PropTypes.node.isRequired,
21
+ };
22
+
23
+ export default Placeholder;
common/src/modules/elements/placeholder/style.pcss ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__placeholder {
2
+ border: 2px dashed #E1E3E6;
3
+ padding: 12px 15px 14px;
4
+ text-align: center;
5
+ font-family: 'Helvetica', 'Arial', 'sans-serif';
6
+ font-size: 1rem;
7
+ line-height: 1.5;
8
+ font-weight: bold;
9
+ color: #8D949B;
10
+ min-width: 260px;
11
+ display: inline-block;
12
+ }
common/src/modules/elements/radio-input/element.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import Input from '@moderntribe/common/elements/input/element';
12
+
13
+ const RadioInput = ( { checked, className, onChange, ...rest } ) => (
14
+ <Input
15
+ checked={ checked }
16
+ className={ classNames( 'tribe-editor__input--radio', className ) }
17
+ onChange={ onChange }
18
+ type="radio"
19
+ { ...rest }
20
+ />
21
+ );
22
+
23
+ RadioInput.propTypes = {
24
+ checked: PropTypes.bool,
25
+ className: PropTypes.string,
26
+ onChange: PropTypes.func,
27
+ };
28
+
29
+ export default RadioInput;
common/src/modules/elements/radio/element.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+ import { noop } from 'lodash';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import { RadioInput } from '@moderntribe/common/elements';
13
+
14
+ const Radio = ( { checked, className, disabled, id, label, onChange, name, value } ) => (
15
+ <div className={ classNames( 'tribe-editor__radio', className ) }>
16
+ <RadioInput
17
+ checked={ checked }
18
+ className="tribe-editor__radio__input"
19
+ disabled={ disabled }
20
+ id={ id }
21
+ name={ name }
22
+ onChange={ onChange }
23
+ value={ value }
24
+ />
25
+ <label
26
+ className="tribe-editor__radio_label"
27
+ htmlFor={ id }
28
+ >
29
+ { label }
30
+ </label>
31
+ </div>
32
+ );
33
+
34
+ Radio.defaultProps = {
35
+ checked: false,
36
+ onChange: noop,
37
+ };
38
+
39
+ Radio.propTypes = {
40
+ checked: PropTypes.bool.isRequired,
41
+ className: PropTypes.string,
42
+ disabled: PropTypes.bool,
43
+ id: PropTypes.string,
44
+ label: PropTypes.string,
45
+ name: PropTypes.string,
46
+ onChange: PropTypes.func,
47
+ value: PropTypes.string,
48
+ };
49
+
50
+ export default Radio;
common/src/modules/elements/select/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Select element Should render the component 1`] = `
4
+ <div
5
+ className="css-10nd86i tribe-editor__select"
6
+ onKeyDown={[Function]}
7
+ >
8
+ <div
9
+ className="css-vj8t7z tribe-editor__select__control"
10
+ onMouseDown={[Function]}
11
+ onTouchEnd={[Function]}
12
+ >
13
+ <div
14
+ className="css-1hwfws3 tribe-editor__select__value-container"
15
+ >
16
+ <div
17
+ className="css-1492t68 tribe-editor__select__placeholder"
18
+ >
19
+ Select...
20
+ </div>
21
+ <div
22
+ className="css-1g6gooi"
23
+ >
24
+ <div
25
+ className="tribe-editor__select__input"
26
+ style={
27
+ Object {
28
+ "display": "inline-block",
29
+ }
30
+ }
31
+ >
32
+ <input
33
+ aria-autocomplete="list"
34
+ autoCapitalize="none"
35
+ autoComplete="off"
36
+ autoCorrect="off"
37
+ disabled={false}
38
+ id="react-select-2-input"
39
+ onBlur={[Function]}
40
+ onChange={[Function]}
41
+ onFocus={[Function]}
42
+ spellCheck="false"
43
+ style={
44
+ Object {
45
+ "background": 0,
46
+ "border": 0,
47
+ "boxSizing": "content-box",
48
+ "color": "inherit",
49
+ "fontSize": "inherit",
50
+ "opacity": 1,
51
+ "outline": 0,
52
+ "padding": 0,
53
+ "width": "1px",
54
+ }
55
+ }
56
+ tabIndex="0"
57
+ type="text"
58
+ value=""
59
+ />
60
+ <div
61
+ style={
62
+ Object {
63
+ "height": 0,
64
+ "left": 0,
65
+ "overflow": "scroll",
66
+ "position": "absolute",
67
+ "top": 0,
68
+ "visibility": "hidden",
69
+ "whiteSpace": "pre",
70
+ }
71
+ }
72
+ >
73
+
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ <div
79
+ className="css-1wy0on6 tribe-editor__select__indicators"
80
+ >
81
+ <div
82
+ aria-hidden="true"
83
+ className="css-1ep9fjw tribe-editor__select__indicator tribe-editor__select__dropdown-indicator"
84
+ onMouseDown={[Function]}
85
+ onTouchEnd={[Function]}
86
+ >
87
+ <span
88
+ className="tribe-editor__select__dropdown-indicator"
89
+ >
90
+ arrow-down
91
+ </span>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ `;
97
+
98
+ exports[`Select element Should render the component with class 1`] = `
99
+ <div
100
+ className="css-10nd86i tribe-editor__select test-class"
101
+ onKeyDown={[Function]}
102
+ >
103
+ <div
104
+ className="css-vj8t7z tribe-editor__select__control"
105
+ onMouseDown={[Function]}
106
+ onTouchEnd={[Function]}
107
+ >
108
+ <div
109
+ className="css-1hwfws3 tribe-editor__select__value-container"
110
+ >
111
+ <div
112
+ className="css-1492t68 tribe-editor__select__placeholder"
113
+ >
114
+ Select...
115
+ </div>
116
+ <div
117
+ className="css-1g6gooi"
118
+ >
119
+ <div
120
+ className="tribe-editor__select__input"
121
+ style={
122
+ Object {
123
+ "display": "inline-block",
124
+ }
125
+ }
126
+ >
127
+ <input
128
+ aria-autocomplete="list"
129
+ autoCapitalize="none"
130
+ autoComplete="off"
131
+ autoCorrect="off"
132
+ disabled={false}
133
+ id="react-select-3-input"
134
+ onBlur={[Function]}
135
+ onChange={[Function]}
136
+ onFocus={[Function]}
137
+ spellCheck="false"
138
+ style={
139
+ Object {
140
+ "background": 0,
141
+ "border": 0,
142
+ "boxSizing": "content-box",
143
+ "color": "inherit",
144
+ "fontSize": "inherit",
145
+ "opacity": 1,
146
+ "outline": 0,
147
+ "padding": 0,
148
+ "width": "1px",
149
+ }
150
+ }
151
+ tabIndex="0"
152
+ type="text"
153
+ value=""
154
+ />
155
+ <div
156
+ style={
157
+ Object {
158
+ "height": 0,
159
+ "left": 0,
160
+ "overflow": "scroll",
161
+ "position": "absolute",
162
+ "top": 0,
163
+ "visibility": "hidden",
164
+ "whiteSpace": "pre",
165
+ }
166
+ }
167
+ >
168
+
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ <div
174
+ className="css-1wy0on6 tribe-editor__select__indicators"
175
+ >
176
+ <div
177
+ aria-hidden="true"
178
+ className="css-1ep9fjw tribe-editor__select__indicator tribe-editor__select__dropdown-indicator"
179
+ onMouseDown={[Function]}
180
+ onTouchEnd={[Function]}
181
+ >
182
+ <span
183
+ className="tribe-editor__select__dropdown-indicator"
184
+ >
185
+ arrow-down
186
+ </span>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ `;
192
+
193
+ exports[`Select element Should render the component with extra props 1`] = `
194
+ <div
195
+ className="css-10nd86i tribe-editor__select"
196
+ onKeyDown={[Function]}
197
+ >
198
+ <div
199
+ className="css-vj8t7z tribe-editor__select__control"
200
+ onMouseDown={[Function]}
201
+ onTouchEnd={[Function]}
202
+ >
203
+ <div
204
+ className="css-1hwfws3 tribe-editor__select__value-container"
205
+ >
206
+ <div
207
+ className="css-1492t68 tribe-editor__select__placeholder"
208
+ >
209
+ Select...
210
+ </div>
211
+ <input
212
+ className="css-14uuagi"
213
+ disabled={false}
214
+ id="react-select-4-input"
215
+ onBlur={[Function]}
216
+ onChange={[Function]}
217
+ onFocus={[Function]}
218
+ readOnly={true}
219
+ tabIndex="0"
220
+ value=""
221
+ />
222
+ </div>
223
+ <div
224
+ className="css-1wy0on6 tribe-editor__select__indicators"
225
+ >
226
+ <div
227
+ aria-hidden="true"
228
+ className="css-1ep9fjw tribe-editor__select__indicator tribe-editor__select__dropdown-indicator"
229
+ onMouseDown={[Function]}
230
+ onTouchEnd={[Function]}
231
+ >
232
+ <span
233
+ className="tribe-editor__select__dropdown-indicator"
234
+ >
235
+ arrow-down
236
+ </span>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ `;
common/src/modules/elements/select/__tests__/element.test.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import Select from '../element.js';
10
+
11
+ const options = [
12
+ { label: 'Test 1', value: 'test-1' },
13
+ { label: 'Test 2', value: 'test-2' },
14
+ ];
15
+
16
+ describe( 'Select element', () => {
17
+ it( 'Should render the component', () => {
18
+ const component = renderer.create( <Select options={ options } /> );
19
+ expect( component.toJSON() ).toMatchSnapshot();
20
+ } );
21
+
22
+ it( 'Should render the component with class', () => {
23
+ const component = renderer.create( <Select options={ options } className="test-class" /> );
24
+ expect( component.toJSON() ).toMatchSnapshot();
25
+ } );
26
+
27
+ it( 'Should render the component with extra props', () => {
28
+ const component = renderer.create( <Select options={ options } isSearchable={ false } /> );
29
+ expect( component.toJSON() ).toMatchSnapshot();
30
+ } );
31
+ } );
common/src/modules/elements/select/element.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+ import ReactSelect, { components } from 'react-select';
8
+ import { Dashicon } from '@wordpress/components';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import './style.pcss';
14
+
15
+ const DropdownIndicator = ( props ) => (
16
+ components.DropdownIndicator && (
17
+ <components.DropdownIndicator { ...props }>
18
+ <Dashicon
19
+ className="tribe-editor__select__dropdown-indicator"
20
+ icon={ 'arrow-down' }
21
+ />
22
+ </components.DropdownIndicator>
23
+ )
24
+ );
25
+
26
+ const IndicatorSeparator = () => null;
27
+
28
+ const Select = ( { className, ...rest } ) => (
29
+ <ReactSelect
30
+ className={ classNames( 'tribe-editor__select', className ) }
31
+ classNamePrefix="tribe-editor__select"
32
+ components={ { DropdownIndicator, IndicatorSeparator } }
33
+ { ...rest }
34
+ />
35
+ );
36
+
37
+ Select.propTypes = {
38
+ className: PropTypes.string,
39
+ };
40
+
41
+ export default Select;
common/src/modules/elements/select/style.pcss ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__select {
2
+
3
+ .tribe-editor__select__control {
4
+ height: 46px;
5
+ border: 1px solid #E1E3E6;
6
+ border-radius: 3px;
7
+ background-color: #FFFFFF;
8
+
9
+ &:hover {
10
+ border: 1px solid #E1E3E6;
11
+ }
12
+
13
+ &--is-focused {
14
+ box-shadow: none;
15
+ }
16
+ }
17
+
18
+ .tribe-editor__select__value-container {
19
+ padding: 2px 10px 2px 15px;
20
+ }
21
+
22
+ .tribe-editor__select__single-value {
23
+ margin: 0;
24
+ max-width: calc(100% - 15px);
25
+ font-size: 16px;
26
+ line-height: 1.5;
27
+ }
28
+
29
+ .tribe-editor__select__input {
30
+ font-size: 16px;
31
+
32
+ & > input {
33
+ margin: 0;
34
+ line-height: 1.5;
35
+ }
36
+ }
37
+
38
+ svg.tribe-editor__select__dropdown-indicator {
39
+ fill: #555D66;
40
+ }
41
+
42
+ .tribe-editor__select__menu {
43
+ margin: 0;
44
+ border: 1px solid #E1E3E6;
45
+ border-top: none;
46
+ border-radius: 0;
47
+ border-bottom-left-radius: 3px;
48
+ border-bottom-right-radius: 3px;
49
+ box-shadow: none;
50
+ transform: translateY(-7px);
51
+ z-index: 10;
52
+ }
53
+
54
+ .tribe-editor__select__menu-list {
55
+ padding: 0;
56
+ }
57
+
58
+ .tribe-editor__select__option {
59
+ font-size: 16px;
60
+ line-height: 1.5;
61
+ padding: 3px 15px;
62
+
63
+ &--is-focused {
64
+ background-color: #E7F5FA;
65
+ }
66
+
67
+ &--is-selected {
68
+ background-color: #11A0D2;
69
+ }
70
+ }
71
+
72
+ &--is-disabled {
73
+
74
+ svg.tribe-editor__select__dropdown-indicator {
75
+ fill: #AEB4BB;
76
+ }
77
+ }
78
+ }
common/src/modules/elements/style.pcss ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ .post-type-tribe_events .editor-styles-wrapper {
2
+ max-width: none!important;
3
+ }
common/src/modules/elements/textarea/element.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+
12
+ const Textarea = ( { className, ...rest } ) => (
13
+ <textarea className={ classNames( 'tribe-editor__textarea', className ) } { ...rest } />
14
+ );
15
+
16
+ Textarea.propTypes = {
17
+ className: PropTypes.string,
18
+ };
19
+
20
+ export default Textarea;
common/src/modules/elements/time-picker/element.js ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { Fragment } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import moment from 'moment';
7
+ import { noop } from 'lodash';
8
+ import classNames from 'classnames';
9
+ import { ScrollTo, ScrollArea } from 'react-scroll-to';
10
+
11
+ /**
12
+ * WordPress dependencies
13
+ */
14
+ import {
15
+ Dropdown,
16
+ Dashicon,
17
+ } from '@wordpress/components';
18
+ import { __ } from '@wordpress/i18n';
19
+
20
+ /**
21
+ * Internal dependencies
22
+ */
23
+ import { PreventBlockClose } from '@moderntribe/common/components';
24
+ import Button from '@moderntribe/common/elements/button/element';
25
+ import Input from '@moderntribe/common/elements/input/element';
26
+ import {
27
+ date as dateUtil,
28
+ moment as momentUtil,
29
+ time as timeUtil,
30
+ TribePropTypes,
31
+ } from '@moderntribe/common/utils';
32
+ import './style.pcss';
33
+
34
+ const TimePicker = ( {
35
+ allDay,
36
+ current,
37
+ disabled,
38
+ end,
39
+ onBlur,
40
+ onChange,
41
+ onClick,
42
+ onFocus,
43
+ showAllDay,
44
+ start,
45
+ step,
46
+ timeFormat,
47
+ } ) => {
48
+
49
+ const renderLabel = ( onAllDayClick ) => {
50
+ if ( allDay ) {
51
+ return (
52
+ <Button
53
+ className="tribe-editor__timepicker__all-day-btn"
54
+ disabled={ disabled }
55
+ onClick={ onAllDayClick }
56
+ >
57
+ { __( 'All Day', 'tribe-common' ) }
58
+ </Button>
59
+ );
60
+ }
61
+
62
+ return (
63
+ <Input
64
+ className="tribe-editor__timepicker__input"
65
+ disabled={ disabled }
66
+ onBlur={ onBlur }
67
+ onChange={ onChange }
68
+ onFocus={ onFocus }
69
+ type="text"
70
+ value={ current }
71
+ />
72
+ );
73
+ };
74
+
75
+ const renderToggle = ( { onToggle, isOpen } ) => (
76
+ <Fragment>
77
+ { renderLabel( onToggle ) }
78
+ <Button
79
+ aria-expanded={ isOpen }
80
+ className="tribe-editor__timepicker__toggle-btn"
81
+ disabled={ disabled }
82
+ onClick={ onToggle }
83
+ >
84
+ <Dashicon
85
+ className="tribe-editor__timepicker__toggle-btn-icon"
86
+ icon={ isOpen ? 'arrow-up' : 'arrow-down' }
87
+ />
88
+ </Button>
89
+ </Fragment>
90
+ );
91
+
92
+ const getItems = () => {
93
+ const items = [];
94
+
95
+ const startSeconds = timeUtil.toSeconds( start, timeUtil.TIME_FORMAT_HH_MM );
96
+ const endSeconds = timeUtil.toSeconds( end, timeUtil.TIME_FORMAT_HH_MM );
97
+
98
+ const currentMoment = moment( current, momentUtil.TIME_FORMAT );
99
+
100
+ for ( let time = startSeconds; time <= endSeconds; time += step ) {
101
+ let isCurrent = false;
102
+ if ( currentMoment.isValid() ) {
103
+ const currentTime = momentUtil.toTime24Hr( currentMoment );
104
+ isCurrent = time === timeUtil.toSeconds( currentTime, timeUtil.TIME_FORMAT_HH_MM );
105
+ }
106
+
107
+ items.push( {
108
+ value: time,
109
+ text: formatLabel( time ),
110
+ isCurrent,
111
+ } );
112
+ }
113
+
114
+ return items;
115
+ };
116
+
117
+ const formatLabel = ( seconds ) => {
118
+ return momentUtil.setTimeInSeconds( moment(), seconds ).format( momentUtil.toFormat( timeFormat ) );
119
+ };
120
+
121
+ const renderItem = ( item, onClose ) => {
122
+ const itemClasses = {
123
+ 'tribe-editor__timepicker__item': true,
124
+ 'tribe-editor__timepicker__item--current': item.isCurrent && ! allDay,
125
+ };
126
+
127
+ return (
128
+ <Button
129
+ key={ `time-${ item.value }` }
130
+ className={ classNames( itemClasses ) }
131
+ value={ item.value }
132
+ onClick={ () => onClick( item.value, onClose ) }
133
+ >
134
+ { item.text }
135
+ </Button>
136
+ );
137
+ };
138
+
139
+ const renderContent = ( { onClose } ) => (
140
+ <ScrollTo>
141
+ { () => (
142
+ <PreventBlockClose>
143
+ <ScrollArea
144
+ key="tribe-element-timepicker-items"
145
+ className="tribe-editor__timepicker__items"
146
+ >
147
+ { showAllDay && renderItem(
148
+ { text: __( 'All Day', 'tribe-common' ), value: 'all-day' },
149
+ onClose,
150
+ ) }
151
+ { getItems().map( ( item ) => renderItem( item, onClose ) ) }
152
+ </ScrollArea>
153
+ </PreventBlockClose>
154
+ ) }
155
+ </ScrollTo>
156
+ );
157
+
158
+ return (
159
+ <div
160
+ key="tribe-element-timepicker"
161
+ className="tribe-editor__timepicker"
162
+ >
163
+ <Dropdown
164
+ className="tribe-editor__timepicker__toggle"
165
+ contentClassName="tribe-editor__timepicker__content"
166
+ position="bottom center"
167
+ renderToggle={ renderToggle }
168
+ renderContent={ renderContent }
169
+ />
170
+ </div>
171
+ );
172
+ };
173
+
174
+ TimePicker.defaultProps = {
175
+ allDay: false,
176
+ onBlur: noop,
177
+ onChange: noop,
178
+ onClick: noop,
179
+ onFocus: noop,
180
+ step: timeUtil.HALF_HOUR_IN_SECONDS,
181
+ timeFormat: dateUtil.FORMATS.WP.time,
182
+ };
183
+
184
+ TimePicker.propTypes = {
185
+ /**
186
+ * TribePropTypes.timeFormat check for string formatted as a time
187
+ * using 24h clock in hh:mm format
188
+ * e.g. 00:24, 03:57, 21:12
189
+ */
190
+ allDay: PropTypes.bool,
191
+ current: PropTypes.string,
192
+ disabled: PropTypes.bool,
193
+ end: TribePropTypes.timeFormat.isRequired,
194
+ onBlur: PropTypes.func,
195
+ onChange: PropTypes.func,
196
+ onClick: PropTypes.func,
197
+ onFocus: PropTypes.func,
198
+ showAllDay: PropTypes.bool,
199
+ start: TribePropTypes.timeFormat.isRequired,
200
+ step: PropTypes.number,
201
+ timeFormat: PropTypes.string,
202
+ };
203
+
204
+ export default TimePicker;
common/src/modules/elements/time-picker/style.pcss ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__timepicker {
2
+ display: inline-block;
3
+ }
4
+
5
+ .tribe-editor__timepicker__toggle {
6
+ background-color: #FFF;
7
+ border: 1px solid #e1e3e6;
8
+ border-radius: 2px;
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+
13
+ input.tribe-editor__timepicker__input[type="text"] {
14
+ font-family: Helvetica, sans-serif;
15
+ font-size: 14px;
16
+ line-height: 1.5;
17
+ padding: 6px 0 6px 10px;
18
+ border: none;
19
+ width: 80px;
20
+ }
21
+
22
+ button.tribe-editor__timepicker__toggle-btn {
23
+ padding: 10px;
24
+
25
+ &:disabled > svg.dashicon {
26
+ fill: #AEB4BB;
27
+ }
28
+ }
29
+
30
+ button.tribe-editor__timepicker__all-day-btn {
31
+ color: #545D66;
32
+ line-height: 20px;
33
+ padding: 6px 10px 6px;
34
+ text-decoration: none;
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ }
39
+ }
40
+
41
+ .tribe-editor__timepicker__content {
42
+
43
+ &.components-popover {
44
+
45
+ .components-popover__content {
46
+ min-width: 110px;
47
+ }
48
+ }
49
+
50
+ .tribe-editor__timepicker__items {
51
+ height: 250px;
52
+ overflow: auto;
53
+
54
+ .components-placeholder {
55
+ height: inherit;
56
+ }
57
+ }
58
+
59
+ .tribe-editor__timepicker__item {
60
+ display: block;
61
+ width: 100%;
62
+ color: #555d66;
63
+ padding: 5px 12px;
64
+ cursor: pointer;
65
+ border-bottom: 1px solid #e2e4e7;
66
+ line-height: 20px;
67
+ background: transparent;
68
+ text-align: left;
69
+
70
+ &:hover,
71
+ &:focus {
72
+ background-color: #e7f5fa;
73
+ }
74
+
75
+ &--current {
76
+ color: #ffffff;
77
+ background-color: #009fd4;
78
+
79
+ &:hover,
80
+ &:focus {
81
+ color: #ffffff;
82
+ background-color: #009fd4;
83
+ }
84
+ }
85
+ }
86
+ }
common/src/modules/elements/tooltip/__tests__/__snapshots__/element.test.js.snap ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Tooltip Element renders a tooltip 1`] = `
4
+ <div>
5
+ <span>
6
+ here is the tooltip text
7
+ </span>
8
+ <span>
9
+ bottom left
10
+ </span>
11
+ <span>
12
+ <button
13
+ aria-label="here is the tooltip text"
14
+ className="tribe-editor__button tribe-editor__tooltip-label label-class-name"
15
+ onClick={[Function]}
16
+ type="button"
17
+ >
18
+ some label
19
+ </button>
20
+ </span>
21
+ </div>
22
+ `;
common/src/modules/elements/tooltip/__tests__/element.test.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+ import renderer from 'react-test-renderer';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import Tooltip from '@moderntribe/common/elements/tooltip/element';
11
+
12
+ jest.mock( '@wordpress/components', () => ( {
13
+ Tooltip: ({ text, position, children }) => (
14
+ <div>
15
+ <span>{ text }</span>
16
+ <span>{ position }</span>
17
+ <span>{ children }</span>
18
+ </div>
19
+ ),
20
+ } ) );
21
+
22
+ describe( 'Tooltip Element', () => {
23
+ it( 'renders a tooltip', () => {
24
+ const props = {
25
+ label: 'some label',
26
+ labelClassName: 'label-class-name',
27
+ position: 'bottom left',
28
+ text: 'here is the tooltip text',
29
+ };
30
+ const component = renderer.create( <Tooltip { ...props } />)
31
+ expect( component.toJSON() ).toMatchSnapshot()
32
+ } );
33
+ } );
common/src/modules/elements/tooltip/element.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { PureComponent } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * WordPress dependencies
10
+ */
11
+ import { Tooltip as WpTooltip } from '@wordpress/components';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import { Button } from '@moderntribe/common/elements';
17
+
18
+ class Tooltip extends PureComponent {
19
+ static defaultProps = {
20
+ position: 'top right',
21
+ text: '',
22
+ };
23
+
24
+ static propTypes = {
25
+ disabled: PropTypes.bool,
26
+ label: PropTypes.node,
27
+ labelClassName: PropTypes.string,
28
+ position: PropTypes.oneOf( [
29
+ 'top left',
30
+ 'top center',
31
+ 'top right',
32
+ 'bottom left',
33
+ 'bottom center',
34
+ 'bottom right',
35
+ ] ),
36
+ text: PropTypes.string,
37
+ };
38
+
39
+ render() {
40
+ const { disabled, label, labelClassName, position, text } = this.props;
41
+
42
+ return (
43
+ <WpTooltip text={ text } position={ position }>
44
+ <Button
45
+ aria-label={ text }
46
+ className={ classNames( 'tribe-editor__tooltip-label', labelClassName ) }
47
+ disabled={ disabled }
48
+ >
49
+ { label }
50
+ </Button>
51
+ </WpTooltip>
52
+ );
53
+ }
54
+ }
55
+
56
+ export default Tooltip;
common/src/modules/elements/tooltip/style.pcss ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .components-tooltip {
2
+
3
+ .components-popover__content {
4
+ white-space: normal;
5
+ min-width: 350px;
6
+ max-width: 600px;
7
+ }
8
+
9
+ &:not(.is-mobile) {
10
+ .components-popover__content {
11
+ min-width: 350px;
12
+ }
13
+ }
14
+ }
common/src/modules/elements/url-input/element.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External Dependencies
3
+ */
4
+ import React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import Input from '@moderntribe/common/elements/input/element';
12
+
13
+ const UrlInput = ( { checked, className, onChange, ...rest } ) => (
14
+ <Input
15
+ type="url"
16
+ className={ classNames( 'tribe-editor__input--url', className ) }
17
+ onChange={ onChange }
18
+ { ...rest }
19
+ />
20
+ );
21
+
22
+ UrlInput.propTypes = {
23
+ className: PropTypes.string,
24
+ onChange: PropTypes.func,
25
+ };
26
+
27
+ export default UrlInput;
common/src/modules/hoc/__tests__/__snapshots__/with-form.test.js.snap ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`HOC - With Form Should register the postType by dispatching the actions 1`] = `
4
+ Array [
5
+ Object {
6
+ "payload": Object {
7
+ "id": "posts",
8
+ "type": "post",
9
+ },
10
+ "type": "@@MT/COMMON/ADD_FORM",
11
+ },
12
+ ]
13
+ `;
14
+
15
+ exports[`HOC - With Form Should render a component 1`] = `
16
+ <div>
17
+ With Form!
18
+ </div>
19
+ `;
common/src/modules/hoc/__tests__/__snapshots__/with-save-data.test.js.snap ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`HOC - With Details Should render a component 1`] = `
4
+ <div
5
+ attributes={
6
+ Object {
7
+ "description": "",
8
+ "organizers": Array [],
9
+ "title": "Modern Tribe",
10
+ }
11
+ }
12
+ description="The Next Generation of Digital Agency"
13
+ isolated={false}
14
+ name="tribe/event"
15
+ onBlockCreated={[Function]}
16
+ onBlockRemoved={[Function]}
17
+ organizers={Array []}
18
+ setAttributes={[MockFunction]}
19
+ setInitialState={
20
+ [MockFunction] {
21
+ "calls": Array [
22
+ Array [
23
+ Object {
24
+ "attributes": Object {
25
+ "description": "",
26
+ "organizers": Array [],
27
+ "title": "Modern Tribe",
28
+ },
29
+ "description": "The Next Generation of Digital Agency",
30
+ "get": [Function],
31
+ "isolated": false,
32
+ "name": "tribe/event",
33
+ "onBlockCreated": [Function],
34
+ "onBlockRemoved": [Function],
35
+ "organizers": Array [],
36
+ "setAttributes": [MockFunction],
37
+ "setInitialState": [MockFunction] {
38
+ "calls": [Circular],
39
+ "results": Array [
40
+ Object {
41
+ "isThrow": false,
42
+ "value": undefined,
43
+ },
44
+ ],
45
+ },
46
+ "title": "Modern Tribe!",
47
+ },
48
+ ],
49
+ ],
50
+ "results": Array [
51
+ Object {
52
+ "isThrow": false,
53
+ "value": undefined,
54
+ },
55
+ ],
56
+ }
57
+ }
58
+ title="Modern Tribe!"
59
+ >
60
+ With Save Data!
61
+ </div>
62
+ `;
common/src/modules/hoc/__tests__/__snapshots__/with-store.test.js.snap ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`HOC - With Store Should add the store property 1`] = `
4
+ <div
5
+ store={
6
+ Object {
7
+ "dispatch": [Function],
8
+ "getState": [Function],
9
+ "injectReducers": [Function],
10
+ "injectedReducers": Object {},
11
+ "replaceReducer": [Function],
12
+ "run": [Function],
13
+ "subscribe": [Function],
14
+ Symbol(observable): [Function],
15
+ }
16
+ }
17
+ />
18
+ `;
common/src/modules/hoc/__tests__/with-form.test.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import renderer from 'react-test-renderer';
5
+ import React from 'react';
6
+ import configureStore from 'redux-mock-store';
7
+ import thunk from 'redux-thunk';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import { withForm } from '@moderntribe/common/hoc';
13
+
14
+ const initialState = {
15
+ events: {
16
+ },
17
+ forms: {
18
+ byId: {},
19
+ },
20
+ };
21
+ // here it is possible to pass in any middleware if needed into //configureStore
22
+ const mockStore = configureStore( [ thunk ] );
23
+ const store = mockStore( initialState );
24
+
25
+ const Block = () => <div>With Form!</div>;
26
+ let setFormID;
27
+ let Wrapper;
28
+ let component;
29
+ let instance;
30
+
31
+ describe( 'HOC - With Form', () => {
32
+ beforeEach( () => {
33
+ setFormID = jest.fn( () => 'posts' );
34
+ Wrapper = withForm( setFormID )( Block );
35
+ component = renderer.create( <Wrapper store={ store } postType="post"/> );
36
+ instance = component.root;
37
+ } );
38
+
39
+ afterEach( () => {
40
+ mockStore( initialState );
41
+ store.clearActions();
42
+ setFormID.mockClear();
43
+ } );
44
+
45
+ it( 'Should render a component', () => {
46
+ expect( component.toJSON() ).toMatchSnapshot();
47
+ } );
48
+
49
+ it( 'Should render the inner component', () => {
50
+ expect( instance ).not.toBe( null );
51
+ expect( () => instance.findByType( Block ) ).not.toThrowError();
52
+ } );
53
+
54
+ it( 'Should attach the form properties', () => {
55
+ const expected = {
56
+ edit: false,
57
+ create: false,
58
+ fields: {},
59
+ submit: false,
60
+ };
61
+ expect( instance.findByType( Block ).props ).toMatchObject( expected );
62
+ } );
63
+
64
+ it( 'Should have properties as functions', () => {
65
+ const props = instance.findByType( Block ).props;
66
+ const expectedProps = [
67
+ 'maybeRemoveEntry',
68
+ 'setSubmit',
69
+ 'sendForm',
70
+ 'editEntry',
71
+ 'createDraft',
72
+ ];
73
+
74
+ expectedProps.forEach( ( property ) => {
75
+ expect( props[ property ] ).not.toBeUndefined();
76
+ expect( typeof props[ property ] ).toBe( 'function' );
77
+ } );
78
+ } );
79
+
80
+ it( 'Should register the postType by dispatching the actions', () => {
81
+ expect( store.getActions() ).toMatchSnapshot();
82
+ } );
83
+
84
+ it( 'Should register the ID of the form', () => {
85
+ expect( setFormID ).toHaveBeenCalled();
86
+ expect( setFormID ).toHaveBeenCalledTimes( 3 );
87
+ } );
88
+ } );
89
+
common/src/modules/hoc/__tests__/with-save-data.test.js ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import renderer from 'react-test-renderer';
5
+ import React from 'react';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { withSaveData } from '@moderntribe/common/hoc';
11
+
12
+ const Block = ( props ) => <div { ...props }>With Save Data!</div>;
13
+ const props = {
14
+ name: 'tribe/event',
15
+ setInitialState: jest.fn(),
16
+ setAttributes: jest.fn(),
17
+ title: 'Modern Tribe!',
18
+ description: 'The Next Generation of Digital Agency',
19
+ organizers: [],
20
+ attributes: {
21
+ title: 'Modern Tribe',
22
+ description: '',
23
+ organizers: [],
24
+ },
25
+ };
26
+
27
+ describe( 'HOC - With Details', () => {
28
+ let Wrapper;
29
+ let component;
30
+ let instance;
31
+
32
+ beforeEach( () => {
33
+ Wrapper = withSaveData()( Block );
34
+ component = renderer.create( <Wrapper { ...props } /> );
35
+ instance = component.root;
36
+ } );
37
+
38
+ afterEach( () => {
39
+ props.setInitialState.mockClear();
40
+ props.setAttributes.mockClear();
41
+ component.getInstance().unregisterBlock();
42
+ } );
43
+
44
+ it( 'Should render a component', () => {
45
+ expect( component.toJSON() ).toMatchSnapshot();
46
+ } );
47
+
48
+ it( 'Should render the inner component', () => {
49
+ expect( instance ).not.toBe( null );
50
+ expect( () => instance.findByType( Block ) ).not.toThrowError();
51
+ } );
52
+
53
+ it( 'Should set the initial state', () => {
54
+ expect( props.setInitialState ).toHaveBeenCalled();
55
+ expect( props.setInitialState ).toHaveBeenCalledTimes( 1 );
56
+ } );
57
+
58
+ it( 'Should generate the attributes', () => {
59
+ const HOC = component.getInstance();
60
+ expect( HOC.attrs ).toEqual( props.attributes );
61
+ } );
62
+
63
+ it( 'Should generate the keys', () => {
64
+ const HOC = component.getInstance();
65
+ expect( HOC.keys ).toEqual( Object.keys( props.attributes ) );
66
+ } );
67
+
68
+ it( 'Simulate componentDidUpdate call', () => {
69
+ const wrapper = shallow( <Wrapper { ...props } /> );
70
+ const wrapperInstance = wrapper.instance();
71
+ expect( wrapperInstance.calculateDiff() ).toEqual( {
72
+ description: 'The Next Generation of Digital Agency',
73
+ title: 'Modern Tribe!',
74
+ } );
75
+ wrapper.setProps( {
76
+ attributes: {
77
+ title: 'Modern Tribe!',
78
+ description: 'The Next Generation of Digital Agency',
79
+ organizers: [],
80
+ }
81
+ } );
82
+ expect( wrapperInstance.calculateDiff() ).toEqual( {} );
83
+ wrapper.setProps( {
84
+ organizers: [ 3 ],
85
+ attributes: {
86
+ title: 'Modern Tribe!',
87
+ description: 'The Next Generation of Digital Agency',
88
+ organizers: [ 3 ],
89
+ },
90
+ } );
91
+ expect( wrapperInstance.calculateDiff() ).toEqual( {} );
92
+ wrapper.setProps( {
93
+ organizers: [ 2, 3 ],
94
+ attributes: {
95
+ title: 'Modern Tribe!',
96
+ description: 'The Next Generation of Digital Agency',
97
+ organizers: [ 3, 2 ],
98
+ },
99
+ } );
100
+ expect( wrapperInstance.calculateDiff() ).toEqual( { organizers: [ 2, 3 ] } );
101
+ wrapperInstance.unregisterBlock();
102
+ } );
103
+
104
+ it( 'Should calculate the diff', () => {
105
+ const HOC = component.getInstance();
106
+ const expected = {
107
+ title: props.title,
108
+ description: props.description,
109
+ };
110
+ expect( HOC.calculateDiff() ).toEqual( expected );
111
+ } );
112
+
113
+ it( 'Should count a single block', () => {
114
+ const HOC = component.getInstance();
115
+ expect( HOC.blockCount() ).toBe( 1 );
116
+ } );
117
+ } );
118
+
119
+ describe( 'HOC - With Details on multiple instances', () => {
120
+ afterEach( () => {
121
+ props.setInitialState.mockClear();
122
+ props.setAttributes.mockClear();
123
+ } );
124
+
125
+ it( 'Should register the initial state just once', () => {
126
+ const WrapperComponent = withSaveData()( Block );
127
+
128
+ renderer.create( <WrapperComponent { ...props } /> );
129
+ renderer.create( <WrapperComponent { ...props } /> );
130
+ renderer.create( <WrapperComponent { ...props } /> );
131
+
132
+ expect( props.setInitialState ).toHaveBeenCalled();
133
+ expect( props.setInitialState ).toHaveBeenCalledTimes( 1 );
134
+ } );
135
+
136
+ it( 'Should register the state multiple times on non isolated instances', () => {
137
+ const WrapperComponent = withSaveData()( Block );
138
+ props.isolated = true;
139
+ renderer.create( <WrapperComponent { ...props } /> );
140
+ renderer.create( <WrapperComponent { ...props } /> );
141
+ renderer.create( <WrapperComponent { ...props } /> );
142
+
143
+ expect( props.setInitialState ).toHaveBeenCalled();
144
+ expect( props.setInitialState ).toHaveBeenCalledTimes( 3 );
145
+ } );
146
+ } );
147
+
148
+ describe( 'HOC - test life cycle callbacks', () => {
149
+ let Wrapper;
150
+ let component;
151
+ let instance;
152
+ let properties = {};
153
+
154
+ beforeAll( () => {
155
+ props.onBlockCreated = jest.fn();
156
+ props.onBlockRemoved = jest.fn();
157
+ });
158
+
159
+ beforeEach( () => {
160
+ Wrapper = withSaveData()( Block );
161
+ component = renderer.create( <Wrapper { ...props } /> );
162
+ instance = component.root;
163
+ properties = instance.props;
164
+ } );
165
+
166
+ afterEach( () => {
167
+ props.setInitialState.mockClear();
168
+ props.setAttributes.mockClear();
169
+ props.onBlockCreated.mockClear();
170
+ props.onBlockRemoved.mockClear();
171
+ } );
172
+
173
+ afterAll( () => {
174
+ delete props.onBlockCreated;
175
+ delete props.onBlockRemoved;
176
+ } );
177
+
178
+ it( 'Should call the onBlockCreated callback on mount', () => {
179
+ expect( props.onBlockCreated ).toHaveBeenCalled();
180
+ expect( props.onBlockCreated ).toHaveBeenCalledWith( properties );
181
+ expect( props.onBlockRemoved ).not.toHaveBeenCalled();
182
+ } );
183
+
184
+ it( 'Should call the onBlockRemoved callback on unmount of the block', () => {
185
+ component.unmount();
186
+ expect( props.onBlockCreated ).toHaveBeenCalled();
187
+ expect( props.onBlockCreated ).toHaveBeenCalledWith( properties );
188
+ expect( props.onBlockRemoved ).toHaveBeenCalled();
189
+ expect( props.onBlockRemoved ).toHaveBeenCalledWith( properties );
190
+ } );
191
+ } );
common/src/modules/hoc/__tests__/with-selected.test.js ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { withSelected } from '@moderntribe/common/hoc';
10
+
11
+ const Block = () => ( <div>With Selected!</div> );
12
+
13
+ describe( 'withSelected', () => {
14
+ let HOC;
15
+ const onFocus = jest.fn();
16
+ const onBlur = jest.fn();
17
+ const props = {
18
+ onBlockFocus: onFocus,
19
+ onBlockBlur: onBlur,
20
+ };
21
+
22
+ beforeEach( () => {
23
+ HOC = withSelected()( Block );
24
+ } );
25
+
26
+ afterEach( () => {
27
+ props.onBlockFocus.mockClear();
28
+ props.onBlockBlur.mockClear();
29
+ } );
30
+
31
+ test( 'onBlur called when is not selected on mount', () => {
32
+ props.isSelected = false;
33
+ const component = mount( <HOC { ...props } /> );
34
+ expect( props.onBlockBlur ).toHaveBeenCalled();
35
+ expect( props.onBlockFocus ).not.toHaveBeenCalled();
36
+ } );
37
+
38
+ test( 'onFocus called when is selected on mount', () => {
39
+ props.isSelected = true;
40
+ const component = mount( <HOC { ...props } /> );
41
+ expect( props.onBlockFocus ).toHaveBeenCalled();
42
+ expect( props.onBlockBlur ).not.toHaveBeenCalled();
43
+ } );
44
+
45
+ test( 'trigger focus when isSelected changes after mounted', () => {
46
+ props.isSelected = false;
47
+ const component = mount( <HOC { ...props } /> );
48
+ expect( props.onBlockBlur ).toHaveBeenCalled();
49
+ expect( props.onBlockFocus ).not.toHaveBeenCalled();
50
+
51
+ props.onBlockBlur.mockClear();
52
+ props.onBlockFocus.mockClear();
53
+
54
+ component.setProps( { isSelected: true } );
55
+
56
+ expect( props.onBlockFocus ).toHaveBeenCalled();
57
+ expect( props.onBlockBlur ).not.toHaveBeenCalled();
58
+ } );
59
+
60
+ test( 'trigger onBlur when isSelected changes after mounted', () => {
61
+ props.isSelected = true;
62
+ const component = mount( <HOC { ...props } /> );
63
+ expect( props.onBlockFocus ).toHaveBeenCalled();
64
+ expect( props.onBlockBlur ).not.toHaveBeenCalled();
65
+
66
+ props.onBlockBlur.mockClear();
67
+ props.onBlockFocus.mockClear();
68
+
69
+ component.setProps( { isSelected: false } );
70
+
71
+ expect( props.onBlockBlur ).toHaveBeenCalled();
72
+ expect( props.onBlockFocus ).not.toHaveBeenCalled();
73
+ } );
74
+
75
+ test( 'blue and focus on the different props changes', () => {
76
+ props.isSelected = false;
77
+ const component = mount( <HOC { ...props } /> );
78
+ expect( props.onBlockBlur ).toHaveBeenCalled();
79
+ expect( props.onBlockFocus ).not.toHaveBeenCalled();
80
+
81
+ props.onBlockBlur.mockClear();
82
+ props.onBlockFocus.mockClear();
83
+
84
+ component.setProps( { isSelected: true } );
85
+
86
+ expect( props.onBlockFocus ).toHaveBeenCalled();
87
+ expect( props.onBlockBlur ).not.toHaveBeenCalled();
88
+
89
+ props.onBlockBlur.mockClear();
90
+ props.onBlockFocus.mockClear();
91
+
92
+ component.setProps( { isSelected: false } );
93
+
94
+ expect( props.onBlockBlur ).toHaveBeenCalled();
95
+ expect( props.onBlockFocus ).not.toHaveBeenCalled();
96
+ } );
97
+ } );
common/src/modules/hoc/__tests__/with-store.test.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import renderer from 'react-test-renderer';
5
+ import React from 'react';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { withStore } from '@moderntribe/common/hoc';
11
+
12
+ describe( 'HOC - With Store', () => {
13
+ it( 'Should add the store property', () => {
14
+ const Block = ( props ) => <div { ...props } />;
15
+ const Wrapper = withStore()( Block );
16
+ const component = renderer.create( <Wrapper /> );
17
+ expect( component.toJSON() ).toMatchSnapshot();
18
+
19
+ const instance = component.root;
20
+ expect( instance ).not.toBe( null );
21
+ const props = instance.findByType( Block ).props;
22
+ expect( props ).toHaveProperty( 'store' );
23
+ const { store } = props;
24
+ expect( store ).toHaveProperty( 'dispatch' );
25
+ expect( store ).toHaveProperty( 'getState' );
26
+ } );
27
+ } );
28
+
common/src/modules/hoc/index.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ export { default as withStore } from './with-store';
2
+ export { default as withSaveData } from './with-save-data';
3
+ export { default as withForm } from './with-form';
4
+ export { default as withBlockCloser } from './with-block-closer';
5
+ export { default as withSelected } from './with-selected';
common/src/modules/hoc/with-block-closer.js ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* eslint-disable max-len */
2
+ /**
3
+ * External dependencies
4
+ */
5
+ import React, { PureComponent } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import { noop } from 'lodash';
8
+
9
+ const ESCAPE_KEY = 27;
10
+ export const EVENT_NAMESPACE = 'tribe:click:proxy';
11
+ export const dispatch = ( e ) => {
12
+ e.target.dispatchEvent( new CustomEvent( EVENT_NAMESPACE, { bubbles: true } ) );
13
+ };
14
+ export const intercept = e => e.stopPropagation();
15
+
16
+ export default ( WrappedComponent ) => {
17
+ /**
18
+ * Prevents clicks on block or blacklisted DOM elements
19
+ * from closing the block
20
+ *
21
+ * @class WithBlockCloser
22
+ * @extends {PureComponent}
23
+ */
24
+ class WithBlockCloser extends PureComponent {
25
+ static displayName = `WithBlockCloser( ${ WrappedComponent.displayName || WrappedComponent.name || 'Component ' }`
26
+
27
+ static propTypes = {
28
+ onClose: PropTypes.func.isRequired,
29
+ classNameClickBlacklist: PropTypes.arrayOf( PropTypes.string ).isRequired,
30
+ isOpen: PropTypes.bool.isRequired,
31
+ };
32
+
33
+ static defaultProps = {
34
+ classNameClickBlacklist: [ '.edit-post-sidebar' ],
35
+ onClose: noop,
36
+ isOpen: false,
37
+ }
38
+
39
+ nodeRef = React.createRef();
40
+ _eventNamespace = EVENT_NAMESPACE;
41
+
42
+ /**
43
+ * dispatches custom events
44
+ *
45
+ * @memberof WithBlockCloser
46
+ * @param {Event} e event
47
+ */
48
+ _dispatchClickProxyEvent = dispatch;
49
+
50
+ // Prevent CustomEvents from propagating to document proxy listeners
51
+ _interceptClickProxyEvent = intercept;
52
+
53
+ /**
54
+ * keydown handler
55
+ *
56
+ * @memberof WithBlockCloser
57
+ * @param {Event} e event
58
+ */
59
+ handleKeyDown = ( e ) => {
60
+ if ( e.keyCode === ESCAPE_KEY ) {
61
+ this.props.onClose();
62
+ }
63
+ }
64
+
65
+ handleClick = () => this.props.onClose()
66
+
67
+ componentDidMount() {
68
+ this.props.isOpen && this._addEventListeners();
69
+ }
70
+
71
+ componentDidUpdate( prevProps ) {
72
+ if ( prevProps.isOpen !== this.props.isOpen ) {
73
+ this.props.isOpen
74
+ ? this._addEventListeners()
75
+ : this._removeEventListeners();
76
+ }
77
+ }
78
+
79
+ componentWillUnmount() {
80
+ this._removeEventListeners();
81
+ }
82
+
83
+ get blacklistedNodes() {
84
+ const classNames = this.props.classNameClickBlacklist.join( ', ' );
85
+ return Array.from( document.querySelectorAll( classNames ) );
86
+ }
87
+
88
+ get node() {
89
+ return this.nodeRef.current;
90
+ }
91
+
92
+ _addEventListeners() {
93
+ // Intercept custom events bubbled in block or blacklisted nodes
94
+ this.node.addEventListener( this._eventNamespace, this._interceptClickProxyEvent );
95
+ this.blacklistedNodes.forEach(
96
+ node => node.addEventListener( this._eventNamespace, this._interceptClickProxyEvent )
97
+ );
98
+
99
+ // Wait to receive custom events, if not intercepted, then go to click handler
100
+ document.addEventListener( this._eventNamespace, this.handleClick );
101
+ // Dispatch custom event on regular clicks
102
+ document.addEventListener( 'click', this._dispatchClickProxyEvent );
103
+
104
+ // Close on certain keypresses
105
+ document.addEventListener( 'keydown', this.handleKeyDown );
106
+ }
107
+
108
+ _removeEventListeners() {
109
+ this.node.removeEventListener( this._eventNamespace, this._interceptClickProxyEvent );
110
+ this.blacklistedNodes.forEach(
111
+ node => node.removeEventListener( this._eventNamespace, this._interceptClickProxyEvent )
112
+ );
113
+
114
+ document.removeEventListener( 'keydown', this.handleKeyDown );
115
+ document.removeEventListener( this._eventNamespace, this.handleClick );
116
+ document.removeEventListener( 'click', this._dispatchClickProxyEvent );
117
+ }
118
+
119
+ render() {
120
+ return (
121
+ <div ref={ this.nodeRef }>
122
+ <WrappedComponent { ...this.props } />
123
+ </div>
124
+ );
125
+ }
126
+ }
127
+
128
+ return WithBlockCloser;
129
+ };
common/src/modules/hoc/with-form.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { Component } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import { bindActionCreators } from 'redux';
7
+ import { connect } from 'react-redux';
8
+ import { noop } from 'lodash';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import { actions, selectors } from '@moderntribe/common/data/forms';
14
+
15
+ /**
16
+ * HOC that register a new object associated with set of fields for a form
17
+ *
18
+ * @param {function} getName Function used to set the name of the form, has a props param to generate the name
19
+ * @returns {function(*): *} Returns a function that takes a Component as argument and returns a component.
20
+ */
21
+ export default ( getName = noop ) => ( WrappedComponent ) => {
22
+ class WithForm extends Component {
23
+ static propTypes = {
24
+ registerForm: PropTypes.func,
25
+ postType: PropTypes.string,
26
+ };
27
+
28
+ componentDidMount() {
29
+ const name = getName( this.props );
30
+ const { registerForm, postType } = this.props;
31
+ registerForm( name, postType );
32
+ }
33
+
34
+ render() {
35
+ return <WrappedComponent { ...this.props } { ...this.additionalProps() } />;
36
+ }
37
+
38
+ additionalProps() {
39
+ const {
40
+ createDraft,
41
+ sendForm,
42
+ setSubmit,
43
+ editEntry,
44
+ maybeRemoveEntry,
45
+ } = this.props;
46
+ const name = getName( this.props );
47
+ return {
48
+ createDraft: ( fieldsObject ) => createDraft( name, fieldsObject ),
49
+ editEntry: ( fieldsObject ) => editEntry( name, fieldsObject ),
50
+ sendForm: ( fieldsObject, callback ) => sendForm( name, fieldsObject, callback ),
51
+ setSubmit: () => setSubmit( name ),
52
+ maybeRemoveEntry: ( details ) => maybeRemoveEntry( name, details ),
53
+ };
54
+ }
55
+ }
56
+
57
+ const mapStateToProps = ( state, props ) => {
58
+ const name = getName( props );
59
+ const modifiedProps = { name };
60
+ return {
61
+ edit: selectors.getFormEdit( state, modifiedProps ),
62
+ create: selectors.getFormCreate( state, modifiedProps ),
63
+ fields: selectors.getFormFields( state, modifiedProps ),
64
+ submit: selectors.getFormSubmit( state, modifiedProps ),
65
+ };
66
+ };
67
+
68
+ const mapDispatchToProps = ( dispatch ) => bindActionCreators( actions, dispatch );
69
+
70
+ return connect( mapStateToProps, mapDispatchToProps )( WithForm );
71
+ };
common/src/modules/hoc/with-save-data.js ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { Component } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import {
7
+ noop,
8
+ isEmpty,
9
+ isArray,
10
+ isObject,
11
+ keys,
12
+ } from 'lodash';
13
+ import isShallowEqual from '@wordpress/is-shallow-equal';
14
+
15
+ const blockRegister = {};
16
+
17
+ /**
18
+ * Higher order component that updates the attributes of a component if any of the properties of the
19
+ * attributes changes.
20
+ *
21
+ * Only updates the attributes that has changed with the new updates into the properties and only
22
+ * the ones specified as attributes params otherwise will fallback to the property attributes of the
23
+ * component to extract the keys of those to do the comparision.
24
+ *
25
+ * @param {object} selectedAttributes Set of attributes to only update fallback to this.props.attributes
26
+ * @returns {function} Return a new HOC
27
+ */
28
+ export default ( selectedAttributes = null ) => ( WrappedComponent ) => {
29
+ class WithSaveData extends Component {
30
+ static defaultProps = {
31
+ attributes: {},
32
+ setInitialState: noop,
33
+ setAttributes: noop,
34
+ name: '',
35
+ isolated: false,
36
+ onBlockCreated: noop,
37
+ onBlockRemoved: noop,
38
+ };
39
+
40
+ static propTypes = {
41
+ setAttributes: PropTypes.func,
42
+ setInitialState: PropTypes.func,
43
+ attributes: PropTypes.object,
44
+ name: PropTypes.string,
45
+ isolated: PropTypes.bool,
46
+ increaseRegister: PropTypes.func,
47
+ decreaseRegister: PropTypes.func,
48
+ onBlockCreated: PropTypes.func,
49
+ onBlockRemoved: PropTypes.func,
50
+ };
51
+
52
+ keys = [];
53
+ saving = null;
54
+
55
+ constructor( props ) {
56
+ super( props );
57
+ this.keys = this.generateKeys();
58
+ }
59
+
60
+ generateKeys() {
61
+ if ( isArray( this.attrs ) ) {
62
+ return this.attrs;
63
+ }
64
+
65
+ if ( isObject( this.attrs ) ) {
66
+ return keys( this.attrs );
67
+ }
68
+
69
+ console.warn( 'Make sure attributes is from a valid type: Array or Object' );
70
+
71
+ return [];
72
+ }
73
+
74
+ // At this point attributes has been set so no need to be set the initial state into the store here.
75
+ componentDidMount() {
76
+ const { setInitialState, attributes = {}, isolated, onBlockCreated } = this.props;
77
+
78
+ onBlockCreated( this.props );
79
+ this.registerBlock();
80
+
81
+ // Prevent to set the initial state for blocks that are copies from others
82
+ // overwrite this with the isolated property of the block to `true`
83
+ if ( this.blockCount() > 1 && ! isolated ) {
84
+ return;
85
+ }
86
+
87
+ setInitialState( {
88
+ ...this.props,
89
+ get( key, defaultValue ) {
90
+ return key in attributes ? attributes[ key ] : defaultValue;
91
+ },
92
+ } );
93
+ }
94
+
95
+ componentWillUnmount() {
96
+ const { onBlockRemoved } = this.props;
97
+ this.unregisterBlock();
98
+ onBlockRemoved( this.props );
99
+ }
100
+
101
+ registerBlock() {
102
+ const { name } = this.props;
103
+ blockRegister[ name ] = name in blockRegister ? blockRegister[ name ] + 1 : 1;
104
+ }
105
+
106
+ unregisterBlock() {
107
+ const { name } = this.props;
108
+ blockRegister[ name ] -= 1;
109
+ }
110
+
111
+ blockCount() {
112
+ const { name } = this.props;
113
+ return blockRegister[ name ];
114
+ }
115
+
116
+ componentDidUpdate() {
117
+ const diff = this.calculateDiff();
118
+
119
+ if ( isShallowEqual( this.saving, diff ) ) {
120
+ return;
121
+ }
122
+
123
+ this.saving = diff;
124
+
125
+ if ( isEmpty( diff ) ) {
126
+ return;
127
+ }
128
+
129
+ this.props.setAttributes( diff );
130
+ }
131
+
132
+ calculateDiff() {
133
+ const attributes = this.attrs;
134
+ return this.keys.reduce( ( diff, key ) => {
135
+ if ( key in this.props && ! isShallowEqual( attributes[ key ], this.props[ key ] ) ) {
136
+ diff[ key ] = this.props[ key ];
137
+ }
138
+ return diff;
139
+ }, {} );
140
+ }
141
+
142
+ get attrs() {
143
+ return selectedAttributes || this.props.attributes || {};
144
+ }
145
+
146
+ render() {
147
+ return <WrappedComponent { ...this.props } />;
148
+ }
149
+ }
150
+
151
+ WithSaveData.displayName = `WithSaveData( ${ WrappedComponent.displayName || WrappedComponent.name || 'Component ' }`;
152
+
153
+ return WithSaveData;
154
+ };
155
+
common/src/modules/hoc/with-selected.js ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React, { Component } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import {
7
+ noop,
8
+ } from 'lodash';
9
+
10
+ /**
11
+ * Higher order component that executes two functions:
12
+ *
13
+ * - `onBlockFocus` when the block is selected
14
+ * - `onBlockBlur` when the block losses focus after being selected
15
+ *
16
+ * @returns {function} Return a new HOC
17
+ */
18
+ export default () => ( WrappedComponent ) => {
19
+ class WithSelected extends Component {
20
+ static defaultProps = {
21
+ isSelected: false,
22
+ onBlockFocus: noop,
23
+ onBlockBlur: noop,
24
+ };
25
+
26
+ static propTypes = {
27
+ onBlockFocus: PropTypes.func,
28
+ onBlockBlur: PropTypes.func,
29
+ isSelected: PropTypes.bool,
30
+ };
31
+
32
+ componentDidMount() {
33
+ const { isSelected, onBlockFocus, onBlockBlur } = this.props;
34
+ if ( isSelected ) {
35
+ onBlockFocus();
36
+ } else {
37
+ onBlockBlur();
38
+ }
39
+ }
40
+
41
+ componentDidUpdate( prevProps ) {
42
+ const { isSelected, onBlockFocus, onBlockBlur } = this.props;
43
+
44
+ if ( prevProps.isSelected === isSelected ) {
45
+ return;
46
+ }
47
+
48
+ if ( isSelected ) {
49
+ onBlockFocus();
50
+ } else {
51
+ onBlockBlur();
52
+ }
53
+ }
54
+
55
+ render() {
56
+ return <WrappedComponent { ...this.props } />;
57
+ }
58
+ }
59
+
60
+ WithSelected.displayName = `WithIsSelected( ${ WrappedComponent.displayName || WrappedComponent.name || 'Component ' }`;
61
+
62
+ return WithSelected;
63
+ };
64
+
common/src/modules/hoc/with-store.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { store } from '@moderntribe/common/store';
10
+
11
+ const getStore = () => store;
12
+
13
+ export default ( additionalProps = {} ) => ( WrappedComponent ) => {
14
+
15
+ const WithStore = ( props ) => {
16
+ const extraProps = {
17
+ ...additionalProps,
18
+ store: getStore(),
19
+ };
20
+
21
+ return <WrappedComponent { ...props } { ...extraProps } />;
22
+ };
23
+
24
+ return WithStore;
25
+
26
+ };
common/src/modules/package.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "@moderntribe/common",
3
+ "version": "0.3.2-alpha",
4
+ "description": "Common Blocks Editor modules",
5
+ "main": "src/resources/main.js",
6
+ "scripts": {},
7
+ "keywords": [
8
+ "gutenberg",
9
+ "common"
10
+ ],
11
+ "private": true,
12
+ "repository": "git+https://github.com/moderntribe/tribe-common.git",
13
+ "author": "Modern Tribe",
14
+ "license": "GPL-2.0-or-later",
15
+ "dependencies": {
16
+ }
17
+ }
common/src/modules/store/configure-store.js ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { createStore, applyMiddleware } from 'redux';
5
+ import { composeWithDevTools } from 'redux-devtools-extension/developmentOnly';
6
+ import { augmentStore } from '@nfen/redux-reducer-injector';
7
+ import thunk from 'redux-thunk';
8
+ import createSagaMiddleware from 'redux-saga';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import reducer from '@moderntribe/common/data';
14
+ import { wpRequest } from './middlewares';
15
+
16
+ const sagaMiddleware = createSagaMiddleware();
17
+
18
+ export default () => {
19
+ if ( window.__tribe_common_store__ ) {
20
+ return window.__tribe_common_store__;
21
+ }
22
+
23
+ const middlewares = [
24
+ thunk,
25
+ sagaMiddleware,
26
+ wpRequest,
27
+ ];
28
+
29
+ const composeEnhancers = composeWithDevTools( { name: 'tribe/common' } );
30
+
31
+ const store = createStore( reducer( {} ), composeEnhancers( applyMiddleware( ...middlewares ) ) );
32
+ augmentStore( reducer, store );
33
+ store.run = sagaMiddleware.run;
34
+ window.__tribe_common_store__ = store;
35
+
36
+ return store;
37
+ };
common/src/modules/store/index.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import 'regenerator-runtime/runtime';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import configureStore from './configure-store';
10
+ import * as middlewares from './middlewares';
11
+
12
+ export const store = configureStore();
13
+ export { middlewares };
common/src/modules/store/middlewares/index.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ export { default as wpRequest } from './request';
2
+ import * as request from './request';
3
+ export { request };
common/src/modules/store/middlewares/request/__tests__/__snapshots__/actions.test.js.snap ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`[STORE] - Request actions WP Request action 1`] = `
4
+ Object {
5
+ "meta": Object {
6
+ "actions": Object {},
7
+ "path": "tribe_organizer/1225",
8
+ },
9
+ "type": "@@MT/COMMON/WP_REQUEST",
10
+ }
11
+ `;
common/src/modules/store/middlewares/request/__tests__/actions.test.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { actions } from '@moderntribe/common/store/middlewares/request';
5
+
6
+ describe( '[STORE] - Request actions', () => {
7
+ test( 'WP Request action', () => {
8
+ const meta = {
9
+ path: 'tribe_organizer/1225',
10
+ actions: {},
11
+ };
12
+ expect( actions.wpRequest( meta ) ).toMatchSnapshot();
13
+ } );
14
+ } );
common/src/modules/store/middlewares/request/__tests__/types.test.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { PREFIX_COMMON_STORE } from '@moderntribe/common/data/utils';
5
+ import { types } from '@moderntribe/common/store/middlewares/request';
6
+
7
+ describe( '[STORE] - Request types', () => {
8
+ it( 'Should return the types values', () => {
9
+ expect( types.WP_REQUEST ).toBe( `${ PREFIX_COMMON_STORE }/WP_REQUEST` );
10
+ } );
11
+ } );
common/src/modules/store/middlewares/request/__tests__/utils.test.js ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { utils } from '@moderntribe/common/store/middlewares/request';
5
+
6
+ const wpParamsExpected = {
7
+ orderby: 'title',
8
+ status: [ 'draft', 'publish' ],
9
+ order: 'asc',
10
+ page: 1,
11
+ };
12
+
13
+ describe( 'Request utils', () => {
14
+ it( 'Should generate the WP params', () => {
15
+ expect( utils.toWpParams( {} ) ).toEqual( wpParamsExpected );
16
+ } );
17
+
18
+ it( 'Should order by relevance if has search', () => {
19
+ expect( utils.toWpParams( { search: 'tribe' } ) )
20
+ .toEqual( {
21
+ ...wpParamsExpected,
22
+ search: 'tribe',
23
+ orderby: 'relevance',
24
+ } );
25
+ } );
26
+
27
+ it( 'Should update the exclude parameter', () => {
28
+ expect( utils.toWpParams( { exclude: [] } ) ).toEqual( wpParamsExpected );
29
+ expect( utils.toWpParams( { exclude: [ 1, 2 ] } ) )
30
+ .toEqual( {
31
+ ...wpParamsExpected,
32
+ exclude: [ 1, 2 ],
33
+ } );
34
+ } );
35
+
36
+ it( 'Should generate a WP Query', () => {
37
+ expect( utils.toWPQuery() ).toBe( 'orderby=title&status=draft%2Cpublish&order=asc&page=1' );
38
+ expect( utils.toWPQuery( { search: 'Modern Tribe' } ) )
39
+ .toBe( 'orderby=relevance&status=draft%2Cpublish&order=asc&page=1&search=Modern%20Tribe' );
40
+ } );
41
+
42
+ it( 'Should return the total of pages', () => {
43
+ const headers = new Headers();
44
+ headers.append( 'x-wp-totalpages', 5 );
45
+ expect( headers.get( 'x-wp-totalpages' ) ).toBe( '5' );
46
+ expect( utils.getTotalPages( headers ) ).toBe( 5 );
47
+
48
+ headers.set( 'x-wp-totalpages', '5' );
49
+ expect( headers.get( 'x-wp-totalpages' ) ).toBe( '5' );
50
+ expect( utils.getTotalPages( headers ) ).toBe( 5 );
51
+
52
+ headers.set( 'x-wp-totalpages', '5.3' );
53
+ expect( headers.get( 'x-wp-totalpages' ) ).toBe( '5.3' );
54
+ expect( utils.getTotalPages( headers ) ).toBe( 5 );
55
+
56
+ headers.delete( 'x-wp-totalpages' );
57
+ headers.set( 'x-wp', 5 );
58
+ expect( utils.getTotalPages( headers ) ).toBe( 0 );
59
+ expect( utils.getTotalPages( new Headers() ) ).toBe( 0 );
60
+ } );
61
+ } );
common/src/modules/store/middlewares/request/__tests__/wp-request.test.js ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import wpRequest, { actions } from '@moderntribe/common/store/middlewares/request';
5
+
6
+ let create;
7
+ const nextMock = jest.fn();
8
+ const meta = {
9
+ path: '',
10
+ params: {},
11
+ actions: {
12
+ none: jest.fn(),
13
+ start: jest.fn(),
14
+ success: jest.fn(),
15
+ error: jest.fn(),
16
+ },
17
+ };
18
+
19
+ describe( '[STORE] - wp-request middleware', () => {
20
+ let _fetch;
21
+ beforeAll( () => {
22
+ create = () => {
23
+ const invoke = ( action ) => wpRequest()( nextMock )( action );
24
+ return { next: nextMock, invoke };
25
+ };
26
+ _fetch = global.fetch;
27
+ } );
28
+
29
+ afterEach( () => {
30
+ global.fetch = _fetch;
31
+ } );
32
+
33
+ afterEach( () => {
34
+ nextMock.mockClear();
35
+ meta.actions.start.mockClear();
36
+ meta.actions.error.mockClear();
37
+ meta.actions.none.mockClear();
38
+ meta.actions.success.mockClear();
39
+ window.wp.apiRequest = undefined;
40
+ } );
41
+
42
+ it( 'Should move through a unknown action', () => {
43
+ const { next, invoke } = create();
44
+ const action = { type: 'UNKNOWN' };
45
+ invoke( action );
46
+
47
+ expect( next ).toHaveBeenCalled();
48
+ expect( next ).toHaveBeenCalledTimes( 1 );
49
+ expect( next ).toHaveBeenCalledWith( action );
50
+ } );
51
+
52
+ it( 'Should execute the none action if the path is empty', () => {
53
+ const { next, invoke } = create();
54
+ const action = actions.wpRequest( meta );
55
+ invoke( action );
56
+
57
+ expect( next ).toHaveBeenCalled();
58
+ expect( next ).toHaveBeenCalledTimes( 1 );
59
+ expect( next ).toHaveBeenCalledWith( action );
60
+ expect( meta.actions.none ).toHaveBeenCalled();
61
+ expect( meta.actions.none ).toHaveBeenCalledTimes( 1 );
62
+ expect( meta.actions.none ).toHaveBeenLastCalledWith( meta.path );
63
+ expect( meta.actions.start ).not.toHaveBeenCalled();
64
+ expect( meta.actions.success ).not.toHaveBeenCalled();
65
+ expect( meta.actions.error ).not.toHaveBeenCalled();
66
+ } );
67
+
68
+ it( 'Should execute the correct actions on success', async () => {
69
+ const { invoke } = create();
70
+
71
+ const body = {
72
+ id: 1217,
73
+ date: '2018-05-26T23:07:05',
74
+ meta: {},
75
+ };
76
+
77
+ const headers = new Headers();
78
+
79
+ global.fetch = jest.fn().mockImplementation( () =>
80
+ Promise.resolve( {
81
+ ok: true,
82
+ status: 200,
83
+ json: () => body,
84
+ headers,
85
+ } ),
86
+ );
87
+
88
+ await invoke( actions.wpRequest( { ...meta, path: 'tribe_organizer/1217' } ) );
89
+
90
+ expect.assertions( 8 );
91
+ expect( meta.actions.none ).not.toHaveBeenCalled();
92
+ expect( meta.actions.error ).not.toHaveBeenCalled();
93
+ expect( meta.actions.start ).toHaveBeenCalledWith( 'wp/v2/tribe_organizer/1217', {} );
94
+ expect( meta.actions.start ).toHaveBeenCalled();
95
+ expect( meta.actions.start ).toHaveBeenCalledTimes( 1 );
96
+ expect( meta.actions.success ).toHaveBeenCalled();
97
+ expect( meta.actions.success )
98
+ .toHaveBeenCalledWith( { body, headers } );
99
+ expect( meta.actions.success ).toHaveBeenCalledTimes( 1 );
100
+ } );
101
+
102
+ it( 'execute success actions on 201 response code - creation code', async () => {
103
+ const { invoke } = create();
104
+
105
+ const body = {
106
+ id: 201,
107
+ date: '2018-05-26T23:07:05',
108
+ meta: {
109
+ title: 'Creating a post....'
110
+ },
111
+ };
112
+
113
+ const headers = new Headers();
114
+
115
+ global.fetch = jest.fn().mockImplementation( () =>
116
+ Promise.resolve( {
117
+ ok: true,
118
+ status: 201,
119
+ json: () => body,
120
+ headers,
121
+ } ),
122
+ );
123
+
124
+ await invoke( actions.wpRequest( { ...meta, path: 'tribe_organizer/1217' } ) );
125
+
126
+ expect.assertions( 8 );
127
+ expect( meta.actions.none ).not.toHaveBeenCalled();
128
+ expect( meta.actions.error ).not.toHaveBeenCalled();
129
+ expect( meta.actions.start ).toHaveBeenCalledWith( 'wp/v2/tribe_organizer/1217', {} );
130
+ expect( meta.actions.start ).toHaveBeenCalled();
131
+ expect( meta.actions.start ).toHaveBeenCalledTimes( 1 );
132
+ expect( meta.actions.success ).toHaveBeenCalled();
133
+ expect( meta.actions.success ).toHaveBeenCalledWith( { body, headers } );
134
+ expect( meta.actions.success ).toHaveBeenCalledTimes( 1 );
135
+ } );
136
+
137
+ it( 'Should reject on 404 status code', async () => {
138
+ const { invoke } = create();
139
+
140
+ global.fetch = jest.fn().mockImplementation( () => Promise.resolve( { status: 404 } ) );
141
+
142
+ const error = await invoke( actions.wpRequest( { ...meta, path: 'tribe_organizer/1217' } ) );
143
+ expect.assertions( 6 );
144
+ expect( meta.actions.none ).not.toHaveBeenCalled();
145
+ expect( meta.actions.success ).not.toHaveBeenCalled();
146
+ expect( meta.actions.start ).toHaveBeenCalled();
147
+ expect( meta.actions.start ).toHaveBeenCalledWith( 'wp/v2/tribe_organizer/1217', {} );
148
+ expect( meta.actions.error ).toHaveBeenCalled();
149
+ expect( meta.actions.error ).toHaveBeenCalledWith( error );
150
+ } );
151
+
152
+ it( 'Should execute the correct actions on failure', async () => {
153
+ const { invoke } = create();
154
+
155
+ global.fetch = jest.fn().mockImplementation( () => Promise.reject( 'Wrong path' ) );
156
+
157
+ const error = await invoke( actions.wpRequest( {
158
+ ...meta,
159
+ path: 'tribe_organizer/1217//////',
160
+ } ) );
161
+ expect.assertions( 6 );
162
+ expect( meta.actions.none ).not.toHaveBeenCalled();
163
+ expect( meta.actions.success ).not.toHaveBeenCalled();
164
+ expect( meta.actions.start ).toHaveBeenCalled();
165
+ expect( meta.actions.start ).toHaveBeenCalledWith( 'wp/v2/tribe_organizer/1217//////', {} );
166
+ expect( meta.actions.error ).toHaveBeenCalled();
167
+ expect( meta.actions.error ).toHaveBeenCalledWith( error );
168
+ } );
169
+ } );
common/src/modules/store/middlewares/request/actions.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import * as types from './types';
5
+
6
+ export const wpRequest = ( meta ) => ( {
7
+ type: types.WP_REQUEST,
8
+ meta,
9
+ } );
common/src/modules/store/middlewares/request/index.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import * as types from './types';
5
+ import * as actions from './actions';
6
+ import * as utils from './utils';
7
+
8
+ export { default } from './wp-request';
9
+ export { types, actions, utils };
common/src/modules/store/middlewares/request/types.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { PREFIX_COMMON_STORE } from '@moderntribe/common/data/utils';
5
+
6
+ export const WP_REQUEST = `${ PREFIX_COMMON_STORE }/WP_REQUEST`;
common/src/modules/store/middlewares/request/utils.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { isEmpty, isUndefined } from 'lodash';
5
+ import { stringify } from 'querystringify';
6
+
7
+ export const toWpParams = ( args = {} ) => {
8
+ const params = {
9
+ orderby: 'title',
10
+ status: [ 'draft', 'publish' ],
11
+ order: 'asc',
12
+ page: 1,
13
+ ...args,
14
+ };
15
+
16
+ if ( ! isUndefined( params.search ) && ! isEmpty( params.search ) ) {
17
+ params.orderby = 'relevance';
18
+ }
19
+
20
+ if ( isEmpty( params.exclude ) ) {
21
+ delete params.exclude;
22
+ }
23
+
24
+ return params;
25
+ };
26
+
27
+ export const toWPQuery = ( args = {} ) => stringify( toWpParams( args ) );
28
+
29
+ export const getTotalPages = ( headers ) => {
30
+ const totalPages = parseInt( headers.get( 'x-wp-totalpages' ), 10 );
31
+ return isNaN( totalPages ) ? 0 : totalPages;
32
+ };
common/src/modules/store/middlewares/request/wp-request.js ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { noop, get, inRange } from 'lodash';
5
+ import 'whatwg-fetch';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { rest } from '@moderntribe/common/utils/globals';
11
+ import { types } from '@moderntribe/common/store/middlewares/request';
12
+
13
+ export default () => ( next ) => async ( action ) => {
14
+ if ( action.type !== types.WP_REQUEST ) {
15
+ return next( action );
16
+ }
17
+
18
+ const { meta = {} } = action;
19
+
20
+ const {
21
+ path = '',
22
+ params = {},
23
+ } = meta;
24
+
25
+ next( action );
26
+
27
+ const { url = '', nonce = {} } = rest();
28
+ const wpRESTNonce = nonce.wp_rest || '';
29
+ const namespaces = rest.namespaces || {};
30
+ const core = namespaces.core || 'wp/v2';
31
+ const BASE = `${ url }${ core }`;
32
+
33
+ const actions = {
34
+ start: noop,
35
+ success: noop,
36
+ error: noop,
37
+ none: noop,
38
+ ...get( meta, 'actions', {} ),
39
+ };
40
+
41
+ if ( path === '' ) {
42
+ actions.none( path );
43
+ return;
44
+ }
45
+
46
+ const endpoint = `${ BASE }/${ path }`;
47
+
48
+ actions.start( endpoint, params );
49
+
50
+ const headers = {
51
+ 'Accept': 'application/json',
52
+ 'Content-Type': 'application/json',
53
+ ...get( params, 'headers', {} ),
54
+ 'X-WP-Nonce': wpRESTNonce,
55
+ };
56
+
57
+ try {
58
+ const response = await fetch( endpoint, {
59
+ ...params,
60
+ credentials: 'include',
61
+ headers,
62
+ } );
63
+
64
+ const { status } = response;
65
+ // inRange includes 200 but excludes 300 from the range so it's from 200 up to 299
66
+ if ( ! inRange( status, 200, 300 ) ) {
67
+ throw response;
68
+ }
69
+ const body = await response.json();
70
+ actions.success( { body, headers: response.headers } );
71
+ return [ response, body ];
72
+ } catch ( error ) {
73
+ actions.error( error );
74
+ return error;
75
+ }
76
+ };
common/src/modules/utils/__tests__/__snapshots__/globals.test.js.snap ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Tests for globals.js Should match the default value for the globals values 1`] = `
4
+ Object {
5
+ "common": Object {
6
+ "countries": Object {},
7
+ "rest": Object {
8
+ "namespaces": Object {
9
+ "core": "wp/v2",
10
+ },
11
+ "nonce": Object {
12
+ "add_ticket_nonce": "0878f40fb2",
13
+ "wp_rest": "cedcd6967b",
14
+ },
15
+ "url": "http://gutenberg.local/wp-json/",
16
+ },
17
+ "settings": Object {},
18
+ "usStates": Object {},
19
+ },
20
+ "tec": Object {
21
+ "googleMap": Object {},
22
+ },
23
+ "tickets": Object {
24
+ "default_currency": "$",
25
+ "default_provider": "Tribe__Tickets_Plus__Commerce__WooCommerce__Main",
26
+ "providers": Array [
27
+ Object {
28
+ "class": "Tribe__Tickets_Plus__Commerce__WooCommerce__Main",
29
+ "currency": "$",
30
+ "currency_position": "prefix",
31
+ "name": "WooCommerce",
32
+ },
33
+ ],
34
+ },
35
+ }
36
+ `;
37
+
38
+ exports[`Tests for globals.js Should match the default value for the globals values 2`] = `
39
+ Object {
40
+ "common": Object {
41
+ "countries": Object {},
42
+ "rest": Object {
43
+ "namespaces": Object {
44
+ "core": "wp/v2",
45
+ },
46
+ "nonce": Object {
47
+ "add_ticket_nonce": "0878f40fb2",
48
+ "wp_rest": "cedcd6967b",
49
+ },
50
+ "url": "http://gutenberg.local/wp-json/",
51
+ },
52
+ "settings": Object {},
53
+ "usStates": Object {},
54
+ },
55
+ "tec": Object {
56
+ "googleMap": Object {},
57
+ },
58
+ "tickets": Object {
59
+ "default_currency": "$",
60
+ "default_provider": "Tribe__Tickets_Plus__Commerce__WooCommerce__Main",
61
+ "providers": Array [
62
+ Object {
63
+ "class": "Tribe__Tickets_Plus__Commerce__WooCommerce__Main",
64
+ "currency": "$",
65
+ "currency_position": "prefix",
66
+ "name": "WooCommerce",
67
+ },
68
+ ],
69
+ },
70
+ }
71
+ `;
72
+
73
+ exports[`Tests for globals.js get default value 1`] = `Array []`;
74
+
75
+ exports[`Tests for globals.js rest value 1`] = `
76
+ Object {
77
+ "namespaces": Object {
78
+ "core": "wp/v2",
79
+ },
80
+ "nonce": Object {
81
+ "add_ticket_nonce": "0878f40fb2",
82
+ "wp_rest": "cedcd6967b",
83
+ },
84
+ "url": "http://gutenberg.local/wp-json/",
85
+ }
86
+ `;
87
+
88
+ exports[`Tests for globals.js rest value 2`] = `
89
+ Object {
90
+ "add_ticket_nonce": "0878f40fb2",
91
+ "wp_rest": "cedcd6967b",
92
+ }
93
+ `;
common/src/modules/utils/__tests__/__snapshots__/time.test.js.snap ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Tests for time.js fromMilliseconds() test 1`] = `"Argument \`ms\` provided to \`fromMilliseconds\` is not a number or is NaN."`;
4
+
5
+ exports[`Tests for time.js fromMilliseconds() test 2`] = `"Argument \`ms\` provided to \`fromMilliseconds\` is not a number or is NaN."`;
6
+
7
+ exports[`Tests for time.js fromMilliseconds() test 3`] = `"Argument \`format\` provided to \`formatTime\` is not a recognized format."`;
8
+
9
+ exports[`Tests for time.js fromSeconds() test 1`] = `"Argument \`s\` provided to \`fromSeconds\` is not a number or is NaN."`;
10
+
11
+ exports[`Tests for time.js fromSeconds() test 2`] = `"Argument \`s\` provided to \`fromSeconds\` is not a number or is NaN."`;
12
+
13
+ exports[`Tests for time.js fromSeconds() test 3`] = `"Argument \`format\` provided to \`formatTime\` is not a recognized format."`;
14
+
15
+ exports[`Tests for time.js toMilliseconds() test 1`] = `"Argument \`time\` provided to \`toMilliseconds\` is not a recognized format."`;
16
+
17
+ exports[`Tests for time.js toMilliseconds() test 2`] = `"Argument \`time\` provided to \`toMilliseconds\` is not a recognized format."`;
18
+
19
+ exports[`Tests for time.js toMilliseconds() test 3`] = `"Argument \`time\` provided to \`toMilliseconds\` is not a recognized format."`;
20
+
21
+ exports[`Tests for time.js toMilliseconds() test 4`] = `"Argument \`time\` provided to \`toMilliseconds\` contains minutes or seconds greater than 59."`;
22
+
23
+ exports[`Tests for time.js toMilliseconds() test 5`] = `"Argument \`format\` provided to \`toMilliseconds\` is not a recognized format."`;
24
+
25
+ exports[`Tests for time.js toSeconds() test 1`] = `"Argument \`time\` provided to \`toMilliseconds\` is not a recognized format."`;
26
+
27
+ exports[`Tests for time.js toSeconds() test 2`] = `"Argument \`time\` provided to \`toMilliseconds\` is not a recognized format."`;
28
+
29
+ exports[`Tests for time.js toSeconds() test 3`] = `"Argument \`time\` provided to \`toMilliseconds\` is not a recognized format."`;
30
+
31
+ exports[`Tests for time.js toSeconds() test 4`] = `"Argument \`time\` provided to \`toMilliseconds\` contains minutes or seconds greater than 59."`;
32
+
33
+ exports[`Tests for time.js toSeconds() test 5`] = `"Argument \`format\` provided to \`toMilliseconds\` is not a recognized format."`;
common/src/modules/utils/__tests__/date.test.js ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { date, moment as momentUtil } from '@moderntribe/common/utils';
5
+ import moment from 'moment';
6
+
7
+ const {
8
+ FORMATS,
9
+ TODAY,
10
+ timezones,
11
+ timezonesAsSelectData,
12
+ toNaturalLanguage,
13
+ rangeToNaturalLanguage,
14
+ labelToDate,
15
+ } = date;
16
+
17
+ jest.mock( '@moderntribe/common/utils/timezone', () => ( {
18
+ getItems: () => [
19
+ {
20
+ options: [
21
+ {
22
+ key: 'America/Argentina/Buenos_Aires',
23
+ text: 'Argentina - Buenos Aires',
24
+ },
25
+ ],
26
+ },
27
+ {
28
+ options: [
29
+ {
30
+ key: 'America/Argentina/Catamarca',
31
+ text: 'Argentina - Catamarca',
32
+ },
33
+ ],
34
+ },
35
+ ],
36
+ } ) );
37
+
38
+ afterAll( () => {
39
+ jest.unmock( '@moderntribe/common/utils/timezone' );
40
+ } );
41
+
42
+ describe( 'Tests for date.js', () => {
43
+ test( 'formats', () => {
44
+ const draft = {
45
+ TIME: 'HH:mm:ss',
46
+ DATE_TIME: 'YYYY-MM-DD HH:mm:ss',
47
+ WP: {
48
+ time: 'g:i a',
49
+ time24Hr: 'H:i',
50
+ date: 'F j, Y',
51
+ datetime: 'F j, Y g:i a',
52
+ dateNoYear: 'F j',
53
+ },
54
+ DATABASE: {
55
+ date: 'Y-m-d',
56
+ datetime: 'Y-m-d H:i:s',
57
+ time: 'H:i:s',
58
+ },
59
+ TIMEZONE: {
60
+ string: 'UTC',
61
+ },
62
+ };
63
+ expect( FORMATS ).toEqual( draft );
64
+ } );
65
+
66
+ test( 'today', () => {
67
+ const now = new Date();
68
+ expect( TODAY ).toBeInstanceOf( Date );
69
+ expect( TODAY ).hasOwnProperty( 'getDay' );
70
+ expect( TODAY.getDay() ).toEqual( now.getDay() );
71
+ } );
72
+
73
+ test( 'timezones', () => {
74
+ const expected = [
75
+ {
76
+ key: 'America/Argentina/Buenos_Aires',
77
+ text: 'Argentina - Buenos Aires',
78
+ },
79
+ {
80
+ key: 'America/Argentina/Catamarca',
81
+ text: 'Argentina - Catamarca',
82
+ },
83
+ ];
84
+ expect( timezones() ).toEqual( expected );
85
+ } );
86
+
87
+ test( 'timezonesAsSelectData', () => {
88
+ const expected = [
89
+ {
90
+ value: 'America/Argentina/Buenos_Aires',
91
+ label: 'Argentina - Buenos Aires',
92
+ },
93
+ {
94
+ value: 'America/Argentina/Catamarca',
95
+ label: 'Argentina - Catamarca',
96
+ },
97
+ ];
98
+ expect( timezonesAsSelectData() ).toEqual( expected );
99
+ } );
100
+
101
+ describe( 'toNaturalLanguage', () => {
102
+ it( 'Should return empty string when non parsed', () => {
103
+ const defaultDetail = { month: '', day: '', year: '', time: '' };
104
+ expect( toNaturalLanguage( {} ) ).toEqual( { moment: null, text: '', detail: defaultDetail, isValid: false } );
105
+ expect( toNaturalLanguage( { date: undefined } ) ).toEqual( {
106
+ moment: undefined,
107
+ text: '',
108
+ detail: defaultDetail,
109
+ isValid: false
110
+ } );
111
+ expect( toNaturalLanguage( { date: '' } ) ).toEqual( {
112
+ moment: '',
113
+ text: '',
114
+ detail: defaultDetail,
115
+ isValid: false
116
+ } );
117
+ } );
118
+
119
+ it( 'Should return the parsed date', () => {
120
+ expect( toNaturalLanguage( { date: '2018-05-04 17:00:00' } ) )
121
+ .toEqual( {
122
+ moment: momentUtil.toMoment( '2018-05-04 17:00:00' ),
123
+ text: 'May 4 2018 5:00 pm',
124
+ detail: {
125
+ month: 'May',
126
+ day: '4',
127
+ year: '2018',
128
+ time: '5:00 pm',
129
+ },
130
+ isValid: true,
131
+ } );
132
+ expect( toNaturalLanguage( { date: '2019-12-24 12:00:00' } ) )
133
+ .toEqual( {
134
+ moment: momentUtil.toMoment( '2019-12-24 12:00:00' ),
135
+ text: 'December 24 2019 12:00 pm',
136
+ detail: {
137
+ month: 'December',
138
+ day: '24',
139
+ year: '2019',
140
+ time: '12:00 pm',
141
+ },
142
+ isValid: true,
143
+ } );
144
+ } );
145
+ } );
146
+
147
+ describe( 'rangeToNaturalLanguage', () => {
148
+ it( 'Should return empty string when range is invalid', () => {
149
+ expect( rangeToNaturalLanguage( null, null ) ).toBe( '' );
150
+ expect( rangeToNaturalLanguage( undefined, undefined ) ).toBe( '' );
151
+ expect( rangeToNaturalLanguage( '', '' ) ).toBe( '' );
152
+ } );
153
+
154
+ it( 'Should return only the start date', () => {
155
+ expect( rangeToNaturalLanguage( '2019-12-24 12:00:00' ) )
156
+ .toBe( 'December 24 2019 at 12:00 pm' );
157
+ expect( rangeToNaturalLanguage( '2019-12-24 12:00:00', '' ) )
158
+ .toBe( 'December 24 2019 at 12:00 pm' );
159
+ } );
160
+
161
+ it( 'Should return the range with time on same day', () => {
162
+ expect( rangeToNaturalLanguage( '2019-12-24 12:00:00', '2019-12-24 17:00:00' ) )
163
+ .toBe( 'December 24 2019 at 12:00 pm - 5:00 pm' );
164
+ } );
165
+
166
+ it( 'Should return the range without year on same year', () => {
167
+ expect( rangeToNaturalLanguage( '2019-12-24 12:00:00', '2019-12-29 17:00:00' ) )
168
+ .toBe( 'December 24 2019 at 12:00 pm - December 29 at 5:00 pm' );
169
+ } );
170
+
171
+ it( 'Should return the range on different years', () => {
172
+ expect( rangeToNaturalLanguage( '2019-12-24 12:00:00', '2020-12-24 17:00:00' ) )
173
+ .toBe( 'December 24 2019 at 12:00 pm - December 24 2020 at 5:00 pm' );
174
+ } );
175
+ } );
176
+
177
+ describe( 'labelToDate - be aware chrono module is being mocked to avoid parsing', () => {
178
+ test( 'Default value when date is invalid', () => {
179
+ expect( labelToDate() ).toEqual( { start: null, end: null } );
180
+ } );
181
+
182
+ test( 'Valid dates', () => {
183
+ const momentDate = moment( '12-25-1995', 'MM-DD-YYYY' );
184
+ expect( labelToDate( momentDate ) )
185
+ .toEqual( { start: momentUtil.toDateTime( momentDate ), end: momentUtil.toDateTime( momentDate ) } );
186
+ } );
187
+ } );
188
+
189
+ } );
common/src/modules/utils/__tests__/dom.test.js ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ hasClass,
6
+ isRootNode,
7
+ searchParent,
8
+ } from '@moderntribe/common/utils/dom';
9
+
10
+ describe( 'Tests for dom.js', () => {
11
+ beforeAll( () => {
12
+ window.document.body.classList.add( 'one', 'two' );
13
+ } );
14
+
15
+ afterAll( () => {
16
+ window.document.body.classList.remove( 'one', 'two' );
17
+ } );
18
+
19
+ describe( 'hasClass dom utility', () => {
20
+ it( 'Should return false when the dom element does not have any class', () => {
21
+ expect( hasClass( window.document.body, [] ) ).toBe( false );
22
+ expect( hasClass( window.document.body, [ 'five', 'seven' ] ) ).toBe( false );
23
+ expect( hasClass( window.document.body, [ 'eight' ] ) ).toBe( false );
24
+ } );
25
+
26
+ it( 'Should return true whe the dom element has any of the classes', () => {
27
+ expect( hasClass( window.document.body, [ 'one', 'two' ] ) ).toBe( true );
28
+ expect( hasClass( window.document.body, [ 'two', 'one' ] ) ).toBe( true );
29
+ expect( hasClass( window.document.body, [ 'four', 'two' ] ) ).toBe( true );
30
+ expect( hasClass( window.document.body, [ 'one', 'five' ] ) ).toBe( true );
31
+ expect( hasClass( window.document.body, [ 'nostyle', 'six', 'seven', 'one' ] ) ).toBe( true );
32
+ } );
33
+ } );
34
+
35
+ test( 'Test for searchParent', () => {
36
+ expect( searchParent( null ) ).toBeFalsy();
37
+ const treeWithNode = {
38
+ parentNode: {
39
+ value: 10,
40
+ parentNode: {
41
+ value: 20,
42
+ },
43
+ },
44
+ };
45
+
46
+ const callback = jest.fn( ( node ) => node.value === 20 );
47
+ const result = searchParent( treeWithNode, callback );
48
+ expect( callback ).toBeCalled();
49
+ expect( callback ).toBeCalledWith( { value: 20 } );
50
+ expect( result ).toBeTruthy();
51
+
52
+ const treeWithoutNode = {
53
+ parentNode: {
54
+ parentNode: {
55
+ parentNode: {
56
+ top: {
57
+ document: 'global',
58
+ },
59
+ },
60
+ },
61
+ },
62
+ };
63
+
64
+ expect( searchParent( treeWithoutNode ) ).toBeFalsy();
65
+ } );
66
+
67
+ test( 'Test for isRootNode', () => {
68
+ expect( isRootNode( null ) ).toBeFalsy();
69
+ expect( isRootNode( 'text' ) ).toBeFalsy();
70
+ expect( isRootNode( window.document.body ) ).toBeFalsy();
71
+ expect( isRootNode( window.document ) ).toBeTruthy();
72
+ } );
73
+ } );
common/src/modules/utils/__tests__/globals.test.js ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ google,
6
+ mapsAPI,
7
+ settings,
8
+ list,
9
+ get,
10
+ config,
11
+ rest,
12
+ restNonce,
13
+ } from '@moderntribe/common/utils/globals';
14
+
15
+ describe( 'Tests for globals.js', () => {
16
+
17
+ beforeAll( () => {
18
+ window.tribe_editor_config = {
19
+ common: {
20
+ countries: {},
21
+ usStates: {},
22
+ settings: {},
23
+ rest: {
24
+ namespaces: {
25
+ core: 'wp/v2',
26
+ },
27
+ nonce: {
28
+ wp_rest: 'cedcd6967b',
29
+ add_ticket_nonce: '0878f40fb2',
30
+ },
31
+ url: 'http://gutenberg.local/wp-json/',
32
+ },
33
+ },
34
+ tec: {
35
+ googleMap: {},
36
+ },
37
+ tickets: {
38
+ providers: [ {
39
+ class: 'Tribe__Tickets_Plus__Commerce__WooCommerce__Main',
40
+ currency: '$',
41
+ currency_position: 'prefix',
42
+ name: 'WooCommerce',
43
+ } ],
44
+ default_provider: 'Tribe__Tickets_Plus__Commerce__WooCommerce__Main',
45
+ default_currency: '$',
46
+ },
47
+ };
48
+ } );
49
+
50
+ test( 'Should match the default value for the globals values', () => {
51
+ expect( get( 'random' ) ).toBe( undefined );
52
+ expect( get( 'google' ) ).toBe( undefined );
53
+ expect( google() ).toBe( undefined );
54
+ expect( get( 'tribe_editor_config' ) ).toMatchSnapshot();
55
+ expect( settings() ).toEqual( {} );
56
+ expect( mapsAPI() ).toEqual( {} );
57
+ expect( list() ).toEqual( {
58
+ countries: {},
59
+ us_states: {},
60
+ } );
61
+ expect( config() ).toMatchSnapshot();
62
+ } );
63
+
64
+ test( 'get default value', () => {
65
+ expect( get( 'UNKNOWN', 10 ) ).toBe( 10 );
66
+ expect( get( 'tribe_js_config', [] ) ).toMatchSnapshot();
67
+ } );
68
+
69
+ test( 'rest value', () => {
70
+ expect( rest() ).toMatchSnapshot();
71
+ expect( restNonce() ).toMatchSnapshot();
72
+ } );
73
+
74
+ afterAll( () => {
75
+ delete window.tribe_editor_config;
76
+ } );
77
+ } );
78
+
79
+ describe( 'Test default values on globals', () => {
80
+ test( 'rest default values', () => {
81
+ expect( rest() ).toEqual( {} );
82
+ expect( restNonce() ).toEqual( {} );
83
+ } );
84
+ } );
common/src/modules/utils/__tests__/input.test.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { sendValue } from '@moderntribe/common/utils/input';
5
+
6
+ describe( 'Tests for input.js', () => {
7
+ const event = {
8
+ target: {
9
+ value: 'Sample',
10
+ },
11
+ };
12
+
13
+ test( 'Callback being executed', () => {
14
+ const mockCallback = jest.fn();
15
+ sendValue( mockCallback )( event );
16
+ expect( mockCallback ).toHaveBeenCalled();
17
+ expect( mockCallback ).toHaveBeenCalledTimes( 1 );
18
+ expect( mockCallback ).toHaveBeenCalledWith( 'Sample' );
19
+ } );
20
+ } );
common/src/modules/utils/__tests__/moment.test.js ADDED
@@ -0,0 +1,332 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import moment from 'moment/moment';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import {
10
+ date,
11
+ moment as momentUtil,
12
+ time,
13
+ } from '@moderntribe/common/utils';
14
+
15
+ const FORMAT = 'MM-DD-YYYY HH:mm:ss';
16
+
17
+ describe( 'Tests for moment.js', () => {
18
+ let console;
19
+ beforeAll( () => {
20
+ console = window.console;
21
+ window.console = {
22
+ ...console,
23
+ warn: jest.fn(),
24
+ };
25
+ } );
26
+
27
+ afterAll( () => {
28
+ window.console = console;
29
+ } );
30
+
31
+ test( 'TIME_FORMAT', () => {
32
+ expect( momentUtil.TIME_FORMAT ).toEqual( 'h:mm a' );
33
+ } );
34
+
35
+ test( 'roundTime', () => {
36
+ const test1 = momentUtil.roundTime(
37
+ moment( '05-09-2018 12:26:02', FORMAT ),
38
+ );
39
+ expect( test1 ).toBeInstanceOf( moment );
40
+ expect( test1.hour() ).toEqual( 12 );
41
+ expect( test1.minutes() ).toEqual( 0 );
42
+ expect( test1.seconds() ).toEqual( 0 );
43
+
44
+ const test2 = momentUtil.roundTime(
45
+ moment( '05-09-2018 15:30:02', FORMAT ),
46
+ );
47
+ expect( test2 ).toBeInstanceOf( moment );
48
+ expect( test2.hour() ).toEqual( 15 );
49
+ expect( test2.minutes() ).toEqual( 30 );
50
+ expect( test2.seconds() ).toEqual( 0 );
51
+
52
+ const test3 = momentUtil.roundTime(
53
+ moment( '05-09-2018 23:59:59', FORMAT ),
54
+ );
55
+ expect( test3 ).toBeInstanceOf( moment );
56
+ expect( test3.hour() ).toEqual( 23 );
57
+ expect( test3.minutes() ).toEqual( 30 );
58
+ expect( test3.seconds() ).toEqual( 0 );
59
+
60
+ const test4 = momentUtil.roundTime(
61
+ moment( '05-09-2018 08:01:59', FORMAT ),
62
+ );
63
+ expect( test4 ).toBeInstanceOf( moment );
64
+ expect( test4.hour() ).toEqual( 8 );
65
+ expect( test4.minutes() ).toEqual( 0 );
66
+ expect( test4.seconds() ).toEqual( 0 );
67
+ } );
68
+
69
+ test( 'toMoment', () => {
70
+ const input = momentUtil.toMoment( new Date( 'January 2, 2015 08:01:59 UTC' ).toISOString() );
71
+
72
+ expect( input ).toBeInstanceOf( moment );
73
+ expect( input.date() ).toEqual( 2 );
74
+ expect( input.month() ).toEqual( 0 );
75
+ expect( input.year() ).toEqual( 2015 );
76
+ expect( input.hour() ).toEqual( 8 );
77
+ expect( input.minutes() ).toEqual( 1 );
78
+ expect( input.seconds() ).toEqual( 59 );
79
+ expect( input.milliseconds() ).toEqual( 0 );
80
+ expect( input.format( FORMAT ) ).toEqual( '01-02-2015 08:01:59' );
81
+ } );
82
+
83
+ test( 'replaceDate', () => {
84
+ expect( () => momentUtil.replaceDate( 'Sample string', 123123 ) ).toThrowError();
85
+
86
+ const a = moment( '02-28-2010 14:24:40', FORMAT );
87
+ const b = moment( '05-10-2012 20:14:20', FORMAT );
88
+
89
+ const replaced = momentUtil.replaceDate( a, b );
90
+ expect( replaced ).toBeInstanceOf( moment );
91
+ expect( replaced.date() ).toEqual( 10 );
92
+ expect( replaced.month() ).toEqual( 4 );
93
+ expect( replaced.year() ).toEqual( 2012 );
94
+ expect( replaced.hour() ).toEqual( 14 );
95
+ expect( replaced.minute() ).toEqual( 24 );
96
+ expect( replaced.second() ).toEqual( 40 );
97
+ expect( replaced.format( FORMAT ) ).toEqual( '05-10-2012 14:24:40' );
98
+ } );
99
+
100
+ test( 'setTimeInSeconds', () => {
101
+ expect( () => momentUtil.setTimeInSeconds( 'Sample String', 123123 ) ).toThrowError();
102
+
103
+ const a = moment( '02-28-2010 14:24:40', FORMAT );
104
+ const SECONDS = ( 12.5 ) * 60 * 60;
105
+ const replaced = momentUtil.setTimeInSeconds( a, SECONDS );
106
+ expect( replaced ).toBeInstanceOf( moment );
107
+ expect( replaced.date() ).toEqual( 28 );
108
+ expect( replaced.month() ).toEqual( 1 );
109
+ expect( replaced.year() ).toEqual( 2010 );
110
+ expect( replaced.hour() ).toEqual( 12 );
111
+ expect( replaced.minute() ).toEqual( 30 );
112
+ expect( replaced.seconds() ).toEqual( 0 );
113
+ expect( replaced.milliseconds() ).toEqual( 0 );
114
+
115
+ const test2 = momentUtil.setTimeInSeconds( a, 0 );
116
+ expect( test2.date() ).toEqual( 28 );
117
+ expect( test2.month() ).toEqual( 1 );
118
+ expect( test2.year() ).toEqual( 2010 );
119
+ expect( test2.hour() ).toEqual( 0 );
120
+ expect( test2.minute() ).toEqual( 0 );
121
+ expect( test2.seconds() ).toEqual( 0 );
122
+ expect( test2.milliseconds() ).toEqual( 0 );
123
+ } );
124
+
125
+ test( 'totalSeconds', () => {
126
+ expect( momentUtil.totalSeconds( null ) ).toEqual( 0 );
127
+ expect( momentUtil.totalSeconds( new Date() ) ).toEqual( 0 );
128
+ expect( momentUtil.totalSeconds( moment().startOf( 'day' ) ) ).toEqual( 0 );
129
+ expect( momentUtil.totalSeconds( moment( 'May 23, 2018 12:30 am', 'MMM D, YYYY k:m a' ) ) )
130
+ .toEqual( time.HALF_HOUR_IN_SECONDS );
131
+ } );
132
+
133
+ test( 'toDateTime', () => {
134
+ const converted = momentUtil.toDateTime( moment() );
135
+ expect( typeof converted ).toBe( 'string' );
136
+ const format = momentUtil.toFormat( date.FORMATS.DATABASE.datetime );
137
+ expect( converted ).toBe( moment().format( format ) );
138
+ } );
139
+
140
+ test( 'toDate', () => {
141
+ const converted = momentUtil.toDate( moment() );
142
+ expect( typeof converted ).toBe( 'string' );
143
+ expect( typeof converted ).toBe( 'string' );
144
+ const format = momentUtil.toFormat( date.FORMATS.WP.date );
145
+ expect( converted ).toBe( moment().format( format ) );
146
+ } );
147
+
148
+ test( 'toDateNoYear', () => {
149
+ const converted = momentUtil.toDateNoYear( moment() );
150
+ expect( typeof converted ).toBe( 'string' );
151
+ expect( converted ).toBe( moment().format( 'MMMM D' ) );
152
+ } );
153
+
154
+ test( 'toTime', () => {
155
+ const converted = momentUtil.toTime( moment() );
156
+ expect( typeof converted ).toBe( 'string' );
157
+ expect( converted ).toBe( moment().format( 'h:mm a' ) );
158
+ } );
159
+
160
+ test( 'toTime24Hr', () => {
161
+ const converted = momentUtil.toTime24Hr( moment() );
162
+ expect( typeof converted ).toBe( 'string' );
163
+ expect( converted ).toBe( moment().format( 'HH:mm' ) );
164
+ } );
165
+
166
+ test( 'toDatabaseDate', () => {
167
+ const converted = momentUtil.toDatabaseDate( moment() );
168
+ expect( typeof converted ).toBe( 'string' );
169
+ expect( converted ).toBe( moment().format( 'YYYY-MM-DD' ) );
170
+ } );
171
+
172
+ test( 'toDatabaseTime', () => {
173
+ const converted = momentUtil.toDatabaseTime( moment() );
174
+ expect( typeof converted ).toBe( 'string' );
175
+ expect( converted ).toBe( moment().format( 'HH:mm:ss' ) );
176
+ } );
177
+
178
+ test( 'toDatePicker', () => {
179
+ const converted = momentUtil.toDatePicker( moment() );
180
+ expect( typeof converted ).toBe( 'string' );
181
+ expect( converted ).toBe( moment().format( 'YYYY-MM-DDTHH:mm:ss' ) );
182
+ } );
183
+
184
+ test( 'isSameDay', () => {
185
+ expect( momentUtil.isSameDay() ).toBe( false );
186
+ expect( momentUtil.isSameDay( false, '' ) ).toBe( false );
187
+ expect( momentUtil.isSameDay( 0, null ) ).toBe( false );
188
+ expect( momentUtil.isSameDay( moment(), moment().endOf( 'day' ) ) ).toBeTruthy();
189
+ expect( momentUtil.isSameDay( moment().endOf( 'day' ), moment().endOf( 'day' ) ) ).toBeTruthy();
190
+ expect( momentUtil.isSameDay( moment(), moment().add( 10, 'days' ) ) ).toBeFalsy();
191
+ expect( momentUtil.isSameDay( new Date(), new Date() ) ).toBeTruthy();
192
+ } );
193
+
194
+ test( 'isSameMonth', () => {
195
+ const date = moment( 'October 8, 2018 5:30 pm', 'MMMM D, Y h:mm a' );
196
+
197
+ expect( momentUtil.isSameMonth() ).toBe( false );
198
+ expect( momentUtil.isSameMonth( false, '' ) ).toBe( false );
199
+ expect( momentUtil.isSameMonth( 0, null ) ).toBe( false );
200
+ expect( momentUtil.isSameMonth( date, date.clone().add( 24, 'days' ) ) ).toBe( false );
201
+ expect( momentUtil.isSameMonth( date, date.clone().add( 23, 'days' ) ) ).toBe( true );
202
+ expect( momentUtil.isSameMonth( date, date.clone().endOf( 'month' ) ) ).toBe( true );
203
+ expect( momentUtil.isSameMonth( date.clone().endOf( 'month' ), date.clone().endOf( 'month' ) ) ).toBe( true );
204
+ expect( momentUtil.isSameMonth( date, date.clone().add( 10, 'days' ) ) ).toBe( true );
205
+ expect( momentUtil.isSameMonth( date, date ) ).toBe( true );
206
+ } );
207
+
208
+ test( 'isSameYear', () => {
209
+ expect( momentUtil.isSameYear(
210
+ moment( 'May 23, 2018 12:30 am', 'MMM D, YYYY k:m a' ),
211
+ moment( 'September 15, 2018 5:30 am', 'MMM D, YYYY k:m a' )
212
+ ) ).toBeTruthy();
213
+ expect( momentUtil.isSameYear(
214
+ moment( 'May 23, 2022 12:30 am', 'MMM D, YYYY k:m a' ),
215
+ moment( 'September 15, 2022 5:30 am', 'MMM D, YYYY k:m a' )
216
+ ) ).toBeTruthy();
217
+ expect( momentUtil.isSameYear(
218
+ moment( 'May 23, 2018 12:30 am', 'MMM D, YYYY k:m a' ),
219
+ moment( 'September 15, 2022 5:30 am', 'MMM D, YYYY k:m a' )
220
+ ) ).toBeFalsy();
221
+ } );
222
+
223
+ test( 'toMomentFromDate', () => {
224
+ expect( () => momentUtil.toMomentFromDate( '' ) ).toThrowError();
225
+ expect( () => momentUtil.toMomentFromDate( moment() ) ).toThrowError();
226
+ Date.now = jest.fn( () => '2018-05-04T05:23:19.000Z' );
227
+ const format = 'YYYY-MM-DD HH:mm:ss';
228
+ const now = new Date( 'December 17, 2015 03:24:00' );
229
+ expect( momentUtil.toMomentFromDate( now ) ).toBeInstanceOf( moment );
230
+ const expected = momentUtil.toMomentFromDate( now ).format( format );
231
+ expect( expected ).toBe( '2015-12-17 00:00:00' );
232
+ } );
233
+
234
+ test( 'toFormat', () => {
235
+ expect( momentUtil.toFormat( '' ) ).toEqual( '' );
236
+ expect( momentUtil.toFormat( 'Y-m-d H:i:s' ) ).toEqual( 'YYYY-MM-DD HH:mm:ss' );
237
+ expect( momentUtil.toFormat( 'F j, Y g:i a' ) ).toEqual( 'MMMM D, YYYY h:mm a' );
238
+ expect( momentUtil.toFormat( 'tLBIOPTZcr' ) ).toEqual( '' );
239
+ expect( momentUtil.toFormat( 'd' ) ).toEqual( 'DD' );
240
+ expect( momentUtil.toFormat( 'D' ) ).toEqual( 'ddd' );
241
+ expect( momentUtil.toFormat( 'j' ) ).toEqual( 'D' );
242
+ expect( momentUtil.toFormat( 'l' ) ).toEqual( 'dddd' );
243
+ expect( momentUtil.toFormat( 'N' ) ).toEqual( 'E' );
244
+ expect( momentUtil.toFormat( 'S' ) ).toEqual( 'o' );
245
+ expect( momentUtil.toFormat( 'w' ) ).toEqual( 'e' );
246
+ expect( momentUtil.toFormat( 'z' ) ).toEqual( 'DDD' );
247
+ expect( momentUtil.toFormat( 'W' ) ).toEqual( 'W' );
248
+ expect( momentUtil.toFormat( 'F' ) ).toEqual( 'MMMM' );
249
+ expect( momentUtil.toFormat( 'm' ) ).toEqual( 'MM' );
250
+ expect( momentUtil.toFormat( 'M' ) ).toEqual( 'MMM' );
251
+ expect( momentUtil.toFormat( 'n' ) ).toEqual( 'M' );
252
+ expect( momentUtil.toFormat( 'o' ) ).toEqual( 'YYYY' );
253
+ expect( momentUtil.toFormat( 'Y' ) ).toEqual( 'YYYY' );
254
+ expect( momentUtil.toFormat( 'y' ) ).toEqual( 'YY' );
255
+ expect( momentUtil.toFormat( 'a' ) ).toEqual( 'a' );
256
+ expect( momentUtil.toFormat( 'A' ) ).toEqual( 'A' );
257
+ expect( momentUtil.toFormat( 'g' ) ).toEqual( 'h' );
258
+ expect( momentUtil.toFormat( 'G' ) ).toEqual( 'H' );
259
+ expect( momentUtil.toFormat( 'h' ) ).toEqual( 'hh' );
260
+ expect( momentUtil.toFormat( 'H' ) ).toEqual( 'HH' );
261
+ expect( momentUtil.toFormat( 'i' ) ).toEqual( 'mm' );
262
+ expect( momentUtil.toFormat( 's' ) ).toEqual( 'ss' );
263
+ expect( momentUtil.toFormat( 'u' ) ).toEqual( 'SSS' );
264
+ expect( momentUtil.toFormat( 'e' ) ).toEqual( 'zz' );
265
+ expect( momentUtil.toFormat( 'U' ) ).toEqual( 'X' );
266
+ } );
267
+
268
+ describe( 'parseFormats', () => {
269
+ test( 'Use DB format', () => {
270
+ const format = 'YYYY-MM-DD HH:mm:ss';
271
+ const expected = momentUtil.parseFormats( '2019-11-19 22:32:00' );
272
+ expect( expected.format( format ) ).toBe( '2019-11-19 22:32:00' );
273
+ } );
274
+
275
+ test( 'Use WP datetime format', () => {
276
+ const format = 'MMMM D, YYYY h:mm a';
277
+ const expected = momentUtil.parseFormats( 'November 19, 2019 10:32 pm' );
278
+ expect( expected.format( format ) ).toBe( 'November 19, 2019 10:32 pm' );
279
+ } );
280
+
281
+ test( 'Invalid date', () => {
282
+ Date.now = jest.fn( () => new Date( 'July 1, 2018 00:07:31 UTC' ).toISOString() );
283
+ const format = 'YYYY-MM-DD HH:mm:ss';
284
+ const expected = momentUtil.parseFormats( 'No date!' );
285
+ expect( expected.format( format ) ).toBe( '2018-07-01 00:07:31' );
286
+ expect( window.console.warn ).toHaveBeenCalled();
287
+ } );
288
+ } );
289
+
290
+ describe( 'resetTimes', () => {
291
+ const format = 'YYYY-MM-DD HH:mm:ss';
292
+ it( 'Should add an hour in seconds', () => {
293
+ const startMoment = moment( new Date( 'July 19, 2018 19:30:00 UTC' ).toISOString() );
294
+ const { start, end } = momentUtil.resetTimes( startMoment );
295
+ expect( start.format( format ) ).toBe( '2018-07-19 19:30:00' );
296
+ expect( end.format( format ) ).toBe( '2018-07-19 20:30:00' );
297
+ } );
298
+
299
+ it( 'Should add hour in seconds on start of the day', () => {
300
+ const startMoment = moment( new Date( 'July 19, 2018 00:00:00 UTC' ).toISOString() );
301
+ const { start, end } = momentUtil.resetTimes( startMoment );
302
+ expect( start.format( format ) ).toBe( '2018-07-19 00:00:00' );
303
+ expect( end.format( format ) ).toBe( '2018-07-19 01:00:00' );
304
+ } );
305
+
306
+ it( 'Should prevent overflow to the next day', () => {
307
+ const startMoment = moment( new Date( 'July 19, 2018 23:59:59 UTC' ).toISOString() );
308
+ const { start, end } = momentUtil.resetTimes( startMoment );
309
+ expect( start.format( format ) ).toBe( '2018-07-19 22:59:59' );
310
+ expect( end.format( format ) ).toBe( '2018-07-19 23:59:59' );
311
+ } );
312
+ } );
313
+
314
+ describe( 'adjustStart', () => {
315
+ const format = 'YYYY-MM-DD HH:mm:ss';
316
+ it( 'Should keep the same order when start is before', () => {
317
+ const start = moment( new Date( 'July 10, 2018 14:30:00 UTC' ).toISOString() );
318
+ const end = moment( new Date( 'July 10, 2018 20:35:00 UTC' ).toISOString() );
319
+ const output = momentUtil.adjustStart( start, end );
320
+ expect( output.start.format( format ) ).toBe( '2018-07-10 14:30:00' );
321
+ expect( output.end.format( format ) ).toBe( '2018-07-10 20:35:00' );
322
+ } );
323
+
324
+ it( 'Should adjust the start and end time', () => {
325
+ const start = moment( new Date( 'July 10, 2018 20:35:00 UTC' ).toISOString() );
326
+ const end = moment( new Date( 'July 10, 2018 10:30:00 UTC' ).toISOString() );
327
+ const output = momentUtil.adjustStart( start, end );
328
+ expect( output.start.format( format ) ).toBe( '2018-07-10 20:35:00' );
329
+ expect( output.end.format( format ) ).toBe( '2018-07-10 21:35:00' );
330
+ } );
331
+ } );
332
+ } );
common/src/modules/utils/__tests__/number.test.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { percentage } from '@moderntribe/common/utils/number';
5
+
6
+ describe( 'percentage', () => {
7
+ test( 'with default values', () => {
8
+ expect( percentage() ).toBe( 0 );
9
+ } );
10
+
11
+ test( 'with non numbers', () => {
12
+ expect( () => percentage( 'modern', 'tribe' ) ).toThrow();
13
+ } );
14
+
15
+ test( 'limits outside 100 percent', () => {
16
+ expect( percentage( 120, 100 ) ).toBe( 120 );
17
+ expect( percentage( 1220, 100 ) ).toBe( 1220 );
18
+ expect( percentage( 101, 100 ) ).toBe( 101 );
19
+ expect( percentage( 100, 100 ) ).toBe( 100 );
20
+ } );
21
+
22
+ test( 'common cases', () => {
23
+ expect( percentage( 10, 100 ) ).toBe( 10 );
24
+ expect( percentage( 17, 100 ) ).toBe( 17 );
25
+ expect( percentage( 20, 1000 ) ).toBe( 2 );
26
+ expect( percentage( 155, 1000 ) ).toBe( 15.5 );
27
+ expect( percentage( 999, 1000 ) ).toBe( 99.9 );
28
+ expect( percentage( 1000, 1000 ) ).toBe( 100 );
29
+ } );
30
+
31
+ test( 'negative percentages', () => {
32
+ expect( percentage( -10, 100 ) ).toBe( -10 );
33
+ expect( percentage( -80, 100 ) ).toBe( -80 );
34
+ expect( percentage( -200, 100 ) ).toBe( -200 );
35
+ } );
36
+ } );
common/src/modules/utils/__tests__/proptypes.test.js ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { noop } from 'lodash';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import * as proptypes from '@moderntribe/common/utils/proptypes';
10
+
11
+ describe( 'Tests for proptypes utils', () => {
12
+ describe( 'createChainableValidator', () => {
13
+ it( 'should not return an error when prop is undefined and is not required', () => {
14
+ const props = {};
15
+ const chainedValidator = jest.fn( proptypes.createChainableValidator( noop ) );
16
+ chainedValidator( props, 'time', 'component' );
17
+
18
+ expect( chainedValidator ).toHaveReturned();
19
+ expect( chainedValidator ).toHaveReturnedWith( null );
20
+ } );
21
+
22
+ it( 'should return an error when prop is undefined and is required', () => {
23
+ const props = {};
24
+ const chainedValidator = jest.fn( proptypes.createChainableValidator( noop ).isRequired );
25
+ chainedValidator( props, 'time', 'component' );
26
+
27
+ expect( chainedValidator ).toHaveReturned();
28
+ expect( chainedValidator ).toHaveReturnedWith( Error( 'The prop `time` is marked as required in `component`, but its value is `undefined`.' ) );
29
+ } );
30
+
31
+ it( 'should return an error when prop is null and is required', () => {
32
+ const props = {
33
+ time: null,
34
+ };
35
+ const chainedValidator = jest.fn( proptypes.createChainableValidator( noop ).isRequired );
36
+ chainedValidator( props, 'time', 'component' );
37
+
38
+ expect( chainedValidator ).toHaveReturned();
39
+ expect( chainedValidator ).toHaveReturnedWith( Error( 'The prop `time` is marked as required in `component`, but its value is `null`.' ) );
40
+ } );
41
+
42
+ it( 'should call the validator when prop is provided, not undefined or null, and is not required', () => {
43
+ const props = {
44
+ time: '15:34',
45
+ };
46
+ const validator = jest.fn( noop );
47
+ const chainedValidator = jest.fn( proptypes.createChainableValidator( validator ) );
48
+ chainedValidator( props, 'time', 'component' );
49
+
50
+ expect( validator ).toHaveBeenCalled();
51
+ expect( validator ).toHaveBeenCalledTimes( 1 );
52
+ } );
53
+
54
+ it( 'should call the validator when prop is provided, not undefined or null, and is required', () => {
55
+ const props = {
56
+ time: '15:34',
57
+ };
58
+ const validator = jest.fn( noop );
59
+ const chainedValidator = jest.fn( proptypes.createChainableValidator( validator ).isRequired );
60
+ chainedValidator( props, 'time', 'component' );
61
+
62
+ expect( validator ).toHaveBeenCalled();
63
+ expect( validator ).toHaveBeenCalledTimes( 1 );
64
+ } );
65
+ } );
66
+
67
+ describe( 'timeRegex', () => {
68
+ it( 'should return true when provided proper time formatted string', () => {
69
+ expect( proptypes.timeRegex.test( '00:00' ) ).toEqual( true );
70
+ expect( proptypes.timeRegex.test( '23:59' ) ).toEqual( true );
71
+ expect( proptypes.timeRegex.test( '12:42' ) ).toEqual( true );
72
+ expect( proptypes.timeRegex.test( '03:01' ) ).toEqual( true );
73
+ expect( proptypes.timeRegex.test( '19:47' ) ).toEqual( true );
74
+ expect( proptypes.timeRegex.test( '05:56' ) ).toEqual( true );
75
+ expect( proptypes.timeRegex.test( '14:11' ) ).toEqual( true );
76
+ } );
77
+
78
+ it( 'should return false when not provided proper time formatted string', () => {
79
+ expect( proptypes.timeRegex.test( 'random string' ) ).toEqual( false );
80
+ expect( proptypes.timeRegex.test( '-00:00' ) ).toEqual( false );
81
+ expect( proptypes.timeRegex.test( '24:00' ) ).toEqual( false );
82
+ expect( proptypes.timeRegex.test( '00:60' ) ).toEqual( false );
83
+ expect( proptypes.timeRegex.test( '24:60' ) ).toEqual( false );
84
+ expect( proptypes.timeRegex.test( '75:93' ) ).toEqual( false );
85
+ expect( proptypes.timeRegex.test( '90:90' ) ).toEqual( false );
86
+ } );
87
+ } );
88
+
89
+ describe( 'timeFormat', () => {
90
+ it( 'should not return an error when provided proper time formatted string', () => {
91
+ const props = {
92
+ time: '15:34',
93
+ };
94
+ const timeFormat = jest.fn( () => proptypes.timeFormat( props, 'time', 'component' ) );
95
+ timeFormat();
96
+
97
+ expect( timeFormat ).toHaveReturned();
98
+ expect( timeFormat ).toHaveReturnedWith( null );
99
+ } );
100
+
101
+ it( 'should return an error when not provided a string', () => {
102
+ const props = {
103
+ time: true,
104
+ };
105
+ const timeFormat = jest.fn( () => proptypes.timeFormat( props, 'time', 'component' ) );
106
+ timeFormat();
107
+
108
+ expect( timeFormat ).toHaveReturned();
109
+ expect( timeFormat ).toHaveReturnedWith( Error( 'Invalid prop `time` of type `boolean` supplied to `component`, expected `string`.' ) );
110
+ } );
111
+
112
+ it( 'should return an error when not provided proper time format', () => {
113
+ const props = {
114
+ time: 'random string',
115
+ };
116
+ const timeFormat = jest.fn( () => proptypes.timeFormat( props, 'time', 'component' ) );
117
+ timeFormat();
118
+
119
+ expect( timeFormat ).toHaveReturned();
120
+ expect( timeFormat ).toHaveReturnedWith( Error( 'Invalid prop `time` format supplied to `component`, expected `hh:mm`.' ) );
121
+ } );
122
+ } );
123
+
124
+ describe( 'nullType', () => {
125
+ test( 'valid prop types', () => {
126
+ const props = {
127
+ name: null,
128
+ }
129
+ const format = jest.fn( () => proptypes.nullType( props, 'name', 'Test Type' ) );
130
+ format();
131
+ expect( format ).toHaveReturned();
132
+ expect( format ).toHaveReturnedWith( undefined );
133
+ } );
134
+
135
+ test( 'invalid prop types', () => {
136
+ const props = {
137
+ name: 'Modern Tribe',
138
+ }
139
+ const format = jest.fn( () => proptypes.nullType( props, 'name', 'Test Type' ) );
140
+ format();
141
+ expect( format ).toHaveReturned();
142
+ expect( format ).toHaveReturnedWith( Error( 'Invalid prop: `name` supplied to `Test Type`, expect null.') );
143
+ } );
144
+ } );
145
+ } );
common/src/modules/utils/__tests__/range.test.js ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ parseChars,
6
+ extractParts,
7
+ parser,
8
+ isFree,
9
+ } from '@moderntribe/common/utils/range';
10
+
11
+ describe( 'Tests for range.js', () => {
12
+ test( 'parseChars', () => {
13
+ expect( parseChars( '' ) ).toEqual( '' );
14
+ expect( parseChars( '12312312321321 123123123123' ) ).toEqual( '12312312321321 123123123123' );
15
+ expect( parseChars( '1"$!%$&/)=(=?^^Ǩ¨_:;' ) ).toEqual( '1' );
16
+ expect( parseChars( ',.-¨¨*^^?=)(/&%$·"!ª12' ) ).toEqual( ',.-12' );
17
+ expect( parseChars( '1-2-3-!"·$%&4-5-6$,.-' ) ).toEqual( '1-2-3-4-5-6,.-' );
18
+ } );
19
+
20
+ test( 'extractParts', () => {
21
+ expect( extractParts( '' ) ).toEqual( [] );
22
+ expect( extractParts( '12' ) ).toEqual( [ '12' ] );
23
+ expect( extractParts( '12 - 23' ) ).toEqual( [ '12', '23' ] );
24
+ expect( extractParts( '12.23 - ' ) ).toEqual( [ '12.23' ] );
25
+ expect( extractParts( '12.23 - 5,10' ) ).toEqual( [ '12.23', '5.10' ] );
26
+ expect( extractParts( '12.23 - - - - - 5,10' ) ).toEqual( [ '12.23', '5.10' ] );
27
+ expect( extractParts( '- - - - - 12.23 - 5,10' ) ).toEqual( [ '12.23', '5.10' ] );
28
+ expect( extractParts( '......,,,,12.23 - 5,10' ) ).toEqual( [ '12.23', '5.10' ] );
29
+ expect( extractParts( '.12.23 - 5,10.....,,,,' ) ).toEqual( [ '12.23', '5.10' ] );
30
+ expect( extractParts( '12.2.....3 ,-. 5,10' ) ).toEqual( [ '12.20', '5.10' ] );
31
+ expect( extractParts( '1-2-3-!"·$%&4-5-6$,.-' ) ).toEqual( [ '1', '2' ] );
32
+ expect( extractParts( '12.23 ,-. ----5,,,,,,10' ) ).toEqual( [ '12.23', '5' ] );
33
+ } );
34
+
35
+ test( 'parser', () => {
36
+ expect( parser( '' ) ).toEqual( '' );
37
+ expect( parser( 'cupidatat occaecat' ) ).toEqual( '' );
38
+ expect( parser( 'cupidatat 12 occaecat - 1,2' ) ).toEqual( '1.20 - 12' );
39
+ expect( parser( '1,2 cupidatat 12 occaecat' ) ).toEqual( '1.20' );
40
+ expect( parser( '1-2-1-1-1-1' ) ).toEqual( '1 - 2' );
41
+ expect( parser( '......,,,,12.23 - 5,10' ) ).toEqual( '5.10 - 12.23' );
42
+ expect( parser( '2.2.....3 ,-. 2,10' ) ).toEqual( '2.10 - 2.20' );
43
+ expect( parser( '12.23 ,-. ----5,,,,,,10' ) ).toEqual( '5 - 12.23' );
44
+ expect( parser( '1-2-3-!"·$%&4-5-6$,.-' ) ).toEqual( '1 - 2' );
45
+ expect( parser( ',.-¨¨*^^?=)(/&%$·"!ª12' ) ).toEqual( '12' );
46
+ expect( parser( '10 - 10' ) ).toEqual( '10' );
47
+ expect( parser( '0' ) ).toEqual( '' );
48
+ expect( parser( '0.0' ) ).toEqual( '' );
49
+ expect( parser( '0 -' ) ).toEqual( '' );
50
+ expect( parser( '0 - 0' ) ).toEqual( '' );
51
+ expect( parser( '0.0 - 0' ) ).toEqual( '' );
52
+ expect( parser( '0.0 - 0.5' ) ).toEqual( '0.00 - 0.50' );
53
+ } );
54
+
55
+ test( 'isFree', () => {
56
+ expect( isFree( '' ) ).toEqual( false );
57
+ expect( isFree( '0.12' ) ).toEqual( false );
58
+ expect( isFree( '0 - 0.12' ) ).toEqual( false );
59
+ expect( isFree( '0.12 - 0' ) ).toEqual( false );
60
+ expect( isFree( '0' ) ).toEqual( true );
61
+ expect( isFree( '0.0' ) ).toEqual( true );
62
+ expect( isFree( '0 - 0' ) ).toEqual( true );
63
+ expect( isFree( '0.0 - 0.0' ) ).toEqual( true );
64
+ } );
65
+ } );
common/src/modules/utils/__tests__/slide.test.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { checkRequestIds } from '@moderntribe/common/utils/slide';
5
+
6
+ describe( 'Tests for slide.js', () => {
7
+ it( 'should return null for up and down', () => {
8
+ const ids = checkRequestIds( 'test-id' );
9
+ expect( ids.up ).toEqual( null );
10
+ expect( ids.down ).toEqual( null );
11
+ } );
12
+ } );
common/src/modules/utils/__tests__/string.test.js ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ isTruthy,
6
+ isFalsy,
7
+ replaceWithObject,
8
+ getWords,
9
+ wordsAsList,
10
+ normalize,
11
+ toBlockName,
12
+ } from '@moderntribe/common/utils/string';
13
+
14
+ describe( 'Tests for string.js', () => {
15
+ test( 'isTruthy', () => {
16
+ expect( isTruthy( 'Sample string' ) ).toEqual( false );
17
+ expect( isTruthy( '0' ) ).toEqual( false );
18
+ expect( isTruthy( 'false' ) ).toEqual( false );
19
+ expect( isTruthy( '1' ) ).toEqual( true );
20
+ expect( isTruthy( 'yes' ) ).toEqual( true );
21
+ expect( isTruthy( 'true' ) ).toEqual( true );
22
+ } );
23
+
24
+ test( 'isFalsy', () => {
25
+ expect( isFalsy( 'Sample string' ) ).toEqual( false );
26
+ expect( isFalsy( '1' ) ).toEqual( false );
27
+ expect( isFalsy( 'true' ) ).toEqual( false );
28
+ expect( isFalsy( '' ) ).toEqual( true );
29
+ expect( isFalsy( '0' ) ).toEqual( true );
30
+ expect( isFalsy( 'no' ) ).toEqual( true );
31
+ expect( isFalsy( 'false' ) ).toEqual( true );
32
+ } );
33
+
34
+ test( 'replaceWithObject', () => {
35
+ expect( replaceWithObject() ).toEqual( '' );
36
+ expect( replaceWithObject( '', {} ) ).toEqual( '' );
37
+ expect( replaceWithObject( 'abcd' ) ).toEqual( 'abcd' );
38
+ expect( replaceWithObject( 'abcd', { z: 'a' } ) ).toEqual( 'abcd' );
39
+ expect( replaceWithObject( 'abcd', { a: 'b', c: 'd' } ) ).toEqual( 'bbdd' );
40
+ expect( replaceWithObject( 'abcd', { a: '', c: '' } ) ).toEqual( 'bd' );
41
+ } );
42
+
43
+ describe( 'getWords', () => {
44
+ test( 'when strings are formed correctly', () => {
45
+ expect( getWords( 'Modern Tribe' ) ).toEqual( [ 'Modern', 'Tribe' ] );
46
+ expect( getWords( 'The Next Generation of Digital Agency' ) )
47
+ .toEqual( [ 'The', 'Next', 'Generation', 'of', 'Digital', 'Agency' ] );
48
+ expect( getWords( 'A list with numbers: 1, 2, 3' ) )
49
+ .toEqual( [ 'A', 'list', 'with', 'numbers:', '1,', '2,', '3' ] );
50
+ } );
51
+
52
+ test( 'Words with multiple spaces on it', () => {
53
+ expect( getWords( ' Modern Tribe ' ) ).toEqual( [ 'Modern', 'Tribe' ] );
54
+ } );
55
+ } );
56
+
57
+ describe( 'applySeparatorsAsCheckboxList', () => {
58
+ test( 'Single word no separator is applied', () => {
59
+ expect( wordsAsList( [ 'Modern' ] ) ).toEqual( 'Modern' );
60
+ } );
61
+
62
+ test( 'Two words last separator is applied', () => {
63
+ expect( wordsAsList( getWords( 'Modern Tribe' ) ) ).toEqual( 'Modern & Tribe' );
64
+ expect( wordsAsList( getWords( 'Events Calendar' ), ',', ' - ' ) )
65
+ .toEqual( 'Events - Calendar' );
66
+ } );
67
+
68
+ test( 'A large number of words', () => {
69
+ expect(
70
+ wordsAsList( [ 'Dog', 'Cat', 'Hamster', 'Parrot', 'Spider', 'Goldfish' ] ),
71
+ ).toEqual( 'Dog, Cat, Hamster, Parrot, Spider & Goldfish' );
72
+ } );
73
+
74
+ test( 'Custom separators', () => {
75
+ expect(
76
+ wordsAsList( [ 'Dog', 'Cat', 'Hamster', 'Parrot', 'Spider', 'Goldfish' ], ' - ', ' => ' ),
77
+ ).toEqual( 'Dog - Cat - Hamster - Parrot - Spider => Goldfish' );
78
+ } );
79
+ } );
80
+
81
+ describe( 'normalize', () => {
82
+ test( 'single words', () => {
83
+ expect( normalize( 'modern' ) ).toEqual( 'modern' );
84
+ expect( normalize( 'TRIBE' ) ).toEqual( 'tribe' );
85
+ } );
86
+
87
+ test( 'multiple words', () => {
88
+ expect( normalize( 'Modern Tribe' ) ).toEqual( 'modern-tribe' );
89
+ expect( normalize( 'https://theeventscalendar.com/' ) )
90
+ .toEqual( 'httpstheeventscalendarcom' );
91
+ } );
92
+
93
+ test( 'Multiple spaces', () => {
94
+ expect( normalize( ' modern TriBe' ) ).toEqual( 'modern-tribe' );
95
+ } );
96
+
97
+ test( 'non words', () => {
98
+ expect( normalize( ' 12312321-,-.(()=^^ ¨¨:;:_¨¨Ç *¿?=)(/&%$·"!.+' ) ).toEqual( '' );
99
+ } );
100
+
101
+ test( 'non strings types', () => {
102
+ expect( normalize( undefined ) ).toBe( '' );
103
+ expect( normalize( [] ) ).toBe( '' );
104
+ expect( normalize( [] ) ).toBe( '' );
105
+ expect( normalize( null ) ).toBe( '' );
106
+ expect( normalize( 1 ) ).toBe( '' );
107
+ } );
108
+ } );
109
+
110
+ describe( 'toBlockName', () => {
111
+ test( 'words', () => {
112
+ expect( toBlockName( 'modern tribe' ) )
113
+ .toBe( 'moderntribe' );
114
+ expect( toBlockName( 'https://theeventscalendar.com/' ) )
115
+ .toBe( 'httpstheeventscalendarcom' );
116
+ } );
117
+
118
+ test( 'non valid characters of a block', () => {
119
+ expect( toBlockName( '_ecp_custom_2' ) ).toBe( 'ecpcustom2' );
120
+ expect( toBlockName( 'ecp-custom-2' ) ).toBe( 'ecp-custom-2' );
121
+ expect( toBlockName( '„…–~~}][‚|#¢∞ecp-custom-2;:_¨¨Ç¨^^=)(/&%$·"!' ) )
122
+ .toBe( 'ecp-custom-2' );
123
+ expect( toBlockName( '„…– ~~}] [‚|#¢∞ecp-custom-2;:_¨ ¨Ç¨^^=)(/ &%$·"!' ) )
124
+ .toBe( 'ecp-custom-2' );
125
+ } );
126
+
127
+ test( 'non strings types', () => {
128
+ expect( toBlockName( undefined ) ).toBe( '' );
129
+ expect( toBlockName( [] ) ).toBe( '' );
130
+ expect( toBlockName( [] ) ).toBe( '' );
131
+ expect( toBlockName( null ) ).toBe( '' );
132
+ expect( toBlockName( 1 ) ).toBe( '' );
133
+ } );
134
+ } );
135
+ } );
common/src/modules/utils/__tests__/time.test.js ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { time } from '@moderntribe/common/utils';
5
+ import { roundTime } from '../moment';
6
+
7
+ describe( 'Tests for time.js', () => {
8
+ test( 'MINUTE_IN_SECONDS', () => {
9
+ expect( time.MINUTE_IN_SECONDS ).toEqual( 60 );
10
+ } );
11
+
12
+ test( 'HALF_HOUR_IN_SECONDS', () => {
13
+ expect( time.HALF_HOUR_IN_SECONDS ).toEqual( 1800 );
14
+ } );
15
+
16
+ test( 'HOUR_IN_SECONDS', () => {
17
+ expect( time.HOUR_IN_SECONDS ).toEqual( 3600 );
18
+ } );
19
+
20
+ test( 'DAY_IN_SECONDS', () => {
21
+ expect( time.DAY_IN_SECONDS ).toEqual( 86400 );
22
+ } );
23
+
24
+ test( 'roundTime', () => {
25
+ expect( time.roundTime( '01:23:54.423', time.TIME_FORMAT_HH_MM_SS_SSS ) )
26
+ .toEqual( '01:00:00.000' );
27
+ expect( time.roundTime( '14:46:13.042', time.TIME_FORMAT_HH_MM_SS_SSS ) )
28
+ .toEqual( '14:30:00.000' );
29
+ expect( time.roundTime( '01:23:54', time.TIME_FORMAT_HH_MM_SS ) )
30
+ .toEqual( '01:00:00' );
31
+ expect( time.roundTime( '14:46:13', time.TIME_FORMAT_HH_MM_SS ) )
32
+ .toEqual( '14:30:00' );
33
+ expect( time.roundTime( '01:23', time.TIME_FORMAT_HH_MM ) )
34
+ .toEqual( '01:00' );
35
+ expect( time.roundTime( '14:46', time.TIME_FORMAT_HH_MM ) )
36
+ .toEqual( '14:30' );
37
+ expect( time.roundTime( '23:54.423', time.TIME_FORMAT_MM_SS_SSS ) )
38
+ .toEqual( '00:00.000' );
39
+ expect( time.roundTime( '46:13.042', time.TIME_FORMAT_MM_SS_SSS ) )
40
+ .toEqual( '30:00.000' );
41
+ expect( time.roundTime( '23:54', time.TIME_FORMAT_MM_SS ) )
42
+ .toEqual( '00:00' );
43
+ expect( time.roundTime( '46:13', time.TIME_FORMAT_MM_SS ) )
44
+ .toEqual( '30:00' );
45
+ } );
46
+
47
+ test( 'START_OF_DAY', () => {
48
+ expect( time.START_OF_DAY ).toEqual( '00:00' );
49
+ } );
50
+
51
+ test( 'END_OF_DAY', () => {
52
+ expect( time.END_OF_DAY ).toEqual( '23:59' );
53
+ } );
54
+
55
+ test( 'TIME_FORMAT_HH_MM_SS_SSS', () => {
56
+ expect( time.TIME_FORMAT_HH_MM_SS_SSS ).toEqual( 'hh:mm:ss.sss' );
57
+ } );
58
+
59
+ test( 'TIME_FORMAT_HH_MM_SS', () => {
60
+ expect( time.TIME_FORMAT_HH_MM_SS ).toEqual( 'hh:mm:ss' );
61
+ } );
62
+
63
+ test( 'TIME_FORMAT_HH_MM', () => {
64
+ expect( time.TIME_FORMAT_HH_MM ).toEqual( 'hh:mm' );
65
+ } );
66
+
67
+ test( 'TIME_FORMAT_MM_SS_SSS', () => {
68
+ expect( time.TIME_FORMAT_MM_SS_SSS ).toEqual( 'mm:ss.sss' );
69
+ } );
70
+
71
+ test( 'TIME_FORMAT_MM_SS', () => {
72
+ expect( time.TIME_FORMAT_MM_SS ).toEqual( 'mm:ss' );
73
+ } );
74
+
75
+ test( 'HOUR_IN_MS', () => {
76
+ expect( time.HOUR_IN_MS ).toEqual( 3600000 );
77
+ } );
78
+
79
+ test( 'MINUTE_IN_MS', () => {
80
+ expect( time.MINUTE_IN_MS ).toEqual( 60000 );
81
+ } );
82
+
83
+ test( 'SECOND_IN_MS', () => {
84
+ expect( time.SECOND_IN_MS ).toEqual( 1000 );
85
+ } );
86
+
87
+ /**
88
+ * Below are tests copied from the hh-mm-ss library and adjusted to use
89
+ * Jest instead of Tape for testing.
90
+ * Link: https://github.com/Goldob/hh-mm-ss/blob/master/test/index.js
91
+ */
92
+ test( 'fromMilliseconds() test', () => {
93
+ // Basic functionality
94
+ expect( time.fromMilliseconds( 75000 ) ).toEqual( '01:15' );
95
+ expect( time.fromMilliseconds( 442800000 ) ).toEqual( '123:00:00' );
96
+ expect( time.fromMilliseconds( 90576 ) ).toEqual( '01:30.576' );
97
+ expect( time.fromMilliseconds( -157250 ) ).toEqual( '-02:37.250' );
98
+
99
+ // Output formatting
100
+ expect( time.fromMilliseconds( 38000, 'mm:ss.sss' ) ).toEqual( '00:38.000' );
101
+ expect( time.fromMilliseconds( 0, 'hh:mm:ss' ) ).toEqual( '00:00:00' );
102
+ expect( time.fromMilliseconds( 3600000, 'mm:ss' ) ).toEqual( '01:00:00' );
103
+ expect( time.fromMilliseconds( 4500000, 'hh:mm' ) ).toEqual( '01:15' );
104
+ expect( time.fromMilliseconds( -9900000, 'hh:mm' ) ).toEqual( '-02:45' );
105
+
106
+ // Input validation
107
+ expect( () => time.fromMilliseconds( null ) ).toThrowErrorMatchingSnapshot();
108
+ expect( () => time.fromMilliseconds('text') ).toThrowErrorMatchingSnapshot();
109
+ expect( () => time.fromMilliseconds(0, 'mm:hh:ss') ).toThrowErrorMatchingSnapshot();
110
+ } );
111
+
112
+ test( 'fromSeconds() test', () => {
113
+ // Basic functionality
114
+ expect( time.fromSeconds( 75 ) ).toEqual( '01:15' );
115
+ expect( time.fromSeconds( 442800 ) ).toEqual( '123:00:00' );
116
+ expect( time.fromSeconds( -442800 ) ).toEqual( '-123:00:00' );
117
+
118
+ // Output formatting
119
+ expect( time.fromSeconds( 38, 'mm:ss.sss' ) ).toEqual( '00:38.000' );
120
+ expect( time.fromSeconds( 0, 'hh:mm:ss' ) ).toEqual( '00:00:00' );
121
+ expect( time.fromSeconds( 3600, 'mm:ss' ) ).toEqual( '01:00:00' );
122
+ expect( time.fromSeconds( 4500, 'hh:mm' ) ).toEqual( '01:15' );
123
+ expect( time.fromSeconds( -9900, 'hh:mm' ) ).toEqual( '-02:45' );
124
+
125
+ // Input validation
126
+ expect( () => time.fromSeconds( null ) ).toThrowErrorMatchingSnapshot();
127
+ expect( () => time.fromSeconds( 'text' ) ).toThrowErrorMatchingSnapshot();
128
+ expect( () => time.fromSeconds( 0, 'mm:hh:ss' ) ).toThrowErrorMatchingSnapshot();
129
+ } );
130
+
131
+ test( 'toMilliseconds() test', () => {
132
+ // Basic functionality
133
+ expect( time.toMilliseconds( '01:05:17' ) ).toEqual( 3917000 );
134
+ expect( time.toMilliseconds( '137:00:00.0' ) ).toEqual( 493200000 );
135
+ expect( time.toMilliseconds( '00:10.230' ) ).toEqual( 10230 );
136
+ expect( time.toMilliseconds( '00:00:07.10845' ) ).toEqual( 7108 );
137
+ expect( time.toMilliseconds( '-02:07:12' ) ).toEqual( -7632000 );
138
+ expect( time.toMilliseconds( '02:00' ) ).toEqual( 120000 );
139
+ expect( time.toMilliseconds( '02:00', 'hh:mm' ) ).toEqual( 7200000 );
140
+ expect( time.toMilliseconds( '-04:35', 'hh:mm' ) ).toEqual( -16500000 );
141
+ expect( time.toMilliseconds( '00:00:07.10845', 'hh:mm' ) ).toEqual( 7108 );
142
+
143
+ // Input validation
144
+ expect( () => time.toMilliseconds( '13:05:02:11' ) ).toThrowErrorMatchingSnapshot();
145
+ expect( () => time.toMilliseconds( '153' ) ).toThrowErrorMatchingSnapshot();
146
+ expect( () => time.toMilliseconds( null ) ).toThrowErrorMatchingSnapshot();
147
+ expect( () => time.toMilliseconds( '00:62' ) ).toThrowErrorMatchingSnapshot();
148
+ expect( () => time.toMilliseconds( '01:30', 'mm:hh:ss' ) ).toThrowErrorMatchingSnapshot();
149
+ } );
150
+
151
+ test( 'toSeconds() test', () => {
152
+ // Basic functionality
153
+ expect( time.toSeconds( '01:05:17' ) ).toEqual( 3917 );
154
+ expect( time.toSeconds( '137:00:00.0' ) ).toEqual( 493200 );
155
+ expect( time.toSeconds( '00:10.230' ) ).toEqual( 10 );
156
+ expect( time.toSeconds( '00:00:07.10845' ) ).toEqual( 7 );
157
+ expect( time.toSeconds( '-02:07:12' ) ).toEqual( -7632 );
158
+ expect( time.toSeconds( '02:00' ) ).toEqual( 120 );
159
+ expect( time.toSeconds( '02:00', 'hh:mm' ) ).toEqual( 7200 );
160
+ expect( time.toSeconds( '-04:35', 'hh:mm' ) ).toEqual( -16500 );
161
+ expect( time.toSeconds( '00:00:07.10845', 'hh:mm' ) ).toEqual( 7 );
162
+
163
+ // Input validation
164
+ expect( () => time.toSeconds( '13:05:02:11' ) ).toThrowErrorMatchingSnapshot();
165
+ expect( () => time.toSeconds( '153' ) ).toThrowErrorMatchingSnapshot();
166
+ expect( () => time.toSeconds( null ) ).toThrowErrorMatchingSnapshot();
167
+ expect( () => time.toSeconds( '00:62' ) ).toThrowErrorMatchingSnapshot();
168
+ expect( () => time.toSeconds( '01:30', 'mm:hh:ss' ) ).toThrowErrorMatchingSnapshot();
169
+ } );
170
+
171
+ test( 'symmetrical conversion test', () => {
172
+ /*
173
+ * fromMilliseconds() and toMilliseconds() for all formats
174
+ */
175
+
176
+ // 90000ms = 1m 30s
177
+ expect( time.toMilliseconds( time.fromMilliseconds( 90000, 'mm:ss' ), 'mm:ss' ) ).toEqual( 90000 );
178
+ expect( time.toMilliseconds( time.fromMilliseconds( 90000, 'mm:ss.sss' ), 'mm:ss.sss' ) ).toEqual( 90000 );
179
+ expect( time.toMilliseconds( time.fromMilliseconds( 90000, 'hh:mm' ), 'hh:mm' ) ).toEqual( 90000 );
180
+ expect( time.toMilliseconds( time.fromMilliseconds( 90000, 'hh:mm:ss' ), 'hh:mm:ss' ) ).toEqual( 90000 );
181
+ expect( time.toMilliseconds( time.fromMilliseconds( 90000, 'hh:mm:ss.sss' ), 'hh:mm:ss.sss' ) ).toEqual( 90000 );
182
+
183
+ // 7517245ms = 2h 5m 17.245s
184
+ expect( time.toMilliseconds( time.fromMilliseconds( 7517245, 'mm:ss' ), 'mm:ss' ) ).toEqual( 7517245 );
185
+ expect( time.toMilliseconds( time.fromMilliseconds( 7517245, 'mm:ss.sss' ), 'mm:ss.sss' ) ).toEqual( 7517245 );
186
+ expect( time.toMilliseconds( time.fromMilliseconds( 7517245, 'hh:mm' ), 'hh:mm' ) ).toEqual( 7517245 );
187
+ expect( time.toMilliseconds( time.fromMilliseconds( 7517245, 'hh:mm:ss' ), 'hh:mm:ss' ) ).toEqual( 7517245 );
188
+ expect( time.toMilliseconds( time.fromMilliseconds( 7517245, 'hh:mm:ss.sss' ), 'hh:mm:ss.sss' ) ).toEqual( 7517245 );
189
+
190
+ // -10800000ms = -3h
191
+ expect( time.toMilliseconds( time.fromMilliseconds( -10800000, 'mm:ss' ), 'mm:ss' ) ).toEqual( -10800000 );
192
+ expect( time.toMilliseconds( time.fromMilliseconds( -10800000, 'mm:ss.sss' ), 'mm:ss.sss' ) ).toEqual( -10800000 );
193
+ expect( time.toMilliseconds( time.fromMilliseconds( -10800000, 'hh:mm' ), 'hh:mm' ) ).toEqual( -10800000 );
194
+ expect( time.toMilliseconds( time.fromMilliseconds( -10800000, 'hh:mm:ss' ), 'hh:mm:ss' ) ).toEqual( -10800000 );
195
+ expect( time.toMilliseconds( time.fromMilliseconds( -10800000, 'hh:mm:ss.sss' ), 'hh:mm:ss.sss' ) ).toEqual( -10800000 );
196
+
197
+ /*
198
+ * fromSeconds() and toMilliseconds() for all formats
199
+ */
200
+
201
+ // 930s = 15m 30s
202
+ expect( time.toSeconds( time.fromSeconds( 930, 'mm:ss' ), 'mm:ss') ).toEqual( 930 );
203
+ expect( time.toSeconds( time.fromSeconds( 930, 'mm:ss.sss' ), 'mm:ss.sss') ).toEqual( 930 );
204
+ expect( time.toSeconds( time.fromSeconds( 930, 'hh:mm' ), 'hh:mm') ).toEqual( 930 );
205
+ expect( time.toSeconds( time.fromSeconds( 930, 'hh:mm:ss' ), 'hh:mm:ss') ).toEqual( 930 );
206
+ expect( time.toSeconds( time.fromSeconds( 930, 'hh:mm:ss.sss' ), 'hh:mm:ss.sss') ).toEqual( 930 );
207
+
208
+ // 4850s = 1h 20m 50s
209
+ expect( time.toSeconds( time.fromSeconds( 4850, 'mm:ss' ), 'mm:ss') ).toEqual( 4850 );
210
+ expect( time.toSeconds( time.fromSeconds( 4850, 'mm:ss.sss' ), 'mm:ss.sss') ).toEqual( 4850 );
211
+ expect( time.toSeconds( time.fromSeconds( 4850, 'hh:mm' ), 'hh:mm') ).toEqual( 4850 );
212
+ expect( time.toSeconds( time.fromSeconds( 4850, 'hh:mm:ss' ), 'hh:mm:ss') ).toEqual( 4850 );
213
+ expect( time.toSeconds( time.fromSeconds( 4850, 'hh:mm:ss.sss' ), 'hh:mm:ss.sss') ).toEqual( 4850 );
214
+
215
+ // -300s = -5m
216
+ expect( time.toSeconds( time.fromSeconds( -300, 'mm:ss' ), 'mm:ss') ).toEqual( -300 );
217
+ expect( time.toSeconds( time.fromSeconds( -300, 'mm:ss.sss' ), 'mm:ss.sss') ).toEqual( -300 );
218
+ expect( time.toSeconds( time.fromSeconds( -300, 'hh:mm' ), 'hh:mm') ).toEqual( -300 );
219
+ expect( time.toSeconds( time.fromSeconds( -300, 'hh:mm:ss' ), 'hh:mm:ss') ).toEqual( -300 );
220
+ expect( time.toSeconds( time.fromSeconds( -300, 'hh:mm:ss.sss' ), 'hh:mm:ss.sss') ).toEqual( -300 );
221
+ } );
222
+ } );
common/src/modules/utils/api.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { rest } from '@moderntribe/common/utils/globals';
2
+ import 'whatwg-fetch';
3
+
4
+ /**
5
+ * Send a request into a wp-json endpoint
6
+ *
7
+ * @param {Object} params An object with the following properties:
8
+ * - path: Path for the endpoint
9
+ * - headers: Array of extra headers for the request
10
+ * - initParams: Params send into the fetch along with headers and credentials
11
+ * - namespace: Endpoint namespace default to `wp/v2`
12
+ *
13
+ * @returns {Promise<Response>} return a fetch promise
14
+ */
15
+ export const wpREST = async ( params ) => {
16
+ const { url = '', nonce = {}, namespaces = {} } = rest();
17
+
18
+ /**
19
+ * @todo refactor this method as for more details look into:
20
+ * - https://github.com/moderntribe/events-gutenberg/pull/346#discussion_r222217138
21
+ */
22
+ const options = {
23
+ path: '',
24
+ headers: {},
25
+ initParams: {},
26
+ namespace: namespaces.core || 'wp/v2',
27
+ ...params,
28
+ };
29
+
30
+ const endpoint = `${ url }${ options.namespace }/${ options.path }`;
31
+
32
+ const headers = {
33
+ 'X-WP-Nonce': nonce.wp_rest || '',
34
+ ...options.headers,
35
+ };
36
+
37
+ try {
38
+ const response = await fetch( endpoint, {
39
+ ...options.initParams,
40
+ credentials: 'include',
41
+ headers,
42
+ } );
43
+
44
+ let data = {};
45
+
46
+ if ( response.ok ) {
47
+ data = await response.json();
48
+ }
49
+
50
+ return {
51
+ response,
52
+ data,
53
+ };
54
+ } catch ( e ) {
55
+ throw e;
56
+ }
57
+ };
common/src/modules/utils/date.js ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { identity } from 'lodash';
5
+ import chrono from 'chrono-node';
6
+
7
+ /**
8
+ * Wordpress dependencies
9
+ */
10
+ import { __ } from '@wordpress/i18n';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import {
16
+ moment as momentUtil,
17
+ timezone as timezoneUtil,
18
+ } from '@moderntribe/common/utils';
19
+ import { dateSettings } from '@moderntribe/common/utils/globals';
20
+
21
+ const formats = dateSettings() && dateSettings().formats ? dateSettings().formats : {};
22
+ const timezone = dateSettings() && dateSettings().formats ? dateSettings().formats : {};
23
+
24
+ export const FORMATS = {
25
+ TIME: 'HH:mm:ss',
26
+ DATE_TIME: 'YYYY-MM-DD HH:mm:ss',
27
+ WP: {
28
+ time: 'g:i a',
29
+ time24Hr: 'H:i',
30
+ date: 'F j, Y',
31
+ datetime: 'F j, Y g:i a',
32
+ dateNoYear: 'F j',
33
+ ...formats,
34
+ },
35
+ TIMEZONE: {
36
+ string: 'UTC',
37
+ ...timezone,
38
+ },
39
+ DATABASE: {
40
+ date: 'Y-m-d',
41
+ datetime: 'Y-m-d H:i:s',
42
+ time: 'H:i:s',
43
+ },
44
+ };
45
+
46
+ export const TODAY = new Date();
47
+
48
+ export const timezonesAsSelectData = () => {
49
+ return timezones().map( ( tzone ) => ( {
50
+ value: tzone.key,
51
+ label: tzone.text,
52
+ } ) );
53
+ };
54
+
55
+ export const timezones = () => {
56
+ return timezoneUtil.getItems()
57
+ .map( ( group ) => group.options || [] )
58
+ .reduce( ( prev, current ) => [ ...prev, ...current ], [] );
59
+ };
60
+
61
+ export const toNaturalLanguage = ( params = {} ) => {
62
+ const options = {
63
+ date: null,
64
+ format: {
65
+ month: 'MMMM',
66
+ day: 'D',
67
+ year: 'YYYY',
68
+ time: momentUtil.toFormat( FORMATS.WP.time ),
69
+ },
70
+ separator: '',
71
+ ...params,
72
+ };
73
+
74
+ const parsed = {
75
+ text: '',
76
+ moment: options.date && momentUtil.toMoment( options.date ),
77
+ detail: {
78
+ day: '',
79
+ month: '',
80
+ year: '',
81
+ time: '',
82
+ },
83
+ isValid: false,
84
+ };
85
+
86
+ parsed.isValid = Boolean( parsed.moment && parsed.moment.isValid() );
87
+
88
+ if ( parsed.isValid ) {
89
+ parsed.detail = {
90
+ month: `${ parsed.moment.format( options.format.month ) }`,
91
+ day: `${ parsed.moment.format( options.format.day ) }`,
92
+ year: `${ parsed.moment.format( options.format.year ) }`,
93
+ time: `${ parsed.moment.format( options.format.time ) }`,
94
+ };
95
+ const { detail } = parsed;
96
+ parsed.text = `${ detail.month } ${ detail.day } ${ detail.year } ${ options.separator } ${ detail.time }`;
97
+ }
98
+ return parsed;
99
+ };
100
+
101
+ export const rangeToNaturalLanguage = ( start = '', end = '', separators = {} ) => {
102
+ const separatorOptions = {
103
+ time: __( 'at', 'tribe-common' ),
104
+ date: ' - ',
105
+ ...separators,
106
+ };
107
+ const from = toNaturalLanguage( { date: start, separator: separatorOptions.time } );
108
+ const to = toNaturalLanguage( { date: end, separator: separatorOptions.time } );
109
+ const parts = [ from.text ];
110
+
111
+ if ( from.isValid && to.isValid ) {
112
+ if ( momentUtil.isSameDay( from.moment, to.moment ) ) {
113
+ /**
114
+ * If both dates are happening on the same day the only relevant thing is the time on the second
115
+ * part of the string (to keep string cleaner).
116
+ *
117
+ * - Current behavior 'Oct 8 2018 at 12:00 pm - Oct 8 2018 at 12:30 pm'
118
+ * - New behavior: 'Oct 8 2018 at 12:00 pm - 12:30 pm'
119
+ */
120
+ parts.push( to.detail.time );
121
+ } else if ( momentUtil.isSameMonth( from.moment, to.moment ) ) {
122
+ /**
123
+ * If both dates are happening on the same month and not on the same day but during the same year
124
+ * we don't need to show the same year twice.
125
+ *
126
+ * - Current Behavior: 'Oct 8 2018 at 12:00 pm - Oct 24 2018 12:30 pm'
127
+ * - New Behavior: 'Oct 8 2018 at 12:00 pm - Oct 24 12:30 pm'
128
+ */
129
+ parts.push( `${ to.detail.month } ${ to.detail.day } ${ separatorOptions.time } ${ to.detail.time }` );
130
+ } else {
131
+ // Otherwise just use the full text
132
+ parts.push( to.text );
133
+ }
134
+ }
135
+
136
+ return parts.filter( identity ).join( separatorOptions.date );
137
+ };
138
+
139
+ export const labelToDate = ( label ) => {
140
+ const [ parsed ] = chrono.parse( label );
141
+ const dates = {
142
+ start: null,
143
+ end: null,
144
+ };
145
+ if ( parsed ) {
146
+ const { start, end } = parsed;
147
+ dates.start = start ? momentUtil.toDateTime( momentUtil.toMoment( start.date() ) ) : null;
148
+ dates.end = end ? momentUtil.toDateTime( momentUtil.toMoment( end.date() ) ) : null;
149
+ }
150
+ return dates;
151
+ };
common/src/modules/utils/dom.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { noop } from 'lodash';
5
+
6
+ /**
7
+ * Test if a node element has a class present on it
8
+ *
9
+ * @param {HTMLElement|Element} node The node where to look for the class names
10
+ * @param {array} classNames List of class names as an array of strings
11
+ * @returns {boolean} `true` if has any of the classes or false if does not have any
12
+ */
13
+ export const hasClass = ( node, classNames = [] ) => {
14
+ for ( let i = 0; i < classNames.length; i++ ) {
15
+ if ( node.classList.contains( classNames[ i ] ) ) {
16
+ return true;
17
+ }
18
+ }
19
+ return false;
20
+ };
21
+
22
+ /**
23
+ * Utility to search the parent of a node looking from the current node Up to the highest
24
+ * node on the DOM Tree
25
+ *
26
+ * @param {(DOMElement|object)} node - The DOM node where the search starts
27
+ * @param {function} callback - Is executed on every iteration, it should return a boolean
28
+ * @returns {boolean} Returns tre if the callback returns true with any of the parents.
29
+ */
30
+ export const searchParent = ( node = {}, callback = noop ) => {
31
+ let found = false;
32
+ let testNode = node;
33
+ do {
34
+ if ( testNode ) {
35
+ found = callback( testNode );
36
+ }
37
+ const nextNode = testNode && testNode.parentNode ? testNode.parentNode : null;
38
+ testNode = isRootNode( nextNode ) ? null : nextNode;
39
+ } while ( ! found && testNode !== null );
40
+
41
+ return found;
42
+ };
43
+
44
+ /**
45
+ * Test if a node is the same as the root element or the base node of the document.
46
+ *
47
+ * @param {Element} node A Document Node
48
+ * @returns {boolean} true if node is the root Node Document
49
+ */
50
+ export const isRootNode = ( node ) => node === window.top.document;
common/src/modules/utils/get-hidden-height.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @function getHiddenHeight
3
+ * @desc gets the height of hidden objects.
4
+ */
5
+
6
+ const getHiddenHeight = ( el ) => {
7
+ const width = el.clientWidth;
8
+ const element = el;
9
+
10
+ element.style.visibility = 'hidden';
11
+ element.style.height = 'auto';
12
+ element.style.maxHeight = 'none';
13
+ element.style.position = 'fixed';
14
+ element.style.width = `${width}px`;
15
+
16
+ const tHeight = element.offsetHeight;
17
+
18
+ element.style.visibility = '';
19
+ element.style.height = '';
20
+ element.style.maxHeight = '';
21
+ element.style.width = '';
22
+ element.style.position = '';
23
+ element.style.zIndex = '';
24
+
25
+ return tHeight;
26
+ };
27
+
28
+ export default getHiddenHeight;
common/src/modules/utils/globals.js ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @todo: handle globals in a better way
3
+ */
4
+ export const get = ( key, defaultValue ) => window[ key ] || defaultValue;
5
+ export const google = () => get( 'google' );
6
+
7
+ // Localized Config
8
+ export const config = () => get( 'tribe_editor_config', {} );
9
+
10
+ // Common
11
+ export const common = () => config().common || {};
12
+ export const adminUrl = () => common().adminUrl || '';
13
+ export const rest = () => common().rest || {};
14
+ export const restNonce = () => rest().nonce || {};
15
+ export const dateSettings = () => common().dateSettings || {};
16
+ export const editorConstants = () => common().constants || {};
17
+ export const list = () => ( {
18
+ countries: common().countries || {},
19
+ us_states: common().usStates || {},
20
+ } );
21
+
22
+ // TEC
23
+ export const tec = () => config().events || {};
24
+ export const editor = () => tec().editor || {};
25
+ export const settings = () => tec().settings || {};
26
+ export const mapsAPI = () => tec().googleMap || {};
27
+ export const priceSettings = () => tec().priceSettings || {};
28
+ export const tecDateSettings = () => tec().dateSettings || {};
29
+ export const timezoneHtml = () => tec().timezoneHTML || '';
30
+ export const defaultTimes = () => tec().defaultTimes || {};
31
+
32
+ // PRO
33
+ export const pro = () => config().eventsPRO || {};
34
+ export const editorDefaults = () => pro().defaults || {};
35
+
36
+ // Tickets
37
+ export const tickets = () => config().tickets || {};
common/src/modules/utils/index.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as date from './date';
2
+ import * as dom from './dom';
3
+ import * as globals from './globals';
4
+ import * as input from './input';
5
+ import * as moment from './moment';
6
+ import * as range from './range';
7
+ import * as slide from './slide';
8
+ import * as string from './string';
9
+ import * as time from './time';
10
+ import * as timezone from './timezone';
11
+ import * as number from './number';
12
+ import * as api from './api';
13
+
14
+ export { date };
15
+ export { dom };
16
+ export { default as getHiddenHeight } from './get-hidden-height';
17
+ export { globals };
18
+ export { input };
19
+ export { moment };
20
+ export { range };
21
+ export { slide };
22
+ export { string };
23
+ export { time };
24
+ export { timezone };
25
+ export { number };
26
+ export { api };
27
+ export { default as TribePropTypes } from './proptypes';
common/src/modules/utils/input.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Allow to set a function (callback) as the parameter of onChange which will send the value of the
3
+ * event into the callback to avoid arrow functions around props of components.
4
+ *
5
+ * @param {Function} callback executed once the event is fired.
6
+ * @return {Function} Function executed by the event to extract the value
7
+ */
8
+ export const sendValue = ( callback ) => ( event ) => {
9
+ const { target = {} } = event;
10
+ const { value = '' } = target;
11
+ callback( value );
12
+ };
common/src/modules/utils/moment.js ADDED
@@ -0,0 +1,332 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { isString } from 'lodash';
5
+ import moment, { isMoment } from 'moment';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import {
11
+ date as dateUtil,
12
+ time,
13
+ string,
14
+ } from '@moderntribe/common/utils';
15
+
16
+ export const TIME_FORMAT = 'h:mm a';
17
+
18
+ /**
19
+ * Make sure the format provided matches the spec used by moment.js
20
+ *
21
+ * @param {string} format The format to be converted to a moment format
22
+ * @returns {string} return a moment.js valid format
23
+ */
24
+ export const toFormat = ( format ) => {
25
+ const replacements = {
26
+ d: 'DD',
27
+ D: 'ddd',
28
+ j: 'D',
29
+ l: 'dddd',
30
+ N: 'E',
31
+ S: 'o',
32
+ w: 'e',
33
+ z: 'DDD',
34
+ W: 'W',
35
+ F: 'MMMM',
36
+ m: 'MM',
37
+ M: 'MMM',
38
+ n: 'M',
39
+ t: '', // no equivalent
40
+ L: '', // no equivalent
41
+ o: 'YYYY',
42
+ Y: 'YYYY',
43
+ y: 'YY',
44
+ a: 'a',
45
+ A: 'A',
46
+ B: '', // no equivalent
47
+ g: 'h',
48
+ G: 'H',
49
+ h: 'hh',
50
+ H: 'HH',
51
+ i: 'mm',
52
+ s: 'ss',
53
+ u: 'SSS',
54
+ e: 'zz', // deprecated since version 1.6.0 of moment.js
55
+ I: '', // no equivalent
56
+ O: '', // no equivalent
57
+ P: '', // no equivalent
58
+ T: '', // no equivalent
59
+ Z: '', // no equivalent
60
+ c: '', // no equivalent
61
+ r: '', // no equivalent
62
+ U: 'X',
63
+ };
64
+
65
+ return string.replaceWithObject( format, replacements );
66
+ };
67
+
68
+ /**
69
+ * Round the time of a moment object if the minutes on the date is lower than 30 will set to 0 if
70
+ * is greater will se 30 so is either 30 or 0.
71
+ *
72
+ * @param {moment} date Make sure the date is rounded between 0 or 30 minutes
73
+ * @returns {moment} A moment object
74
+ */
75
+ export const roundTime = ( date ) => {
76
+ if ( ! isMoment( date ) ) {
77
+ return date;
78
+ }
79
+
80
+ let minutes = date.minute();
81
+ if ( minutes >= 30 ) {
82
+ minutes = ( minutes % 30 );
83
+ }
84
+
85
+ return date
86
+ .clone()
87
+ .subtract( minutes, 'm' )
88
+ .seconds( 0 );
89
+ };
90
+
91
+ /**
92
+ * Parse multiple formats in a date to ensure the generated dates are valid
93
+ *
94
+ * @param {string} date The date to be converted
95
+ * @param {array} formats The list of formats used to format
96
+ * @returns {moment} moment Object with the date or current date if is non valid
97
+ */
98
+ export const parseFormats = ( date, formats = [ dateUtil.FORMATS.DATABASE.datetime, dateUtil.FORMATS.WP.datetime ] ) => {
99
+ for ( let i = 0; i < formats.length; i ++ ) {
100
+ const format = formats[ i ];
101
+ const result = toMoment( date, format );
102
+ if ( result.isValid() ) {
103
+ return result;
104
+ }
105
+ }
106
+
107
+ const noFormat = moment( date );
108
+ return noFormat.isValid() ? noFormat : moment();
109
+ };
110
+
111
+ /**
112
+ * Convert a Date() object into a Moment.js object avoiding warnings of different formats
113
+ * used by Date
114
+ *
115
+ * @param {(Date|moment|string)} date The date to be converted.
116
+ * @param {string} format The format of the data to be used
117
+ * @param {bool} Force the parse of the format default to true
118
+ * @returns {moment} A moment object
119
+ */
120
+ export const toMoment = ( date, format = dateUtil.FORMATS.DATABASE.datetime, parseFormat = true ) => {
121
+ if ( isMoment( date ) || date instanceof Date ) {
122
+ return moment( date );
123
+ } else if ( isString( date ) ) {
124
+ return moment( date, parseFormat ? toFormat( format ) : format );
125
+ }
126
+
127
+ return moment();
128
+ };
129
+
130
+ export const toMomentFromDate = ( date ) => {
131
+ if ( ! ( date instanceof Date ) ) {
132
+ throw new Error( 'Make sure your date is an instance of Date' );
133
+ }
134
+
135
+ const year = date.getFullYear();
136
+ const month = date.getMonth();
137
+ const day = date.getDate();
138
+
139
+ return moment()
140
+ .year( year )
141
+ .month( month )
142
+ .date( day )
143
+ .startOf( 'day' );
144
+ };
145
+
146
+ /**
147
+ * Convert a Date() object or date string and time into a moment object
148
+ *
149
+ * @param {(Date|moment|string)} date The date to be converted.
150
+ * @param {string} time The time string in HH:mm format..
151
+ * @returns {moment} A moment object
152
+ */
153
+ export const toMomentFromDateTime = ( date, time ) => {
154
+ const [ hours, minutes ] = time.split( ':' );
155
+ return moment( date ).hours( hours ).minutes( minutes );
156
+ };
157
+
158
+ /**
159
+ * Replace the date of a moment object with another date from another moment object
160
+ *
161
+ * @param {moment} original The moment object where the date is going to be replaced
162
+ * @param {moment} replaced The moment object where the date to be used to replace is located
163
+ * @returns {moment} A moment object where the date is replaced
164
+ */
165
+ export const replaceDate = ( original, replaced ) => {
166
+ if ( ! isMoment( original ) || ! isMoment( replaced ) ) {
167
+ throw new Error( 'Make sure your values are instances of moment' );
168
+ }
169
+
170
+ return original
171
+ .year( replaced.year() )
172
+ .month( replaced.month() )
173
+ .date( replaced.date() );
174
+ };
175
+
176
+ /**
177
+ * Set time in seconds to a moment object
178
+ *
179
+ * @param {moment} original The original moment where the date is going to be set
180
+ * @param {number} seconds Amount of seconds to be set to the moment object.
181
+ * @returns {moment} A moment object with the new date
182
+ */
183
+ export const setTimeInSeconds = ( original, seconds = 0 ) => {
184
+ if ( ! isMoment( original ) ) {
185
+ throw new Error( 'Make sure your values are instances of moment' );
186
+ }
187
+
188
+ if ( seconds < 0 ) {
189
+ return original;
190
+ }
191
+
192
+ return original
193
+ .startOf( 'day' )
194
+ .seconds( seconds || original.seconds() );
195
+ };
196
+
197
+ /**
198
+ * Total seconds of a current date from moment
199
+ *
200
+ * @param {moment} date The date to compare on the current day
201
+ * @returns {int} Total of seconds from start of the day to the current moment,
202
+ */
203
+ export const totalSeconds = ( date ) => {
204
+ if ( ! date || ! isMoment( date ) ) {
205
+ return 0;
206
+ }
207
+ return date.diff( moment( date ).startOf( 'day' ), 'seconds' );
208
+ };
209
+
210
+ /**
211
+ * Convert a moment object into a WP date time format
212
+ *
213
+ * @param {moment} date A moment date object
214
+ * @param {string} format Format used to output the date
215
+ * @returns {string} A date time format
216
+ */
217
+ export const toDateTime = ( date, format = dateUtil.FORMATS.DATABASE.datetime ) => (
218
+ date.format( toFormat( format ) )
219
+ );
220
+
221
+ export const toDate = ( date, format = dateUtil.FORMATS.WP.date ) => (
222
+ date.format( toFormat( format ) )
223
+ );
224
+
225
+ export const toDateNoYear = ( date, format = dateUtil.FORMATS.WP.dateNoYear ) => (
226
+ date.format( toFormat( format ) )
227
+ );
228
+
229
+ export const toTime = ( date, format = dateUtil.FORMATS.WP.time ) => (
230
+ date.format( toFormat( format ) )
231
+ );
232
+
233
+ export const toTime24Hr = ( date, format = dateUtil.FORMATS.WP.time24Hr ) => (
234
+ date.format( toFormat( format ) )
235
+ );
236
+
237
+ export const toDatabaseDate = ( date, format = dateUtil.FORMATS.DATABASE.date ) => (
238
+ date.format( toFormat( format ) )
239
+ );
240
+
241
+ export const toDatabaseTime = ( date, format = dateUtil.FORMATS.DATABASE.time ) => (
242
+ date.format( toFormat( format ) )
243
+ );
244
+
245
+ export const toDatePicker = ( date = moment(), format = 'YYYY-MM-DDTHH:mm:ss' ) => (
246
+ date.format( format )
247
+ );
248
+
249
+ /**
250
+ * Test if the start and end dates are the same day.
251
+ *
252
+ * @param {moment} start The start date
253
+ * @param {(moment|String)} end The end date
254
+ * @returns {boolean} if the start and end dates are the same day
255
+ */
256
+ export const isSameDay = ( start, end ) => {
257
+
258
+ if ( ! start || ! end ) {
259
+ return false;
260
+ }
261
+
262
+ return moment( start ).isSame( end, 'day' );
263
+ };
264
+
265
+ /**
266
+ * Test if two moment objects are in the same month
267
+ *
268
+ * @param {moment} start The start moment
269
+ * @param {moment} end The end moment
270
+ * @returns {boolean} true if start and end are on the same month
271
+ */
272
+ export const isSameMonth = ( start, end ) => {
273
+
274
+ if ( ! start || ! end ) {
275
+ return false;
276
+ }
277
+
278
+ return moment( start ).isSame( end, 'month' );
279
+ };
280
+
281
+ /**
282
+ * Test if the start and end dates have the same year.
283
+ *
284
+ * @param {moment} start The start date
285
+ * @param {(moment|String)} end The end date
286
+ * @returns {boolean} if the start and end dates have the same year
287
+ */
288
+ export const isSameYear = ( start, end ) => (
289
+ toMoment( start ).isSame( toMoment( end ), 'year' )
290
+ );
291
+
292
+ /**
293
+ * Reset the time of an event by creating an object with start and end ensuring the end event is
294
+ * after the start date and both are on the same day if the start is one hour before the end of the
295
+ * day it will remove an hour of the start to ensure both start / end happen on the same day
296
+ *
297
+ * @param {moment} start The start date
298
+ * @returns {{start: {moment}, end: {moment}}} Object with two keys: start, end
299
+ */
300
+ export const resetTimes = ( start ) => {
301
+ const testMoment = start.clone().add( time.HOUR_IN_SECONDS, 'seconds' );
302
+
303
+ // Rollback an hour before adding half an hour as we are on the edge of the day
304
+ if ( ! isSameDay( start, testMoment ) ) {
305
+ start.subtract( time.HOUR_IN_SECONDS, 'seconds' );
306
+ }
307
+
308
+ const end = start.clone().add( time.HOUR_IN_SECONDS, 'seconds' );
309
+
310
+ return {
311
+ start,
312
+ end,
313
+ };
314
+ };
315
+
316
+ /**
317
+ * Make sure the start time is always before the end time
318
+ *
319
+ * @param {moment} start The start date
320
+ * @param {moment} end The end date
321
+ * @returns {{start: {moment}, end: {moment}}} Object with two keys: start, end
322
+ */
323
+ export const adjustStart = ( start, end ) => {
324
+ if ( end.isBefore( start ) ) {
325
+ return resetTimes( start );
326
+ }
327
+
328
+ return {
329
+ start,
330
+ end,
331
+ };
332
+ };
common/src/modules/utils/number.js ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Calculate the percentage of two numbers
3
+ *
4
+ * @param {number} value Initial value from where to take the percentage
5
+ * @param {number} total Total value to get the percentage relative to this value
6
+ * @returns {number} total percentage value
7
+ */
8
+ export const percentage = ( value = 0, total = 0 ) => {
9
+ if ( total === 0 ) {
10
+ return 0;
11
+ }
12
+
13
+ const result = Number.parseFloat( ( value / total ) * 100 );
14
+
15
+ if ( isNaN( result ) ) {
16
+ throw new RangeError(
17
+ `Make sure ${value} and ${total} are valid numbers, operation result in NaN value`
18
+ );
19
+ }
20
+
21
+ return result;
22
+ };
common/src/modules/utils/proptypes.js ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Create chainable validator with isRequired check
3
+ * @param {function} validator
4
+ */
5
+ export const createChainableValidator = ( validator ) => {
6
+ const createChainedValidator = (
7
+ isRequired,
8
+ props,
9
+ propName,
10
+ componentName,
11
+ ) => {
12
+ const propValue = props[ propName ];
13
+
14
+ if ( propValue == null ) {
15
+ if ( isRequired ) {
16
+ if ( propValue === null ) {
17
+ /* eslint-disable-next-line max-len */
18
+ return new Error( `The prop \`${propName}\` is marked as required in \`${componentName}\`, but its value is \`null\`.` );
19
+ }
20
+ /* eslint-disable-next-line max-len */
21
+ return new Error( `The prop \`${propName}\` is marked as required in \`${componentName}\`, but its value is \`undefined\`.` );
22
+ }
23
+ return null;
24
+ } else {
25
+ return validator( props, propName, componentName );
26
+ }
27
+ };
28
+
29
+ const chainedValidator = createChainedValidator.bind( null, false );
30
+ chainedValidator.isRequired = createChainedValidator.bind( null, true );
31
+
32
+ return chainedValidator;
33
+ }
34
+
35
+ export const timeRegex = /^([01]?[0-9]|2[0-3]):[0-5][0-9]$/;
36
+
37
+ /**
38
+ * PropTypes check for type string and time format using 24h clock in hh:mm format
39
+ * e.g. 00:24, 03:57, 21:12
40
+ *
41
+ * @param {object} props
42
+ * @param {string} propName
43
+ * @param {string} componentName
44
+ */
45
+ export const timeFormat = ( props, propName, componentName ) => {
46
+ const propValue = props[ propName ];
47
+
48
+ if ( typeof propValue !== 'string' ) {
49
+ const type = typeof propValue;
50
+ /* eslint-disable-next-line max-len */
51
+ return new Error( `Invalid prop \`${propName}\` of type \`${type}\` supplied to \`${componentName}\`, expected \`string\`.` );
52
+ }
53
+
54
+ if ( ! timeRegex.test( propValue ) ) {
55
+ /* eslint-disable-next-line max-len */
56
+ return new Error( `Invalid prop \`${propName}\` format supplied to \`${componentName}\`, expected \`hh:mm\`.` );
57
+ }
58
+
59
+ return null;
60
+ };
61
+
62
+ export const nullType = ( props, propName, componentName ) => {
63
+ if ( null !== props[ propName ] ) {
64
+ return new Error(
65
+ `Invalid prop: \`${propName}\` supplied to \`${ componentName }\`, expect null.`
66
+ );
67
+ }
68
+ }
69
+
70
+ export default {
71
+ timeFormat: createChainableValidator( timeFormat ),
72
+ nullType: createChainableValidator( nullType ),
73
+ };
common/src/modules/utils/range.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { trim, isEmpty, split } from 'lodash';
5
+
6
+ /**
7
+ * Parse a string into a range type of string {a} - {b} where a and b are numbers
8
+ *
9
+ * @param {string} input The original string
10
+ * @returns {string} A formatted range string.
11
+ */
12
+ export const parser = ( input ) => {
13
+ const range = trim( input );
14
+
15
+ if ( isEmpty( range ) ) {
16
+ return range;
17
+ }
18
+
19
+ const chars = parseChars( input );
20
+
21
+ if ( isEmpty( chars ) ) {
22
+ return chars;
23
+ }
24
+
25
+ const [ a, b ] = extractParts( chars );
26
+ const [ num_a, num_b ] = [ parseFloat( a ), parseFloat( b ) ];
27
+
28
+ if ( ! num_b || num_b === num_a ) {
29
+ return num_a === 0 ? '' : trim( a );
30
+ }
31
+
32
+ return num_a >= num_b ? `${ trim( b ) } - ${ trim( a ) }` : `${ trim( a ) } - ${ trim( b ) }`;
33
+ };
34
+
35
+ /**
36
+ * Remove any char that is not a: number, dash, dot or comma.
37
+ *
38
+ * @param {string} input The string from where to extract the chars
39
+ * @returns {string} A string with only valid chars
40
+ */
41
+ export const parseChars = ( input = '' ) => (
42
+ split( input, ' ' )
43
+ .map( ( part ) => {
44
+ // Remove anything that is not a number a period or a dash
45
+ return part.replace( /[^0-9.,-]/g, '' );
46
+ } )
47
+ .join( ' ' )
48
+ .trim()
49
+ );
50
+
51
+ /**
52
+ * Extract only valid numbers from the string
53
+ *
54
+ * @param {string} chars The chars to be split into parts.
55
+ * @returns {array} An array with the parts
56
+ */
57
+ export const extractParts = ( chars ) => (
58
+ split( chars.replace( /,/g, '.' ), '-' )
59
+ // Convert , into . so we can parse into numbers
60
+ .map( ( item ) => {
61
+ const re = /([0-9]+(.[0-9]+)?)/g;
62
+ const result = re.exec( item.trim() );
63
+ return null === result ? '' : result[ 1 ];
64
+ } )
65
+ .filter( ( item ) => ! isEmpty( item ) )
66
+ .map( ( item ) => {
67
+ // If the user input the price with decimals (even .00) we want to keep them
68
+ const decimals = 0 < item.indexOf( '.' ) ? 2 : 0;
69
+ return parseFloat( item ).toFixed( decimals );
70
+ } )
71
+ .filter( ( item ) => ! isNaN( item ) )
72
+ .slice( 0, 2 )
73
+ );
74
+
75
+ /**
76
+ * Test to see if an input range is free of cost
77
+ *
78
+ * @param {string} input Range input
79
+ * @returns {boolean} true if the event has 0 on all parts of the range, false otherwise
80
+ */
81
+ export const isFree = ( input ) => {
82
+ const parts = split( input, '-' );
83
+ const test = parts
84
+ .map( ( item ) => parseFloat( item ) )
85
+ .filter( ( item ) => ! isNaN( item ) )
86
+ .filter( ( item ) => item === 0 );
87
+
88
+ return parts.length === test.length;
89
+ };
common/src/modules/utils/slide.js ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Element to slide gets the following CSS:
3
+ * max-height: 0;
4
+ * overflow: hidden;
5
+ */
6
+ import BezierEasing from 'bezier-easing';
7
+ import getHiddenHeight from './get-hidden-height';
8
+
9
+ const ease = BezierEasing( 0.25, 0.1, 0.25, 1 );
10
+
11
+ const requestIds = {};
12
+
13
+ /**
14
+ * Check that request id exists, if not create an entry
15
+ * @param {string} id Unique ID of animation
16
+ */
17
+ export const checkRequestIds = ( id ) => {
18
+ if ( ! requestIds[ id ] ) {
19
+ requestIds[ id ] = {
20
+ up: null,
21
+ down: null,
22
+ };
23
+ }
24
+
25
+ return requestIds[ id ];
26
+ };
27
+
28
+ /**
29
+ * Cancel animations with request id
30
+ * @param {string} id Unique ID of animation
31
+ */
32
+ const cancelAnimations = ( id ) => {
33
+ if ( requestIds[ id ].up ) {
34
+ window.cancelAnimationFrame( requestIds[ id ].up );
35
+ requestIds[ id ].up = null;
36
+ }
37
+ if ( requestIds[ id ].down ) {
38
+ window.cancelAnimationFrame( requestIds[ id ].down );
39
+ requestIds[ id ].down = null;
40
+ }
41
+ };
42
+
43
+ /**
44
+ * Like jQuery's slideDown function
45
+ * @param {Node} elem Element to show and hide
46
+ * @param {string} id Unique ID of animation
47
+ * @param {int} time Length of animation in ms
48
+ * @param {function} callback Callback function
49
+ */
50
+ export const down = ( elem, id, time = 400, callback = null ) => {
51
+ const startHeight = elem.offsetHeight;
52
+ const endHeight = getHiddenHeight( elem );
53
+ let startTime = null;
54
+ elem.style.maxHeight = '0';
55
+
56
+ checkRequestIds( id );
57
+ cancelAnimations( id );
58
+
59
+ const step = ( timestamp ) => {
60
+ if ( ! startTime ) {
61
+ startTime = timestamp;
62
+ }
63
+ const timeDiff = timestamp - startTime;
64
+ const progress = ease( timeDiff / time );
65
+ const height = ( progress * ( endHeight - startHeight ) ) + startHeight;
66
+ elem.style.maxHeight = `${height}px`;
67
+
68
+ if ( timeDiff < time ) {
69
+ requestIds[ id ].down = window.requestAnimationFrame( step );
70
+ } else {
71
+ requestIds[ id ].down = null;
72
+ elem.style.maxHeight = 'none';
73
+ if ( callback ) {
74
+ callback();
75
+ }
76
+ }
77
+ };
78
+
79
+ requestIds[ id ].down = window.requestAnimationFrame( step );
80
+ };
81
+
82
+ /**
83
+ * Slide element up
84
+ * @param {Node} elem Element to show and hide
85
+ * @param {string} id Unique ID of animation
86
+ * @param {int} time Length of animation in ms
87
+ * @param {function} callback Callback function
88
+ */
89
+ export const up = ( elem, id, time = 400, callback = null ) => {
90
+ const startHeight = elem.offsetHeight;
91
+ const endHeight = 0;
92
+ let startTime = null;
93
+ elem.style.maxHeight = `${startHeight}px`;
94
+
95
+ checkRequestIds( id );
96
+ cancelAnimations( id );
97
+
98
+ const step = ( timestamp ) => {
99
+ if ( ! startTime ) {
100
+ startTime = timestamp;
101
+ }
102
+ const timeDiff = timestamp - startTime;
103
+ const progress = ease( timeDiff / time );
104
+ const height = ( progress * ( endHeight - startHeight ) ) + startHeight;
105
+ elem.style.maxHeight = `${height}px`;
106
+
107
+ if ( timeDiff < time ) {
108
+ requestIds[ id ].up = window.requestAnimationFrame( step );
109
+ } else {
110
+ requestIds[ id ].up = null;
111
+ elem.style.maxHeight = '0';
112
+ if ( callback ) {
113
+ callback();
114
+ }
115
+ }
116
+ };
117
+
118
+ requestIds[ id ].up = window.requestAnimationFrame( step );
119
+ };
common/src/modules/utils/string.js ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { escapeRegExp, isUndefined, isString, identity } from 'lodash';
5
+
6
+ /**
7
+ * Test if a string is equivalent to a true value
8
+ *
9
+ * @param {string} value The value to be tested
10
+ * @returns {boolean} true if the value is a valid "true" value.
11
+ */
12
+ export const isTruthy = ( value ) => {
13
+ const validValues = [
14
+ 'true',
15
+ 'yes',
16
+ '1',
17
+ ];
18
+ return validValues.indexOf( value ) !== -1;
19
+ };
20
+
21
+ /**
22
+ * Test if a string is equivalent to a false value
23
+ *
24
+ * @param {string} value The value to be tested
25
+ * @returns {boolean} true if the value is a valid "false" value.
26
+ */
27
+ export const isFalsy = ( value ) => {
28
+ const validValues = [
29
+ 'false',
30
+ 'no',
31
+ '0',
32
+ '',
33
+ ];
34
+ return validValues.indexOf( value ) !== -1;
35
+ };
36
+
37
+ export const replaceWithObject = ( str = '', pairs = {} ) => {
38
+ const substrs = Object.keys( pairs ).map( escapeRegExp );
39
+ return str.split( RegExp( `(${ substrs.join( '|' ) })` ) )
40
+ .map( part => isUndefined( pairs[ part ] ) ? part : pairs[ part ] )
41
+ .join( '' );
42
+ };
43
+
44
+ /**
45
+ * Extract the words from a string into an array of words removing all the empty spaces.
46
+ *
47
+ * @param {string} text The initial text
48
+ * @returns {array} Return an array with the words
49
+ */
50
+ export const getWords = ( text = '' ) => {
51
+ if ( ! isString( text ) ) {
52
+ return [];
53
+ }
54
+ return text.split( /\s/ ).filter( identity );
55
+ };
56
+
57
+ /**
58
+ * Apply separators specifically for check box style list where if there are more than 2 words the first
59
+ * separators except the last is different from the rest, and if there are only 2 words it only uses
60
+ * the last separator instead
61
+ *
62
+ * @param {array} words The list of words to join
63
+ * @param {string} startSeparator the separator applied if there are more than 2 words between all the words except the last one
64
+ * @param {string} endSeparator separator applied between the last words
65
+ * @returns {string} return a string with custom separators between words
66
+ */
67
+ export const wordsAsList = ( words, startSeparator = ', ', endSeparator = ' & ' ) => {
68
+ if ( words.length <= 1 ) {
69
+ return words.join( '' );
70
+ } else {
71
+ const start = words.slice( 0, words.length - 1 ).join( startSeparator );
72
+ const last = words[ words.length - 1 ];
73
+ return `${ start }${ endSeparator }${ last }`;
74
+ }
75
+ };
76
+
77
+ /**
78
+ * Creates a string that only contains a-z characters, useful specially for keys
79
+ *
80
+ * @param {string} text Then ame to be normalized
81
+ * @returns {string} A formatted string with no spacing and only a-z chars
82
+ */
83
+ export const normalize = ( text = '' ) => {
84
+ if ( ! isString( text ) ) {
85
+ return '';
86
+ }
87
+ return text.toLowerCase()
88
+ // Remove any non word or space
89
+ .replace( /[^a-z\s]/g, '' )
90
+ .trim()
91
+ .replace( /\s+/g, '-' );
92
+ };
93
+
94
+ /**
95
+ * Remove invalid characters from a string that aren't consider as valid for a block name.
96
+ *
97
+ * @since 4.8
98
+ *
99
+ * @param {string} text The text to be formatted as block name
100
+ * @returns {string} The formatted text
101
+ */
102
+ export const toBlockName = ( text = '' ) => {
103
+ if ( ! isString( text ) ) {
104
+ return '';
105
+ }
106
+
107
+ // Remove any non numeric, a-z or - value
108
+ return text.replace(/[^a-zA-Z0-9-]/g, '' );
109
+ }
common/src/modules/utils/time.js ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import zeroFill from 'zero-fill';
5
+
6
+ export const MINUTE_IN_SECONDS = 60;
7
+ export const HALF_HOUR_IN_SECONDS = MINUTE_IN_SECONDS * 30;
8
+ export const HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS;
9
+ export const DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS;
10
+
11
+ export const START_OF_DAY = '00:00';
12
+ export const END_OF_DAY = '23:59';
13
+
14
+ /**
15
+ * Round the time of a time string
16
+ * If the minutes is lower than 30, it will round the minutes to 0
17
+ * If the minutes is greater than or equal to 30, it will round the minutes to 30
18
+ *
19
+ * @param {string} time
20
+ * @returns {moment} A moment object
21
+ */
22
+ export const roundTime = ( time, format = TIME_FORMAT_MM_SS ) => {
23
+ const seconds = toSeconds( time, format );
24
+ const overage = seconds % ( MINUTE_IN_SECONDS * 30 );
25
+ const roundedSeconds = seconds - overage;
26
+ return fromSeconds( roundedSeconds, format );
27
+ }
28
+
29
+ /**
30
+ * The code below is copied from the library hh-mm-ss
31
+ * Link: https://www.npmjs.com/package/hh-mm-ss
32
+ * The code has been copied so that Modern Tribe can maintain this library
33
+ * internally and adjust as needed.
34
+ */
35
+ export const TIME_FORMAT_HH_MM_SS_SSS = 'hh:mm:ss.sss';
36
+ export const TIME_FORMAT_HH_MM_SS = 'hh:mm:ss';
37
+ export const TIME_FORMAT_HH_MM = 'hh:mm';
38
+ export const TIME_FORMAT_MM_SS_SSS = 'mm:ss.sss';
39
+ export const TIME_FORMAT_MM_SS = 'mm:ss';
40
+
41
+ export const SECOND_IN_MS = 1000;
42
+ export const MINUTE_IN_MS = MINUTE_IN_SECONDS * SECOND_IN_MS;
43
+ export const HOUR_IN_MS = HOUR_IN_SECONDS * SECOND_IN_MS;
44
+
45
+ /**
46
+ * Converts milliseconds to time in the format provided
47
+ *
48
+ * @param {int} ms Milliseconds to convert from
49
+ * @param {string} format Format of time to convert to
50
+ * @returns {string} Time string equivalent of milliseconds in format provided
51
+ */
52
+ export const fromMilliseconds = ( ms, format = TIME_FORMAT_MM_SS ) => {
53
+ if ( typeof ms !== 'number' || Number.isNaN( ms ) ) {
54
+ /* eslint-disable-next-line max-len */
55
+ throw new Error( 'Argument `ms` provided to `fromMilliseconds` is not a number or is NaN.' );
56
+ }
57
+
58
+ const absMs = Math.abs( ms );
59
+
60
+ const negative = ( ms < 0 );
61
+ const hours = Math.floor( absMs / HOUR_IN_MS );
62
+ const minutes = Math.floor( absMs % HOUR_IN_MS / MINUTE_IN_MS );
63
+ const seconds = Math.floor( absMs % MINUTE_IN_MS / SECOND_IN_MS );
64
+ const miliseconds = Math.floor( absMs % SECOND_IN_MS );
65
+
66
+ return formatTime( {
67
+ negative,
68
+ hours,
69
+ minutes,
70
+ seconds,
71
+ miliseconds,
72
+ }, format );
73
+ };
74
+
75
+ /**
76
+ * Converts seconds to time in the format provided
77
+ *
78
+ * @param {int} s Seconds to convert from
79
+ * @param {string} format Format of time to convert to
80
+ * @returns {string} Time string equivalent of seconds in format provided
81
+ */
82
+ export const fromSeconds = ( s, format = TIME_FORMAT_MM_SS ) => {
83
+ if ( typeof s !== 'number' || Number.isNaN( s ) ) {
84
+ /* eslint-disable-next-line max-len */
85
+ throw new Error( 'Argument `s` provided to `fromSeconds` is not a number or is NaN.' );
86
+ }
87
+
88
+ const ms = s * SECOND_IN_MS;
89
+
90
+ return fromMilliseconds( ms, format );
91
+ };
92
+
93
+ /**
94
+ * Converts time in the format provided to milliseconds
95
+ *
96
+ * @param {string} time Time string to convert from
97
+ * @param {string} format Format of time to convert from
98
+ * @returns {int} Milliseconds equivalent of time string in format provided
99
+ */
100
+ export const toMilliseconds = ( time, format = TIME_FORMAT_MM_SS ) => {
101
+ let re;
102
+
103
+ if ( [
104
+ TIME_FORMAT_HH_MM_SS_SSS,
105
+ TIME_FORMAT_HH_MM_SS,
106
+ TIME_FORMAT_MM_SS_SSS,
107
+ TIME_FORMAT_MM_SS,
108
+ ].includes( format ) ) {
109
+ re = /^(-)?(?:(\d\d+):)?(\d\d):(\d\d)(\.\d+)?$/;
110
+ } else if ( format === TIME_FORMAT_HH_MM ) {
111
+ re = /^(-)?(\d\d):(\d\d)(?::(\d\d)(?:(\.\d+))?)?$/;
112
+ } else {
113
+ /* eslint-disable-next-line max-len */
114
+ throw new Error( 'Argument `format` provided to `toMilliseconds` is not a recognized format.' );
115
+ }
116
+
117
+ const result = re.exec( time );
118
+ if ( ! result ) {
119
+ /* eslint-disable-next-line max-len */
120
+ throw new Error( 'Argument `time` provided to `toMilliseconds` is not a recognized format.' );
121
+ }
122
+
123
+ const negative = result[ 1 ] === '-';
124
+ const hours = result[ 2 ] | 0;
125
+ const minutes = result[ 3 ] | 0;
126
+ const seconds = result[ 4 ] | 0;
127
+ const miliseconds = Math.floor( 1000 * result[ 5 ] | 0 );
128
+
129
+ if ( minutes >= 60 || seconds >= 60 ) {
130
+ /* eslint-disable-next-line max-len */
131
+ throw new Error( 'Argument `time` provided to `toMilliseconds` contains minutes or seconds greater than 59.' );
132
+ }
133
+
134
+ return ( negative ? -1 : 1 ) * (
135
+ hours * HOUR_IN_MS
136
+ + minutes * MINUTE_IN_MS
137
+ + seconds * SECOND_IN_MS
138
+ + miliseconds
139
+ );
140
+ };
141
+
142
+ /**
143
+ * Converts time in the format provided to seconds
144
+ *
145
+ * @param {string} time Time string to convert from
146
+ * @param {string} format Format of time to convert from
147
+ * @returns {int} Seconds equivalent of time string in format provided
148
+ */
149
+ export const toSeconds = ( time, format = TIME_FORMAT_MM_SS ) => {
150
+ const ms = toMilliseconds( time, format );
151
+ return Math.floor( ms / SECOND_IN_MS );
152
+ };
153
+
154
+ /**
155
+ * Formats time object to time string in the format provided
156
+ *
157
+ * @param {object} time Time object to format from
158
+ * @param {string} format Format of time to format to
159
+ * @returns {string} Time string in format provided
160
+ */
161
+ export const formatTime = ( time, format ) => {
162
+ let showMs;
163
+ let showSc;
164
+ let showHr;
165
+
166
+ switch ( format ) {
167
+ case TIME_FORMAT_HH_MM_SS_SSS:
168
+ showMs = true;
169
+ showSc = true;
170
+ showHr = true;
171
+ break;
172
+ case TIME_FORMAT_HH_MM_SS:
173
+ showMs = ! ! time.miliseconds;
174
+ showSc = true;
175
+ showHr = true;
176
+ break;
177
+ case TIME_FORMAT_HH_MM:
178
+ showMs = ! ! time.miliseconds;
179
+ showSc = showMs || ! ! time.seconds;
180
+ showHr = true;
181
+ break;
182
+ case TIME_FORMAT_MM_SS_SSS:
183
+ showMs = true;
184
+ showSc = true;
185
+ showHr = ! ! time.hours;
186
+ break;
187
+ case TIME_FORMAT_MM_SS:
188
+ showMs = ! ! time.miliseconds;
189
+ showSc = true;
190
+ showHr = ! ! time.hours;
191
+ break;
192
+ default:
193
+ /* eslint-disable-next-line max-len */
194
+ throw new Error( 'Argument `format` provided to `formatTime` is not a recognized format.' );
195
+ }
196
+
197
+ const hh = zeroFill( 2, time.hours );
198
+ const mm = zeroFill( 2, time.minutes );
199
+ const ss = zeroFill( 2, time.seconds );
200
+ const sss = zeroFill( 3, time.miliseconds );
201
+
202
+ return ( time.negative ? '-' : '' ) + ( showHr ? (
203
+ showMs ? `${hh}:${mm}:${ss}.${sss}` : showSc ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`
204
+ ) : (
205
+ showMs ? `${mm}:${ss}.${sss}` : `${mm}:${ss}`
206
+ ) );
207
+ };
common/src/modules/utils/timezone.js ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { find, flatten, map, get } from 'lodash';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { timezoneHtml } from '@moderntribe/common/utils/globals';
10
+
11
+ /**
12
+ * Module Code
13
+ */
14
+
15
+ let timezoneOpts;
16
+
17
+ export const getTimezoneOpts = () => {
18
+ // Verify if we have it in cache solved
19
+ if ( timezoneOpts ) {
20
+ return timezoneOpts;
21
+ }
22
+
23
+ const $timezoneOpts = jQuery( timezoneHtml() );
24
+ const groups = [];
25
+ let number = 0;
26
+
27
+ $timezoneOpts.each( ( index, item ) => {
28
+ const $group = jQuery( item );
29
+
30
+ if ( ! $group.is( 'optgroup' ) ) {
31
+ return;
32
+ }
33
+
34
+ number++;
35
+
36
+ const label = $group.attr( 'label' );
37
+ const group = {
38
+ key: label,
39
+ text: label,
40
+ options: [],
41
+ };
42
+
43
+ $group.find( 'option' ).each( ( optIndex, optionEl ) => {
44
+ number++;
45
+
46
+ const $option = jQuery( optionEl );
47
+ group.options.push( {
48
+ key: $option.val(),
49
+ text: $option.text(),
50
+ index: number,
51
+ } );
52
+ } );
53
+
54
+ groups.push( group );
55
+ } );
56
+
57
+ // Save it in a cache
58
+ timezoneOpts = groups;
59
+
60
+ return groups;
61
+ }
62
+
63
+ export const getItems = ( searchFor ) => {
64
+ const groups = getTimezoneOpts();
65
+
66
+ if ( searchFor ) {
67
+ const opts = flatten( map( groups, 'options' ) );
68
+ return find( opts, searchFor );
69
+ }
70
+
71
+ return groups;
72
+ }
common/src/resources/css/accessibility.css ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+
12
+ /**
13
+ * Following rules set in this article about accessibility elements
14
+ *
15
+ * @link https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe
16
+ */
17
+ .tribe-js .tribe-accessible-js-hidden {
18
+ clip: rect( 1px 1px 1px 1px ); /* IE 6/7 */
19
+ clip: rect( 1px, 1px, 1px, 1px );
20
+ height: 1px;
21
+ overflow: hidden;
22
+ position: absolute;
23
+ white-space: nowrap; /* added line */
24
+ width: 1px;
25
+ }
26
+ .tribe-accessible-hidden {
27
+ clip: rect( 1px 1px 1px 1px ); /* IE 6/7 */
28
+ clip: rect( 1px, 1px, 1px, 1px );
29
+ height: 1px;
30
+ overflow: hidden;
31
+ position: absolute;
32
+ white-space: nowrap; /* added line */
33
+ width: 1px;
34
+ }
common/src/resources/css/app-shop.css ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ #tribe-app-shop {
12
+ max-width: 960px;
13
+ }
14
+
15
+ #tribe-app-shop .addon-grid {
16
+ width: 100%;
17
+ }
18
+
19
+ #tribe-app-shop .header h1 {
20
+ display: inline-block;
21
+ }
22
+
23
+ #tribe-app-shop .header .button {
24
+ margin-top: 10px;
25
+ }
26
+
27
+ #tribe-app-shop .tribe-addon {
28
+ background-color: #fff;
29
+ border-bottom: 1px solid #dfdfdf;
30
+ display: inline-block;
31
+ margin: 0 15px 15px 0;
32
+ overflow: hidden;
33
+ padding: 0;
34
+ position: relative;
35
+ vertical-align: top;
36
+ width: 300px;
37
+ border-radius: 3px 3px 3px 3px;
38
+ box-sizing: border-box;
39
+ }
40
+
41
+ #tribe-app-shop .tribe-addon h4 {
42
+ font-size: 1.17em;
43
+ margin: 15px 0;
44
+ }
45
+
46
+ #tribe-app-shop .tribe-addon h4 a {
47
+ text-decoration: none;
48
+ }
49
+
50
+ #tribe-app-shop .tribe-addon .button {
51
+ bottom: 15px;
52
+ display: block;
53
+ position: absolute;
54
+ }
55
+
56
+ #tribe-app-shop .tribe-addon .button-disabled {
57
+ padding-left: 3px;
58
+ }
59
+
60
+ #tribe-app-shop .tribe-addon .button-disabled .dashicons {
61
+ font-size: 28px;
62
+ padding-right: 9px;
63
+ }
64
+
65
+ #tribe-app-shop .tribe-addon .caption {
66
+ padding: 0 15px 45px 15px;
67
+ }
68
+
69
+ #tribe-app-shop .tribe-addon .thumb img {
70
+ height: 228px;
71
+ max-width: 100%;
72
+ width: 300px;
73
+ }
74
+
75
+ #tribe-app-shop .tribe-addon.first {
76
+ margin: 20px 0;
77
+ overflow: hidden;
78
+ padding: 0;
79
+ width: 937px;
80
+ }
81
+
82
+ #tribe-app-shop .tribe-addon.first h4 {
83
+ font-size: 20px;
84
+ line-height: 1.4;
85
+ margin: 15px 0 0 0;
86
+ }
87
+
88
+ #tribe-app-shop .tribe-addon.first .caption {
89
+ display: inline-block;
90
+ padding-left: 20px;
91
+ width: 600px;
92
+ }
93
+
94
+ #tribe-app-shop .tribe-addon.first .thumb {
95
+ float: left;
96
+ height: 228px;
97
+ width: 300px;
98
+ }
99
+
100
+ #tribe-app-shop .tribe-installed-headline {
101
+ margin-bottom: 20px;
102
+ }
common/src/resources/css/app/components.css ADDED
@@ -0,0 +1,2 @@
 
 
1
+ .tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout{margin:0}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block{margin:0;max-width:100%!important;padding:0}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block.is-hovered>.editor-block-list__block-edit:before,.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block.is-selected-parent>.editor-block-list__block-edit:before,.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block.is-selected>.editor-block-list__block-edit:before{outline:none}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block .editor-block-list__block-edit{margin:0}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block .editor-block-list__block-edit:before{outline:none}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block .editor-block-list__block-edit .editor-block-contextual-toolbar{display:none}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block{outline:none}
2
+ .tribe-common-form-select{display:-webkit-box;display:flex}.tribe-common-form-select>div{-webkit-box-flex:0;flex:0 0 auto;min-width:193px}.tribe-common-form-select__toggle{background-color:#fff;border-radius:2px;border:2px solid #eaebec}.tribe-common-form-select__toggle button{-webkit-box-align:center;align-items:center;background-color:#fefffe;border:none;color:#545d66;display:-webkit-box;display:flex;font-family:Helvetica,sans-serif;font-size:16px;font-weight:400;-webkit-box-pack:center;justify-content:center;line-height:1.5;padding:6px 10px;text-align:left;text-decoration:none;width:100%}.tribe-common-form-select__toggle button>span{-webkit-box-flex:1;flex:1}.tribe-common-form-select__options__option{background:transparent;border:0;color:#555d66;cursor:pointer;display:block;line-height:20px;padding:5px 12px;text-align:left;width:100%}.tribe-common-form-select__options__option:hover{background-color:#009fd4;color:#fff}
common/src/resources/css/app/elements.css ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tribe-editor__btn--label{background-color:transparent;border:none;padding:0;margin:0;text-align:left}.editor-styles-wrapper .tribe-editor__button,.tribe-editor__button{background-color:transparent;border:none;padding:0;margin:0;font-family:Helvetica,"sans-serif";cursor:pointer}.editor-styles-wrapper .tribe-editor__button[disabled],.tribe-editor__button[disabled]{cursor:default}.editor-styles-wrapper .tribe-editor__button--sm,.tribe-editor__button--sm{background-color:#009fd4;color:#fff;padding:11px 16px 9px;font-size:15px;font-weight:700;line-height:18px;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.editor-styles-wrapper .tribe-editor__button--sm:focus,.editor-styles-wrapper .tribe-editor__button--sm:hover,.tribe-editor__button--sm:focus,.tribe-editor__button--sm:hover{background-color:#007bb4}.editor-styles-wrapper .tribe-editor__button--sm[disabled],.editor-styles-wrapper .tribe-editor__button--sm[disabled]:focus,.editor-styles-wrapper .tribe-editor__button--sm[disabled]:hover,.tribe-editor__button--sm[disabled],.tribe-editor__button--sm[disabled]:focus,.tribe-editor__button--sm[disabled]:hover{background-color:#f3f4f5;color:#8d949b}
2
+ .tribe-editor__accordion__row-content{max-height:0;overflow:hidden}.tribe-editor__accordion__row-content.active{max-height:none}
3
+ .editor-block-inspector__card .tribe-editor__icons__container{padding:4px;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center}.editor-block-inspector__card .tribe-editor__icons__container svg{width:28px;height:28px}.editor-block-inspector__card .tribe-editor__icons--tec{background-color:#199fd1}button[class*=" editor-block-list-item-tribe-"] svg,button[class^=editor-block-list-item-tribe-] svg{color:#16a0d6}
4
+ .tribe-editor__counter{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-align:center;align-items:center}.tribe-editor__counter__count{-webkit-box-flex:0;flex:none;color:#aeb4bb;font-size:32px;font-weight:700;line-height:40px;margin-bottom:10px}.tribe-editor__counter__label{-webkit-box-flex:0;flex:none;color:#aeb4bb;font-size:12px;line-height:14px;letter-spacing:.04px}
5
+ .edit-post-visual-editor .editor-block-list__block .tribe-editor__image-upload__title{padding:0;margin:0 0 12px;color:#000;font-size:15px;font-weight:700;line-height:18px}.tribe-editor__image-upload__content{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;align-items:center}.tribe-editor__image-upload--has-image .tribe-editor__image-upload__content{-webkit-box-align:start;align-items:flex-start}.tribe-editor__image-upload__content p.tribe-editor__image-upload__description{-webkit-box-flex:0;flex:none;width:52%;font-family:Helvetica,sans-serif;font-size:14px;color:#545d66;line-height:18px;margin:0}.tribe-editor__image-upload__upload-button{-webkit-box-flex:0;flex:none;margin-right:10px}.tribe-editor__image-upload__image-wrapper{-webkit-box-flex:0;flex:none;width:42%;max-width:325px;padding-left:25px;position:relative}.tribe-editor__image-upload__remove-button{position:absolute;top:10px;right:10px;width:32px;height:32px;padding:8px;border-radius:50%;background-color:#f8f9fb}.tribe-editor__image-upload__remove-button>svg,.tribe-editor__image-upload__remove-button>svg path{fill:#545d66}.tribe-editor__image-upload__remove-button:focus>svg,.tribe-editor__image-upload__remove-button:focus>svg path,.tribe-editor__image-upload__remove-button:hover>svg,.tribe-editor__image-upload__remove-button:hover>svg path{fill:#009fd4}.tribe-editor__image-upload__remove-button:disabled:focus>svg,.tribe-editor__image-upload__remove-button:disabled:focus>svg path,.tribe-editor__image-upload__remove-button:disabled:hover>svg,.tribe-editor__image-upload__remove-button:disabled:hover>svg path,.tribe-editor__image-upload__remove-button:disabled>svg,.tribe-editor__image-upload__remove-button:disabled>svg path{fill:#aeb4bb}.tribe-editor__image-upload__remove-button-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}
6
+ .tribe-editor__rsvp .tribe-editor__label-with-link,.tribe-editor__ticket .tribe-editor__label-with-link{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;background-color:#fff;padding:10px 17px;border:1px solid #e1e3e6}.tribe-editor__rsvp .tribe-editor__label-with-link .tribe-editor__labeled-item__label,.tribe-editor__ticket .tribe-editor__label-with-link .tribe-editor__labeled-item__label{-webkit-box-flex:1;flex:auto;color:#545d66;font-size:15px;font-weight:700;line-height:18px;letter-spacing:.38px;padding-right:10px}.tribe-editor__rsvp .tribe-editor__label-with-link .tribe-editor__label-with-link__link,.tribe-editor__ticket .tribe-editor__label-with-link .tribe-editor__label-with-link__link{-webkit-box-flex:0;flex:none;color:#009fd4;font-size:15px;font-weight:700;line-height:18px;letter-spacing:.38px;text-decoration:none;box-shadow:none;-webkit-transition:color .2s ease;transition:color .2s ease}.tribe-editor__rsvp .tribe-editor__label-with-link .tribe-editor__label-with-link__link:focus,.tribe-editor__rsvp .tribe-editor__label-with-link .tribe-editor__label-with-link__link:hover,.tribe-editor__ticket .tribe-editor__label-with-link .tribe-editor__label-with-link__link:focus,.tribe-editor__ticket .tribe-editor__label-with-link .tribe-editor__label-with-link__link:hover{color:#007bb4}.tribe-editor__rsvp .tribe-editor__label-with-link .tribe-editor__label-with-link__link.tribe-editor__label-with-link__link--disabled,.tribe-editor__ticket .tribe-editor__label-with-link .tribe-editor__label-with-link__link.tribe-editor__label-with-link__link--disabled{color:#aeb4bb}
7
+ .tribe-editor__label-with-modal{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;background-color:#fff;padding:11px 17px;border:1px solid #e1e3e6;height:40px}.tribe-editor__label-with-modal .tribe-editor__labeled-item__label{-webkit-box-flex:1;flex:auto;color:#545d66;font-size:15px;font-weight:700;line-height:18px;letter-spacing:.38px}.tribe-editor__label-with-modal .tribe-editor__label-with-modal__modal-button{-webkit-box-flex:0;flex:none}.tribe-editor__label-with-modal .tribe-editor__modal-button__button{color:#009fd4;font-size:15px;font-weight:700;line-height:18px;letter-spacing:.38px;-webkit-transition:color .2s ease;transition:color .2s ease}.tribe-editor__label-with-modal .tribe-editor__modal-button__button:focus,.tribe-editor__label-with-modal .tribe-editor__modal-button__button:hover{color:#007bb4}.tribe-editor__label-with-modal .tribe-editor__modal-button__button:disabled,.tribe-editor__label-with-modal .tribe-editor__modal-button__button:disabled:focus,.tribe-editor__label-with-modal .tribe-editor__modal-button__button:disabled:hover{color:#aeb4bb}
8
+ .tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout{margin:0}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block{margin:0;max-width:100%!important;padding:0}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block.is-hovered>.editor-block-list__block-edit:before,.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block.is-selected-parent>.editor-block-list__block-edit:before,.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block.is-selected>.editor-block-list__block-edit:before{outline:none}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block .editor-block-list__block-edit{margin:0}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block .editor-block-list__block-edit:before{outline:none}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block .editor-block-list__block-edit .editor-block-contextual-toolbar{display:none}.tribe-common__plugin-block-hook .editor-inner-blocks .editor-block-list__layout .editor-block-list__block{outline:none}
9
+ .tribe-common-form-select{display:-webkit-box;display:flex}.tribe-common-form-select>div{-webkit-box-flex:0;flex:0 0 auto;min-width:193px}.tribe-common-form-select__toggle{background-color:#fff;border-radius:2px;border:2px solid #eaebec}.tribe-common-form-select__toggle button{-webkit-box-align:center;align-items:center;background-color:#fefffe;border:none;color:#545d66;display:-webkit-box;display:flex;font-family:Helvetica,sans-serif;font-size:16px;font-weight:400;-webkit-box-pack:center;justify-content:center;line-height:1.5;padding:6px 10px;text-align:left;text-decoration:none;width:100%}.tribe-common-form-select__toggle button>span{-webkit-box-flex:1;flex:1}.tribe-common-form-select__options__option{background:transparent;border:0;color:#555d66;cursor:pointer;display:block;line-height:20px;padding:5px 12px;text-align:left;width:100%}.tribe-common-form-select__options__option:hover{background-color:#009fd4;color:#fff}
10
+ input.tribe-editor__input[type=number],input.tribe-editor__input[type=text]{color:#000;font-size:16px;line-height:24px;border:1px solid #e1e3e6;padding:7px 15px;margin:0;height:40px}input.tribe-editor__input[type=number]:focus,input.tribe-editor__input[type=text]:focus{color:#000;box-shadow:none;outline:none}input.tribe-editor__input[type=number]:disabled,input.tribe-editor__input[type=text]:disabled{color:#aeb4bb}
11
+ .tribe-editor__timepicker{display:inline-block}.tribe-editor__timepicker__toggle{background-color:#fff;border:1px solid #e1e3e6;border-radius:2px;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center}.tribe-editor__timepicker__toggle input.tribe-editor__timepicker__input[type=text]{font-family:Helvetica,sans-serif;font-size:14px;line-height:1.5;padding:6px 0 6px 10px;border:none;width:80px}.tribe-editor__timepicker__toggle button.tribe-editor__timepicker__toggle-btn{padding:10px}.tribe-editor__timepicker__toggle button.tribe-editor__timepicker__toggle-btn:disabled>svg.dashicon{fill:#aeb4bb}.tribe-editor__timepicker__toggle button.tribe-editor__timepicker__all-day-btn{color:#545d66;line-height:20px;padding:6px 10px;text-decoration:none;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center}.tribe-editor__timepicker__content.components-popover .components-popover__content{min-width:110px}.tribe-editor__timepicker__content .tribe-editor__timepicker__items{height:250px;overflow:auto}.tribe-editor__timepicker__content .tribe-editor__timepicker__items .components-placeholder{height:inherit}.tribe-editor__timepicker__content .tribe-editor__timepicker__item{display:block;width:100%;color:#555d66;padding:5px 12px;cursor:pointer;border-bottom:1px solid #e2e4e7;line-height:20px;background:transparent;text-align:left}.tribe-editor__timepicker__content .tribe-editor__timepicker__item:focus,.tribe-editor__timepicker__content .tribe-editor__timepicker__item:hover{background-color:#e7f5fa}.tribe-editor__timepicker__content .tribe-editor__timepicker__item--current,.tribe-editor__timepicker__content .tribe-editor__timepicker__item--current:focus,.tribe-editor__timepicker__content .tribe-editor__timepicker__item--current:hover{color:#fff;background-color:#009fd4}
12
+ .DayPicker{display:inline-block;font-size:1rem}.DayPicker-wrapper{position:relative;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;padding-bottom:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.DayPicker-Months{display:-webkit-box;display:flex;flex-wrap:wrap;-webkit-box-pack:center;justify-content:center}.DayPicker-Month{display:table;margin:0 1em;margin-top:1em;border-spacing:0;border-collapse:collapse;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.DayPicker-NavButton{position:absolute;top:1em;right:1.5em;left:auto;display:inline-block;margin-top:2px;width:1.25em;height:1.25em;background-position:50%;background-size:50%;background-repeat:no-repeat;color:#8b9898;cursor:pointer}.DayPicker-NavButton:hover{opacity:.8}.DayPicker-NavButton--prev{margin-right:1.5em;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAwCAYAAAB5R9gVAAAABGdBTUEAALGPC/xhBQAAAVVJREFUWAnN2G0KgjAYwPHpGfRkaZeqvgQaK+hY3SUHrk1YzNLay/OiEFp92I+/Mp2F2Mh2lLISWnflFjzH263RQjzMZ19wgs73ez0o1WmtW+dgA01VxrE3p6l2GLsnBy1VYQOtVSEH/atCCgqpQgKKqYIOiq2CBkqtggLKqQIKgqgCBjpJ2Y5CdJ+zrT9A7HHSTA1dxUdHgzCqJIEwq0SDsKsEg6iqBIEoq/wEcVRZBXFV+QJxV5mBtlDFB5VjYTaGZ2sf4R9PM7U9ZU+lLuaetPP/5Die3ToO1+u+MKtHs06qODB2zBnI/jBd4MPQm1VkY79Tb18gB+C62FdBFsZR6yeIo1YQiLJWMIiqVjQIu1YSCLNWFgijVjYIuhYYCKoWKAiiFgoopxYaKLUWOii2FgkophYp6F3r42W5A9s9OcgNvva8xQaysKXlFytoqdYmQH6tF3toSUo0INq9AAAAAElFTkSuQmCC")}.DayPicker-NavButton--next{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAwCAYAAAB5R9gVAAAABGdBTUEAALGPC/xhBQAAAXRJREFUWAnN119ugjAcwPHWzJ1gnmxzB/BBE0n24m4xfNkTaOL7wOtsl3AXMMb+Vjaa1BG00N8fSEibPpAP3xAKKs2yjzTPH9RAjhEo9WzPr/Vm8zgE0+gXATAxxuxtqeJ9t5tIwv5AtQAApsfT6TPdbp+kUBcgVwvO51KqVhMkXKsVJFXrOkigVhCIs1Y4iKlWZxB1rX4gwlpRIIpa8SDkWmggrFq4IIRaJKCYWnSgnrXIQV1r8YD+1Vrn+bReagysIFfLABRt31v8oBu1xEBttfRbltmfjgEcWh9snUS2kNdBK6WN1vrOWxObWsz+fjxevsxmB1GQDfINWiev83nhaoiB/CoOU438oPrhXS0WpQ9xc1ZQWxWHqUYe0I0qrKCQKjygDlXIQV2r0IF6ViEBxVTBBSFUQQNhVYkHIVeJAtkNsbQ7c1LtzP6FsObhb2rCKv7NBIGoq4SDmKoEgTirXAcJVGkFSVVpgoSrXICGUMUH/QBZNSUy5XWUhwAAAABJRU5ErkJggg==")}.DayPicker-NavButton--interactionDisabled{display:none}.DayPicker-Caption{display:table-caption;margin-bottom:.5em;padding:0 .5em;text-align:left}.DayPicker-Caption>div{font-weight:500;font-size:1.15em}.DayPicker-Weekdays{display:table-header-group;margin-top:1em}.DayPicker-WeekdaysRow{display:table-row}.DayPicker-Weekday{display:table-cell;padding:.5em;color:#8b9898;text-align:center;font-size:.875em}.DayPicker-Weekday abbr[title]{border-bottom:none;text-decoration:none}.DayPicker-Body{display:table-row-group}.DayPicker-Week{display:table-row}.DayPicker-Day{border-radius:50%;text-align:center}.DayPicker-Day,.DayPicker-WeekNumber{display:table-cell;padding:.5em;vertical-align:middle;cursor:pointer}.DayPicker-WeekNumber{min-width:1em;border-right:1px solid #eaecec;color:#8b9898;text-align:right;font-size:.75em}.DayPicker--interactionDisabled .DayPicker-Day{cursor:default}.DayPicker-Footer{padding-top:.5em}.DayPicker-TodayButton{border:none;background-color:transparent;background-image:none;box-shadow:none;color:#4a90e2;font-size:.875em;cursor:pointer}.DayPicker-Day--today{color:#d0021b;font-weight:700}.DayPicker-Day--outside{color:#8b9898;cursor:default}.DayPicker-Day--disabled{color:#dce0e0;cursor:default}.DayPicker-Day--sunday{background-color:#f7f8f8}.DayPicker-Day--sunday:not(.DayPicker-Day--today){color:#dce0e0}.DayPicker-Day--selected:not(.DayPicker-Day--disabled):not(.DayPicker-Day--outside){position:relative;background-color:#4a90e2;color:#f0f8ff}.DayPicker-Day--selected:not(.DayPicker-Day--disabled):not(.DayPicker-Day--outside):hover{background-color:#51a0fa}.DayPicker:not(.DayPicker--interactionDisabled) .DayPicker-Day:not(.DayPicker-Day--disabled):not(.DayPicker-Day--selected):not(.DayPicker-Day--outside):hover{background-color:#f0f8ff}.DayPickerInput{display:inline-block}.DayPickerInput-OverlayWrapper{position:relative}.DayPickerInput-Overlay{position:absolute;left:0;z-index:1;background:#fff;box-shadow:0 2px 5px rgba(0,0,0,.15)}
13
+ .tribe-editor__day-picker-input.DayPickerInput>input{border:1px solid #e1e3e6;color:#545d66;font-size:16px;line-height:24px;padding:7px 15px;width:100%;height:40px}.tribe-editor__day-picker-input.DayPickerInput>input:disabled{color:#aeb4bb}.tribe-editor__day-picker-input .DayPickerInput-Overlay{padding:20px;z-index:10}.tribe-editor__day-picker-input .DayPicker{width:100%}.tribe-editor__day-picker-input .DayPicker-Month{margin:0}.tribe-editor__day-picker-input .DayPicker-Caption>div,.tribe-editor__day-picker-input .DayPicker-Day,.tribe-editor__day-picker-input .DayPicker-Weekday{color:#545d66;font-family:Helvetica,"sans-serif";font-weight:400}.tribe-editor__day-picker-input .DayPicker-Caption>div{font-size:16px;margin-bottom:12px;text-align:center}.tribe-editor__day-picker-input .DayPicker-Weekday{font-size:12px}.tribe-editor__day-picker-input .DayPicker-Day{font-size:14px}.tribe-editor__day-picker-input .DayPicker-Day:hover{color:#007bb4;background-color:#fff}.tribe-editor__day-picker-input .DayPicker-Day--today{color:#545d66}.tribe-editor__day-picker-input .DayPicker-Day--disabled{pointer-events:none;color:#ccc}.tribe-editor__day-picker-input .DayPicker-Day--selected:not(.DayPicker-Day--outside){border-radius:0;background-color:#009fd4;color:#fff}.tribe-editor__day-picker-input .DayPicker-Day--selected:not(.DayPicker-Day--outside):hover{background-color:#007bb4;color:#fff}.tribe-editor__day-picker-input .DayPicker-NavButton--prev{left:0;top:0}.tribe-editor__day-picker-input .DayPicker-NavButton--next{right:0;top:0}.tribe-editor__day-picker-input .DayPicker:not(.DayPicker--interactionDisabled) .DayPicker-Day:not(.DayPicker-Day--disabled):not(.DayPicker-Day--selected):not(.DayPicker-Day--outside):hover{background-color:#fff}.tribe-editor__day-picker-input .DayPicker-Day--selected:not(.DayPicker-Day--start):not(.DayPicker-Day--end):not(.DayPicker-Day--outside){background-color:#e7f5fa;color:#545d66}.tribe-editor__day-picker-input .DayPicker-Day--selected:not(.DayPicker-Day--start):not(.DayPicker-Day--end):not(.DayPicker-Day--outside):hover{color:#007bb4}
14
+ .tribe-editor__creatable-select .tribe-editor__creatable-select__control{height:40px;border:1px solid #e1e3e6;border-radius:3px;background-color:#fff}.tribe-editor__creatable-select .tribe-editor__creatable-select__control:hover{border:1px solid #e1e3e6}.tribe-editor__creatable-select .tribe-editor__creatable-select__control--is-focused{box-shadow:none}.tribe-editor__creatable-select .tribe-editor__creatable-select__value-container{padding:2px 5px 2px 15px}.tribe-editor__creatable-select .tribe-editor__creatable-select__single-value{margin:0;max-width:calc(100% - 15px);font-size:16px;line-height:1.5}.tribe-editor__creatable-select .tribe-editor__creatable-select__input{font-size:16px}.tribe-editor__creatable-select .tribe-editor__creatable-select__input>input{margin:0;line-height:1.5}.tribe-editor__creatable-select .tribe-editor__creatable-select__input>input,.tribe-editor__creatable-select .tribe-editor__creatable-select__input>input:focus{box-shadow:none}.tribe-editor__creatable-select svg.tribe-editor__creatable-select__dropdown-indicator{fill:#555d66}.tribe-editor__creatable-select .tribe-editor__creatable-select__menu{margin:0;border:1px solid #e1e3e6;border-top:none;border-radius:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px;box-shadow:none;-webkit-transform:translateY(-7px);transform:translateY(-7px)}.tribe-editor__creatable-select .tribe-editor__creatable-select__menu-list{padding:0}.tribe-editor__creatable-select .tribe-editor__creatable-select__option{font-size:16px;line-height:1.5;padding:3px 15px}.tribe-editor__creatable-select .tribe-editor__creatable-select__option--is-focused{background-color:#e7f5fa}.tribe-editor__creatable-select .tribe-editor__creatable-select__option--is-selected{background-color:#11a0d2}
15
+ .tribe-editor__placeholder{border:2px dashed #e1e3e6;padding:12px 15px 14px;text-align:center;font-family:Helvetica,Arial,"sans-serif";font-size:1rem;line-height:1.5;font-weight:700;color:#8d949b;min-width:260px;display:inline-block}
16
+ .tribe-editor__heading{font-family:Helvetica,Arial,"sans-serif";color:#000}.tribe-editor__heading--h1{font-size:2.375rem}.tribe-editor__heading--h2{font-size:1.3125rem}.tribe-editor__heading--h3{font-size:1rem}
17
+ .tribe-editor__paragraph{font-family:Helvetica,Arial,"sans-serif";line-height:1.5;font-weight:400}.tribe-editor__paragraph--medium{font-size:1rem}.tribe-editor__paragraph--small{font-size:.875rem}.tribe-editor__paragraph a{color:#11a0d2}.tribe-editor__paragraph a:hover{text-decoration:none;color:#007bb4}
18
+ input[type=checkbox].tribe-editor__input--checkbox{background-color:#fff;border:1px solid #e0e5e9;border-radius:0}input[type=checkbox].tribe-editor__input--checkbox:focus{border:1px solid #e0e5e9;box-shadow:0 0 0 1px #e0e5e9}input[type=checkbox].tribe-editor__input--checkbox:checked{background-color:#fff;border:1px solid #e0e5e9}input[type=checkbox].tribe-editor__input--checkbox:checked:focus{border:1px solid #e0e5e9;box-shadow:0 0 0 1px #e0e5e9}input[type=checkbox].tribe-editor__input--checkbox:checked:before{color:#11a0d2}
19
+ .tribe-editor__select .tribe-editor__select__control{height:46px;border:1px solid #e1e3e6;border-radius:3px;background-color:#fff}.tribe-editor__select .tribe-editor__select__control:hover{border:1px solid #e1e3e6}.tribe-editor__select .tribe-editor__select__control--is-focused{box-shadow:none}.tribe-editor__select .tribe-editor__select__value-container{padding:2px 10px 2px 15px}.tribe-editor__select .tribe-editor__select__single-value{margin:0;max-width:calc(100% - 15px);font-size:16px;line-height:1.5}.tribe-editor__select .tribe-editor__select__input{font-size:16px}.tribe-editor__select .tribe-editor__select__input>input{margin:0;line-height:1.5}.tribe-editor__select svg.tribe-editor__select__dropdown-indicator{fill:#555d66}.tribe-editor__select .tribe-editor__select__menu{margin:0;border:1px solid #e1e3e6;border-top:none;border-radius:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px;box-shadow:none;-webkit-transform:translateY(-7px);transform:translateY(-7px);z-index:10}.tribe-editor__select .tribe-editor__select__menu-list{padding:0}.tribe-editor__select .tribe-editor__select__option{font-size:16px;line-height:1.5;padding:3px 15px}.tribe-editor__select .tribe-editor__select__option--is-focused{background-color:#e7f5fa}.tribe-editor__select .tribe-editor__select__option--is-selected{background-color:#11a0d2}.tribe-editor__select--is-disabled svg.tribe-editor__select__dropdown-indicator{fill:#aeb4bb}
20
+ .post-type-tribe_events .editor-styles-wrapper{max-width:none!important}
common/src/resources/css/bumpdown.css ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ /* = Bumpdown CSS
12
+ =============================================*/
13
+ .wrap .tribe-bumpdown,
14
+ .tribe-bumpdown,
15
+ .tribe-bumpdown-cell.tribe-bumpdown {
16
+ display: none;
17
+ margin: 1rem 0;
18
+ }
19
+ .wrap .tribe-bumpdown .tribe-bumpdown-content, .tribe-bumpdown .tribe-bumpdown-content, .tribe-bumpdown-cell.tribe-bumpdown .tribe-bumpdown-content {
20
+ background: #f1f1f1;
21
+ padding: 10px 35px 10px 10px;
22
+ font-size: 12px;
23
+ position: relative;
24
+ }
25
+ .tribe-bumpdown-cell.tribe-bumpdown {
26
+ padding: 0;
27
+ }
28
+ #poststuff .tribe-bumpdown h1,
29
+ #poststuff .tribe-bumpdown h2,
30
+ #poststuff .tribe-bumpdown h3,
31
+ #poststuff .tribe-bumpdown h4,
32
+ .tribe-bumpdown h1,
33
+ .tribe-bumpdown h2,
34
+ .tribe-bumpdown h3,
35
+ .tribe-bumpdown h4 {
36
+ padding-left: 0;
37
+ padding-top: 0;
38
+ }
39
+ .tribe-bumpdown-arrow {
40
+ position: absolute;
41
+ width: 0;
42
+ height: 0;
43
+ top: -11px;
44
+ margin-left: -18px;
45
+ border-left: 8px solid transparent;
46
+ border-right: 8px solid transparent;
47
+
48
+ border-bottom: 11px solid #f1f1f1;
49
+ }
50
+ .tribe-bumpdown-close {
51
+ color: #686868;
52
+ cursor: pointer;
53
+ position: absolute;
54
+ right: .5rem;
55
+ top: .5rem;
56
+ z-index: 2;
57
+ }
58
+ .tribe-bumpdown-trigger .target {
59
+ color: #0074a2;
60
+ }
61
+ @media screen and (max-width: 782px) {
62
+ .wrap td.tribe-bumpdown {
63
+ padding-right: 35px;
64
+ }
65
+
66
+ .tribe-bumpdown-arrow {
67
+ margin-left: -15px;
68
+ }
69
+ }
common/src/resources/css/buttonset.css ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ .tribe-buttonset .tribe-button-field {
12
+ background-color: #f7f7f7;
13
+ }
14
+
15
+ .tribe-button-field {
16
+ color: #444;
17
+ cursor: pointer;
18
+ display: inline-block;
19
+ text-decoration: none;
20
+ font-size: 13px;
21
+ line-height: 26px;
22
+ height: 28px;
23
+ margin: 0 0 3px;
24
+ padding: 0 10px 1px;
25
+ background-color: #fff;
26
+ border-width: 1px;
27
+ border-style: solid;
28
+ border-color: #ddd;
29
+ -webkit-appearance: none;
30
+ border-radius: 3px;
31
+ white-space: nowrap;
32
+ box-sizing: border-box;
33
+ }
34
+
35
+ .tribe-button-field.tribe-active {
36
+ color: #fff;
37
+ background-color: #585858;
38
+ border-color: #585858;
39
+ }
common/src/resources/css/common-full.css ADDED
@@ -0,0 +1,2319 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ /*
12
+ * Common Full CSS
13
+ *
14
+ * DO NOT EDIT THIS CSS FILE DIRECTLY.
15
+ * -------------------------------------------------------------
16
+ * This file is just a clearing-house, see the pcss directory
17
+ * and edit the source files found there.
18
+ */
19
+
20
+ /* Reset */
21
+
22
+ /* -----------------------------------------------------------------------------
23
+ *
24
+ * Resets Full
25
+ *
26
+ * This file is just a clearing-house.
27
+ * Make partials (start with an underscore) for any actual css code.
28
+ *
29
+ * ----------------------------------------------------------------------------- */
30
+
31
+ /* Reset */
32
+
33
+ /* -----------------------------------------------------------------------------
34
+ *
35
+ * Normalize "Light"
36
+ *
37
+ * ----------------------------------------------------------------------------- */
38
+
39
+ .tribe-common figure {
40
+ line-height: 0;
41
+ }
42
+
43
+ .tribe-common figcaption {
44
+ line-height: normal;
45
+ }
46
+
47
+ .tribe-common a {
48
+ background-color: transparent;
49
+ -webkit-text-decoration-skip: objects;
50
+ }
51
+
52
+ .tribe-common abbr[title] {
53
+ border-bottom: none;
54
+ text-decoration: underline;
55
+ -webkit-text-decoration: underline dotted;
56
+ text-decoration: underline dotted;
57
+ }
58
+
59
+ .tribe-common code,
60
+ .tribe-common kbd,
61
+ .tribe-common pre,
62
+ .tribe-common samp {
63
+ font-family: monospace;
64
+ font-size: 1em;
65
+ }
66
+
67
+ .tribe-common b,
68
+ .tribe-common strong {
69
+ font-weight: inherit;
70
+ font-weight: bolder;
71
+ }
72
+
73
+ .tribe-common dfn {
74
+ font-style: italic;
75
+ }
76
+
77
+ .tribe-common mark {
78
+ background-color: #ff0;
79
+ color: #000;
80
+ }
81
+
82
+ .tribe-common small {
83
+ font-size: 80%;
84
+ }
85
+
86
+ .tribe-common sub,
87
+ .tribe-common sup {
88
+ font-size: 75%;
89
+ line-height: 0;
90
+ }
91
+
92
+ .tribe-common hr {
93
+ border: 0;
94
+ height: 0;
95
+ }
96
+
97
+ /* Input: Kill browser input chrome */
98
+
99
+ .tribe-common input[type="text"],
100
+ .tribe-common input[type="email"],
101
+ .tribe-common input[type="url"],
102
+ .tribe-common input[type="search"],
103
+ .tribe-common input[type="submit"],
104
+ .tribe-common input[type="password"],
105
+ .tribe-common input[type="reset"],
106
+ .tribe-common input[type="button"],
107
+ .tribe-common button,
108
+ .tribe-common textarea {
109
+ -webkit-appearance: none;
110
+ -moz-appearance: none;
111
+ appearance: none;
112
+ }
113
+
114
+ .tribe-common input,
115
+ .tribe-common button,
116
+ .tribe-common select,
117
+ .tribe-common textarea,
118
+ .tribe-common optgroup {
119
+ color: inherit;
120
+ font: inherit;
121
+ line-height: normal;
122
+ -webkit-font-smoothing: antialiased;
123
+ }
124
+
125
+ .tribe-common input,
126
+ .tribe-common button,
127
+ .tribe-common select,
128
+ .tribe-common textarea {
129
+ outline: 0;
130
+ border-radius: 0;
131
+ }
132
+
133
+ .tribe-common select:-moz-focusring {
134
+ color: transparent;
135
+ text-shadow: 0 0 0 #000;
136
+ }
137
+
138
+ .tribe-common optgroup {
139
+ font-weight: bold;
140
+ }
141
+
142
+ /* -----------------------------------------------------------------------------
143
+ *
144
+ * Reset "Light"
145
+ *
146
+ * ----------------------------------------------------------------------------- */
147
+
148
+ .tribe-common h1,
149
+ .tribe-common h2,
150
+ .tribe-common h3,
151
+ .tribe-common h4,
152
+ .tribe-common h5,
153
+ .tribe-common h6,
154
+ .tribe-common p {
155
+ font-weight: normal;
156
+ text-rendering: optimizeLegibility;
157
+ }
158
+
159
+ /* Theme Overrides */
160
+
161
+ /* .tribe-theme-avada { */
162
+
163
+ /* -------------------------------------------------------------------------
164
+ * Reset Full Theme Overrides - Avada
165
+ * ------------------------------------------------------------------------- */
166
+
167
+ /* } */
168
+
169
+ /* .tribe-theme-divi { */
170
+
171
+ /* -------------------------------------------------------------------------
172
+ * Reset Full Theme Overrides - Divi
173
+ * ------------------------------------------------------------------------- */
174
+
175
+ /* } */
176
+
177
+ /* -------------------------------------------------------------------------
178
+ * Reset Full Theme Overrides - Enfold
179
+ * ------------------------------------------------------------------------- */
180
+
181
+ #top.tribe-theme-enfold .tribe-common button[disabled], #top .main_color .tribe-common button[disabled] {
182
+ opacity: 1;
183
+ }
184
+
185
+ /* .tribe-theme-genesis { */
186
+
187
+ /* -------------------------------------------------------------------------
188
+ * Reset Full Theme Overrides - Genesis
189
+ * ------------------------------------------------------------------------- */
190
+
191
+ /* } */
192
+
193
+ /* -------------------------------------------------------------------------
194
+ * Reset Full Theme Overrides - Twenty Nineteen
195
+ * ------------------------------------------------------------------------- */
196
+
197
+ .tribe-theme-twentynineteen .tribe-common h1:before, .tribe-theme-twentynineteen .tribe-common h2:before {
198
+ content: none;
199
+ }
200
+
201
+ .tribe-theme-twentynineteen .tribe-common button,
202
+ .tribe-theme-twentynineteen .tribe-common input[type="button"],
203
+ .tribe-theme-twentynineteen .tribe-common input[type="reset"],
204
+ .tribe-theme-twentynineteen .tribe-common input[type="submit"] {
205
+ outline: none;
206
+ }
207
+
208
+ .tribe-theme-twentynineteen .tribe-common th,
209
+ .tribe-theme-twentynineteen .tribe-common td {
210
+ word-break: normal;
211
+ }
212
+
213
+ /* -------------------------------------------------------------------------
214
+ * Reset Full Theme Overrides - Twenty Seventeen
215
+ * ------------------------------------------------------------------------- */
216
+
217
+ .tribe-theme-twentyseventeen .tribe-common h5 {
218
+ letter-spacing: normal;
219
+ text-transform: none;
220
+ }
221
+
222
+ .tribe-theme-twentyseventeen .tribe-common input[type="text"] {
223
+ border-radius: 0;
224
+ }
225
+
226
+ .tribe-theme-twentytwenty .tribe-common {
227
+
228
+ /* -------------------------------------------------------------------------
229
+ * Reset Full Theme Overrides - Twenty Twenty
230
+ * ------------------------------------------------------------------------- */
231
+ background-color: #FFFFFF;
232
+ letter-spacing: normal;
233
+ }
234
+
235
+ .tribe-theme-twentytwenty .tribe-common input,
236
+ .tribe-theme-twentytwenty .tribe-common textarea {
237
+ letter-spacing: normal;
238
+ }
239
+
240
+ .tribe-theme-twentytwenty .tribe-common * {
241
+ word-break: normal;
242
+ }
243
+
244
+ /* Utilities */
245
+
246
+ /* -----------------------------------------------------------------------------
247
+ *
248
+ * Utilities
249
+ *
250
+ * This file is just a clearing-house.
251
+ * Make partials (start with an underscore) for any actual css code.
252
+ *
253
+ * ----------------------------------------------------------------------------- */
254
+
255
+ /* Variables */
256
+
257
+ :root {
258
+ /* -----------------------------------------------------------------------------
259
+ * Borders - Radius
260
+ * ----------------------------------------------------------------------------- */
261
+
262
+ /* -----------------------------------------------------------------------------
263
+ * Borders - Width
264
+ * ----------------------------------------------------------------------------- */
265
+ }
266
+
267
+ :root {
268
+ /* -----------------------------------------------------------------------------
269
+ * Box Shadows
270
+ * ----------------------------------------------------------------------------- */
271
+ }
272
+
273
+ :root {
274
+ /* -----------------------------------------------------------------------------
275
+ * Layers of z-index
276
+ * ----------------------------------------------------------------------------- */
277
+ }
278
+
279
+ :root {
280
+ /* -----------------------------------------------------------------------------
281
+ * Colors - Typography
282
+ * ----------------------------------------------------------------------------- */
283
+
284
+ /* -----------------------------------------------------------------------------
285
+ * Colors - Iconography
286
+ * ----------------------------------------------------------------------------- */
287
+
288
+ /* -----------------------------------------------------------------------------
289
+ * Colors - UI
290
+ * ----------------------------------------------------------------------------- */
291
+
292
+ /* -----------------------------------------------------------------------------
293
+ * Colors - Borders & Misc
294
+ * ----------------------------------------------------------------------------- */
295
+
296
+ }
297
+
298
+ :root {
299
+ /* -----------------------------------------------------------------------------
300
+ * Forms - Colors
301
+ * ----------------------------------------------------------------------------- */
302
+
303
+ /* -----------------------------------------------------------------------------
304
+ * Forms - Box Shadows
305
+ * ----------------------------------------------------------------------------- */
306
+ }
307
+
308
+ :root {
309
+ /* -----------------------------------------------------------------------------
310
+ * Gutter - Default
311
+ * ----------------------------------------------------------------------------- */
312
+
313
+ /* -----------------------------------------------------------------------------
314
+ * Gutter - Page
315
+ * ----------------------------------------------------------------------------- */
316
+
317
+ /* -----------------------------------------------------------------------------
318
+ * Grid Width - Default
319
+ * ----------------------------------------------------------------------------- */
320
+
321
+ /* -----------------------------------------------------------------------------
322
+ * Grid Width - Relative
323
+ * ----------------------------------------------------------------------------- */
324
+ }
325
+
326
+ :root {
327
+ /* -----------------------------------------------------------------------------
328
+ * Opacities
329
+ * ----------------------------------------------------------------------------- */
330
+ }
331
+
332
+ :root {
333
+ /* -----------------------------------------------------------------------------
334
+ * Spacers
335
+ * ----------------------------------------------------------------------------- */
336
+ }
337
+
338
+ /* -----------------------------------------------------------------------------
339
+ * SVG - Arrow Right
340
+ * ----------------------------------------------------------------------------- */
341
+
342
+ /* -----------------------------------------------------------------------------
343
+ * SVG - Caret Down
344
+ * ----------------------------------------------------------------------------- */
345
+
346
+ /* -----------------------------------------------------------------------------
347
+ * SVG - Caret Left
348
+ * ----------------------------------------------------------------------------- */
349
+
350
+ /* -----------------------------------------------------------------------------
351
+ * SVG - Caret Right
352
+ * ----------------------------------------------------------------------------- */
353
+
354
+ /* -----------------------------------------------------------------------------
355
+ * SVG - Caret Up
356
+ * ----------------------------------------------------------------------------- */
357
+
358
+ /* -----------------------------------------------------------------------------
359
+ * SVG - Check
360
+ * ----------------------------------------------------------------------------- */
361
+
362
+ /* -----------------------------------------------------------------------------
363
+ * SVG - Close
364
+ * ----------------------------------------------------------------------------- */
365
+
366
+ /* -----------------------------------------------------------------------------
367
+ * SVG - Day
368
+ * ----------------------------------------------------------------------------- */
369
+
370
+ /* -----------------------------------------------------------------------------
371
+ * SVG - Dropdown
372
+ * ----------------------------------------------------------------------------- */
373
+
374
+ /* -----------------------------------------------------------------------------
375
+ * SVG - Featured
376
+ * ----------------------------------------------------------------------------- */
377
+
378
+ /* -----------------------------------------------------------------------------
379
+ * SVG - Filters
380
+ * ----------------------------------------------------------------------------- */
381
+
382
+ /* -----------------------------------------------------------------------------
383
+ * SVG - Link
384
+ * ----------------------------------------------------------------------------- */
385
+
386
+ /* -----------------------------------------------------------------------------
387
+ * SVG - List
388
+ * ----------------------------------------------------------------------------- */
389
+
390
+ /* -----------------------------------------------------------------------------
391
+ * SVG - Location
392
+ * ----------------------------------------------------------------------------- */
393
+
394
+ /* -----------------------------------------------------------------------------
395
+ * SVG - Mail
396
+ * ----------------------------------------------------------------------------- */
397
+
398
+ /* -----------------------------------------------------------------------------
399
+ * SVG - Map
400
+ * ----------------------------------------------------------------------------- */
401
+
402
+ /* -----------------------------------------------------------------------------
403
+ * SVG - Map pin
404
+ * ----------------------------------------------------------------------------- */
405
+
406
+ /* -----------------------------------------------------------------------------
407
+ * SVG - Messages
408
+ * ----------------------------------------------------------------------------- */
409
+
410
+ /* -----------------------------------------------------------------------------
411
+ * SVG - Month
412
+ * ----------------------------------------------------------------------------- */
413
+
414
+ /* -----------------------------------------------------------------------------
415
+ * SVG - No Map
416
+ * ----------------------------------------------------------------------------- */
417
+
418
+ /* -----------------------------------------------------------------------------
419
+ * SVG - Phone
420
+ * ----------------------------------------------------------------------------- */
421
+
422
+ /* -----------------------------------------------------------------------------
423
+ * SVG - Photo
424
+ * ----------------------------------------------------------------------------- */
425
+
426
+ /* -----------------------------------------------------------------------------
427
+ * SVG - Plus
428
+ * ----------------------------------------------------------------------------- */
429
+
430
+ /* -----------------------------------------------------------------------------
431
+ * SVG - Recurring
432
+ * ----------------------------------------------------------------------------- */
433
+
434
+ /* -----------------------------------------------------------------------------
435
+ * SVG - Reset
436
+ * ----------------------------------------------------------------------------- */
437
+
438
+ /* -----------------------------------------------------------------------------
439
+ * SVG - Search
440
+ * ----------------------------------------------------------------------------- */
441
+
442
+ /* -----------------------------------------------------------------------------
443
+ * SVG - Search Filter
444
+ * ----------------------------------------------------------------------------- */
445
+
446
+ /* -----------------------------------------------------------------------------
447
+ * SVG - Week
448
+ * ----------------------------------------------------------------------------- */
449
+
450
+ :root {
451
+ /* -----------------------------------------------------------------------------
452
+ * Transitions
453
+ * ----------------------------------------------------------------------------- */
454
+ }
455
+
456
+ :root {
457
+ /* -----------------------------------------------------------------------------
458
+ * Font Stacks
459
+ * ----------------------------------------------------------------------------- */
460
+
461
+ /* -----------------------------------------------------------------------------
462
+ * Font Weights
463
+ * ----------------------------------------------------------------------------- */
464
+
465
+ /* -----------------------------------------------------------------------------
466
+ * Font Sizing
467
+ * ----------------------------------------------------------------------------- */
468
+
469
+ /* -----------------------------------------------------------------------------
470
+ * Line Height
471
+ * ----------------------------------------------------------------------------- */
472
+ }
473
+
474
+ /* Mixins */
475
+
476
+ /* -----------------------------------------------------------------------------
477
+ * Body
478
+ * ----------------------------------------------------------------------------- */
479
+
480
+ /* -----------------------------------------------------------------------------
481
+ * Desktop Body 1
482
+ * ----------------------------------------------------------------------------- */
483
+
484
+ /* -----------------------------------------------------------------------------
485
+ * Desktop Body 2
486
+ * ----------------------------------------------------------------------------- */
487
+
488
+ /* -----------------------------------------------------------------------------
489
+ * Desktop Body 3
490
+ * ----------------------------------------------------------------------------- */
491
+
492
+ /* -----------------------------------------------------------------------------
493
+ * Mobile Body 1
494
+ * ----------------------------------------------------------------------------- */
495
+
496
+ /* -----------------------------------------------------------------------------
497
+ * Mobile Body 2
498
+ * ----------------------------------------------------------------------------- */
499
+
500
+ /* -----------------------------------------------------------------------------
501
+ * Mobile Body 3
502
+ * ----------------------------------------------------------------------------- */
503
+
504
+ /* -----------------------------------------------------------------------------
505
+ * Heading
506
+ * ----------------------------------------------------------------------------- */
507
+
508
+ /* -----------------------------------------------------------------------------
509
+ * Heading 1
510
+ * ----------------------------------------------------------------------------- */
511
+
512
+ /* -----------------------------------------------------------------------------
513
+ * Heading 2
514
+ * ----------------------------------------------------------------------------- */
515
+
516
+ /* -----------------------------------------------------------------------------
517
+ * Heading 3
518
+ * ----------------------------------------------------------------------------- */
519
+
520
+ /* -----------------------------------------------------------------------------
521
+ * Heading 4
522
+ * ----------------------------------------------------------------------------- */
523
+
524
+ /* -----------------------------------------------------------------------------
525
+ * Heading 5
526
+ * ----------------------------------------------------------------------------- */
527
+
528
+ /* -----------------------------------------------------------------------------
529
+ * Heading 6
530
+ * ----------------------------------------------------------------------------- */
531
+
532
+ /* -----------------------------------------------------------------------------
533
+ * Heading 7
534
+ * ----------------------------------------------------------------------------- */
535
+
536
+ /* -----------------------------------------------------------------------------
537
+ * Heading 8
538
+ * ----------------------------------------------------------------------------- */
539
+
540
+ /* -----------------------------------------------------------------------------
541
+ * Anchor - Default
542
+ * ----------------------------------------------------------------------------- */
543
+
544
+ /* -----------------------------------------------------------------------------
545
+ * Anchor - Alt
546
+ * ----------------------------------------------------------------------------- */
547
+
548
+ /* -----------------------------------------------------------------------------
549
+ * Anchor - Thin
550
+ * ----------------------------------------------------------------------------- */
551
+
552
+ /* -----------------------------------------------------------------------------
553
+ * Anchor - Thin
554
+ * ----------------------------------------------------------------------------- */
555
+
556
+ /* -----------------------------------------------------------------------------
557
+ * Button - Global
558
+ * ----------------------------------------------------------------------------- */
559
+
560
+ /* -----------------------------------------------------------------------------
561
+ * Button - Solid
562
+ * ----------------------------------------------------------------------------- */
563
+
564
+ /* -----------------------------------------------------------------------------
565
+ * Button - Border
566
+ * ----------------------------------------------------------------------------- */
567
+
568
+ /* -----------------------------------------------------------------------------
569
+ * Button - Icon Border
570
+ * ----------------------------------------------------------------------------- */
571
+
572
+ /* -----------------------------------------------------------------------------
573
+ * Sliders & Toggles
574
+ * ----------------------------------------------------------------------------- */
575
+
576
+ /* -----------------------------------------------------------------------------
577
+ * Sliders
578
+ * ----------------------------------------------------------------------------- */
579
+
580
+ /* -----------------------------------------------------------------------------
581
+ * Hidden: Hide from both screenreaders and browsers
582
+ * @author: h5bp.com/u
583
+ * ----------------------------------------------------------------------------- */
584
+
585
+ /* -----------------------------------------------------------------------------
586
+ * Visually Hide: Hide only visually, but have it available for screenreaders
587
+ * @author: h5bp.com/v
588
+ * ----------------------------------------------------------------------------- */
589
+
590
+ /* -----------------------------------------------------------------------------
591
+ * Visually Show: Show element after has been hidden with %visually-hide
592
+ * ----------------------------------------------------------------------------- */
593
+
594
+ /* Base */
595
+
596
+ /* -----------------------------------------------------------------------------
597
+ *
598
+ * Base Full
599
+ *
600
+ * This file is just a clearing-house.
601
+ * Make partials (start with an underscore) for any actual css code.
602
+ *
603
+ * ----------------------------------------------------------------------------- */
604
+
605
+ /* Forms */
606
+
607
+ .tribe-common {
608
+
609
+ /* -----------------------------------------------------------------------------
610
+ *
611
+ * Form Control: Checkboxes & Radios Theme Overrides
612
+ *
613
+ * ----------------------------------------------------------------------------- */
614
+
615
+ /* -----------------------------------------------------------------------------
616
+ * Form Control: Checkboxes Theme Overrides
617
+ * ----------------------------------------------------------------------------- */
618
+
619
+ /* -----------------------------------------------------------------------------
620
+ * Form Control: Radios Theme Overrides
621
+ * ----------------------------------------------------------------------------- */
622
+ }
623
+
624
+ /* -----------------------------------------------------------------------------
625
+ *
626
+ * Form Control: Checkboxes & Radios
627
+ *
628
+ * Example (Checkboxes):
629
+ * <fieldset>
630
+ * <legend>Legend for Checkboxes</legend>
631
+ * <div class="tribe-common-form-control-checkbox-radio-group">
632
+ * <div class="tribe-common-form-control-checkbox">
633
+ * <input
634
+ * class="tribe-common-form-control-checkbox__input"
635
+ * id="checkboxOne"
636
+ * name="checkboxGroup"
637
+ * type="checkbox"
638
+ * value="checkboxOne"
639
+ * checked="checked"
640
+ * />
641
+ * <label
642
+ * class="tribe-common-form-control-checkbox__label"
643
+ * for="checkboxOne"
644
+ * >
645
+ * Checkbox One
646
+ * </label>
647
+ * </div>
648
+ * <div class="tribe-common-form-control-checkbox">
649
+ * <input
650
+ * class="tribe-common-form-control-checkbox__input"
651
+ * id="checkboxTwo"
652
+ * name="checkboxGroup"
653
+ * type="checkbox"
654
+ * value="checkboxTwo"
655
+ * />
656
+ * <label
657
+ * class="tribe-common-form-control-checkbox__label"
658
+ * for="checkboxTwo"
659
+ * >
660
+ * Checkbox Two
661
+ * </label>
662
+ * </div>
663
+ * </div>
664
+ * </fieldset>
665
+ *
666
+ * Example (Radios):
667
+ * <div class="tribe-common-form-control-checkbox-radio-group">
668
+ * <div class="tribe-common-form-control-radio">
669
+ * <input
670
+ * class="tribe-common-form-control-radio__input"
671
+ * id="radioExample"
672
+ * name="radioExample"
673
+ * type="radio"
674
+ * value="RadioExample"
675
+ * checked="checked"
676
+ * />
677
+ * <label
678
+ * class="tribe-common-form-control-radio__label"
679
+ * for="radioExample"
680
+ * >
681
+ * Radio Example
682
+ * </label>
683
+ * </div>
684
+ * </div>
685
+ *
686
+ * ----------------------------------------------------------------------------- */
687
+
688
+ .tribe-common .tribe-common-form-control-checkbox,
689
+ .tribe-common .tribe-common-form-control-radio {
690
+ line-height: 0;
691
+ }
692
+
693
+ .tribe-common .tribe-common-form-control-checkbox__label,
694
+ .tribe-common .tribe-common-form-control-radio__label {
695
+ color: #141827;
696
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
697
+ font-size: 14px;
698
+ line-height: 1.62;
699
+ font-weight: 400;
700
+
701
+ color: #5D5D5D;
702
+ }
703
+
704
+ .tribe-common .tribe-common-form-control-checkbox__input,
705
+ .tribe-common .tribe-common-form-control-radio__input {
706
+ -webkit-appearance: none;
707
+ -moz-appearance: none;
708
+ appearance: none;
709
+ background-color: #FFFFFF;
710
+ border: 1px solid #141827;
711
+ height: 20px;
712
+ position: relative;
713
+ width: 20px;
714
+ }
715
+
716
+ .tribe-common .tribe-common-form-control-checkbox__input:active,
717
+ .tribe-common .tribe-common-form-control-checkbox__input:focus,
718
+ .tribe-common .tribe-common-form-control-checkbox__input:hover,
719
+ .tribe-common .tribe-common-form-control-radio__input:active,
720
+ .tribe-common .tribe-common-form-control-radio__input:focus,
721
+ .tribe-common .tribe-common-form-control-radio__input:hover {
722
+ border: 1px solid #141827;
723
+ }
724
+
725
+ .tribe-common .tribe-common-form-control-checkbox__input:checked, .tribe-common .tribe-common-form-control-radio__input:checked {
726
+ background-color: #141827;
727
+ }
728
+
729
+ /* -----------------------------------------------------------------------------
730
+ * Form Control: Checkboxes
731
+ * ----------------------------------------------------------------------------- */
732
+
733
+ .tribe-common .tribe-common-form-control-checkbox__input:checked:before {
734
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='9' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.6.1L3.9 6.8 1.4 4.3c-.1-.1-.3-.1-.4 0l-.8.8c-.1.1-.1.3 0 .4l3.4 3.4c.2.1.4.1.5 0l7.7-7.7c.1-.1.1-.3 0-.4L11 .1c-.1-.1-.3-.1-.4 0z' fill='%23FFFFFF'/%3E%3C/svg%3E");
735
+ background-repeat: no-repeat;
736
+ background-size: contain;
737
+ content: '';
738
+ display: block;
739
+ height: 9px;
740
+ left: 50%;
741
+ position: absolute;
742
+ top: 50%;
743
+ -webkit-transform: translate(-50%, -50%);
744
+ transform: translate(-50%, -50%);
745
+ width: 12px;
746
+ }
747
+
748
+ /* -----------------------------------------------------------------------------
749
+ * Form Control: Radios
750
+ * ----------------------------------------------------------------------------- */
751
+
752
+ .tribe-common .tribe-common-form-control-radio__input {
753
+ border-radius: 50%;
754
+ }
755
+
756
+ .tribe-common .tribe-common-form-control-radio__input:checked:before {
757
+ background-color: #FFFFFF;
758
+ border-radius: 50%;
759
+ content: '';
760
+ display: block;
761
+ height: 8px;
762
+ left: 50%;
763
+ position: absolute;
764
+ top: 50%;
765
+ -webkit-transform: translate(-50%, -50%);
766
+ transform: translate(-50%, -50%);
767
+ width: 8px;
768
+ }
769
+
770
+ /* -----------------------------------------------------------------------------
771
+ * Theme Overrides - Enfold
772
+ * ----------------------------------------------------------------------------- */
773
+
774
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-checkbox__label, #top .main_color .tribe-common .tribe-common-form-control-checkbox__label {
775
+ font-weight: 400;
776
+ font-size: 14px;
777
+ }
778
+
779
+ /* -----------------------------------------------------------------------------
780
+ * Theme Overrides - Enfold
781
+ * ----------------------------------------------------------------------------- */
782
+
783
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-radio__label, #top .main_color .tribe-common .tribe-common-form-control-radio__label {
784
+ font-weight: 400;
785
+ font-size: 14px;
786
+ }
787
+
788
+ /* .tribe-common { */
789
+
790
+ /* -----------------------------------------------------------------------------
791
+ *
792
+ * Form Control: Groups (Checkbox & Radio)
793
+ *
794
+ * Example:
795
+ * <div class="tribe-common-form-control-checkbox-radio-group">
796
+ * <div class="tribe-common-form-control-checkbox">
797
+ * <input id="checkboxOne" name="checkboxGroup" type="checkbox" value="checkboxOne" checked="checked" />
798
+ * <label for="checkboxOne">Checkbox One</label>
799
+ * </div>
800
+ * <div class="tribe-common-form-control-checkbox">
801
+ * <input id="checkboxTwo" name="checkboxGroup" type="checkbox" value="checkboxTwo" />
802
+ * <label for="checkboxTwo">Checkbox two</label>
803
+ * </div>
804
+ * </div>
805
+ *
806
+ * ----------------------------------------------------------------------------- */
807
+
808
+ /* .tribe-common-form-control-checkbox-radio-group {} */
809
+
810
+ /* } */
811
+
812
+ .tribe-common {
813
+
814
+ /* -----------------------------------------------------------------------------
815
+ *
816
+ * Form Control: Sliders Theme Overrides
817
+ *
818
+ * ----------------------------------------------------------------------------- */
819
+ }
820
+
821
+ /* -----------------------------------------------------------------------------
822
+ *
823
+ * Form Control: Sliders
824
+ *
825
+ * Example (Horizontal):
826
+ * <div class="tribe-common-form-control-slider">
827
+ * <input
828
+ * class="tribe-common-form-control-slider__input"
829
+ * id="sliderOne"
830
+ * type="range"
831
+ * min="0"
832
+ * max="100"
833
+ * value="50"
834
+ * />
835
+ * <label class="tribe-common-form-control-slider__label" for="sliderOne">Slider One</label>
836
+ * </div>
837
+ *
838
+ * Example (Vertical):
839
+ * <div class="tribe-common-form-control-slider tribe-common-form-control-slider--vertical">
840
+ * <label class="tribe-common-form-control-slider__label" for="sliderOne">Slider One</label>
841
+ * <input
842
+ * class="tribe-common-form-control-slider__input"
843
+ * id="sliderOne"
844
+ * type="range"
845
+ * min="0"
846
+ * max="100"
847
+ * value="50"
848
+ * />
849
+ * </div>
850
+ *
851
+ * ----------------------------------------------------------------------------- */
852
+
853
+ .tribe-common .tribe-common-form-control-slider {
854
+ line-height: 0;
855
+ }
856
+
857
+ .tribe-common .tribe-common-form-control-slider__input {
858
+ -webkit-appearance: none;
859
+ -moz-appearance: none;
860
+ appearance: none;
861
+ background-color: transparent;
862
+ border: 0;
863
+ }
864
+
865
+ /* -----------------------------------------------------------------------------
866
+ * Track styles
867
+ * ----------------------------------------------------------------------------- */
868
+
869
+ .tribe-common .tribe-common-form-control-slider__input::-webkit-slider-runnable-track {
870
+ border: none;
871
+ border-radius: 5px;
872
+ height: 10px;
873
+ margin: 5px 0;
874
+ padding: 0;
875
+ position: relative;
876
+ -webkit-transition: background-color 0.2s ease;
877
+ transition: background-color 0.2s ease;
878
+ background-color: #334AFF;
879
+ }
880
+
881
+ .tribe-common .tribe-common-form-control-slider__input::-moz-range-track {
882
+ border: none;
883
+ border-radius: 5px;
884
+ height: 10px;
885
+ margin: 5px 0;
886
+ padding: 0;
887
+ position: relative;
888
+ -moz-transition: background-color 0.2s ease;
889
+ transition: background-color 0.2s ease;
890
+ background-color: #334AFF;
891
+ }
892
+
893
+ .tribe-common .tribe-common-form-control-slider__input::-ms-track {
894
+ background-color: transparent;
895
+ border-color: transparent;
896
+ border-width: 5px 0;
897
+ color: transparent;
898
+ height: 10px;
899
+ }
900
+
901
+ .tribe-common .tribe-common-form-control-slider__input::-ms-fill-lower,
902
+ .tribe-common .tribe-common-form-control-slider__input::-ms-fill-upper {
903
+ background-color: #334AFF;
904
+ border-radius: 10px;
905
+ }
906
+
907
+ /* -----------------------------------------------------------------------------
908
+ * Thumb styles
909
+ * ----------------------------------------------------------------------------- */
910
+
911
+ .tribe-common .tribe-common-form-control-slider__input::-webkit-slider-thumb {
912
+ background-color: #FFFFFF;
913
+ border: 1px solid #D5D5D5;
914
+ border-radius: 50%;
915
+ box-shadow: 0 2px 5px 0 rgba(0,0,0, 0.14);
916
+ height: 20px;
917
+ width: 20px;
918
+ margin-top: -5px;
919
+
920
+ -webkit-appearance: none;
921
+
922
+ appearance: none;
923
+ }
924
+
925
+ .tribe-common .tribe-common-form-control-slider__input::-moz-range-thumb {
926
+ background-color: #FFFFFF;
927
+ border: 1px solid #D5D5D5;
928
+ border-radius: 50%;
929
+ box-shadow: 0 2px 5px 0 rgba(0,0,0, 0.14);
930
+ height: 20px;
931
+ width: 20px;
932
+ margin-top: -5px;
933
+ }
934
+
935
+ .tribe-common .tribe-common-form-control-slider__input::-ms-thumb {
936
+ background-color: #FFFFFF;
937
+ border: 1px solid #D5D5D5;
938
+ border-radius: 50%;
939
+ box-shadow: 0 2px 5px 0 rgba(0,0,0, 0.14);
940
+ height: 20px;
941
+ width: 20px;
942
+ margin-top: -5px;
943
+
944
+ box-shadow: none;
945
+ margin-top: -1px;
946
+ }
947
+
948
+ .tribe-common .tribe-common-form-control-slider__label {
949
+ color: #141827;
950
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
951
+ font-size: 12px;
952
+ line-height: 1.38;
953
+ font-weight: 400;
954
+
955
+ color: #5D5D5D;
956
+ }
957
+
958
+ /* -----------------------------------------------------------------------------
959
+ * Theme Overrides - Enfold
960
+ * ----------------------------------------------------------------------------- */
961
+
962
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-slider__label, #top .main_color .tribe-common .tribe-common-form-control-slider__label {
963
+ font-weight: 400;
964
+ font-size: 12px;
965
+ }
966
+
967
+ .tribe-common {
968
+
969
+ /* -----------------------------------------------------------------------------
970
+ *
971
+ * Form Control: Text Theme Overrides
972
+ *
973
+ * ----------------------------------------------------------------------------- */
974
+ }
975
+
976
+ /* -----------------------------------------------------------------------------
977
+ *
978
+ * Form Control: Text
979
+ *
980
+ * Example:
981
+ * <div class="tribe-common-form-control-text">
982
+ * <label class="tribe-common-form-control-text__label" for="textInput">Text Input</label>
983
+ * <input
984
+ * class="tribe-common-form-control-text__input"
985
+ * id="textInput"
986
+ * name="textInput"
987
+ * type="text"
988
+ * placeholder="Text Input"
989
+ * />
990
+ * </div>
991
+ *
992
+ * ----------------------------------------------------------------------------- */
993
+
994
+ .tribe-common .tribe-common-form-control-text__input {
995
+ color: #141827;
996
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
997
+ font-size: 16px;
998
+ line-height: 1.62;
999
+ font-weight: 400;
1000
+
1001
+ border: 0;
1002
+ border-bottom: 1px solid #D5D5D5;
1003
+ }
1004
+
1005
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-form-control-text__input {
1006
+ color: #141827;
1007
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1008
+ font-size: 14px;
1009
+ line-height: 1.62;
1010
+ font-weight: 400;
1011
+
1012
+ border: 0;
1013
+ }
1014
+
1015
+ .tribe-common .tribe-common-form-control-text__input::-webkit-input-placeholder {
1016
+ color: #5D5D5D;
1017
+ font-style: normal;
1018
+ opacity: 1;
1019
+ }
1020
+
1021
+ .tribe-common .tribe-common-form-control-text__input::-moz-placeholder {
1022
+ color: #5D5D5D;
1023
+ font-style: normal;
1024
+ opacity: 1;
1025
+ }
1026
+
1027
+ .tribe-common .tribe-common-form-control-text__input:-ms-input-placeholder {
1028
+ color: #5D5D5D;
1029
+ font-style: normal;
1030
+ opacity: 1;
1031
+ }
1032
+
1033
+ .tribe-common .tribe-common-form-control-text__input::-ms-input-placeholder {
1034
+ color: #5D5D5D;
1035
+ font-style: normal;
1036
+ opacity: 1;
1037
+ }
1038
+
1039
+ .tribe-common .tribe-common-form-control-text__input::placeholder {
1040
+ color: #5D5D5D;
1041
+ font-style: normal;
1042
+ opacity: 1;
1043
+ }
1044
+
1045
+ .tribe-common .tribe-common-form-control-text__input:focus {
1046
+ border-bottom-color: #141827;
1047
+ outline: 0;
1048
+ }
1049
+
1050
+ /* -------------------------------------------------------------------------
1051
+ * Theme Overrides - Twenty Seventeen
1052
+ * ------------------------------------------------------------------------- */
1053
+
1054
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-form-control-text__input {
1055
+ color: #141827;
1056
+ }
1057
+
1058
+ /* -------------------------------------------------------------------------
1059
+ * Theme Overrides - Twenty Twenty
1060
+ * ------------------------------------------------------------------------- */
1061
+
1062
+ .tribe-theme-twentytwenty .tribe-common .tribe-common-form-control-text__input {
1063
+ line-height: inherit;
1064
+ }
1065
+
1066
+ /* -------------------------------------------------------------------------
1067
+ * Theme Overrides - Enfold
1068
+ * ------------------------------------------------------------------------- */
1069
+
1070
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-text__input, #top .main_color .tribe-common .tribe-common-form-control-text__input {
1071
+ color: #141827;
1072
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1073
+ font-size: 16px;
1074
+ line-height: 1.62;
1075
+ font-weight: 400;
1076
+
1077
+ background: #FFFFFF;
1078
+ border: 0;
1079
+ border-bottom: 1px solid #D5D5D5;
1080
+ }
1081
+
1082
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-text__input:focus, #top .main_color .tribe-common .tribe-common-form-control-text__input:focus {
1083
+ border-bottom-color: #141827;
1084
+ box-shadow: none;
1085
+ }
1086
+
1087
+ #top.tribe-theme-enfold .tribe-common.tribe-common--breakpoint-medium .tribe-common-form-control-text__input, #top .main_color .tribe-common.tribe-common--breakpoint-medium .tribe-common-form-control-text__input {
1088
+ color: #141827;
1089
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1090
+ font-size: 14px;
1091
+ line-height: 1.62;
1092
+ font-weight: 400;
1093
+
1094
+ border: 0;
1095
+ }
1096
+
1097
+ .tribe-common {
1098
+
1099
+ /* -----------------------------------------------------------------------------
1100
+ *
1101
+ * Form Control: Toggles Theme Overrides
1102
+ *
1103
+ * ----------------------------------------------------------------------------- */
1104
+ }
1105
+
1106
+ /* -----------------------------------------------------------------------------
1107
+ *
1108
+ * Form Control: Toggles
1109
+ *
1110
+ * Example (Horizontal):
1111
+ * <div class="tribe-common-form-control-toggle">
1112
+ * <input
1113
+ * class="tribe-common-form-control-toggle__input"
1114
+ * id="toggleOne"
1115
+ * name="toggleGroup"
1116
+ * type="checkbox"
1117
+ * value="toggleOne"
1118
+ * />
1119
+ * <label class="tribe-common-form-control-toggle__label" for="toggleOne">Toggle One</label>
1120
+ * </div>
1121
+ *
1122
+ * Example (Vertical):
1123
+ * <div class="tribe-common-form-control-toggle tribe-common-form-control-toggle--vertical">
1124
+ * <label class="tribe-common-form-control-toggle__label" for="toggleOne">Toggle One</label>
1125
+ * <input
1126
+ * class="tribe-common-form-control-toggle__input"
1127
+ * id="toggleOne"
1128
+ * name="toggleGroup"
1129
+ * type="checkbox"
1130
+ * value="toggleOne"
1131
+ * />
1132
+ * </div>
1133
+ *
1134
+ * ----------------------------------------------------------------------------- */
1135
+
1136
+ .tribe-common .tribe-common-form-control-toggle {
1137
+ line-height: 0;
1138
+ }
1139
+
1140
+ .tribe-common .tribe-common-form-control-toggle__input {
1141
+ border: none;
1142
+ border-radius: 5px;
1143
+ height: 10px;
1144
+ margin: 5px 0;
1145
+ padding: 0;
1146
+ position: relative;
1147
+ -webkit-transition: background-color 0.2s ease;
1148
+ transition: background-color 0.2s ease;
1149
+
1150
+ -webkit-appearance: none;
1151
+
1152
+ -moz-appearance: none;
1153
+
1154
+ appearance: none;
1155
+ background-color: #D5D5D5;
1156
+ width: 40px;
1157
+ }
1158
+
1159
+ .tribe-common .tribe-common-form-control-toggle__input:after {
1160
+ background-color: #FFFFFF;
1161
+ border: 1px solid #D5D5D5;
1162
+ border-radius: 50%;
1163
+ box-shadow: 0 2px 5px 0 rgba(0,0,0, 0.14);
1164
+ height: 20px;
1165
+ width: 20px;
1166
+
1167
+ content: '';
1168
+ left: 0;
1169
+ position: absolute;
1170
+ top: -5px;
1171
+ -webkit-transition: -webkit-transform 0.2s ease;
1172
+ transition: -webkit-transform 0.2s ease;
1173
+ transition: transform 0.2s ease;
1174
+ transition: transform 0.2s ease, -webkit-transform 0.2s ease;
1175
+ }
1176
+
1177
+ .tribe-common .tribe-common-form-control-toggle__input:checked {
1178
+ background-color: #334AFF;
1179
+ }
1180
+
1181
+ .tribe-common .tribe-common-form-control-toggle__input:checked:after {
1182
+ -webkit-transform: translateX(20px);
1183
+ transform: translateX(20px);
1184
+ }
1185
+
1186
+ .tribe-common .tribe-common-form-control-toggle__label {
1187
+ color: #141827;
1188
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1189
+ font-size: 12px;
1190
+ line-height: 1.38;
1191
+ font-weight: 400;
1192
+
1193
+ color: #5D5D5D;
1194
+ }
1195
+
1196
+ /* -----------------------------------------------------------------------------
1197
+ * Theme Overrides - Enfold
1198
+ * ----------------------------------------------------------------------------- */
1199
+
1200
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-toggle__label, #top .main_color .tribe-common .tribe-common-form-control-toggle__label {
1201
+ font-weight: 400;
1202
+ font-size: 12px;
1203
+ }
1204
+
1205
+ /* Grid */
1206
+
1207
+ /* .tribe-common { */
1208
+
1209
+ /* -----------------------------------------------------------------------------
1210
+ * Grid: Columns
1211
+ * ----------------------------------------------------------------------------- */
1212
+
1213
+ /* } */
1214
+
1215
+ /* .tribe-common { */
1216
+
1217
+ /* -----------------------------------------------------------------------------
1218
+ *
1219
+ * Grid: Rows
1220
+ *
1221
+ * Example:
1222
+ * <div class="g-row">
1223
+ * <div class="g-col">
1224
+ * <p>Component or another grid layout, perhaps?</p>
1225
+ * </div>
1226
+ * </div>
1227
+ *
1228
+ * ----------------------------------------------------------------------------- */
1229
+
1230
+ /* } */
1231
+
1232
+ /* Typography */
1233
+
1234
+ .tribe-common {
1235
+
1236
+ /* -------------------------------------------------------------------------
1237
+ *
1238
+ * Anchor: Theme Overrides
1239
+ *
1240
+ * ------------------------------------------------------------------------- */
1241
+ }
1242
+
1243
+ .tribe-common a {
1244
+ color: #141827;
1245
+ outline: 0;
1246
+ text-decoration: none;
1247
+ }
1248
+
1249
+ .tribe-common a:hover,
1250
+ .tribe-common a:focus,
1251
+ .tribe-common a:active,
1252
+ .tribe-common a:visited {
1253
+ color: #141827;
1254
+ outline: 0;
1255
+ text-decoration: none;
1256
+ }
1257
+
1258
+ /* -------------------------------------------------------------------------
1259
+ *
1260
+ * Anchor: Theme Overrides
1261
+ *
1262
+ * ------------------------------------------------------------------------- */
1263
+
1264
+ /* -------------------------------------------------------------------------
1265
+ * Theme Overrides - Twenty Seventeen
1266
+ * ------------------------------------------------------------------------- */
1267
+
1268
+ .tribe-theme-twentyseventeen .tribe-common a {
1269
+ box-shadow: none;
1270
+ }
1271
+
1272
+ .tribe-theme-twentyseventeen .tribe-common a:hover,
1273
+ .tribe-theme-twentyseventeen .tribe-common a:focus {
1274
+ box-shadow: none;
1275
+ color: #141827;
1276
+ }
1277
+
1278
+ /* -------------------------------------------------------------------------
1279
+ * Theme Overrides - Twenty Nineteen
1280
+ * ------------------------------------------------------------------------- */
1281
+
1282
+ .tribe-theme-twentynineteen .tribe-common a,
1283
+ .tribe-theme-twentynineteen .entry .tribe-common a {
1284
+ text-decoration: none;
1285
+ }
1286
+
1287
+ /* -------------------------------------------------------------------------
1288
+ *
1289
+ * Anchor
1290
+ *
1291
+ * Example:
1292
+ * <a class="tribe-common-anchor">Anchor Text</a>
1293
+ * <a class="tribe-common-anchor-alt">Anchor Alt Text</a>
1294
+ * <a class="tribe-common-anchor-thin">Anchor Thin Text</a>
1295
+ *
1296
+ * ------------------------------------------------------------------------- */
1297
+
1298
+ .tribe-common .tribe-common-anchor {
1299
+ border-bottom: 2px solid transparent;
1300
+ -webkit-transition: border-color 0.2s ease;
1301
+ transition: border-color 0.2s ease;
1302
+ }
1303
+
1304
+ .tribe-common .tribe-common-anchor:active,
1305
+ .tribe-common .tribe-common-anchor:focus,
1306
+ .tribe-common .tribe-common-anchor:hover {
1307
+ border-bottom: 2px solid #141827;
1308
+ }
1309
+
1310
+ .tribe-common .tribe-common-anchor-alt {
1311
+ border-bottom: 2px solid #334AFF;
1312
+ color: #141827;
1313
+ -webkit-transition: color 0.2s ease;
1314
+ transition: color 0.2s ease;
1315
+ }
1316
+
1317
+ .tribe-common .tribe-common-anchor-alt:active,
1318
+ .tribe-common .tribe-common-anchor-alt:focus,
1319
+ .tribe-common .tribe-common-anchor-alt:hover {
1320
+ border-bottom: 2px solid #334AFF;
1321
+ color: #334AFF;
1322
+ }
1323
+
1324
+ .tribe-common .tribe-common-anchor-thin {
1325
+ border-bottom: 1px solid transparent;
1326
+ -webkit-transition: border-color 0.2s ease;
1327
+ transition: border-color 0.2s ease;
1328
+ }
1329
+
1330
+ .tribe-common .tribe-common-anchor-thin:active,
1331
+ .tribe-common .tribe-common-anchor-thin:focus,
1332
+ .tribe-common .tribe-common-anchor-thin:hover {
1333
+ border-bottom: 1px solid #141827;
1334
+ }
1335
+
1336
+ /* -------------------------------------------------------------------------
1337
+ * Theme Overrides - Twenty Seventeen
1338
+ * ------------------------------------------------------------------------- */
1339
+
1340
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-anchor-alt:hover,
1341
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-anchor-alt:focus {
1342
+ color: #334AFF;
1343
+ }
1344
+
1345
+ /* -------------------------------------------------------------------------
1346
+ * Body 1
1347
+ * ------------------------------------------------------------------------- */
1348
+
1349
+ .tribe-common .tribe-common-b1 {
1350
+ color: #141827;
1351
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1352
+ font-size: 14px;
1353
+ font-weight: 400;
1354
+ line-height: 1.62;
1355
+ }
1356
+
1357
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-b1 {
1358
+ font-size: 16px;
1359
+ line-height: 1.62;
1360
+ }
1361
+
1362
+ /* -------------------------------------------------------------------------
1363
+ *
1364
+ * Body
1365
+ *
1366
+ * Example:
1367
+ * <p class="tribe-common-b1">Text here</p>
1368
+ *
1369
+ * ------------------------------------------------------------------------- */
1370
+
1371
+ .tribe-common .tribe-common-b1--bold {
1372
+ font-weight: 700;
1373
+ }
1374
+
1375
+ /* -------------------------------------------------------------------------
1376
+ * Body 2
1377
+ * ------------------------------------------------------------------------- */
1378
+
1379
+ .tribe-common .tribe-common-b2 {
1380
+ color: #141827;
1381
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1382
+ font-size: 12px;
1383
+ font-weight: 400;
1384
+ line-height: 1.38;
1385
+ }
1386
+
1387
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-b2 {
1388
+ font-size: 14px;
1389
+ line-height: 1.62;
1390
+ }
1391
+
1392
+ .tribe-common .tribe-common-b2--bold {
1393
+ font-weight: 700;
1394
+ }
1395
+
1396
+ /* -------------------------------------------------------------------------
1397
+ * Body 3
1398
+ * ------------------------------------------------------------------------- */
1399
+
1400
+ .tribe-common .tribe-common-b3 {
1401
+ color: #141827;
1402
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1403
+ font-size: 11px;
1404
+ font-weight: 400;
1405
+ line-height: 1.5;
1406
+ }
1407
+
1408
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-b3 {
1409
+ font-size: 12px;
1410
+ line-height: 1.38;
1411
+ }
1412
+
1413
+ .tribe-common .tribe-common-b3--bold {
1414
+ font-weight: 700;
1415
+ }
1416
+
1417
+ /* -------------------------------------------------------------------------
1418
+ * Body 1 for --viewport-medium
1419
+ * ------------------------------------------------------------------------- */
1420
+
1421
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-b1--min-medium {
1422
+ font-size: 16px;
1423
+ line-height: 1.62;
1424
+ }
1425
+
1426
+ /* -------------------------------------------------------------------------
1427
+ * Body 2 for --viewport-medium
1428
+ * ------------------------------------------------------------------------- */
1429
+
1430
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-b2--min-medium {
1431
+ font-size: 14px;
1432
+ line-height: 1.62;
1433
+ }
1434
+
1435
+ /* -------------------------------------------------------------------------
1436
+ * Body 3 for --viewport-medium
1437
+ * ------------------------------------------------------------------------- */
1438
+
1439
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-b3--min-medium {
1440
+ font-size: 12px;
1441
+ line-height: 1.38;
1442
+ }
1443
+
1444
+ .tribe-common {
1445
+
1446
+ /* -------------------------------------------------------------------------
1447
+ *
1448
+ * CTA: Theme Overrides
1449
+ *
1450
+ * ------------------------------------------------------------------------- */
1451
+ }
1452
+
1453
+ /* -------------------------------------------------------------------------
1454
+ *
1455
+ * CTA
1456
+ *
1457
+ * Example:
1458
+ * <a class="tribe-common-cta">Link Text</a>
1459
+ * <a class="tribe-common-cta tribe-common-cta--alt">Link Text Alt</a>
1460
+ *
1461
+ * ------------------------------------------------------------------------- */
1462
+
1463
+ .tribe-common .tribe-common-cta {
1464
+ color: #141827;
1465
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1466
+ font-size: 12px;
1467
+ line-height: 1.38;
1468
+ font-weight: 400;
1469
+ font-weight: 700;
1470
+ border-bottom: 2px solid transparent;
1471
+ -webkit-transition: border-color 0.2s ease;
1472
+ transition: border-color 0.2s ease;
1473
+ }
1474
+
1475
+ .tribe-common .tribe-common-cta:active,
1476
+ .tribe-common .tribe-common-cta:focus,
1477
+ .tribe-common .tribe-common-cta:hover {
1478
+ border-bottom: 2px solid #141827;
1479
+ }
1480
+
1481
+ .tribe-common .tribe-common-cta--alt {
1482
+ border-bottom: 2px solid #334AFF;
1483
+ color: #141827;
1484
+ -webkit-transition: color 0.2s ease;
1485
+ transition: color 0.2s ease;
1486
+ }
1487
+
1488
+ .tribe-common .tribe-common-cta--alt:active,
1489
+ .tribe-common .tribe-common-cta--alt:focus,
1490
+ .tribe-common .tribe-common-cta--alt:hover {
1491
+ border-bottom: 2px solid #334AFF;
1492
+ color: #334AFF;
1493
+ }
1494
+
1495
+ .tribe-common .tribe-common-cta--thin-alt {
1496
+ border-bottom: 1px solid #334AFF;
1497
+ color: #141827;
1498
+ -webkit-transition: color 0.2s ease;
1499
+ transition: color 0.2s ease;
1500
+ }
1501
+
1502
+ .tribe-common .tribe-common-cta--thin-alt:active,
1503
+ .tribe-common .tribe-common-cta--thin-alt:focus,
1504
+ .tribe-common .tribe-common-cta--thin-alt:hover {
1505
+ border-bottom: 1px solid #334AFF;
1506
+ color: #334AFF;
1507
+ }
1508
+
1509
+ /* -------------------------------------------------------------------------
1510
+ * Theme Overrides - Twenty Seventeen
1511
+ * ------------------------------------------------------------------------- */
1512
+
1513
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-cta--alt:hover,
1514
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-cta--alt:focus,
1515
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-cta--thin-alt:hover,
1516
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-cta--thin-alt:focus {
1517
+ color: #334AFF;
1518
+ }
1519
+
1520
+ .tribe-common {
1521
+ /* -------------------------------------------------------------------------
1522
+ *
1523
+ * Heading
1524
+ *
1525
+ * Example:
1526
+ * <h1 class="tribe-common-h1">Heading Text</h1>
1527
+ *
1528
+ * ------------------------------------------------------------------------- */
1529
+
1530
+ /* -------------------------------------------------------------------------
1531
+ *
1532
+ * Heading: Theme Overrides
1533
+ *
1534
+ * ------------------------------------------------------------------------- */
1535
+ }
1536
+
1537
+ /* -------------------------------------------------------------------------
1538
+ * Heading: h1
1539
+ * ------------------------------------------------------------------------- */
1540
+
1541
+ .tribe-common .tribe-common-h1 {
1542
+ color: #141827;
1543
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1544
+ font-weight: 700;
1545
+ font-size: 28px;
1546
+ line-height: 1.42;
1547
+ }
1548
+
1549
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h1 {
1550
+ font-size: 42px;
1551
+ line-height: 1.38;
1552
+ }
1553
+
1554
+ /* -------------------------------------------------------------------------
1555
+ * Heading: h2
1556
+ * ------------------------------------------------------------------------- */
1557
+
1558
+ .tribe-common .tribe-common-h2 {
1559
+ color: #141827;
1560
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1561
+ font-weight: 700;
1562
+ font-size: 24px;
1563
+ line-height: 1.42;
1564
+ }
1565
+
1566
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h2 {
1567
+ font-size: 32px;
1568
+ line-height: 1.38;
1569
+ }
1570
+
1571
+ /* -------------------------------------------------------------------------
1572
+ * Heading: h3
1573
+ * ------------------------------------------------------------------------- */
1574
+
1575
+ .tribe-common .tribe-common-h3 {
1576
+ color: #141827;
1577
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1578
+ font-weight: 700;
1579
+ font-size: 22px;
1580
+ line-height: 1.5;
1581
+ }
1582
+
1583
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h3 {
1584
+ font-size: 28px;
1585
+ line-height: 1.42;
1586
+ }
1587
+
1588
+ /* -------------------------------------------------------------------------
1589
+ * Heading: h4
1590
+ * ------------------------------------------------------------------------- */
1591
+
1592
+ .tribe-common .tribe-common-h4 {
1593
+ color: #141827;
1594
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1595
+ font-weight: 700;
1596
+ font-size: 20px;
1597
+ line-height: 1.42;
1598
+ }
1599
+
1600
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h4 {
1601
+ font-size: 24px;
1602
+ line-height: 1.42;
1603
+ }
1604
+
1605
+ /* -------------------------------------------------------------------------
1606
+ * Heading: h5
1607
+ * ------------------------------------------------------------------------- */
1608
+
1609
+ .tribe-common .tribe-common-h5 {
1610
+ color: #141827;
1611
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1612
+ font-weight: 700;
1613
+ font-size: 18px;
1614
+ line-height: 1.5;
1615
+ }
1616
+
1617
+ /* -------------------------------------------------------------------------
1618
+ * Heading: h6
1619
+ * ------------------------------------------------------------------------- */
1620
+
1621
+ .tribe-common .tribe-common-h6 {
1622
+ color: #141827;
1623
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1624
+ font-weight: 700;
1625
+ font-size: 16px;
1626
+ line-height: 1.5;
1627
+ }
1628
+
1629
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h6 {
1630
+ font-size: 16px;
1631
+ line-height: 1.62;
1632
+ }
1633
+
1634
+ /* -------------------------------------------------------------------------
1635
+ * Heading: h7
1636
+ * ------------------------------------------------------------------------- */
1637
+
1638
+ .tribe-common .tribe-common-h7 {
1639
+ color: #141827;
1640
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1641
+ font-weight: 700;
1642
+ font-size: 14px;
1643
+ line-height: 1.62;
1644
+ }
1645
+
1646
+ /* -------------------------------------------------------------------------
1647
+ * Heading: h8
1648
+ * ------------------------------------------------------------------------- */
1649
+
1650
+ .tribe-common .tribe-common-h8 {
1651
+ color: #141827;
1652
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1653
+ font-weight: 700;
1654
+ font-size: 12px;
1655
+ line-height: 1.38;
1656
+ }
1657
+
1658
+ /* -------------------------------------------------------------------------
1659
+ * Heading: h3 for --viewport-medium
1660
+ * ------------------------------------------------------------------------- */
1661
+
1662
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h3--min-medium {
1663
+ font-size: 28px;
1664
+ line-height: 1.42;
1665
+ }
1666
+
1667
+ /* -------------------------------------------------------------------------
1668
+ * Heading: h4 for --viewport-medium
1669
+ * ------------------------------------------------------------------------- */
1670
+
1671
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h4--min-medium {
1672
+ font-size: 24px;
1673
+ line-height: 1.42;
1674
+ }
1675
+
1676
+ /* -------------------------------------------------------------------------
1677
+ * Heading: h5 for --viewport-medium
1678
+ * ------------------------------------------------------------------------- */
1679
+
1680
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h5--min-medium {
1681
+ font-size: 18px;
1682
+ line-height: 1.5;
1683
+ }
1684
+
1685
+ /* -------------------------------------------------------------------------
1686
+ * Heading: h6 for --viewport-medium
1687
+ * ------------------------------------------------------------------------- */
1688
+
1689
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h6--min-medium {
1690
+ font-size: 16px;
1691
+ line-height: 1.62;
1692
+ }
1693
+
1694
+ /* -------------------------------------------------------------------------
1695
+ * Heading: h7 for --viewport-medium
1696
+ * ------------------------------------------------------------------------- */
1697
+
1698
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-h7--min-medium {
1699
+ font-size: 14px;
1700
+ line-height: 1.62;
1701
+ }
1702
+
1703
+ /* -------------------------------------------------------------------------
1704
+ * Heading: alt style
1705
+ * ------------------------------------------------------------------------- */
1706
+
1707
+ .tribe-common .tribe-common-h--alt {
1708
+ font-weight: 400;
1709
+ }
1710
+
1711
+ /* -------------------------------------------------------------------------
1712
+ * Theme Overrides - Avada
1713
+ * ------------------------------------------------------------------------- */
1714
+
1715
+ /* -------------------------------------------------------------------------
1716
+ * Heading: h1
1717
+ * ------------------------------------------------------------------------- */
1718
+
1719
+ .tribe-theme-avada #main .tribe-common .tribe-common-h1 {
1720
+ color: #141827;
1721
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1722
+ font-weight: 700;
1723
+ font-size: 28px;
1724
+ line-height: 1.42;
1725
+ }
1726
+
1727
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h1 {
1728
+ font-size: 42px;
1729
+ line-height: 1.38;
1730
+ }
1731
+
1732
+ /* -------------------------------------------------------------------------
1733
+ * Heading: h2
1734
+ * ------------------------------------------------------------------------- */
1735
+
1736
+ .tribe-theme-avada #main .tribe-common .tribe-common-h2 {
1737
+ color: #141827;
1738
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1739
+ font-weight: 700;
1740
+ font-size: 24px;
1741
+ line-height: 1.42;
1742
+ }
1743
+
1744
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h2 {
1745
+ font-size: 32px;
1746
+ line-height: 1.38;
1747
+ }
1748
+
1749
+ /* -------------------------------------------------------------------------
1750
+ * Heading: h3
1751
+ * ------------------------------------------------------------------------- */
1752
+
1753
+ .tribe-theme-avada #main .tribe-common .tribe-common-h3 {
1754
+ color: #141827;
1755
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1756
+ font-weight: 700;
1757
+ font-size: 22px;
1758
+ line-height: 1.5;
1759
+ }
1760
+
1761
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h3 {
1762
+ font-size: 28px;
1763
+ line-height: 1.42;
1764
+ }
1765
+
1766
+ /* -------------------------------------------------------------------------
1767
+ * Heading: h4
1768
+ * ------------------------------------------------------------------------- */
1769
+
1770
+ .tribe-theme-avada #main .tribe-common .tribe-common-h4 {
1771
+ color: #141827;
1772
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1773
+ font-weight: 700;
1774
+ font-size: 20px;
1775
+ line-height: 1.42;
1776
+ }
1777
+
1778
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h4 {
1779
+ font-size: 24px;
1780
+ line-height: 1.42;
1781
+ }
1782
+
1783
+ /* -------------------------------------------------------------------------
1784
+ * Heading: h5
1785
+ * ------------------------------------------------------------------------- */
1786
+
1787
+ .tribe-theme-avada #main .tribe-common .tribe-common-h5 {
1788
+ color: #141827;
1789
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1790
+ font-weight: 700;
1791
+ font-size: 18px;
1792
+ line-height: 1.5;
1793
+ }
1794
+
1795
+ /* -------------------------------------------------------------------------
1796
+ * Heading: h6
1797
+ * ------------------------------------------------------------------------- */
1798
+
1799
+ .tribe-theme-avada #main .tribe-common .tribe-common-h6 {
1800
+ color: #141827;
1801
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1802
+ font-weight: 700;
1803
+ font-size: 16px;
1804
+ line-height: 1.5;
1805
+ }
1806
+
1807
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h6 {
1808
+ font-size: 16px;
1809
+ line-height: 1.62;
1810
+ }
1811
+
1812
+ /* -------------------------------------------------------------------------
1813
+ * Heading: h7
1814
+ * ------------------------------------------------------------------------- */
1815
+
1816
+ .tribe-theme-avada #main .tribe-common .tribe-common-h7 {
1817
+ color: #141827;
1818
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1819
+ font-weight: 700;
1820
+ font-size: 14px;
1821
+ line-height: 1.62;
1822
+ }
1823
+
1824
+ /* -------------------------------------------------------------------------
1825
+ * Heading: h8
1826
+ * ------------------------------------------------------------------------- */
1827
+
1828
+ .tribe-theme-avada #main .tribe-common .tribe-common-h8 {
1829
+ color: #141827;
1830
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
1831
+ font-weight: 700;
1832
+ font-size: 12px;
1833
+ line-height: 1.38;
1834
+ }
1835
+
1836
+ /* -------------------------------------------------------------------------
1837
+ * Heading: h3 for --viewport-medium
1838
+ * ------------------------------------------------------------------------- */
1839
+
1840
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h3--min-medium {
1841
+ font-size: 28px;
1842
+ line-height: 1.42;
1843
+ }
1844
+
1845
+ /* -------------------------------------------------------------------------
1846
+ * Heading: h4 for --viewport-medium
1847
+ * ------------------------------------------------------------------------- */
1848
+
1849
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h4--min-medium {
1850
+ font-size: 24px;
1851
+ line-height: 1.42;
1852
+ }
1853
+
1854
+ /* -------------------------------------------------------------------------
1855
+ * Heading: h5 for --viewport-medium
1856
+ * ------------------------------------------------------------------------- */
1857
+
1858
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h5--min-medium {
1859
+ font-size: 18px;
1860
+ line-height: 1.5;
1861
+ }
1862
+
1863
+ /* -------------------------------------------------------------------------
1864
+ * Heading: h6 for --viewport-medium
1865
+ * ------------------------------------------------------------------------- */
1866
+
1867
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h6--min-medium {
1868
+ font-size: 16px;
1869
+ line-height: 1.62;
1870
+ }
1871
+
1872
+ /* -------------------------------------------------------------------------
1873
+ * Heading: h7 for --viewport-medium
1874
+ * ------------------------------------------------------------------------- */
1875
+
1876
+ .tribe-theme-avada #main .tribe-common.tribe-common--breakpoint-medium .tribe-common-h7--min-medium {
1877
+ font-size: 14px;
1878
+ line-height: 1.62;
1879
+ }
1880
+
1881
+ /* -------------------------------------------------------------------------
1882
+ * Heading: alt style
1883
+ * ------------------------------------------------------------------------- */
1884
+
1885
+ .tribe-theme-avada #main .tribe-common .tribe-common-h--alt {
1886
+ font-weight: 400;
1887
+ }
1888
+
1889
+ .tribe-common {
1890
+ /* -------------------------------------------------------------------------
1891
+ * Lists
1892
+ * ------------------------------------------------------------------------- */
1893
+
1894
+ /* -----------------------------------------------------------------------------
1895
+ *
1896
+ * Lists: Theme Overrides
1897
+ *
1898
+ * ----------------------------------------------------------------------------- */
1899
+ }
1900
+
1901
+ /* -------------------------------------------------------------------------
1902
+ * Button
1903
+ * ------------------------------------------------------------------------- */
1904
+
1905
+ .tribe-common button {
1906
+ background-color: transparent;
1907
+ border: none;
1908
+ }
1909
+
1910
+ .tribe-common button:hover,
1911
+ .tribe-common button:focus {
1912
+ background-color: transparent;
1913
+ }
1914
+
1915
+ /* -------------------------------------------------------------------------
1916
+ * Theme Overrides - Twenty Seventeen
1917
+ * ------------------------------------------------------------------------- */
1918
+
1919
+ .tribe-theme-twentyseventeen .tribe-common button:hover,
1920
+ .tribe-theme-twentyseventeen .tribe-common button:focus {
1921
+ background-color: transparent;
1922
+ }
1923
+
1924
+ /* -------------------------------------------------------------------------
1925
+ *
1926
+ * Button: Theme Overrides
1927
+ *
1928
+ * ------------------------------------------------------------------------- */
1929
+
1930
+ .tribe-theme-twentytwenty .tribe-common button {
1931
+ background-color: transparent;
1932
+ text-transform: inherit;
1933
+ }
1934
+
1935
+ .tribe-theme-twentytwenty .tribe-common button:hover,
1936
+ .tribe-theme-twentytwenty .tribe-common button:focus {
1937
+ text-decoration: none;
1938
+ }
1939
+
1940
+ /* .tribe-common { */
1941
+
1942
+ /* -----------------------------------------------------------------------------
1943
+ *
1944
+ * Layout: Global Content Container
1945
+ *
1946
+ * ----------------------------------------------------------------------------- */
1947
+
1948
+ /* } */
1949
+
1950
+ /* -------------------------------------------------------------------------
1951
+ * SVG Icons
1952
+ * ------------------------------------------------------------------------- */
1953
+
1954
+ .tribe-common .tribe-common-svgicon--featured {
1955
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h16v20l-7.902-5.122L0 20z' fill='%23334AFF'/%3E%3C/svg%3E");
1956
+ }
1957
+
1958
+ .tribe-common {
1959
+ /* -----------------------------------------------------------------------------
1960
+ *
1961
+ * Tables
1962
+ *
1963
+ * ----------------------------------------------------------------------------- */
1964
+
1965
+ /* -----------------------------------------------------------------------------
1966
+ * Tables: Theme Overrides
1967
+ * ----------------------------------------------------------------------------- */
1968
+ }
1969
+
1970
+ /* -----------------------------------------------------------------------------
1971
+ * Theme Overrides - Enfold
1972
+ * ----------------------------------------------------------------------------- */
1973
+
1974
+ .tribe-theme-enfold .tribe-common th {
1975
+ letter-spacing: 0;
1976
+ text-transform: none;
1977
+ }
1978
+
1979
+ /* Components */
1980
+
1981
+ /* -----------------------------------------------------------------------------
1982
+ *
1983
+ * Components Full
1984
+ *
1985
+ * This file is just a clearing-house.
1986
+ * Make partials (start with an underscore) for any actual css code.
1987
+ *
1988
+ * ----------------------------------------------------------------------------- */
1989
+
1990
+ /* Buttons */
1991
+
1992
+ .tribe-common {
1993
+
1994
+ /* -------------------------------------------------------------------------
1995
+ *
1996
+ * Button: Border - Theme Overrides
1997
+ *
1998
+ * ------------------------------------------------------------------------- */
1999
+ }
2000
+
2001
+ /* -----------------------------------------------------------------------------
2002
+ *
2003
+ * Button: Border
2004
+ *
2005
+ * Example:
2006
+ * <button class="tribe-common-c-btn-border">...</button>
2007
+ * <a href="#" class="tribe-common-c-btn-border">...</a>
2008
+ *
2009
+ * ----------------------------------------------------------------------------- */
2010
+
2011
+ .tribe-common .tribe-common-c-btn-border,
2012
+ .tribe-common a.tribe-common-c-btn-border {
2013
+ color: #141827;
2014
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
2015
+ font-size: 12px;
2016
+ line-height: 1.38;
2017
+ font-weight: 400;
2018
+ border: 0;
2019
+ cursor: pointer;
2020
+ display: inline-block;
2021
+ height: auto;
2022
+ padding: 0;
2023
+ text-decoration: none;
2024
+ width: auto;
2025
+ background-color: #FFFFFF;
2026
+ border: 1px solid #D5D5D5;
2027
+ border-radius: 4px;
2028
+ text-align: center;
2029
+ -webkit-transition: color 0.2s ease, border-color 0.2s ease;
2030
+ transition: color 0.2s ease, border-color 0.2s ease;
2031
+
2032
+ color: #5D5D5D;
2033
+ padding: 14px 20px 14px;
2034
+ }
2035
+
2036
+ .tribe-common .tribe-common-c-btn-border:hover,
2037
+ .tribe-common .tribe-common-c-btn-border:focus,
2038
+ .tribe-common a.tribe-common-c-btn-border:hover,
2039
+ .tribe-common a.tribe-common-c-btn-border:focus {
2040
+ background-color: #FFFFFF;
2041
+ }
2042
+
2043
+ .tribe-common .tribe-common-c-btn-border:active, .tribe-common a.tribe-common-c-btn-border:active {
2044
+ border-color: #141827;
2045
+ }
2046
+
2047
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-c-btn-border, .tribe-common--breakpoint-medium.tribe-common a.tribe-common-c-btn-border {
2048
+ padding: 6px 15px;
2049
+ }
2050
+
2051
+ .tribe-common .tribe-common-c-btn-border:active,
2052
+ .tribe-common .tribe-common-c-btn-border:focus,
2053
+ .tribe-common .tribe-common-c-btn-border:hover,
2054
+ .tribe-common a.tribe-common-c-btn-border:active,
2055
+ .tribe-common a.tribe-common-c-btn-border:focus,
2056
+ .tribe-common a.tribe-common-c-btn-border:hover {
2057
+ color: #141827;
2058
+ }
2059
+
2060
+ .tribe-common .tribe-common-c-btn-border:disabled, .tribe-common a.tribe-common-c-btn-border:disabled {
2061
+ color: #D5D5D5
2062
+ }
2063
+
2064
+ /* -------------------------------------------------------------------------
2065
+ * Theme Overrides - Twenty Seventeen
2066
+ * ------------------------------------------------------------------------- */
2067
+
2068
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-c-btn-border:hover {
2069
+ background-color: #FFFFFF;
2070
+ }
2071
+
2072
+ .tribe-common {
2073
+
2074
+ /* -----------------------------------------------------------------------------
2075
+ * Button: Icon Caret Left
2076
+ * ----------------------------------------------------------------------------- */
2077
+
2078
+ /* -----------------------------------------------------------------------------
2079
+ * Button: Icon Caret Right
2080
+ * ----------------------------------------------------------------------------- */
2081
+
2082
+ /* -----------------------------------------------------------------------------
2083
+ * Button: Icon Filters
2084
+ * ----------------------------------------------------------------------------- */
2085
+
2086
+ /* -----------------------------------------------------------------------------
2087
+ * Button: Icon Search
2088
+ * ----------------------------------------------------------------------------- */
2089
+
2090
+ /* -------------------------------------------------------------------------
2091
+ *
2092
+ * Button: Icon Border - Theme Overrides
2093
+ *
2094
+ * ------------------------------------------------------------------------- */
2095
+ }
2096
+
2097
+ /* -----------------------------------------------------------------------------
2098
+ *
2099
+ * Button: Icon
2100
+ *
2101
+ * Example:
2102
+ * <button class="tribe-common-c-btn-icon tribe-common-c-btn-icon--filter">...</button>
2103
+ * <a href="#" class="tribe-common-c-btn-icon tribe-common-c-btn-icon--filter">...</a>
2104
+ *
2105
+ * ----------------------------------------------------------------------------- */
2106
+
2107
+ .tribe-common .tribe-common-c-btn-icon {
2108
+ border: 0;
2109
+ cursor: pointer;
2110
+ display: inline-block;
2111
+ height: auto;
2112
+ padding: 0;
2113
+ text-decoration: none;
2114
+ width: auto;
2115
+ }
2116
+
2117
+ /* -----------------------------------------------------------------------------
2118
+ *
2119
+ * Button: Icon Border
2120
+ *
2121
+ * Example:
2122
+ * <button class="tribe-common-c-btn-icon tribe-common-c-btn-icon--border tribe-common-c-btn-icon--filter">...</button>
2123
+ * <a href="#" class="tribe-common-c-btn-icon tribe-common-c-btn-icon--border tribe-common-c-btn-icon--filter">...</a>
2124
+ *
2125
+ * ----------------------------------------------------------------------------- */
2126
+
2127
+ .tribe-common .tribe-common-c-btn-icon--border {
2128
+ background-color: #FFFFFF;
2129
+ border: 1px solid #D5D5D5;
2130
+ -webkit-box-align: center;
2131
+ align-items: center;
2132
+ display: -webkit-inline-box;
2133
+ display: inline-flex;
2134
+ height: 56px;
2135
+ -webkit-box-pack: center;
2136
+ justify-content: center;
2137
+ -webkit-transition: none;
2138
+ transition: none;
2139
+ width: 56px;
2140
+ }
2141
+
2142
+ .tribe-common .tribe-common-c-btn-icon--border:hover,
2143
+ .tribe-common .tribe-common-c-btn-icon--border:focus {
2144
+ background-color: #FFFFFF;
2145
+ }
2146
+
2147
+ .tribe-common .tribe-common-c-btn-icon--border:active {
2148
+ border-color: #141827;
2149
+ }
2150
+
2151
+ /* -------------------------------------------------------------------------
2152
+ * Theme Overrides - Twenty Seventeen
2153
+ * ------------------------------------------------------------------------- */
2154
+
2155
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-c-btn-icon--border:hover {
2156
+ background-color: #FFFFFF;
2157
+ }
2158
+
2159
+ .tribe-common {
2160
+
2161
+ /* -------------------------------------------------------------------------
2162
+ *
2163
+ * Button: Solid - Theme Overrides
2164
+ *
2165
+ * ------------------------------------------------------------------------- */
2166
+ }
2167
+
2168
+ /* -----------------------------------------------------------------------------
2169
+ *
2170
+ * Button: Solid
2171
+ *
2172
+ * Example:
2173
+ * <button class="tribe-common-c-btn">...</button>
2174
+ * <a href="#" class="tribe-common-c-btn">...</a>
2175
+ *
2176
+ * ----------------------------------------------------------------------------- */
2177
+
2178
+ .tribe-common .tribe-common-c-btn,
2179
+ .tribe-common a.tribe-common-c-btn {
2180
+ color: #141827;
2181
+ font-family: "Helvetica Neue", Helvetica, -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
2182
+ font-size: 14px;
2183
+ line-height: 1.62;
2184
+ font-weight: 400;
2185
+ font-weight: 700;
2186
+ border: 0;
2187
+ cursor: pointer;
2188
+ display: inline-block;
2189
+ height: auto;
2190
+ padding: 0;
2191
+ text-decoration: none;
2192
+ width: auto;
2193
+ border-radius: 4px;
2194
+ color: #FFFFFF;
2195
+ text-align: center;
2196
+ -webkit-transition: background-color 0.2s ease;
2197
+ transition: background-color 0.2s ease;
2198
+
2199
+ background-color: #334AFF;
2200
+ padding: 11px 20px 11px;
2201
+ width: 100%;
2202
+ }
2203
+
2204
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-c-btn, .tribe-common--breakpoint-medium.tribe-common a.tribe-common-c-btn {
2205
+ width: auto;
2206
+ }
2207
+
2208
+ .tribe-common .tribe-common-c-btn:focus,
2209
+ .tribe-common .tribe-common-c-btn:hover,
2210
+ .tribe-common a.tribe-common-c-btn:focus,
2211
+ .tribe-common a.tribe-common-c-btn:hover {
2212
+ background-color: rgba(51,74,255, 0.8);
2213
+ }
2214
+
2215
+ .tribe-common .tribe-common-c-btn:active, .tribe-common a.tribe-common-c-btn:active {
2216
+ background-color: rgba(51,74,255, 0.9);
2217
+ }
2218
+
2219
+ .tribe-common .tribe-common-c-btn:disabled, .tribe-common a.tribe-common-c-btn:disabled {
2220
+ background-color: rgba(51,74,255, 0.07);
2221
+ }
2222
+
2223
+ /* -------------------------------------------------------------------------
2224
+ * Theme Overrides - Twenty Seventeen
2225
+ * ------------------------------------------------------------------------- */
2226
+
2227
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-c-btn:hover,
2228
+ .tribe-theme-twentyseventeen .tribe-common .tribe-common-c-btn:focus {
2229
+ background-color: rgba(51,74,255, 0.8);
2230
+ color: #FFFFFF;
2231
+ }
2232
+
2233
+ /* -------------------------------------------------------------------------
2234
+ * Theme Overrides - Twenty Twenty
2235
+ * ------------------------------------------------------------------------- */
2236
+
2237
+ .tribe-theme-twentytwenty .tribe-common .tribe-common-c-btn {
2238
+ background-color: #334AFF;
2239
+ }
2240
+
2241
+ .tribe-theme-twentytwenty .tribe-common .tribe-common-c-btn:hover,
2242
+ .tribe-theme-twentytwenty .tribe-common .tribe-common-c-btn:focus {
2243
+ background-color: rgba(51,74,255, 0.8);
2244
+ color: #FFFFFF;
2245
+ }
2246
+
2247
+ /* .tribe-common { */
2248
+
2249
+ /* -----------------------------------------------------------------------------
2250
+ *
2251
+ * Component: Image
2252
+ *
2253
+ * Example (Regular):
2254
+ * <img src="#" alt="" class="tribe-common-c-image" />
2255
+ *
2256
+ * Example (Background):
2257
+ * <div class="tribe-common-c-image tribe-common-c-image--bg">
2258
+ * <div class="tribe-common-c-image__bg"></div>
2259
+ * </div>
2260
+ *
2261
+ * ----------------------------------------------------------------------------- */
2262
+
2263
+ /* } */
2264
+
2265
+ /* -----------------------------------------------------------------------------
2266
+ *
2267
+ * Component: Loader
2268
+ *
2269
+ *
2270
+ * Example:
2271
+ * <div class="tribe-events-view-loader__dots tribe-common-c-loader">
2272
+ * <div class="tribe-common-c-loader__dot tribe-common-c-loader__dot--first"></div>
2273
+ * <div class="tribe-common-c-loader__dot tribe-common-c-loader__dot--second"></div>
2274
+ * <div class="tribe-common-c-loader__dot tribe-common-c-loader__dot--third"></div>
2275
+ * </div>
2276
+ *
2277
+ * ----------------------------------------------------------------------------- */
2278
+
2279
+ .tribe-common .tribe-common-c-loader__dot {
2280
+ -webkit-animation-name: tribe-common-c-loader-bounce;
2281
+ animation-name: tribe-common-c-loader-bounce;
2282
+ -webkit-animation-duration: 2.24s;
2283
+ animation-duration: 2.24s;
2284
+ -webkit-animation-iteration-count: infinite;
2285
+ animation-iteration-count: infinite;
2286
+ -webkit-animation-direction: normal;
2287
+ animation-direction: normal;
2288
+ }
2289
+
2290
+ .tribe-common .tribe-common-c-loader__dot--first {
2291
+ -webkit-animation-delay: 0.45s;
2292
+ animation-delay: 0.45s;
2293
+ }
2294
+
2295
+ .tribe-common .tribe-common-c-loader__dot--second {
2296
+ -webkit-animation-delay: 1.05s;
2297
+ animation-delay: 1.05s;
2298
+ }
2299
+
2300
+ .tribe-common .tribe-common-c-loader__dot--third {
2301
+ -webkit-animation-delay: 1.35s;
2302
+ animation-delay: 1.35s;
2303
+ }
2304
+
2305
+ @-webkit-keyframes tribe-common-c-loader-bounce {
2306
+ 0% {}
2307
+
2308
+ 50% { background-color: #334AFF; }
2309
+
2310
+ 100% {}
2311
+ }
2312
+
2313
+ @keyframes tribe-common-c-loader-bounce {
2314
+ 0% {}
2315
+
2316
+ 50% { background-color: #334AFF; }
2317
+
2318
+ 100% {}
2319
+ }
common/src/resources/css/common-skeleton.css ADDED
@@ -0,0 +1,1774 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ /*
12
+ * Common Skeleton CSS
13
+ *
14
+ * DO NOT EDIT THIS CSS FILE DIRECTLY.
15
+ * -------------------------------------------------------------
16
+ * This file is just a clearing-house, see the pcss directory
17
+ * and edit the source files found there.
18
+ */
19
+
20
+ /* Reset */
21
+
22
+ /* -----------------------------------------------------------------------------
23
+ *
24
+ * Resets Skeleton
25
+ *
26
+ * This file is just a clearing-house.
27
+ * Make partials (start with an underscore) for any actual css code.
28
+ *
29
+ * ----------------------------------------------------------------------------- */
30
+
31
+ /* Reset */
32
+
33
+ .tribe-common {
34
+ -webkit-font-smoothing: antialiased;
35
+ -moz-osx-font-smoothing: grayscale;
36
+ font-smoothing: antialiased;
37
+ }
38
+
39
+ /* -----------------------------------------------------------------------------
40
+ *
41
+ * Global "Resets"
42
+ *
43
+ * ----------------------------------------------------------------------------- */
44
+
45
+ .tribe-common * {
46
+ box-sizing: border-box;
47
+ }
48
+
49
+ /* -----------------------------------------------------------------------------
50
+ *
51
+ * HTML5 Elements
52
+ *
53
+ * ----------------------------------------------------------------------------- */
54
+
55
+ .tribe-common article,
56
+ .tribe-common aside,
57
+ .tribe-common details,
58
+ .tribe-common figcaption,
59
+ .tribe-common figure,
60
+ .tribe-common footer,
61
+ .tribe-common header,
62
+ .tribe-common main,
63
+ .tribe-common menu,
64
+ .tribe-common nav,
65
+ .tribe-common section,
66
+ .tribe-common summary {
67
+ display: block;
68
+ }
69
+
70
+ /* -----------------------------------------------------------------------------
71
+ *
72
+ * Normalize "Light"
73
+ *
74
+ * ----------------------------------------------------------------------------- */
75
+
76
+ .tribe-common svg:not(:root) {
77
+ overflow: hidden;
78
+ }
79
+
80
+ .tribe-common audio,
81
+ .tribe-common canvas,
82
+ .tribe-common progress,
83
+ .tribe-common video {
84
+ display: inline-block;
85
+ }
86
+
87
+ .tribe-common audio:not([controls]) {
88
+ display: none;
89
+ height: 0;
90
+ }
91
+
92
+ .tribe-common progress {
93
+ vertical-align: baseline;
94
+ }
95
+
96
+ .tribe-common template,
97
+ .tribe-common [hidden] {
98
+ display: none;
99
+ }
100
+
101
+ .tribe-common pre {
102
+ overflow: auto;
103
+ }
104
+
105
+ .tribe-common sub,
106
+ .tribe-common sup {
107
+ position: relative;
108
+ vertical-align: baseline;
109
+ }
110
+
111
+ .tribe-common sup {
112
+ top: -0.5em;
113
+ }
114
+
115
+ .tribe-common sub {
116
+ bottom: -0.25em;
117
+ }
118
+
119
+ .tribe-common input,
120
+ .tribe-common button,
121
+ .tribe-common select,
122
+ .tribe-common textarea {
123
+ box-sizing: border-box;
124
+ margin: 0;
125
+ }
126
+
127
+ .tribe-common input[type="number"]::-webkit-inner-spin-button,
128
+ .tribe-common input[type="number"]::-webkit-outer-spin-button {
129
+ height: auto;
130
+ }
131
+
132
+ .tribe-common legend {
133
+ color: inherit;
134
+ display: table;
135
+ max-width: 100%;
136
+ white-space: normal;
137
+ }
138
+
139
+ .tribe-common textarea {
140
+ resize: none;
141
+ overflow: auto;
142
+ }
143
+
144
+ .tribe-common button,
145
+ .tribe-common input[type="button"],
146
+ .tribe-common input[type="reset"],
147
+ .tribe-common input[type="submit"] {
148
+ cursor: pointer;
149
+ overflow: visible;
150
+ }
151
+
152
+ .tribe-common button[disabled],
153
+ .tribe-common input[disabled] {
154
+ cursor: default;
155
+ }
156
+
157
+ .tribe-common button::-moz-focus-inner,
158
+ .tribe-common input::-moz-focus-inner {
159
+ border: 0;
160
+ padding: 0;
161
+ }
162
+
163
+ /* -----------------------------------------------------------------------------
164
+ *
165
+ * Reset "Light"
166
+ *
167
+ * ----------------------------------------------------------------------------- */
168
+
169
+ .tribe-common div,
170
+ .tribe-common span,
171
+ .tribe-common applet,
172
+ .tribe-common object,
173
+ .tribe-common iframe,
174
+ .tribe-common h1,
175
+ .tribe-common h2,
176
+ .tribe-common h3,
177
+ .tribe-common h4,
178
+ .tribe-common h5,
179
+ .tribe-common h6,
180
+ .tribe-common p,
181
+ .tribe-common blockquote,
182
+ .tribe-common pre,
183
+ .tribe-common a,
184
+ .tribe-common abbr,
185
+ .tribe-common acronym,
186
+ .tribe-common address,
187
+ .tribe-common big,
188
+ .tribe-common cite,
189
+ .tribe-common code,
190
+ .tribe-common del,
191
+ .tribe-common dfn,
192
+ .tribe-common em,
193
+ .tribe-common img,
194
+ .tribe-common ins,
195
+ .tribe-common kbd,
196
+ .tribe-common q,
197
+ .tribe-common s,
198
+ .tribe-common samp,
199
+ .tribe-common small,
200
+ .tribe-common strike,
201
+ .tribe-common strong,
202
+ .tribe-common sub,
203
+ .tribe-common sup,
204
+ .tribe-common tt,
205
+ .tribe-common var,
206
+ .tribe-common b,
207
+ .tribe-common u,
208
+ .tribe-common i,
209
+ .tribe-common center,
210
+ .tribe-common dl,
211
+ .tribe-common dt,
212
+ .tribe-common dd,
213
+ .tribe-common ol,
214
+ .tribe-common ul,
215
+ .tribe-common li,
216
+ .tribe-common fieldset,
217
+ .tribe-common form,
218
+ .tribe-common label,
219
+ .tribe-common legend,
220
+ .tribe-common table,
221
+ .tribe-common caption,
222
+ .tribe-common tbody,
223
+ .tribe-common tfoot,
224
+ .tribe-common thead,
225
+ .tribe-common tr,
226
+ .tribe-common th,
227
+ .tribe-common td,
228
+ .tribe-common article,
229
+ .tribe-common aside,
230
+ .tribe-common canvas,
231
+ .tribe-common details,
232
+ .tribe-common embed,
233
+ .tribe-common figure,
234
+ .tribe-common figcaption,
235
+ .tribe-common footer,
236
+ .tribe-common header,
237
+ .tribe-common main,
238
+ .tribe-common menu,
239
+ .tribe-common nav,
240
+ .tribe-common output,
241
+ .tribe-common ruby,
242
+ .tribe-common section,
243
+ .tribe-common summary,
244
+ .tribe-common time,
245
+ .tribe-common mark,
246
+ .tribe-common audio,
247
+ .tribe-common video {
248
+ margin: 0;
249
+ padding: 0;
250
+ border: 0;
251
+ }
252
+
253
+ .tribe-common ol,
254
+ .tribe-common ul {
255
+ list-style: none;
256
+ }
257
+
258
+ .tribe-common img {
259
+ -ms-interpolation-mode: bicubic;
260
+ height: auto;
261
+ max-width: 100%;
262
+ border-style: none;
263
+ }
264
+
265
+ .tribe-common iframe,
266
+ .tribe-common video,
267
+ .tribe-common embed {
268
+ max-width: 100%;
269
+ max-height: 100%;
270
+ }
271
+
272
+ /* Theme Overrides */
273
+
274
+ /* -------------------------------------------------------------------------
275
+ * Reset Skeleton Theme Overrides - Avada
276
+ * ------------------------------------------------------------------------- */
277
+
278
+ .tribe-theme-avada input[type="text"] {
279
+ margin: 0;
280
+ }
281
+
282
+ /* -------------------------------------------------------------------------
283
+ * Reset Skeleton Theme Overrides - Divi
284
+ * ------------------------------------------------------------------------- */
285
+
286
+ .tribe-theme-divi .entry-content .tribe-common table, .tribe-theme-divibody.et-pb-preview #main-content .container .tribe-common table {
287
+ border: 0;
288
+ margin: 0;
289
+ }
290
+
291
+ .tribe-theme-divi .entry-content .tribe-common td, .tribe-theme-divibody.et-pb-preview #main-content .container .tribe-common td {
292
+ border: 0;
293
+ }
294
+
295
+ .tribe-theme-divi #content-area .tribe-common td,
296
+ .tribe-theme-divi #content-area .tribe-common th,
297
+ .tribe-theme-divi #content-area .tribe-common tr {
298
+ padding: 0;
299
+ }
300
+
301
+ /* -------------------------------------------------------------------------
302
+ * Reset Skeleton Theme Overrides - Enfold
303
+ * ------------------------------------------------------------------------- */
304
+
305
+ #top.tribe-theme-enfold .tribe-common button[disabled], #top .main_color .tribe-common button[disabled] {
306
+ cursor: default;
307
+ }
308
+
309
+ #top.tribe-theme-enfold .tribe-common form,
310
+ #top.tribe-theme-enfold .tribe-common input,
311
+ #top .main_color .tribe-common form,
312
+ #top .main_color .tribe-common input {
313
+ margin: 0;
314
+ }
315
+
316
+ .entry-content-wrapper .tribe-common li {
317
+ margin: 0;
318
+ padding: 0;
319
+ }
320
+
321
+ /* -------------------------------------------------------------------------
322
+ * Reset Skeleton Theme Overrides - Genesis
323
+ * ------------------------------------------------------------------------- */
324
+
325
+ .tribe-theme-genesis .tribe-common ol,
326
+ .tribe-theme-genesis .tribe-common ul,
327
+ .entry-content .tribe-common ol,
328
+ .entry-content .tribe-common ul {
329
+ margin: 0;
330
+ padding: 0;
331
+ }
332
+
333
+ /* .tribe-theme-twentynineteen .tribe-common { */
334
+
335
+ /* -------------------------------------------------------------------------
336
+ * Reset Skeleton Theme Overrides - Twenty Nineteen
337
+ * ------------------------------------------------------------------------- */
338
+
339
+ /* } */
340
+
341
+ .tribe-theme-twentyseventeen .tribe-common {
342
+
343
+ /* -------------------------------------------------------------------------
344
+ * Reset Skeleton Theme Overrides - Twenty Seventeen
345
+ * ------------------------------------------------------------------------- */
346
+
347
+ }
348
+
349
+ /* dialogs are set to z-index of 1 by default. Twentyseventeen .site-branding (in page header) is set to 3. */
350
+
351
+ .tribe-theme-twentyseventeen .tribe-common div.tribe-dialog {
352
+ z-index: 5 !important;
353
+ }
354
+
355
+ /* .tribe-theme-twentytwenty .tribe-common { */
356
+
357
+ /* -------------------------------------------------------------------------
358
+ * Reset Skeleton Theme Overrides - Twenty Twenty
359
+ * ------------------------------------------------------------------------- */
360
+
361
+ /* } */
362
+
363
+ /* Utilities */
364
+
365
+ /* -----------------------------------------------------------------------------
366
+ *
367
+ * Utilities
368
+ *
369
+ * This file is just a clearing-house.
370
+ * Make partials (start with an underscore) for any actual css code.
371
+ *
372
+ * ----------------------------------------------------------------------------- */
373
+
374
+ /* Variables */
375
+
376
+ :root {
377
+ /* -----------------------------------------------------------------------------
378
+ * Borders - Radius
379
+ * ----------------------------------------------------------------------------- */
380
+
381
+ /* -----------------------------------------------------------------------------
382
+ * Borders - Width
383
+ * ----------------------------------------------------------------------------- */
384
+ }
385
+
386
+ :root {
387
+ /* -----------------------------------------------------------------------------
388
+ * Box Shadows
389
+ * ----------------------------------------------------------------------------- */
390
+ }
391
+
392
+ :root {
393
+ /* -----------------------------------------------------------------------------
394
+ * Layers of z-index
395
+ * ----------------------------------------------------------------------------- */
396
+ }
397
+
398
+ :root {
399
+ /* -----------------------------------------------------------------------------
400
+ * Colors - Typography
401
+ * ----------------------------------------------------------------------------- */
402
+
403
+ /* -----------------------------------------------------------------------------
404
+ * Colors - Iconography
405
+ * ----------------------------------------------------------------------------- */
406
+
407
+ /* -----------------------------------------------------------------------------
408
+ * Colors - UI
409
+ * ----------------------------------------------------------------------------- */
410
+
411
+ /* -----------------------------------------------------------------------------
412
+ * Colors - Borders & Misc
413
+ * ----------------------------------------------------------------------------- */
414
+
415
+ }
416
+
417
+ :root {
418
+ /* -----------------------------------------------------------------------------
419
+ * Forms - Colors
420
+ * ----------------------------------------------------------------------------- */
421
+
422
+ /* -----------------------------------------------------------------------------
423
+ * Forms - Box Shadows
424
+ * ----------------------------------------------------------------------------- */
425
+ }
426
+
427
+ :root {
428
+ /* -----------------------------------------------------------------------------
429
+ * Gutter - Default
430
+ * ----------------------------------------------------------------------------- */
431
+
432
+ /* -----------------------------------------------------------------------------
433
+ * Gutter - Page
434
+ * ----------------------------------------------------------------------------- */
435
+
436
+ /* -----------------------------------------------------------------------------
437
+ * Grid Width - Default
438
+ * ----------------------------------------------------------------------------- */
439
+
440
+ /* -----------------------------------------------------------------------------
441
+ * Grid Width - Relative
442
+ * ----------------------------------------------------------------------------- */
443
+ }
444
+
445
+ :root {
446
+ /* -----------------------------------------------------------------------------
447
+ * Opacities
448
+ * ----------------------------------------------------------------------------- */
449
+ }
450
+
451
+ :root {
452
+ /* -----------------------------------------------------------------------------
453
+ * Spacers
454
+ * ----------------------------------------------------------------------------- */
455
+ }
456
+
457
+ /* -----------------------------------------------------------------------------
458
+ * SVG - Arrow Right
459
+ * ----------------------------------------------------------------------------- */
460
+
461
+ /* -----------------------------------------------------------------------------
462
+ * SVG - Caret Down
463
+ * ----------------------------------------------------------------------------- */
464
+
465
+ /* -----------------------------------------------------------------------------
466
+ * SVG - Caret Left
467
+ * ----------------------------------------------------------------------------- */
468
+
469
+ /* -----------------------------------------------------------------------------
470
+ * SVG - Caret Right
471
+ * ----------------------------------------------------------------------------- */
472
+
473
+ /* -----------------------------------------------------------------------------
474
+ * SVG - Caret Up
475
+ * ----------------------------------------------------------------------------- */
476
+
477
+ /* -----------------------------------------------------------------------------
478
+ * SVG - Check
479
+ * ----------------------------------------------------------------------------- */
480
+
481
+ /* -----------------------------------------------------------------------------
482
+ * SVG - Close
483
+ * ----------------------------------------------------------------------------- */
484
+
485
+ /* -----------------------------------------------------------------------------
486
+ * SVG - Day
487
+ * ----------------------------------------------------------------------------- */
488
+
489
+ /* -----------------------------------------------------------------------------
490
+ * SVG - Dropdown
491
+ * ----------------------------------------------------------------------------- */
492
+
493
+ /* -----------------------------------------------------------------------------
494
+ * SVG - Featured
495
+ * ----------------------------------------------------------------------------- */
496
+
497
+ /* -----------------------------------------------------------------------------
498
+ * SVG - Filters
499
+ * ----------------------------------------------------------------------------- */
500
+
501
+ /* -----------------------------------------------------------------------------
502
+ * SVG - Link
503
+ * ----------------------------------------------------------------------------- */
504
+
505
+ /* -----------------------------------------------------------------------------
506
+ * SVG - List
507
+ * ----------------------------------------------------------------------------- */
508
+
509
+ /* -----------------------------------------------------------------------------
510
+ * SVG - Location
511
+ * ----------------------------------------------------------------------------- */
512
+
513
+ /* -----------------------------------------------------------------------------
514
+ * SVG - Mail
515
+ * ----------------------------------------------------------------------------- */
516
+
517
+ /* -----------------------------------------------------------------------------
518
+ * SVG - Map
519
+ * ----------------------------------------------------------------------------- */
520
+
521
+ /* -----------------------------------------------------------------------------
522
+ * SVG - Map pin
523
+ * ----------------------------------------------------------------------------- */
524
+
525
+ /* -----------------------------------------------------------------------------
526
+ * SVG - Messages
527
+ * ----------------------------------------------------------------------------- */
528
+
529
+ /* -----------------------------------------------------------------------------
530
+ * SVG - Month
531
+ * ----------------------------------------------------------------------------- */
532
+
533
+ /* -----------------------------------------------------------------------------
534
+ * SVG - No Map
535
+ * ----------------------------------------------------------------------------- */
536
+
537
+ /* -----------------------------------------------------------------------------
538
+ * SVG - Phone
539
+ * ----------------------------------------------------------------------------- */
540
+
541
+ /* -----------------------------------------------------------------------------
542
+ * SVG - Photo
543
+ * ----------------------------------------------------------------------------- */
544
+
545
+ /* -----------------------------------------------------------------------------
546
+ * SVG - Plus
547
+ * ----------------------------------------------------------------------------- */
548
+
549
+ /* -----------------------------------------------------------------------------
550
+ * SVG - Recurring
551
+ * ----------------------------------------------------------------------------- */
552
+
553
+ /* -----------------------------------------------------------------------------
554
+ * SVG - Reset
555
+ * ----------------------------------------------------------------------------- */
556
+
557
+ /* -----------------------------------------------------------------------------
558
+ * SVG - Search
559
+ * ----------------------------------------------------------------------------- */
560
+
561
+ /* -----------------------------------------------------------------------------
562
+ * SVG - Search Filter
563
+ * ----------------------------------------------------------------------------- */
564
+
565
+ /* -----------------------------------------------------------------------------
566
+ * SVG - Week
567
+ * ----------------------------------------------------------------------------- */
568
+
569
+ :root {
570
+ /* -----------------------------------------------------------------------------
571
+ * Transitions
572
+ * ----------------------------------------------------------------------------- */
573
+ }
574
+
575
+ :root {
576
+ /* -----------------------------------------------------------------------------
577
+ * Font Stacks
578
+ * ----------------------------------------------------------------------------- */
579
+
580
+ /* -----------------------------------------------------------------------------
581
+ * Font Weights
582
+ * ----------------------------------------------------------------------------- */
583
+
584
+ /* -----------------------------------------------------------------------------
585
+ * Font Sizing
586
+ * ----------------------------------------------------------------------------- */
587
+
588
+ /* -----------------------------------------------------------------------------
589
+ * Line Height
590
+ * ----------------------------------------------------------------------------- */
591
+ }
592
+
593
+ /* Mixins */
594
+
595
+ /* -----------------------------------------------------------------------------
596
+ * Body
597
+ * ----------------------------------------------------------------------------- */
598
+
599
+ /* -----------------------------------------------------------------------------
600
+ * Desktop Body 1
601
+ * ----------------------------------------------------------------------------- */
602
+
603
+ /* -----------------------------------------------------------------------------
604
+ * Desktop Body 2
605
+ * ----------------------------------------------------------------------------- */
606
+
607
+ /* -----------------------------------------------------------------------------
608
+ * Desktop Body 3
609
+ * ----------------------------------------------------------------------------- */
610
+
611
+ /* -----------------------------------------------------------------------------
612
+ * Mobile Body 1
613
+ * ----------------------------------------------------------------------------- */
614
+
615
+ /* -----------------------------------------------------------------------------
616
+ * Mobile Body 2
617
+ * ----------------------------------------------------------------------------- */
618
+
619
+ /* -----------------------------------------------------------------------------
620
+ * Mobile Body 3
621
+ * ----------------------------------------------------------------------------- */
622
+
623
+ /* -----------------------------------------------------------------------------
624
+ * Heading
625
+ * ----------------------------------------------------------------------------- */
626
+
627
+ /* -----------------------------------------------------------------------------
628
+ * Heading 1
629
+ * ----------------------------------------------------------------------------- */
630
+
631
+ /* -----------------------------------------------------------------------------
632
+ * Heading 2
633
+ * ----------------------------------------------------------------------------- */
634
+
635
+ /* -----------------------------------------------------------------------------
636
+ * Heading 3
637
+ * ----------------------------------------------------------------------------- */
638
+
639
+ /* -----------------------------------------------------------------------------
640
+ * Heading 4
641
+ * ----------------------------------------------------------------------------- */
642
+
643
+ /* -----------------------------------------------------------------------------
644
+ * Heading 5
645
+ * ----------------------------------------------------------------------------- */
646
+
647
+ /* -----------------------------------------------------------------------------
648
+ * Heading 6
649
+ * ----------------------------------------------------------------------------- */
650
+
651
+ /* -----------------------------------------------------------------------------
652
+ * Heading 7
653
+ * ----------------------------------------------------------------------------- */
654
+
655
+ /* -----------------------------------------------------------------------------
656
+ * Heading 8
657
+ * ----------------------------------------------------------------------------- */
658
+
659
+ /* -----------------------------------------------------------------------------
660
+ * Anchor - Default
661
+ * ----------------------------------------------------------------------------- */
662
+
663
+ /* -----------------------------------------------------------------------------
664
+ * Anchor - Alt
665
+ * ----------------------------------------------------------------------------- */
666
+
667
+ /* -----------------------------------------------------------------------------
668
+ * Anchor - Thin
669
+ * ----------------------------------------------------------------------------- */
670
+
671
+ /* -----------------------------------------------------------------------------
672
+ * Anchor - Thin
673
+ * ----------------------------------------------------------------------------- */
674
+
675
+ /* -----------------------------------------------------------------------------
676
+ * Button - Global
677
+ * ----------------------------------------------------------------------------- */
678
+
679
+ /* -----------------------------------------------------------------------------
680
+ * Button - Solid
681
+ * ----------------------------------------------------------------------------- */
682
+
683
+ /* -----------------------------------------------------------------------------
684
+ * Button - Border
685
+ * ----------------------------------------------------------------------------- */
686
+
687
+ /* -----------------------------------------------------------------------------
688
+ * Button - Icon Border
689
+ * ----------------------------------------------------------------------------- */
690
+
691
+ /* -----------------------------------------------------------------------------
692
+ * Sliders & Toggles
693
+ * ----------------------------------------------------------------------------- */
694
+
695
+ /* -----------------------------------------------------------------------------
696
+ * Sliders
697
+ * ----------------------------------------------------------------------------- */
698
+
699
+ /* -----------------------------------------------------------------------------
700
+ * Hidden: Hide from both screenreaders and browsers
701
+ * @author: h5bp.com/u
702
+ * ----------------------------------------------------------------------------- */
703
+
704
+ /* -----------------------------------------------------------------------------
705
+ * Visually Hide: Hide only visually, but have it available for screenreaders
706
+ * @author: h5bp.com/v
707
+ * ----------------------------------------------------------------------------- */
708
+
709
+ /* -----------------------------------------------------------------------------
710
+ * Visually Show: Show element after has been hidden with %visually-hide
711
+ * ----------------------------------------------------------------------------- */
712
+
713
+ /* Base */
714
+
715
+ /* -----------------------------------------------------------------------------
716
+ *
717
+ * Base Skeleton
718
+ *
719
+ * This file is just a clearing-house.
720
+ * Make partials (start with an underscore) for any actual css code.
721
+ *
722
+ * ----------------------------------------------------------------------------- */
723
+
724
+ /* Forms */
725
+
726
+ .tribe-common {
727
+
728
+
729
+ /* -----------------------------------------------------------------------------
730
+ * Form Control: Checkboxes
731
+ * ----------------------------------------------------------------------------- */
732
+
733
+ /* -----------------------------------------------------------------------------
734
+ * Form Control: Radios
735
+ * ----------------------------------------------------------------------------- */
736
+
737
+ /* -----------------------------------------------------------------------------
738
+ *
739
+ * Form Control: Checkboxes & Radios Theme Overrides
740
+ *
741
+ * ----------------------------------------------------------------------------- */
742
+
743
+ /* -----------------------------------------------------------------------------
744
+ * Form Control: Checkboxes Theme Overrides
745
+ * ----------------------------------------------------------------------------- */
746
+
747
+ /* -----------------------------------------------------------------------------
748
+ * Form Control: Radios Theme Overrides
749
+ * ----------------------------------------------------------------------------- */
750
+ }
751
+
752
+ /* -----------------------------------------------------------------------------
753
+ *
754
+ * Form Control: Checkboxes & Radios
755
+ *
756
+ * Example (Checkboxes):
757
+ * <fieldset>
758
+ * <legend>Legend for Checkboxes</legend>
759
+ * <div class="tribe-common-form-control-checkbox-radio-group">
760
+ * <div class="tribe-common-form-control-checkbox">
761
+ * <input
762
+ * class="tribe-common-form-control-checkbox__input"
763
+ * id="checkboxOne"
764
+ * name="checkboxGroup"
765
+ * type="checkbox"
766
+ * value="checkboxOne"
767
+ * checked="checked"
768
+ * />
769
+ * <label
770
+ * class="tribe-common-form-control-checkbox__label"
771
+ * for="checkboxOne"
772
+ * >
773
+ * Checkbox One
774
+ * </label>
775
+ * </div>
776
+ * <div class="tribe-common-form-control-checkbox">
777
+ * <input
778
+ * class="tribe-common-form-control-checkbox__input"
779
+ * id="checkboxTwo"
780
+ * name="checkboxGroup"
781
+ * type="checkbox"
782
+ * value="checkboxTwo"
783
+ * />
784
+ * <label
785
+ * class="tribe-common-form-control-checkbox__label"
786
+ * for="checkboxTwo"
787
+ * >
788
+ * Checkbox Two
789
+ * </label>
790
+ * </div>
791
+ * </div>
792
+ * </fieldset>
793
+ *
794
+ * Example (Radios):
795
+ * <div class="tribe-common-form-control-checkbox-radio-group">
796
+ * <div class="tribe-common-form-control-radio">
797
+ * <input
798
+ * class="tribe-common-form-control-radio__input"
799
+ * id="radioExample"
800
+ * name="radioExample"
801
+ * type="radio"
802
+ * value="RadioExample"
803
+ * checked="checked"
804
+ * />
805
+ * <label
806
+ * class="tribe-common-form-control-radio__label"
807
+ * for="radioExample"
808
+ * >
809
+ * Radio Example
810
+ * </label>
811
+ * </div>
812
+ * </div>
813
+ *
814
+ * ----------------------------------------------------------------------------- */
815
+
816
+ .tribe-common .tribe-common-form-control-checkbox__label,
817
+ .tribe-common .tribe-common-form-control-radio__label {
818
+ cursor: pointer;
819
+ display: inline-block;
820
+ margin-left: 11px;
821
+ vertical-align: middle;
822
+ }
823
+
824
+ .tribe-common .tribe-common-form-control-checkbox__input,
825
+ .tribe-common .tribe-common-form-control-radio__input {
826
+ cursor: pointer;
827
+ display: inline-block;
828
+ margin: 0;
829
+ vertical-align: middle;
830
+ }
831
+
832
+ /* -----------------------------------------------------------------------------
833
+ * Theme Overrides - Enfold
834
+ * ----------------------------------------------------------------------------- */
835
+
836
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-checkbox__input, #top .main_color .tribe-common .tribe-common-form-control-checkbox__input {
837
+ display: inline-block;
838
+ }
839
+
840
+ /* -----------------------------------------------------------------------------
841
+ *
842
+ * Form Control: Groups (Checkbox & Radio)
843
+ *
844
+ * Example:
845
+ * <div class="tribe-common-form-control-checkbox-radio-group">
846
+ * <div class="tribe-common-form-control-checkbox">
847
+ * <input id="checkboxOne" name="checkboxGroup" type="checkbox" value="checkboxOne" checked="checked" />
848
+ * <label for="checkboxOne">Checkbox One</label>
849
+ * </div>
850
+ * <div class="tribe-common-form-control-checkbox">
851
+ * <input id="checkboxTwo" name="checkboxGroup" type="checkbox" value="checkboxTwo" />
852
+ * <label for="checkboxTwo">Checkbox two</label>
853
+ * </div>
854
+ * </div>
855
+ *
856
+ * ----------------------------------------------------------------------------- */
857
+
858
+ .tribe-common .tribe-common-form-control-checkbox-radio-group > * {
859
+ margin-bottom: 15px;
860
+ }
861
+
862
+ .tribe-common .tribe-common-form-control-checkbox-radio-group > *:last-child {
863
+ margin-bottom: 0;
864
+ }
865
+
866
+ .tribe-common {
867
+
868
+ /* -----------------------------------------------------------------------------
869
+ *
870
+ * Form Control: Sliders Theme Overrides
871
+ *
872
+ * ----------------------------------------------------------------------------- */
873
+ }
874
+
875
+ /* -----------------------------------------------------------------------------
876
+ *
877
+ * Form Control: Sliders
878
+ *
879
+ * Example (Horizontal):
880
+ * <div class="tribe-common-form-control-slider">
881
+ * <input
882
+ * class="tribe-common-form-control-slider__input"
883
+ * id="sliderOne"
884
+ * type="range"
885
+ * min="0"
886
+ * max="100"
887
+ * value="50"
888
+ * />
889
+ * <label class="tribe-common-form-control-slider__label" for="sliderOne">Slider One</label>
890
+ * </div>
891
+ *
892
+ * Example (Vertical):
893
+ * <div class="tribe-common-form-control-slider tribe-common-form-control-slider--vertical">
894
+ * <label class="tribe-common-form-control-slider__label" for="sliderOne">Slider One</label>
895
+ * <input
896
+ * class="tribe-common-form-control-slider__input"
897
+ * id="sliderOne"
898
+ * type="range"
899
+ * min="0"
900
+ * max="100"
901
+ * value="50"
902
+ * />
903
+ * </div>
904
+ *
905
+ * ----------------------------------------------------------------------------- */
906
+
907
+ .tribe-common .tribe-common-form-control-slider__input {
908
+ cursor: pointer;
909
+ display: inline-block;
910
+ margin: 0;
911
+ padding: 0;
912
+ width: 120px;
913
+ vertical-align: middle;
914
+
915
+ /* -----------------------------------------------------------------------------
916
+ * Track styles
917
+ * ----------------------------------------------------------------------------- */
918
+
919
+ /* -----------------------------------------------------------------------------
920
+ * Thumb styles
921
+ * ----------------------------------------------------------------------------- */
922
+ }
923
+
924
+ .tribe-common .tribe-common-form-control-slider__label {
925
+ cursor: pointer;
926
+ display: inline-block;
927
+ margin-left: 11px;
928
+ vertical-align: middle;
929
+ }
930
+
931
+ .tribe-common .tribe-common-form-control-slider--vertical .tribe-common-form-control-slider__label {
932
+ display: block;
933
+ margin: 0 0 6px;
934
+ }
935
+
936
+ .tribe-common {
937
+
938
+ /* -----------------------------------------------------------------------------
939
+ *
940
+ * Form Control: Text Theme Overrides
941
+ *
942
+ * ----------------------------------------------------------------------------- */
943
+ }
944
+
945
+ /* -----------------------------------------------------------------------------
946
+ *
947
+ * Form Control: Text
948
+ *
949
+ * Example:
950
+ * <div class="tribe-common-form-control-text">
951
+ * <label class="tribe-common-form-control-text__label" for="textInput">Text Input</label>
952
+ * <input
953
+ * class="tribe-common-form-control-text__input"
954
+ * id="textInput"
955
+ * name="textInput"
956
+ * type="text"
957
+ * placeholder="Text Input"
958
+ * />
959
+ * </div>
960
+ *
961
+ * ----------------------------------------------------------------------------- */
962
+
963
+ .tribe-common .tribe-common-form-control-text__label {
964
+ border: 0;
965
+ clip: rect(0 0 0 0);
966
+ height: 1px;
967
+ margin: -1px;
968
+ overflow: hidden;
969
+ padding: 0;
970
+ position: absolute;
971
+ width: 1px;
972
+ }
973
+
974
+ .tribe-common .tribe-common-form-control-text__input {
975
+ height: auto;
976
+ padding: 12px 28px 12px 0;
977
+ width: 100%;
978
+ }
979
+
980
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-form-control-text__input {
981
+ padding: 20px 20px 20px 40px;
982
+ }
983
+
984
+ /* -------------------------------------------------------------------------
985
+ * Theme Overrides - Enfold
986
+ * ------------------------------------------------------------------------- */
987
+
988
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-text__input, #top .main_color .tribe-common .tribe-common-form-control-text__input {
989
+ padding: 12px 28px 12px 0;
990
+ width: 100%;
991
+ }
992
+
993
+ #top.tribe-theme-enfold .tribe-common.tribe-common--breakpoint-medium .tribe-common-form-control-text__input, #top .main_color .tribe-common.tribe-common--breakpoint-medium .tribe-common-form-control-text__input {
994
+ padding: 20px 20px 20px 40px;
995
+ }
996
+
997
+ .tribe-common {
998
+
999
+ /* -----------------------------------------------------------------------------
1000
+ *
1001
+ * Form Control: Toggles Theme Overrides
1002
+ *
1003
+ * ----------------------------------------------------------------------------- */
1004
+ }
1005
+
1006
+ /* -----------------------------------------------------------------------------
1007
+ *
1008
+ * Form Control: Toggles
1009
+ *
1010
+ * Example (Horizontal):
1011
+ * <div class="tribe-common-form-control-toggle">
1012
+ * <input
1013
+ * class="tribe-common-form-control-toggle__input"
1014
+ * id="toggleOne"
1015
+ * name="toggleGroup"
1016
+ * type="checkbox"
1017
+ * value="toggleOne"
1018
+ * />
1019
+ * <label class="tribe-common-form-control-toggle__label" for="toggleOne">Toggle One</label>
1020
+ * </div>
1021
+ *
1022
+ * Example (Vertical):
1023
+ * <div class="tribe-common-form-control-toggle tribe-common-form-control-toggle--vertical">
1024
+ * <label class="tribe-common-form-control-toggle__label" for="toggleOne">Toggle One</label>
1025
+ * <input
1026
+ * class="tribe-common-form-control-toggle__input"
1027
+ * id="toggleOne"
1028
+ * name="toggleGroup"
1029
+ * type="checkbox"
1030
+ * value="toggleOne"
1031
+ * />
1032
+ * </div>
1033
+ *
1034
+ * ----------------------------------------------------------------------------- */
1035
+
1036
+ .tribe-common .tribe-common-form-control-toggle__input {
1037
+ cursor: pointer;
1038
+ display: inline-block;
1039
+ vertical-align: middle;
1040
+ }
1041
+
1042
+ .tribe-common .tribe-common-form-control-toggle__label {
1043
+ cursor: pointer;
1044
+ display: inline-block;
1045
+ margin-left: 11px;
1046
+ vertical-align: middle;
1047
+ }
1048
+
1049
+ .tribe-common .tribe-common-form-control-toggle--vertical .tribe-common-form-control-toggle__label {
1050
+ display: block;
1051
+ margin: 0 0 6px;
1052
+ }
1053
+
1054
+ /* -----------------------------------------------------------------------------
1055
+ * Theme Overrides - Enfold
1056
+ * ----------------------------------------------------------------------------- */
1057
+
1058
+ #top.tribe-theme-enfold .tribe-common .tribe-common-form-control-toggle__input, #top .main_color .tribe-common .tribe-common-form-control-toggle__input {
1059
+ display: inline-block;
1060
+ margin: 5px 0;
1061
+ }
1062
+
1063
+ /* Grid */
1064
+
1065
+ /* -----------------------------------------------------------------------------
1066
+ * Grid: Columns
1067
+ * ----------------------------------------------------------------------------- */
1068
+
1069
+ .tribe-common .tribe-common-g-col {
1070
+ min-width: 0;
1071
+ width: 100%;
1072
+ }
1073
+
1074
+ .tribe-common {
1075
+
1076
+ /* -------------------------------------------------------------------------
1077
+ *
1078
+ * Grid Rows: Theme Overrides
1079
+ *
1080
+ * ------------------------------------------------------------------------- */
1081
+ }
1082
+
1083
+ /* -----------------------------------------------------------------------------
1084
+ *
1085
+ * Grid: Rows
1086
+ *
1087
+ * Example:
1088
+ * <div class="g-row">
1089
+ * <div class="g-col">
1090
+ * <p>Component or another grid layout, perhaps?</p>
1091
+ * </div>
1092
+ * </div>
1093
+ *
1094
+ * ----------------------------------------------------------------------------- */
1095
+
1096
+ .tribe-common .tribe-common-g-row {
1097
+ display: -webkit-box;
1098
+ display: flex;
1099
+ flex-wrap: wrap;
1100
+ }
1101
+
1102
+ .tribe-common .tribe-common-g-row--gutters {
1103
+ margin-left: -21px;
1104
+ margin-right: -21px;
1105
+ }
1106
+
1107
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-g-row--gutters {
1108
+ margin-left: -24px;
1109
+ margin-right: -24px;
1110
+ }
1111
+
1112
+ .tribe-common .tribe-common-g-row--gutters > .tribe-common-g-col {
1113
+ padding-left: 21px;
1114
+ padding-right: 21px;
1115
+ }
1116
+
1117
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-g-row--gutters > .tribe-common-g-col {
1118
+ padding-left: 24px;
1119
+ padding-right: 24px;
1120
+ }
1121
+
1122
+ /* -----------------------------------------------------------------------------
1123
+ * Theme Overrides - Twenty Nineteen
1124
+ * ----------------------------------------------------------------------------- */
1125
+
1126
+ .tribe-theme-twentynineteen .tribe-common .entry.tribe-common-g-row--gutters {
1127
+ margin-left: -21px;
1128
+ margin-right: -21px;
1129
+ padding: 0;
1130
+ }
1131
+
1132
+ .tribe-theme-twentynineteen .tribe-common.tribe-common--breakpoint-medium .entry.tribe-common-g-row--gutters {
1133
+ margin-left: -24px;
1134
+ margin-right: -24px;
1135
+ }
1136
+
1137
+ .tribe-theme-twentynineteen .tribe-common .tribe-common-g-row--gutters > .entry.tribe-common-g-col {
1138
+ margin: 0;
1139
+ padding-left: 21px;
1140
+ padding-right: 21px;
1141
+ }
1142
+
1143
+ .tribe-theme-twentynineteen .tribe-common.tribe-common--breakpoint-medium .tribe-common-g-row--gutters > .entry.tribe-common-g-col {
1144
+ padding-left: 24px;
1145
+ padding-right: 24px;
1146
+ }
1147
+
1148
+ /* Typography */
1149
+
1150
+ .tribe-common {
1151
+
1152
+ /* -------------------------------------------------------------------------
1153
+ *
1154
+ * Anchor: Theme Overrides
1155
+ *
1156
+ * ------------------------------------------------------------------------- */
1157
+
1158
+ /* -------------------------------------------------------------------------
1159
+ *
1160
+ * Anchor
1161
+ *
1162
+ * Example:
1163
+ * <a class="tribe-common-anchor">Anchor Text</a>
1164
+ * <a class="tribe-common-anchor-alt">Anchor Alt Text</a>
1165
+ * <a class="tribe-common-anchor-thin">Anchor Thin Text</a>
1166
+ *
1167
+ * ------------------------------------------------------------------------- */
1168
+
1169
+ /* -------------------------------------------------------------------------
1170
+ *
1171
+ * Anchor: Theme Overrides
1172
+ *
1173
+ * ------------------------------------------------------------------------- */
1174
+ }
1175
+
1176
+ .tribe-common a {
1177
+ cursor: pointer;
1178
+ }
1179
+
1180
+ /* .tribe-common { */
1181
+
1182
+ /* -------------------------------------------------------------------------
1183
+ *
1184
+ * Body
1185
+ *
1186
+ * Example:
1187
+ * <p class="tribe-common-b1">Text here</p>
1188
+ *
1189
+ * ------------------------------------------------------------------------- */
1190
+
1191
+ /* -------------------------------------------------------------------------
1192
+ * Body 1
1193
+ * ------------------------------------------------------------------------- */
1194
+
1195
+ /* -------------------------------------------------------------------------
1196
+ * Body 2
1197
+ * ------------------------------------------------------------------------- */
1198
+
1199
+ /* -------------------------------------------------------------------------
1200
+ * Body 3
1201
+ * ------------------------------------------------------------------------- */
1202
+
1203
+ /* -------------------------------------------------------------------------
1204
+ * Body 1 for --viewport-medium
1205
+ * ------------------------------------------------------------------------- */
1206
+
1207
+ /* -------------------------------------------------------------------------
1208
+ * Body 2 for --viewport-medium
1209
+ * ------------------------------------------------------------------------- */
1210
+
1211
+ /* -------------------------------------------------------------------------
1212
+ * Body 3 for --viewport-medium
1213
+ * ------------------------------------------------------------------------- */
1214
+
1215
+ /* } */
1216
+
1217
+ /* .tribe-common { */
1218
+
1219
+ /* -------------------------------------------------------------------------
1220
+ *
1221
+ * CTA
1222
+ *
1223
+ * Example:
1224
+ * <a class="tribe-common-cta">Link Text</a>
1225
+ * <a class="tribe-common-cta tribe-common-cta--alt">Link Text Alt</a>
1226
+ *
1227
+ * ------------------------------------------------------------------------- */
1228
+
1229
+ /* -------------------------------------------------------------------------
1230
+ *
1231
+ * CTA: Theme Overrides
1232
+ *
1233
+ * ------------------------------------------------------------------------- */
1234
+
1235
+ /* } */
1236
+
1237
+ /* .tribe-common { */
1238
+
1239
+ /* -------------------------------------------------------------------------
1240
+ *
1241
+ * Heading
1242
+ *
1243
+ * Example:
1244
+ * <h1 class="tribe-common-h1">Heading Text</h1>
1245
+ *
1246
+ * ------------------------------------------------------------------------- */
1247
+
1248
+ /* -------------------------------------------------------------------------
1249
+ * Heading: h1
1250
+ * ------------------------------------------------------------------------- */
1251
+
1252
+ /* -------------------------------------------------------------------------
1253
+ * Heading: h2
1254
+ * ------------------------------------------------------------------------- */
1255
+
1256
+ /* -------------------------------------------------------------------------
1257
+ * Heading: h3
1258
+ * ------------------------------------------------------------------------- */
1259
+
1260
+ /* -------------------------------------------------------------------------
1261
+ * Heading: h4
1262
+ * ------------------------------------------------------------------------- */
1263
+
1264
+ /* -------------------------------------------------------------------------
1265
+ * Heading: h5
1266
+ * ------------------------------------------------------------------------- */
1267
+
1268
+ /* -------------------------------------------------------------------------
1269
+ * Heading: h6
1270
+ * ------------------------------------------------------------------------- */
1271
+
1272
+ /* -------------------------------------------------------------------------
1273
+ * Heading: h7
1274
+ * ------------------------------------------------------------------------- */
1275
+
1276
+ /* -------------------------------------------------------------------------
1277
+ * Heading: h8
1278
+ * ------------------------------------------------------------------------- */
1279
+
1280
+ /* -------------------------------------------------------------------------
1281
+ * Heading: h3 for --viewport-medium
1282
+ * ------------------------------------------------------------------------- */
1283
+
1284
+ /* -------------------------------------------------------------------------
1285
+ * Heading: h4 for --viewport-medium
1286
+ * ------------------------------------------------------------------------- */
1287
+
1288
+ /* -------------------------------------------------------------------------
1289
+ * Heading: h5 for --viewport-medium
1290
+ * ------------------------------------------------------------------------- */
1291
+
1292
+ /* -------------------------------------------------------------------------
1293
+ * Heading: h6 for --viewport-medium
1294
+ * ------------------------------------------------------------------------- */
1295
+
1296
+ /* -------------------------------------------------------------------------
1297
+ * Heading: h7 for --viewport-medium
1298
+ * ------------------------------------------------------------------------- */
1299
+
1300
+ /* -------------------------------------------------------------------------
1301
+ * Heading: alt style
1302
+ * ------------------------------------------------------------------------- */
1303
+
1304
+ /* -------------------------------------------------------------------------
1305
+ *
1306
+ * Heading: Theme Overrides
1307
+ *
1308
+ * ------------------------------------------------------------------------- */
1309
+
1310
+ /* } */
1311
+
1312
+ .tribe-common {
1313
+ /* -------------------------------------------------------------------------
1314
+ * Lists
1315
+ * ------------------------------------------------------------------------- */
1316
+
1317
+ /* -----------------------------------------------------------------------------
1318
+ *
1319
+ * Lists: Theme Overrides
1320
+ *
1321
+ * ----------------------------------------------------------------------------- */
1322
+ }
1323
+
1324
+ /* -------------------------------------------------------------------------
1325
+ * Theme Overrides - Divi
1326
+ * ------------------------------------------------------------------------- */
1327
+
1328
+ .tribe-theme-divi #left-area .tribe-common ul,
1329
+ .tribe-theme-divi .entry-content .tribe-common ul,
1330
+ body.et-pb-preview.tribe-theme-divi #main-content .container .tribe-common ul {
1331
+ list-style-type: none;
1332
+ padding: 0;
1333
+ }
1334
+
1335
+ /* -------------------------------------------------------------------------
1336
+ * Theme Overrides - Genesis
1337
+ * ------------------------------------------------------------------------- */
1338
+
1339
+ .entry-content .tribe-common ul > li,
1340
+ .entry-content .tribe-common ol > li {
1341
+ list-style-type: none;
1342
+ }
1343
+
1344
+ .tribe-common {
1345
+
1346
+ /* -------------------------------------------------------------------------
1347
+ *
1348
+ * Button: Theme Overrides
1349
+ *
1350
+ * ------------------------------------------------------------------------- */
1351
+
1352
+ }
1353
+
1354
+ /* -------------------------------------------------------------------------
1355
+ * Button
1356
+ * ------------------------------------------------------------------------- */
1357
+
1358
+ .tribe-common button {
1359
+ padding: 0;
1360
+ }
1361
+
1362
+ /* -----------------------------------------------------------------------------
1363
+ *
1364
+ * Layout: Global Content Container
1365
+ *
1366
+ * ----------------------------------------------------------------------------- */
1367
+
1368
+ .tribe-common .tribe-common-l-container {
1369
+ max-width: 1260px;
1370
+ margin-left: auto;
1371
+ margin-right: auto;
1372
+ padding-left: 19.5px;
1373
+ padding-right: 19.5px;
1374
+ width: 100%;
1375
+ }
1376
+
1377
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-l-container {
1378
+ padding-left: 42px;
1379
+ padding-right: 42px;
1380
+ }
1381
+
1382
+ /* -------------------------------------------------------------------------
1383
+ * SVG Icons
1384
+ * ------------------------------------------------------------------------- */
1385
+
1386
+ .tribe-common .tribe-common-svgicon {
1387
+ background-repeat: no-repeat;
1388
+ background-size: contain;
1389
+ }
1390
+
1391
+ .tribe-common .tribe-common-svgicon--close {
1392
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cg fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'%3E%3Cpath d='M16 2L2 16M16 16L2 2' stroke='%235D5D5D'/%3E%3C/g%3E%3C/svg%3E");
1393
+ }
1394
+
1395
+ .tribe-common .tribe-common-svgicon--close-secondary {
1396
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cg fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'%3E%3Cpath d='M16 2L2 16M16 16L2 2' stroke='%23BABABA'/%3E%3C/g%3E%3C/svg%3E");
1397
+ }
1398
+
1399
+ .tribe-common .tribe-common-svgicon--day {
1400
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='21' height='21' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 .503v19.994c0 .278.19.503.424.503h20.152c.234 0 .424-.225.424-.503V.503C21 .225 20.81 0 20.576 0H.424C.19 0 0 .225 0 .503zm1.156.943h18.66v2.7H1.157v-2.7zm0 4.023h18.66V19.55H1.157V5.469zM14.18 14.53v1.747c0 .482.39.874.873.874h1.747a.873.873 0 0 0 .873-.874v-1.747a.873.873 0 0 0-.873-.873h-1.747a.873.873 0 0 0-.873.873z' fill='%23141827' fill-rule='nonzero'/%3E%3C/svg%3E");
1401
+ }
1402
+
1403
+ .tribe-common .tribe-common-svgicon--filters {
1404
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='17' height='17'%3E%3Cg fill='none' fill-rule='evenodd' stroke='%23727272' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' transform='translate(1 1)'%3E%3Cpath d='M3 3V0M3 15v-2' stroke='%235D5D5D'/%3E%3Ccircle cx='3' cy='9' r='3' stroke='%235D5D5D'/%3E%3Cpath d='M12 9v6' stroke='%235D5D5D'/%3E%3Ccircle cx='12' cy='3' r='3' transform='matrix(1 0 0 -1 0 6)' stroke='%235D5D5D'/%3E%3C/g%3E%3C/svg%3E");
1405
+ }
1406
+
1407
+ .tribe-common .tribe-common-svgicon--list {
1408
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 22'%3E%3Cdefs/%3E%3Cg fill='%23141827' fill-rule='evenodd'%3E%3Cpath fill-rule='nonzero' d='M0 .50378788V20.5332919c0 .278234.19022354.5037879.42487547.5037879H20.6133064c.2346519 0 .4248754-.2255539.4248754-.5037879V.50378788C21.0381818.22555389 20.8479583 0 20.6133064 0H.42487547C.19022355 0 0 .2255539 0 .50378788zm1.1580346.94435628h18.6945206v2.70490149H1.1580346V1.44814416zm0 2.70490796h18.6945206V19.5845078H1.1580346V4.15305212z' fill='%23141827'/%3E%3Cpath d='M13.38928235 5.73125033V7.860417c0 .58795234.48212125 1.06458333 1.07684605 1.06458333h2.1536922c.5947248 0 1.0768461-.47663099 1.0768461-1.06458333V5.73125033c0-.58795234-.4821213-1.06458333-1.0768461-1.06458333h-2.1536922c-.5947248 0-1.07684605.476631-1.07684605 1.06458333z' fill='%23141827'/%3E%3Cpath fill-rule='nonzero' d='M8.83943685 8.936667c.28648654 0 .52088465-.23521914.52088465-.5227092v-.4245816c0-.28749006-.23439811-.5227092-.52088465-.5227092h-4.8185522C3.7343981 7.466667 3.5 7.70188614 3.5 7.9893762v.4245816c0 .28749006.2343981.5227092.52088465.5227092h4.8185522zM10.9041036 6.136667c.28648654 0 .52088465-.23521914.52088465-.5227092v-.4245816c0-.28749006-.23439811-.5227092-.52088465-.5227092H4.02088465C3.7343981 4.666667 3.5 4.90188614 3.5 5.1893762v.4245816c0 .28749006.2343981.5227092.52088465.5227092h6.88321895z' fill='%23141827'/%3E%3Cg%3E%3Cpath d='M13.38928235 12.73125033V14.860417c0 .58795234.48212125 1.06458333 1.07684605 1.06458333h2.1536922c.5947248 0 1.0768461-.47663099 1.0768461-1.06458333v-2.12916667c0-.58795234-.4821213-1.06458333-1.0768461-1.06458333h-2.1536922c-.5947248 0-1.07684605.476631-1.07684605 1.06458333z' fill='%23141827'/%3E%3Cpath fill-rule='nonzero' d='M8.83943685 15.936667c.28648654 0 .52088465-.23521914.52088465-.5227092v-.4245816c0-.28749006-.23439811-.5227092-.52088465-.5227092h-4.8185522c-.28648655 0-.52088465.23521914-.52088465.5227092v.4245816c0 .28749006.2343981.5227092.52088465.5227092h4.8185522zM10.9041036 13.136667c.28648654 0 .52088465-.23521914.52088465-.5227092v-.4245816c0-.28749006-.23439811-.5227092-.52088465-.5227092H4.02088465c-.28648655 0-.52088465.23521914-.52088465.5227092v.4245816c0 .28749006.2343981.5227092.52088465.5227092h6.88321895z' fill='%23141827'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
1409
+ }
1410
+
1411
+ .tribe-common .tribe-common-svgicon--map {
1412
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 22'%3E%3Cdefs/%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill-rule='nonzero' stroke-width='.7'%3E%3Cpath fill='%23141827' stroke='%23141827' d='M10.66992557 17.2092094c.18208949-.2244634 4.46052505-5.52626362 4.46052505-8.17980983 0-2.72724863-2.08535521-4.94606657-4.64855882-4.94606657-2.56320359 0-4.6485588 2.21881794-4.6485588 4.94606657 0 2.65354618 4.27843556 7.95534643 4.46052504 8.17980983.04719041.0580842.11585307.0915149.18803376.0915149.0721807 0 .14084336-.0334307.18803377-.0915149zM6.33022741 9.02939957c0-2.43579482 1.86238353-4.41737092 4.15166439-4.41737092 2.28928088 0 4.15166441 1.9815761 4.15166441 4.41737092 0 2.15995923-3.31788627 6.53241163-4.15166441 7.59703123-.83377813-1.0644905-4.15166439-5.43616846-4.15166439-7.59703123z'/%3E%3Cpath fill='%23141827' stroke='%23000' d='M12.05539077 9.03985474c0-.91098834-.70589102-1.65217392-1.57349897-1.65217392-.86760794 0-1.57349896.74118558-1.57349896 1.65217392 0 .91098834.70589102 1.65217392 1.57349896 1.65217392.86760795 0 1.57349897-.74118558 1.57349897-1.65217392zm-2.85036002 0c0-.73928452.57278056-1.34070411 1.27686105-1.34070411.70408051 0 1.27686107.60141959 1.27686107 1.34070411 0 .73928452-.57278056 1.34070411-1.27686107 1.34070411-.70408049 0-1.27686105-.60141959-1.27686105-1.34070411z'/%3E%3C/g%3E%3Cpath fill='%23141827' fill-rule='nonzero' d='M0 .50378788V20.5332919c0 .278234.19022354.5037879.42487547.5037879H20.6133064c.2346519 0 .4248754-.2255539.4248754-.5037879V.50378788C21.0381818.22555389 20.8479583 0 20.6133064 0H.42487547C.19022355 0 0 .2255539 0 .50378788zm1.1580346.94435628h18.6945206v2.70490796H1.1580346V1.44814416zm0 2.70490796h18.6945206V19.5845078H1.1580346V4.15305212z'/%3E%3C/g%3E%3C/svg%3E");
1413
+ }
1414
+
1415
+ .tribe-common .tribe-common-svgicon--month {
1416
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='22' height='22' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M.637 1.063v19.879c0 .276.189.5.422.5h20.037c.232 0 .421-.224.421-.5V1.062c0-.275-.189-.5-.421-.5H1.059c-.233 0-.422.225-.422.5zM1.787 2H20.34v2.685H1.787V2zm0 4H20.34v14H1.787V6zM8 8.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm4 0v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm4 0v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm-8 4v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm4 0v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm4 0v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm-12 0v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm0 4v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm4 0v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5zm4 0v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5z' fill='%23141827' fill-rule='nonzero'/%3E%3C/svg%3E");
1417
+ }
1418
+
1419
+ .tribe-common .tribe-common-svgicon--no-map {
1420
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='92' height='92' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill-rule='nonzero' fill='none'%3E%3Cg stroke='%23141827' stroke-width='2.5' transform='translate(2 2)'%3E%3Cpath d='M32.219 88S0 58.674 0 32.281C-.011 15.598 12.685 1.66 29.278.136c16.593-1.523 31.608 9.873 34.627 26.28M32.733 88s2.96-2.693 7.083-7.181' stroke-linecap='round'/%3E%3Ccircle cx='33' cy='33' r='8.905'/%3E%3Ccircle cx='65.127' cy='59.016' r='23.571'/%3E%3C/g%3E%3Cg transform='translate(64.857 47.048)'%3E%3Ccircle fill='%23111' cx='2.839' cy='26.495' r='2.839'/%3E%3Cpath d='M2.642 0v18.925' stroke='%23141827' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
1421
+ }
1422
+
1423
+ .tribe-common .tribe-common-svgicon--photo {
1424
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 21 21'%3E%3Cdefs/%3E%3Cg fill='%23141827' fill-rule='nonzero'%3E%3Cpath d='M20.4070967 0H.57757675C.25413377 0 0 .24803922 0 .5637255v19.872549C0 20.7519607.25413377 21 .57757676 21H20.4070967c.323443 0 .5775767-.2480393.5775767-.5637255V.5637255C20.9846734.24803921 20.7305397 0 20.4070967 0zm-.6006799 1.15v14.8679567l-2.2249804-3.4274509c-.6468859-.6764706-1.8482455-.6764706-2.4951316 0l-1.5479057 1.6460784-4.48199558-5.02843135c-.34654605-.38333333-.83171053-.58627451-1.36308114-.58627451-.50826755 0-1.01653509.22549021-1.33997808.60882354L1.17825658 14.9807019V1.15H19.8064168zM1.17825658 19.8499999v-3.1330235l6.0530044-6.76470589c.11551535-.13529412.27723684-.20294118.4620614-.20294118.16172149 0 .36964912.06764706.48516448.20294118l4.92095394 5.52450979c.1155153.1127452.2772369.2029412.4389583.2029412.1848246.022549.3234431-.067647.4389583-.1803922l1.9868641-2.1196078c.1848246-.2029412.5544737-.2029412.7624013 0l3.1028972 4.3519608v2.1408666H1.17825658v-.022549z' fill='%23141827'/%3E%3Cpath d='M14.9552083 9.04117648c1.159375 0 2.121875-.96960785 2.121875-2.18725491 0-1.21764705-.940625-2.1872549-2.121875-2.1872549-1.18125 0-2.121875.96960785-2.121875 2.1872549 0 1.21764706.9625 2.18725491 2.121875 2.18725491zm0-3.22450981c.546875 0 1.00625.47352941 1.00625 1.0372549 0 .5637255-.459375 1.03725491-1.00625 1.03725491-.546875 0-1.00625-.47352941-1.00625-1.03725491 0-.56372549.459375-1.0372549 1.00625-1.0372549z' fill='%23141827'/%3E%3C/g%3E%3C/svg%3E");
1425
+ }
1426
+
1427
+ .tribe-common .tribe-common-svgicon--search {
1428
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 18.711l-6.044-6.044a7.782 7.782 0 0 0 1.688-4.845c0-2.089-.822-4.044-2.288-5.533C11.866.822 9.91 0 7.822 0S3.778.822 2.29 2.289A7.801 7.801 0 0 0 0 7.822c0 2.09.822 4.045 2.289 5.534a7.801 7.801 0 0 0 5.533 2.288c1.778 0 3.467-.6 4.845-1.688L18.71 20 20 18.711zM3.578 12.067c-2.334-2.334-2.334-6.156 0-8.49a5.968 5.968 0 0 1 4.244-1.755c1.6 0 3.111.622 4.245 1.756 2.333 2.333 2.333 6.155 0 8.489a5.968 5.968 0 0 1-4.245 1.755c-1.6 0-3.11-.622-4.244-1.755z' fill='%235D5D5D'/%3E%3C/svg%3E");
1429
+ }
1430
+
1431
+ .tribe-common .tribe-common-svgicon--week {
1432
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='21' height='21' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 .503v19.994c0 .278.19.503.424.503h20.152c.234 0 .424-.225.424-.503V.503C21 .225 20.81 0 20.576 0H.424C.19 0 0 .225 0 .503zm1.156.943h18.66v2.7H1.157v-2.7zm0 4.023h18.66V19.55H1.157V5.469zm6.25 6.537v1.006c0 .278.224.503.502.503h1.006a.503.503 0 0 0 .503-.503v-1.006a.503.503 0 0 0-.503-.502H7.908a.503.503 0 0 0-.503.502zm4.022 0v1.006c0 .278.225.503.503.503h1.006a.503.503 0 0 0 .503-.503v-1.006a.503.503 0 0 0-.503-.502H11.93a.503.503 0 0 0-.503.502zm4.023 0v1.006c0 .278.225.503.503.503h1.006a.503.503 0 0 0 .503-.503v-1.006a.503.503 0 0 0-.503-.502h-1.006a.503.503 0 0 0-.503.502zm-12.069 0v1.006c0 .278.225.503.503.503h1.006a.503.503 0 0 0 .503-.503v-1.006a.503.503 0 0 0-.503-.502H3.885a.503.503 0 0 0-.503.502z' fill='%23141827' fill-rule='nonzero'/%3E%3C/svg%3E");
1433
+ }
1434
+
1435
+ .tribe-common .tribe-common-svgicon--featured {
1436
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h16v20l-7.902-5.122L0 20z' fill='%23141827'/%3E%3C/svg%3E");
1437
+ height: 10px;
1438
+ width: 8px;
1439
+ }
1440
+
1441
+ .tribe-common .tribe-common-svgicon--recurring {
1442
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.333 3.826c0 .065 0 .13-.02.174 0 .022-.02.065-.02.087a.9.9 0 0 1-.197.37L10.45 7.37a.797.797 0 0 1-.592.26.797.797 0 0 1-.593-.26c-.316-.348-.316-.935 0-1.305l1.225-1.348H6.3C3.753 4.717 1.66 7 1.66 9.827c0 1.369.474 2.651 1.363 3.608.316.348.316.935 0 1.304A.797.797 0 0 1 2.43 15a.797.797 0 0 1-.593-.26C.652 13.434 0 11.695 0 9.847c0-3.826 2.825-6.935 6.301-6.935h4.208L9.284 1.565c-.316-.348-.316-.935 0-1.304.316-.348.85-.348 1.185 0l2.647 2.913c.099.109.158.239.198.37 0 .021.02.065.02.086v.196zM20 10.152c0 3.826-2.825 6.935-6.301 6.935H9.49l1.225 1.348c.336.348.336.935 0 1.304a.797.797 0 0 1-.593.261.83.83 0 0 1-.592-.26l-2.627-2.936a.948.948 0 0 1-.198-.37c0-.021-.02-.064-.02-.086-.02-.065-.02-.109-.02-.174 0-.065 0-.13.02-.174 0-.022.02-.065.02-.087a.9.9 0 0 1 .198-.37L9.55 12.63c.316-.347.849-.347 1.185 0 .336.348.336.935 0 1.305L9.51 15.283h4.208c2.548 0 4.641-2.283 4.641-5.11 0-1.369-.474-2.651-1.362-3.608a.97.97 0 0 1 0-1.304c.316-.348.849-.348 1.185 0C19.348 6.543 20 8.283 20 10.152z' fill='%23141827'/%3E%3C/svg%3E");
1443
+ height: 10px;
1444
+ width: 10px;
1445
+ }
1446
+
1447
+ .tribe-common .tribe-common-svgicon--search {
1448
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 18.711l-6.044-6.044a7.782 7.782 0 0 0 1.688-4.845c0-2.089-.822-4.044-2.288-5.533C11.866.822 9.91 0 7.822 0S3.778.822 2.29 2.289A7.801 7.801 0 0 0 0 7.822c0 2.09.822 4.045 2.289 5.534a7.801 7.801 0 0 0 5.533 2.288c1.778 0 3.467-.6 4.845-1.688L18.71 20 20 18.711zM3.578 12.067c-2.334-2.334-2.334-6.156 0-8.49a5.968 5.968 0 0 1 4.244-1.755c1.6 0 3.111.622 4.245 1.756 2.333 2.333 2.333 6.155 0 8.489a5.968 5.968 0 0 1-4.245 1.755c-1.6 0-3.11-.622-4.244-1.755z' fill='%235D5D5D'/%3E%3C/svg%3E");
1449
+ }
1450
+
1451
+ .tribe-common .tribe-common-svgicon--filters {
1452
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='17' height='17'%3E%3Cg fill='none' fill-rule='evenodd' stroke='%23727272' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' transform='translate(1 1)'%3E%3Cpath d='M3 3V0M3 15v-2' stroke='%235D5D5D'/%3E%3Ccircle cx='3' cy='9' r='3' stroke='%235D5D5D'/%3E%3Cpath d='M12 9v6' stroke='%235D5D5D'/%3E%3Ccircle cx='12' cy='3' r='3' transform='matrix(1 0 0 -1 0 6)' stroke='%235D5D5D'/%3E%3C/g%3E%3C/svg%3E");
1453
+ }
1454
+
1455
+ .tribe-common .tribe-common-svgicon--close {
1456
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cg fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'%3E%3Cpath d='M16 2L2 16M16 16L2 2' stroke='%235D5D5D'/%3E%3C/g%3E%3C/svg%3E");
1457
+ }
1458
+
1459
+ /* .tribe-common { */
1460
+
1461
+ /* -----------------------------------------------------------------------------
1462
+ *
1463
+ * Tables
1464
+ *
1465
+ * ----------------------------------------------------------------------------- */
1466
+
1467
+ /* -----------------------------------------------------------------------------
1468
+ * Tables: Theme Overrides
1469
+ * ----------------------------------------------------------------------------- */
1470
+
1471
+ /* } */
1472
+
1473
+ /* A11y */
1474
+
1475
+ /* -----------------------------------------------------------------------------
1476
+ *
1477
+ * A11y
1478
+ *
1479
+ * This file is just a clearing-house.
1480
+ * Make partials (start with an underscore) for any actual css code.
1481
+ *
1482
+ * ----------------------------------------------------------------------------- */
1483
+
1484
+ /* -----------------------------------------------------------------------------
1485
+ * Hide from screenreaders & browsers
1486
+ * ----------------------------------------------------------------------------- */
1487
+
1488
+ .tribe-common .tribe-common-a11y-hidden {
1489
+ display: none !important;
1490
+ visibility: hidden;
1491
+ }
1492
+
1493
+ /* -----------------------------------------------------------------------------
1494
+ * Hide from browsers & show for screenreaders
1495
+ * ----------------------------------------------------------------------------- */
1496
+
1497
+ .tribe-common .tribe-common-a11y-visual-hide {
1498
+ border: 0;
1499
+ clip: rect(0 0 0 0);
1500
+ height: 1px;
1501
+ margin: -1px;
1502
+ overflow: hidden;
1503
+ padding: 0;
1504
+ position: absolute;
1505
+ width: 1px;
1506
+ }
1507
+
1508
+ /* -----------------------------------------------------------------------------
1509
+ * Show for browsers & screenreaders
1510
+ * ----------------------------------------------------------------------------- */
1511
+
1512
+ .tribe-common .tribe-common-a11y-visual-show {
1513
+ border: 0;
1514
+ clip: rect(0 0 0 0);
1515
+ height: 1px;
1516
+ margin: -1px;
1517
+ overflow: hidden;
1518
+ padding: 0;
1519
+ position: absolute;
1520
+ width: 1px;
1521
+ }
1522
+
1523
+ /* Components */
1524
+
1525
+ /* -----------------------------------------------------------------------------
1526
+ *
1527
+ * Components Skeleton
1528
+ *
1529
+ * This file is just a clearing-house.
1530
+ * Make partials (start with an underscore) for any actual css code.
1531
+ *
1532
+ * ----------------------------------------------------------------------------- */
1533
+
1534
+ /* Buttons */
1535
+
1536
+ .tribe-common {
1537
+
1538
+ /* -------------------------------------------------------------------------
1539
+ *
1540
+ * Button: Border - Theme Overrides
1541
+ *
1542
+ * ------------------------------------------------------------------------- */
1543
+ }
1544
+
1545
+ /* -----------------------------------------------------------------------------
1546
+ *
1547
+ * Button: Border
1548
+ *
1549
+ * Example:
1550
+ * <button class="tribe-common-c-btn-border">...</button>
1551
+ * <a href="#" class="tribe-common-c-btn-border">...</a>
1552
+ *
1553
+ * ----------------------------------------------------------------------------- */
1554
+
1555
+ .tribe-common .tribe-common-c-btn-border,
1556
+ .tribe-common a.tribe-common-c-btn-border {
1557
+ padding: 14px 20px 14px;
1558
+ width: 100%;
1559
+ }
1560
+
1561
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-c-btn-border, .tribe-common--breakpoint-medium.tribe-common a.tribe-common-c-btn-border {
1562
+ padding: 6px 15px;
1563
+ width: auto;
1564
+ }
1565
+
1566
+ .tribe-common {
1567
+
1568
+ /* -----------------------------------------------------------------------------
1569
+ *
1570
+ * Button: Icon Border
1571
+ *
1572
+ * Example:
1573
+ * <button class="tribe-common-c-btn-icon tribe-common-c-btn-icon--border tribe-common-c-btn-icon--filter">...</button>
1574
+ * <a href="#" class="tribe-common-c-btn-icon tribe-common-c-btn-icon--border tribe-common-c-btn-icon--filter">...</a>
1575
+ *
1576
+ * ----------------------------------------------------------------------------- */
1577
+
1578
+ /* -------------------------------------------------------------------------
1579
+ *
1580
+ * Button: Icon Border - Theme Overrides
1581
+ *
1582
+ * ------------------------------------------------------------------------- */
1583
+ }
1584
+
1585
+ /* -----------------------------------------------------------------------------
1586
+ *
1587
+ * Button: Icon
1588
+ *
1589
+ * Example:
1590
+ * <button class="tribe-common-c-btn-icon tribe-common-c-btn-icon--filter">...</button>
1591
+ * <a href="#" class="tribe-common-c-btn-icon tribe-common-c-btn-icon--filter">...</a>
1592
+ *
1593
+ * ----------------------------------------------------------------------------- */
1594
+
1595
+ .tribe-common .tribe-common-c-btn-icon:before {
1596
+ background-repeat: no-repeat;
1597
+ background-size: contain;
1598
+ content: '';
1599
+ display: block;
1600
+ }
1601
+
1602
+ /* -----------------------------------------------------------------------------
1603
+ * Button: Icon Caret Left
1604
+ * ----------------------------------------------------------------------------- */
1605
+
1606
+ .tribe-common .tribe-common-c-btn-icon--caret-left:before {
1607
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.916 17.841L10 19.757l-9.9-9.9L10-.041l1.916 1.916-7.983 7.984z' fill='%23BABABA'/%3E%3C/svg%3E");
1608
+ height: 20px;
1609
+ width: 12px;
1610
+ }
1611
+
1612
+ .tribe-common .tribe-common-c-btn-icon--caret-left:active:before, .tribe-common .tribe-common-c-btn-icon--caret-left:hover:before, .tribe-common .tribe-common-c-btn-icon--caret-left:focus:before {
1613
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.916 17.841L10 19.757l-9.9-9.9L10-.041l1.916 1.916-7.983 7.984z' fill='%235D5D5D'/%3E%3C/svg%3E");
1614
+ }
1615
+
1616
+ .tribe-common .tribe-common-c-btn-icon--caret-left:disabled:before {
1617
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.916 17.841L10 19.757l-9.9-9.9L10-.041l1.916 1.916-7.983 7.984z' fill='%23D5D5D5'/%3E%3C/svg%3E");
1618
+ }
1619
+
1620
+ /* -----------------------------------------------------------------------------
1621
+ * Button: Icon Caret Right
1622
+ * ----------------------------------------------------------------------------- */
1623
+
1624
+ .tribe-common .tribe-common-c-btn-icon--caret-right:before {
1625
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M.084 2.159L2 .243l9.9 9.9L2 20.041.084 18.126l7.983-7.984z' fill='%23BABABA'/%3E%3C/svg%3E");
1626
+ height: 20px;
1627
+ width: 12px;
1628
+ }
1629
+
1630
+ .tribe-common .tribe-common-c-btn-icon--caret-right:active:before, .tribe-common .tribe-common-c-btn-icon--caret-right:hover:before, .tribe-common .tribe-common-c-btn-icon--caret-right:focus:before {
1631
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M.084 2.159L2 .243l9.9 9.9L2 20.041.084 18.126l7.983-7.984z' fill='%235D5D5D'/%3E%3C/svg%3E");
1632
+ }
1633
+
1634
+ .tribe-common .tribe-common-c-btn-icon--caret-right:disabled:before {
1635
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M.084 2.159L2 .243l9.9 9.9L2 20.041.084 18.126l7.983-7.984z' fill='%23D5D5D5'/%3E%3C/svg%3E");
1636
+ }
1637
+
1638
+ /* -----------------------------------------------------------------------------
1639
+ * Button: Icon Filters
1640
+ * ----------------------------------------------------------------------------- */
1641
+
1642
+ .tribe-common .tribe-common-c-btn-icon--filters:before {
1643
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='17' height='17'%3E%3Cg fill='none' fill-rule='evenodd' stroke='%23727272' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' transform='translate(1 1)'%3E%3Cpath d='M3 3V0M3 15v-2' stroke='%235D5D5D'/%3E%3Ccircle cx='3' cy='9' r='3' stroke='%235D5D5D'/%3E%3Cpath d='M12 9v6' stroke='%235D5D5D'/%3E%3Ccircle cx='12' cy='3' r='3' transform='matrix(1 0 0 -1 0 6)' stroke='%235D5D5D'/%3E%3C/g%3E%3C/svg%3E");
1644
+ height: 20px;
1645
+ width: 24px;
1646
+ }
1647
+
1648
+ .tribe-common .tribe-common-c-btn-icon--filters:active:before, .tribe-common .tribe-common-c-btn-icon--filters:hover:before, .tribe-common .tribe-common-c-btn-icon--filters:focus:before {
1649
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='17' height='17'%3E%3Cg fill='none' fill-rule='evenodd' stroke='%23727272' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' transform='translate(1 1)'%3E%3Cpath d='M3 3V0M3 15v-2' stroke='%23141827'/%3E%3Ccircle cx='3' cy='9' r='3' stroke='%23141827'/%3E%3Cpath d='M12 9v6' stroke='%23141827'/%3E%3Ccircle cx='12' cy='3' r='3' transform='matrix(1 0 0 -1 0 6)' stroke='%23141827'/%3E%3C/g%3E%3C/svg%3E");
1650
+ }
1651
+
1652
+ .tribe-common .tribe-common-c-btn-icon--filters:disabled:before {
1653
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='17' height='17'%3E%3Cg fill='none' fill-rule='evenodd' stroke='%23727272' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' transform='translate(1 1)'%3E%3Cpath d='M3 3V0M3 15v-2' stroke='%23D5D5D5'/%3E%3Ccircle cx='3' cy='9' r='3' stroke='%23D5D5D5'/%3E%3Cpath d='M12 9v6' stroke='%23D5D5D5'/%3E%3Ccircle cx='12' cy='3' r='3' transform='matrix(1 0 0 -1 0 6)' stroke='%23D5D5D5'/%3E%3C/g%3E%3C/svg%3E");
1654
+ }
1655
+
1656
+ /* -----------------------------------------------------------------------------
1657
+ * Button: Icon Search
1658
+ * ----------------------------------------------------------------------------- */
1659
+
1660
+ .tribe-common .tribe-common-c-btn-icon--search:before {
1661
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 18.711l-6.044-6.044a7.782 7.782 0 0 0 1.688-4.845c0-2.089-.822-4.044-2.288-5.533C11.866.822 9.91 0 7.822 0S3.778.822 2.29 2.289A7.801 7.801 0 0 0 0 7.822c0 2.09.822 4.045 2.289 5.534a7.801 7.801 0 0 0 5.533 2.288c1.778 0 3.467-.6 4.845-1.688L18.71 20 20 18.711zM3.578 12.067c-2.334-2.334-2.334-6.156 0-8.49a5.968 5.968 0 0 1 4.244-1.755c1.6 0 3.111.622 4.245 1.756 2.333 2.333 2.333 6.155 0 8.489a5.968 5.968 0 0 1-4.245 1.755c-1.6 0-3.11-.622-4.244-1.755z' fill='%235D5D5D'/%3E%3C/svg%3E");
1662
+ height: 20px;
1663
+ width: 20px;
1664
+ }
1665
+
1666
+ .tribe-common .tribe-common-c-btn-icon--search:active:before, .tribe-common .tribe-common-c-btn-icon--search:hover:before, .tribe-common .tribe-common-c-btn-icon--search:focus:before {
1667
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 18.711l-6.044-6.044a7.782 7.782 0 0 0 1.688-4.845c0-2.089-.822-4.044-2.288-5.533C11.866.822 9.91 0 7.822 0S3.778.822 2.29 2.289A7.801 7.801 0 0 0 0 7.822c0 2.09.822 4.045 2.289 5.534a7.801 7.801 0 0 0 5.533 2.288c1.778 0 3.467-.6 4.845-1.688L18.71 20 20 18.711zM3.578 12.067c-2.334-2.334-2.334-6.156 0-8.49a5.968 5.968 0 0 1 4.244-1.755c1.6 0 3.111.622 4.245 1.756 2.333 2.333 2.333 6.155 0 8.489a5.968 5.968 0 0 1-4.245 1.755c-1.6 0-3.11-.622-4.244-1.755z' fill='%23141827'/%3E%3C/svg%3E");
1668
+ }
1669
+
1670
+ .tribe-common .tribe-common-c-btn-icon--search:disabled:before {
1671
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 18.711l-6.044-6.044a7.782 7.782 0 0 0 1.688-4.845c0-2.089-.822-4.044-2.288-5.533C11.866.822 9.91 0 7.822 0S3.778.822 2.29 2.289A7.801 7.801 0 0 0 0 7.822c0 2.09.822 4.045 2.289 5.534a7.801 7.801 0 0 0 5.533 2.288c1.778 0 3.467-.6 4.845-1.688L18.71 20 20 18.711zM3.578 12.067c-2.334-2.334-2.334-6.156 0-8.49a5.968 5.968 0 0 1 4.244-1.755c1.6 0 3.111.622 4.245 1.756 2.333 2.333 2.333 6.155 0 8.489a5.968 5.968 0 0 1-4.245 1.755c-1.6 0-3.11-.622-4.244-1.755z' fill='%23D5D5D5'/%3E%3C/svg%3E");
1672
+ }
1673
+
1674
+ .tribe-common {
1675
+
1676
+ /* -------------------------------------------------------------------------
1677
+ *
1678
+ * Button: Solid - Theme Overrides
1679
+ *
1680
+ * ------------------------------------------------------------------------- */
1681
+ }
1682
+
1683
+ /* -----------------------------------------------------------------------------
1684
+ *
1685
+ * Button: Solid
1686
+ *
1687
+ * Example:
1688
+ * <button class="tribe-common-c-btn">...</button>
1689
+ * <a href="#" class="tribe-common-c-btn">...</a>
1690
+ *
1691
+ * ----------------------------------------------------------------------------- */
1692
+
1693
+ .tribe-common .tribe-common-c-btn,
1694
+ .tribe-common a.tribe-common-c-btn {
1695
+ padding: 11px 20px 11px;
1696
+ width: 100%;
1697
+ }
1698
+
1699
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-c-btn, .tribe-common--breakpoint-medium.tribe-common a.tribe-common-c-btn {
1700
+ width: auto;
1701
+ }
1702
+
1703
+ /* -----------------------------------------------------------------------------
1704
+ *
1705
+ * Component: Image
1706
+ *
1707
+ * Example (Regular):
1708
+ * <img src="#" alt="" class="tribe-common-c-image" />
1709
+ *
1710
+ * Example (Background):
1711
+ * <div class="tribe-common-c-image tribe-common-c-image--bg">
1712
+ * <div class="tribe-common-c-image__bg"></div>
1713
+ * </div>
1714
+ *
1715
+ * ----------------------------------------------------------------------------- */
1716
+
1717
+ .tribe-common .tribe-common-c-image {
1718
+ display: block;
1719
+ height: auto;
1720
+ margin-left: auto;
1721
+ margin-right: auto;
1722
+ width: 100%;
1723
+ }
1724
+
1725
+ .tribe-common .tribe-common-c-image--bg {
1726
+ position: relative;
1727
+ }
1728
+
1729
+ .tribe-common .tribe-common-c-image__bg {
1730
+ background: center center no-repeat;
1731
+ background-size: cover;
1732
+ bottom: 0;
1733
+ height: 100%;
1734
+ left: 0;
1735
+ position: absolute;
1736
+ right: 0;
1737
+ top: 0;
1738
+ width: 100%;
1739
+ }
1740
+
1741
+ /* -----------------------------------------------------------------------------
1742
+ *
1743
+ * Component: Loader
1744
+ *
1745
+ *
1746
+ * Example:
1747
+ * <div class="tribe-events-view-loader__dots tribe-common-c-loader">
1748
+ * <div class="tribe-common-c-loader__dot tribe-common-c-loader__dot--first"></div>
1749
+ * <div class="tribe-common-c-loader__dot tribe-common-c-loader__dot--second"></div>
1750
+ * <div class="tribe-common-c-loader__dot tribe-common-c-loader__dot--third"></div>
1751
+ * </div>
1752
+ *
1753
+ * ----------------------------------------------------------------------------- */
1754
+
1755
+ .tribe-common .tribe-common-c-loader {
1756
+ display: -webkit-box;
1757
+ display: flex;
1758
+ padding-top: 192px;
1759
+ }
1760
+
1761
+ .tribe-common--breakpoint-medium.tribe-common .tribe-common-c-loader {
1762
+ padding-top: 288px;
1763
+ }
1764
+
1765
+ .tribe-common .tribe-common-c-loader__dot {
1766
+ background-color: rgba(51,74,255, 0.07);
1767
+ height: 15px;
1768
+ width: 15px;
1769
+ border-radius: 50%;
1770
+ }
1771
+
1772
+ .tribe-common .tribe-common-c-loader__dot:not(:first-of-type) {
1773
+ margin-left: 8px;
1774
+ }
common/src/resources/css/datatables.css ADDED
@@ -0,0 +1,396 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ /*
12
+ * Table styles
13
+ */
14
+ table.dataTable {
15
+ border-collapse: separate;
16
+ border-spacing: 0;
17
+ clear: both;
18
+ margin: 0 auto;
19
+ width: 100%;
20
+ }
21
+ table.dataTable thead th:active,
22
+ table.dataTable thead td:active {
23
+ outline: none;
24
+ }
25
+ table.dataTable thead .sorting,
26
+ table.dataTable thead .sorting_asc,
27
+ table.dataTable thead .sorting_desc {
28
+ cursor: pointer;
29
+ *cursor: hand;
30
+ }
31
+ table.dataTable thead .sorting,
32
+ table.dataTable thead .sorting_asc,
33
+ table.dataTable thead .sorting_desc,
34
+ table.dataTable thead .sorting_asc_disabled,
35
+ table.dataTable thead .sorting_desc_disabled {
36
+ background-position: center right;
37
+ background-repeat: no-repeat;
38
+ }
39
+ table.dataTable thead .sorting {
40
+ background-image: url("../../../vendor/datatables/DataTables/images/sort_both.png");
41
+ }
42
+ table.dataTable thead .sorting_asc {
43
+ background-image: url("../../../vendor/datatables/DataTables/images/sort_asc.png");
44
+ }
45
+ table.dataTable thead .sorting_desc {
46
+ background-image: url("../../../vendor/datatables/DataTables/images/sort_desc.png");
47
+ }
48
+ table.dataTable thead .sorting_asc_disabled {
49
+ background-image: url("../../../vendor/datatables/DataTables/images/sort_asc_disabled.png");
50
+ }
51
+ table.dataTable thead .sorting_desc_disabled {
52
+ background-image: url("../../../vendor/datatables/DataTables/images/sort_desc_disabled.png");
53
+ }
54
+ table.dataTable.widefat thead th input, table.dataTable.widefat thead td input, table.dataTable.widefat tfoot th input, table.dataTable.widefat tfoot td input {
55
+ margin: 0 0 0 8px;
56
+ vertical-align: text-top;
57
+ }
58
+ table.dataTable.widefat thead td.check-column, table.dataTable.widefat tfoot td.check-column {
59
+ padding-top: 4px;
60
+ vertical-align: middle;
61
+ }
62
+ table.dataTable.widefat thead th.check-column, table.dataTable.widefat tfoot th.check-column, table.dataTable.widefat tbody th.check-column {
63
+ padding: 11px 0 0 3px;
64
+ }
65
+ table.dataTable .check-column {
66
+ width: 2.2em;
67
+ }
68
+ table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
69
+ border-top: 1px solid #ddd;
70
+ }
71
+ table.dataTable.row-border tbody tr:first-child th,
72
+ table.dataTable.row-border tbody tr:first-child td,
73
+ table.dataTable.display tbody tr:first-child th,
74
+ table.dataTable.display tbody tr:first-child td {
75
+ border-top: none;
76
+ }
77
+ table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
78
+ border-top: 1px solid #ddd;
79
+ border-right: 1px solid #ddd;
80
+ }
81
+ table.dataTable.cell-border tbody tr th:first-child,
82
+ table.dataTable.cell-border tbody tr td:first-child {
83
+ border-left: 1px solid #ddd;
84
+ }
85
+ table.dataTable.cell-border tbody tr:first-child th,
86
+ table.dataTable.cell-border tbody tr:first-child td {
87
+ border-top: none;
88
+ }
89
+ table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
90
+ background-color: #f9f9f9;
91
+ }
92
+ table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
93
+ background-color: #f6f6f6;
94
+ }
95
+ table.dataTable.order-column tbody tr > .sorting_1,
96
+ table.dataTable.order-column tbody tr > .sorting_2,
97
+ table.dataTable.order-column tbody tr > .sorting_3,
98
+ table.dataTable.display tbody tr > .sorting_1,
99
+ table.dataTable.display tbody tr > .sorting_2,
100
+ table.dataTable.display tbody tr > .sorting_3 {
101
+ background-color: #fafafa;
102
+ }
103
+ table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
104
+ background-color: #f1f1f1;
105
+ }
106
+ table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
107
+ background-color: #f3f3f3;
108
+ }
109
+ table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
110
+ background-color: whitesmoke;
111
+ }
112
+ table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
113
+ background-color: #fafafa;
114
+ }
115
+ table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
116
+ background-color: #fcfcfc;
117
+ }
118
+ table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
119
+ background-color: #fefefe;
120
+ }
121
+ table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
122
+ background-color: #eaeaea;
123
+ }
124
+ table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
125
+ background-color: #ececec;
126
+ }
127
+ table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
128
+ background-color: #efefef;
129
+ }
130
+ table.dataTable.no-footer {
131
+ border-bottom: 1px solid #111;
132
+ }
133
+ table.dataTable.nowrap th, table.dataTable.nowrap td {
134
+ white-space: nowrap;
135
+ }
136
+ table.dataTable.compact thead th,
137
+ table.dataTable.compact thead td {
138
+ padding: 4px 17px 4px 4px;
139
+ }
140
+ table.dataTable.compact tfoot th,
141
+ table.dataTable.compact tfoot td {
142
+ padding: 4px;
143
+ }
144
+ table.dataTable.compact tbody th,
145
+ table.dataTable.compact tbody td {
146
+ padding: 4px;
147
+ }
148
+ table.dataTable th.dt-left,
149
+ table.dataTable td.dt-left {
150
+ text-align: left;
151
+ }
152
+ table.dataTable th.dt-center,
153
+ table.dataTable td.dt-center,
154
+ table.dataTable td.dataTables_empty {
155
+ text-align: center;
156
+ }
157
+ table.dataTable th.dt-right,
158
+ table.dataTable td.dt-right {
159
+ text-align: right;
160
+ }
161
+ table.dataTable th.dt-justify,
162
+ table.dataTable td.dt-justify {
163
+ text-align: justify;
164
+ }
165
+ table.dataTable th.dt-nowrap,
166
+ table.dataTable td.dt-nowrap {
167
+ white-space: nowrap;
168
+ }
169
+ table.dataTable thead th.dt-head-left,
170
+ table.dataTable thead td.dt-head-left,
171
+ table.dataTable tfoot th.dt-head-left,
172
+ table.dataTable tfoot td.dt-head-left {
173
+ text-align: left;
174
+ }
175
+ table.dataTable thead th.dt-head-center,
176
+ table.dataTable thead td.dt-head-center,
177
+ table.dataTable tfoot th.dt-head-center,
178
+ table.dataTable tfoot td.dt-head-center {
179
+ text-align: center;
180
+ }
181
+ table.dataTable thead th.dt-head-right,
182
+ table.dataTable thead td.dt-head-right,
183
+ table.dataTable tfoot th.dt-head-right,
184
+ table.dataTable tfoot td.dt-head-right {
185
+ text-align: right;
186
+ }
187
+ table.dataTable thead th.dt-head-justify,
188
+ table.dataTable thead td.dt-head-justify,
189
+ table.dataTable tfoot th.dt-head-justify,
190
+ table.dataTable tfoot td.dt-head-justify {
191
+ text-align: justify;
192
+ }
193
+ table.dataTable thead th.dt-head-nowrap,
194
+ table.dataTable thead td.dt-head-nowrap,
195
+ table.dataTable tfoot th.dt-head-nowrap,
196
+ table.dataTable tfoot td.dt-head-nowrap {
197
+ white-space: nowrap;
198
+ }
199
+ table.dataTable tbody th.dt-body-left,
200
+ table.dataTable tbody td.dt-body-left {
201
+ text-align: left;
202
+ }
203
+ table.dataTable tbody th.dt-body-center,
204
+ table.dataTable tbody td.dt-body-center {
205
+ text-align: center;
206
+ }
207
+ table.dataTable tbody th.dt-body-right,
208
+ table.dataTable tbody td.dt-body-right {
209
+ text-align: right;
210
+ }
211
+ table.dataTable tbody th.dt-body-justify,
212
+ table.dataTable tbody td.dt-body-justify {
213
+ text-align: justify;
214
+ }
215
+ table.dataTable tbody th.dt-body-nowrap,
216
+ table.dataTable tbody td.dt-body-nowrap {
217
+ white-space: nowrap;
218
+ }
219
+ table.dataTable,
220
+ table.dataTable th,
221
+ table.dataTable td {
222
+ box-sizing: content-box;
223
+ }
224
+ /*
225
+ * Control feature layout
226
+ */
227
+ .dataTables_wrapper {
228
+ clear: both;
229
+ position: relative;
230
+ zoom: 1;
231
+ }
232
+ .dataTables_wrapper .dataTables_length {
233
+ float: left;
234
+ }
235
+ .dataTables_wrapper .dataTables_filter {
236
+ float: right;
237
+ text-align: right;
238
+ }
239
+ .dataTables_wrapper .dataTables_filter input {
240
+ margin-left: 0.5em;
241
+ }
242
+ .dataTables_wrapper .dataTables_info {
243
+ clear: both;
244
+ float: left;
245
+ padding-top: 0.755em;
246
+ }
247
+ .dataTables_wrapper .dataTables_paginate {
248
+ float: right;
249
+ padding-top: 0.25em;
250
+ text-align: right;
251
+ }
252
+ .dataTables_wrapper .dataTables_paginate .paginate_button {
253
+ border-color: transparent;
254
+ border-radius: 3px;
255
+ border-style: solid;
256
+ border-width: 1px;
257
+ box-shadow: none;
258
+ box-sizing: border-box;
259
+ color: #555;
260
+ cursor: pointer;
261
+ display: inline-block;
262
+ font-size: 13px;
263
+ height: 28px;
264
+ line-height: 26px;
265
+ margin: 0 0 0 2px;
266
+ padding: 0 10px 1px;
267
+ text-decoration: none;
268
+ vertical-align: top;
269
+ white-space: nowrap;
270
+ }
271
+ .dataTables_wrapper .dataTables_paginate .paginate_button:hover,
272
+ .dataTables_wrapper .dataTables_paginate .paginate_button:active {
273
+ background: #fafafa;
274
+ border-color: #999;
275
+ color: #23282d;
276
+ }
277
+ .dataTables_wrapper .dataTables_paginate .paginate_button.next,
278
+ .dataTables_wrapper .dataTables_paginate .paginate_button.previous {
279
+ background: transparent;
280
+ border-color: transparent;
281
+ box-shadow: none;
282
+ color: #23282d;
283
+ }
284
+ .dataTables_wrapper .dataTables_paginate .paginate_button.next.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.previous.disabled {
285
+ background: transparent;
286
+ border-color: transparent;
287
+ box-shadow: none;
288
+ }
289
+ .dataTables_wrapper .dataTables_paginate .paginate_button.next.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.previous.disabled:hover {
290
+ background: transparent;
291
+ border-color: transparent;
292
+ box-shadow: none;
293
+ text-decoration: none;
294
+ }
295
+ .dataTables_wrapper .dataTables_paginate .paginate_button.next:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.previous:hover {
296
+ color: #222;
297
+ text-decoration: underline;
298
+ }
299
+ .dataTables_wrapper .dataTables_paginate .paginate_button.current,
300
+ .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
301
+ background: #fcfcfc;
302
+ border-color: #999;
303
+ box-shadow: 0 1px 0 #cccccc;
304
+ color: #23282d;
305
+ text-decoration: none;
306
+ }
307
+ .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,
308
+ .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,
309
+ .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
310
+ background: #f7f7f7;
311
+ border-color: #ddd;
312
+ box-shadow: none;
313
+ color: #a0a5aa;
314
+ cursor: default;
315
+ text-shadow: 0 1px 0 #fff;
316
+ -webkit-transform: none;
317
+ transform: none;
318
+ }
319
+ .dataTables_wrapper .dataTables_paginate .ellipsis {
320
+ padding: 0 1em;
321
+ }
322
+ .dataTables_wrapper .dataTables_processing {
323
+ position: absolute;
324
+ top: 50%;
325
+ left: 50%;
326
+ width: 100%;
327
+ height: 40px;
328
+ margin-left: -50%;
329
+ margin-top: -25px;
330
+ padding-top: 20px;
331
+ text-align: center;
332
+ font-size: 1.2em;
333
+ background-color: white;
334
+ background: -webkit-gradient(linear, left top, right top, from(rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), to(rgba(255, 255, 255, 0)));
335
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
336
+ }
337
+ .dataTables_wrapper .dataTables_length,
338
+ .dataTables_wrapper .dataTables_filter,
339
+ .dataTables_wrapper .dataTables_info,
340
+ .dataTables_wrapper .dataTables_processing,
341
+ .dataTables_wrapper .dataTables_paginate {
342
+ color: #333;
343
+ }
344
+ .dataTables_wrapper .dataTables_scroll {
345
+ clear: both;
346
+ }
347
+ .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
348
+ *margin-top: -1px;
349
+ -webkit-overflow-scrolling: touch;
350
+ }
351
+ .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td {
352
+ vertical-align: middle;
353
+ }
354
+ .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
355
+ .dataTables_wrapper .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
356
+ height: 0;
357
+ overflow: hidden;
358
+ margin: 0 !important;
359
+ padding: 0 !important;
360
+ }
361
+ .dataTables_wrapper.no-footer .dataTables_scrollBody {
362
+ border-bottom: 1px solid #111;
363
+ }
364
+ .dataTables_wrapper.no-footer div.dataTables_scrollHead table,
365
+ .dataTables_wrapper.no-footer div.dataTables_scrollBody table {
366
+ border-bottom: none;
367
+ }
368
+ .dataTables_wrapper:after {
369
+ visibility: hidden;
370
+ display: block;
371
+ content: "";
372
+ clear: both;
373
+ height: 0;
374
+ }
375
+ @media screen and (max-width: 767px) {
376
+ .dataTables_wrapper .dataTables_info,
377
+ .dataTables_wrapper .dataTables_paginate {
378
+ float: none;
379
+ text-align: center;
380
+ }
381
+
382
+ .dataTables_wrapper .dataTables_paginate {
383
+ margin-top: 0.5em;
384
+ }
385
+ }
386
+ @media screen and (max-width: 640px) {
387
+ .dataTables_wrapper .dataTables_length,
388
+ .dataTables_wrapper .dataTables_filter {
389
+ float: none;
390
+ text-align: center;
391
+ }
392
+
393
+ .dataTables_wrapper .dataTables_filter {
394
+ margin-top: 0.5em;
395
+ }
396
+ }
common/src/resources/css/datepicker.css ADDED
@@ -0,0 +1,566 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ .tribe-ui-datepicker.ui-datepicker body,
12
+ .tribe-ui-datepicker.ui-datepicker button,
13
+ .tribe-ui-datepicker.ui-datepicker input,
14
+ .tribe-ui-datepicker.ui-datepicker select,
15
+ .tribe-ui-datepicker.ui-datepicker textarea {
16
+ font-family: "Verdana", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
17
+ }
18
+ .tribe-ui-datepicker.ui-datepicker table {
19
+ border: none;
20
+ }
21
+
22
+ .tribe-ui-datepicker .ui-datepicker-month {
23
+ font-weight: bold;
24
+ }
25
+
26
+ /* Interaction Cues
27
+ ----------------------------------*/
28
+
29
+ .tribe-ui-datepicker .ui-state-disabled {
30
+ cursor: default !important;
31
+ pointer-events: none;
32
+ }
33
+
34
+ /* Icons
35
+ ----------------------------------*/
36
+
37
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-group span.ui-icon {
38
+ display: inline-block;
39
+ vertical-align: middle;
40
+ margin-top: -.25rem;
41
+ position: relative;
42
+ text-indent: -99999px;
43
+ overflow: hidden;
44
+ background-repeat: no-repeat;
45
+ background-image: none;
46
+ }
47
+
48
+ .tribe-ui-datepicker .ui-widget-icon-block {
49
+ left: 50%;
50
+ margin-left: -8px;
51
+ display: block;
52
+ }
53
+
54
+ /* Misc visuals
55
+ ----------------------------------*/
56
+
57
+ /* Overlays */
58
+
59
+ .ui-widget-overlay {
60
+ position: fixed;
61
+ top: 0;
62
+ left: 0;
63
+ width: 100%;
64
+ height: 100%;
65
+ }
66
+
67
+ .tribe-ui-datepicker.ui-datepicker {
68
+ background: #fff;
69
+ box-shadow: 1px 1px 5px rgba(0,0,0,.5);
70
+ width: 17em;
71
+ padding: 1em;
72
+ display: none;
73
+ }
74
+
75
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-header {
76
+ margin-bottom: 1rem;
77
+ position: relative;
78
+ padding: 0;
79
+ border: 0;
80
+ background-color: transparent;
81
+ background-image: none;
82
+ }
83
+
84
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-prev,
85
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-next {
86
+ position: absolute;
87
+ top: 50%;
88
+ -webkit-transform: translateY(-50%);
89
+ transform: translateY(-50%);
90
+ line-height: 1.8em;
91
+ text-align: center;
92
+ }
93
+
94
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-prev:before {
95
+ color: #b1b1b1;
96
+ content: '\2190';
97
+ cursor: pointer;
98
+ }
99
+
100
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-prev:hover:before {
101
+ color: #000;
102
+ }
103
+
104
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-next:before {
105
+ color: #b1b1b1;
106
+ content: '\2192';
107
+ cursor: pointer;
108
+ }
109
+
110
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-next:hover:before {
111
+ color: #000;
112
+ }
113
+
114
+ .tribe-ui-datepicker .ui-datepicker-prev-hover,
115
+ .tribe-ui-datepicker .ui-datepicker-next-hover {
116
+ color: darken(#b1b1b1, 10%);
117
+ border: 0;
118
+ background: none;
119
+ }
120
+
121
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-prev {
122
+ left: 1px;
123
+ }
124
+
125
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-next {
126
+ right: 1px;
127
+ }
128
+
129
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-prev-hover {
130
+ left: 1px;
131
+ }
132
+
133
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-next-hover {
134
+ right: 1px;
135
+ }
136
+
137
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-title {
138
+ margin: 0 2.3em;
139
+ line-height: 1.8;
140
+ text-align: center;
141
+ }
142
+
143
+ .tribe-ui-datepicker select.ui-datepicker-month,
144
+ .tribe-ui-datepicker select.ui-datepicker-year {
145
+ border: none;
146
+ box-shadow: 0 1px 0 rgba(0,0,0,0.1);
147
+ margin-right: 1px;
148
+ width: 4.5rem;
149
+ }
150
+
151
+ .tribe-ui-datepicker.ui-datepicker table {
152
+ width: 100%;
153
+ font-size: .9rem;
154
+ border-collapse: collapse;
155
+ margin: 0 0 .4rem;
156
+ }
157
+
158
+ .tribe-ui-datepicker.ui-datepicker th {
159
+ color: #b1b1b1;
160
+ padding: .7rem .3rem;
161
+ text-align: center;
162
+ border: 0;
163
+ }
164
+
165
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-calendar td {
166
+ border: 1px solid #ddd;
167
+ padding: 1px;
168
+ }
169
+
170
+ .tribe-ui-datepicker.ui-datepicker td.ui-datepicker-unselectable {
171
+ border: none;
172
+ }
173
+
174
+ .tribe-ui-datepicker.ui-datepicker a.ui-state-active {
175
+ background: #0085ba;
176
+ color: #fff;
177
+ }
178
+
179
+ .tribe-ui-datepicker.ui-datepicker td span,
180
+ .tribe-ui-datepicker.ui-datepicker td a {
181
+ display: block;
182
+ padding: .5rem .2rem;
183
+ text-align: center;
184
+ text-decoration: none;
185
+ }
186
+
187
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-buttonpane {
188
+ background-image: none;
189
+ margin: .7rem 0 0 0;
190
+ padding: 0 .2rem;
191
+ border-left: 0;
192
+ border-right: 0;
193
+ border-bottom: 0;
194
+ }
195
+
196
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-buttonpane button {
197
+ float: right;
198
+ margin: .5rem .2rem .4rem;
199
+ cursor: pointer;
200
+ padding: .2rem .6rem .3rem .6rem;
201
+ width: auto;
202
+ overflow: visible;
203
+ }
204
+
205
+ .tribe-ui-datepicker.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
206
+ float: left;
207
+ background: #fff;
208
+ border: 1px solid #b1b1b1;
209
+ }
210
+
211
+ .tribe-ui-datepicker.ui-datepicker button.ui-datepicker-close {
212
+ background: linear-gradient(354deg, rgba(10,85,160,1.00) 0%, rgba(18,136,235,1.00) 100%);
213
+ border: 1px solid #0085ba;
214
+ color: #fff !important;
215
+ font-weight: 400;
216
+ }
217
+
218
+ /* with multiple calendars */
219
+
220
+ .tribe-ui-datepicker.ui-datepicker.ui-datepicker-multi {
221
+ width: auto;
222
+ }
223
+
224
+ .tribe-ui-datepicker.ui-datepicker-multi .ui-datepicker-group {
225
+ float: left;
226
+ }
227
+
228
+ .tribe-ui-datepicker.ui-datepicker-multi .ui-datepicker-group table {
229
+ width: 95%;
230
+ margin: 0 auto .4rem;
231
+ }
232
+
233
+ .tribe-ui-datepicker.ui-datepicker-multi-2 .ui-datepicker-group {
234
+ width: 50%;
235
+ }
236
+
237
+ .tribe-ui-datepicker.ui-datepicker-multi-3 .ui-datepicker-group {
238
+ width: 33.3%;
239
+ }
240
+
241
+ .tribe-ui-datepicker.ui-datepicker-multi-4 .ui-datepicker-group {
242
+ width: 25%;
243
+ }
244
+
245
+ .tribe-ui-datepicker.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
246
+ .tribe-ui-datepicker.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
247
+ border-left-width: 0;
248
+ }
249
+
250
+ .tribe-ui-datepicker.ui-datepicker-multi .ui-datepicker-buttonpane {
251
+ clear: left;
252
+ }
253
+
254
+ .tribe-ui-datepicker .ui-datepicker-row-break {
255
+ clear: both;
256
+ width: 100%;
257
+ font-size: 0;
258
+ }
259
+
260
+ /* Component containers
261
+ ----------------------------------*/
262
+
263
+ .tribe-ui-datepicker.ui-widget {
264
+ font-size: 1.2rem;
265
+ font-family: inherit;
266
+ }
267
+
268
+ .tribe-ui-datepicker.ui-widget .ui-widget {
269
+ font-size: 1rem;
270
+ }
271
+
272
+ .tribe-ui-datepicker.ui-widget input,
273
+ .tribe-ui-datepicker.ui-widget select,
274
+ .tribe-ui-datepicker.ui-widget textarea,
275
+ .tribe-ui-datepicker.ui-widget button {
276
+ font-size: 1rem;
277
+ }
278
+
279
+ .tribe-ui-datepicker.ui-widget-content a,
280
+ .tribe-ui-datepicker .ui-widget-header a {
281
+ color: #23282d;
282
+ }
283
+
284
+ /* Interaction states
285
+ ----------------------------------*/
286
+
287
+ .tribe-ui-datepicker .ui-state-default,
288
+ .tribe-ui-datepicker.ui-widget-content .ui-state-default,
289
+ .tribe-ui-datepicker .ui-widget-header .ui-state-default,
290
+ .tribe-ui-datepicker .ui-button,
291
+
292
+ /* We use html here because we need a greater specificity to make sure disabled
293
+ works properly when clicked or hovered */
294
+ html .tribe-ui-datepicker .ui-button.ui-state-disabled:hover,
295
+ html .tribe-ui-datepicker .ui-button.ui-state-disabled:active {
296
+ color: #23282d;
297
+ border: 0;
298
+ background-color: transparent;
299
+ background-image: none;
300
+ }
301
+
302
+ .tribe-ui-datepicker .ui-state-default a,
303
+ .tribe-ui-datepicker .ui-state-default a:link,
304
+ .tribe-ui-datepicker .ui-state-default a:visited,
305
+ .tribe-ui-datepicker a.ui-button,
306
+ .tribe-ui-datepicker a:link.ui-button,
307
+ .tribe-ui-datepicker a:visited.ui-button,
308
+ .tribe-ui-datepicker .ui-button {
309
+ color: #23282d;
310
+ text-decoration: none;
311
+ }
312
+
313
+ .tribe-ui-datepicker .ui-state-hover,
314
+ .tribe-ui-datepicker .ui-widget-content .ui-state-hover,
315
+ .tribe-ui-datepicker .ui-widget-header .ui-state-hover,
316
+ .tribe-ui-datepicker .ui-state-focus,
317
+ .tribe-ui-datepicker .ui-widget-content .ui-state-focus,
318
+ .tribe-ui-datepicker .ui-widget-header .ui-state-focus,
319
+ .tribe-ui-datepicker .ui-button:hover,
320
+ .tribe-ui-datepicker .ui-button:focus {
321
+ color: #000;
322
+ border: 0;
323
+ background: none;
324
+ }
325
+
326
+ .tribe-ui-datepicker .ui-state-hover a,
327
+ .tribe-ui-datepicker .ui-state-hover a:hover,
328
+ .tribe-ui-datepicker .ui-state-hover a:link,
329
+ .tribe-ui-datepicker .ui-state-hover a:visited,
330
+ .tribe-ui-datepicker .ui-state-focus a,
331
+ .tribe-ui-datepicker .ui-state-focus a:hover,
332
+ .tribe-ui-datepicker .ui-state-focus a:link,
333
+ .tribe-ui-datepicker .ui-state-focus a:visited,
334
+ .tribe-ui-datepicker a.ui-button:hover,
335
+ .tribe-ui-datepicker a.ui-button:focus {
336
+ color: #b1b1b1;
337
+ text-decoration: none;
338
+ background-color: none;
339
+ background-image: none;
340
+ }
341
+
342
+ .tribe-ui-datepicker .ui-visual-focus {
343
+ box-shadow: 0 0 3px 1px rgb(94, 158, 214);
344
+ }
345
+
346
+ .tribe-ui-datepicker .ui-state-active,
347
+ .tribe-ui-datepicker .ui-widget-content .ui-state-active,
348
+ .tribe-ui-datepicker .ui-widget-header .ui-state-active,
349
+ .tribe-ui-datepicker a.ui-button:active,
350
+ .tribe-ui-datepicker .ui-button:active,
351
+ .tribe-ui-datepicker .ui-button.ui-state-active:hover {
352
+ background: linear-gradient(354deg, rgba(10,85,160,1.00) 0%, rgba(18,136,235,1.00) 100%);
353
+ color: #fff;
354
+ }
355
+
356
+ .tribe-ui-datepicker .ui-icon-background,
357
+ .tribe-ui-datepicker .ui-state-active .ui-icon-background {
358
+ border: #dddddd;
359
+ background-color: #1c94c4;
360
+ }
361
+
362
+ .tribe-ui-datepicker .ui-state-active a,
363
+ .tribe-ui-datepicker .ui-state-active a:link,
364
+ .tribe-ui-datepicker .ui-state-active a:visited {
365
+ color: #23282d;
366
+ text-decoration: none;
367
+ }
368
+
369
+ /* Interaction Cues
370
+ ----------------------------------*/
371
+
372
+ .tribe-ui-datepicker .ui-state-highlight,
373
+ .tribe-ui-datepicker.ui-widget-content .ui-state-highlight,
374
+ .tribe-ui-datepicker .ui-widget-header .ui-state-highlight {
375
+ background: #ffffff;
376
+ color: #363636;
377
+ border: 0;
378
+ background-image: none;
379
+ }
380
+
381
+ .tribe-ui-datepicker .ui-state-checked {
382
+ background: #ffffff;
383
+ }
384
+
385
+ .tribe-ui-datepicker .ui-state-highlight a,
386
+ .tribe-ui-datepicker.ui-widget-content .ui-state-highlight a,
387
+ .tribe-ui-datepicker .ui-widget-header .ui-state-highlight a {
388
+ color: #363636;
389
+ }
390
+
391
+ .tribe-ui-datepicker .ui-state-error,
392
+ .tribe-ui-datepicker.ui-widget-content .ui-state-error,
393
+ .tribe-ui-datepicker .ui-widget-header .ui-state-error {
394
+ background: #b81900;
395
+ color: #ffffff;
396
+ }
397
+
398
+ .tribe-ui-datepicker .ui-state-error a,
399
+ .tribe-ui-datepicker.ui-widget-content .ui-state-error a,
400
+ .tribe-ui-datepicker .ui-widget-header .ui-state-error a {
401
+ color: #ffffff;
402
+ }
403
+
404
+ .tribe-ui-datepicker .ui-state-error-text,
405
+ .tribe-ui-datepicker.ui-widget-content .ui-state-error-text,
406
+ .tribe-ui-datepicker .ui-widget-header .ui-state-error-text {
407
+ color: #ffffff;
408
+ }
409
+
410
+ .tribe-ui-datepicker .ui-priority-secondary,
411
+ .tribe-ui-datepicker.ui-widget-content .ui-priority-secondary,
412
+ .tribe-ui-datepicker .ui-widget-header .ui-priority-secondary {
413
+ opacity: .7;
414
+ filter:Alpha(Opacity=70); /* support: IE8 */
415
+ font-weight: normal;
416
+ }
417
+
418
+ .tribe-ui-datepicker .ui-state-disabled,
419
+ .tribe-ui-datepicker.ui-widget-content .ui-state-disabled,
420
+ .tribe-ui-datepicker .ui-widget-header .ui-state-disabled {
421
+ opacity: .35;
422
+ filter:Alpha(Opacity=35); /* support: IE8 */
423
+ background-image: none;
424
+ }
425
+
426
+ .tribe-ui-datepicker .ui-state-disabled .ui-icon {
427
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
428
+ }
429
+
430
+ /* Corner radius */
431
+
432
+ .tribe-ui-datepicker .ui-corner-all,
433
+ .tribe-ui-datepicker .ui-corner-top,
434
+ .tribe-ui-datepicker .ui-corner-left,
435
+ .tribe-ui-datepicker .ui-corner-tl {
436
+ border-top-left-radius: 4px;
437
+ }
438
+
439
+ .tribe-ui-datepicker .ui-corner-all,
440
+ .tribe-ui-datepicker .ui-corner-top,
441
+ .tribe-ui-datepicker .ui-corner-right,
442
+ .tribe-ui-datepicker .ui-corner-tr {
443
+ border-top-right-radius: 4px;
444
+ }
445
+
446
+ .tribe-ui-datepicker .ui-corner-all,
447
+ .tribe-ui-datepicker .ui-corner-bottom,
448
+ .tribe-ui-datepicker .ui-corner-left,
449
+ .tribe-ui-datepicker .ui-corner-bl {
450
+ border-bottom-left-radius: 4px;
451
+ }
452
+
453
+ .tribe-ui-datepicker .ui-corner-all,
454
+ .tribe-ui-datepicker .ui-corner-bottom,
455
+ .tribe-ui-datepicker .ui-corner-right,
456
+ .tribe-ui-datepicker .ui-corner-br {
457
+ border-bottom-right-radius: 4px;
458
+ }
459
+
460
+ /* Overlays */
461
+
462
+ .tribe-ui-datepicker .ui-widget-overlay {
463
+ background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
464
+ opacity: .5;
465
+ filter: Alpha(Opacity=50); /* support: IE8 */
466
+ }
467
+
468
+ .tribe-ui-datepicker .ui-widget-shadow {
469
+ box-shadow: -5px -5px 5px #000000;
470
+ }
471
+
472
+ .tribe-ui-datepicker .ui-helper-hidden {
473
+ display: none;
474
+ }
475
+
476
+ .tribe-ui-datepicker .ui-helper-hidden-accessible {
477
+ border: 0;
478
+ clip: rect(0 0 0 0);
479
+ height: 1px;
480
+ margin: -1px;
481
+ overflow: hidden;
482
+ padding: 0;
483
+ position: absolute;
484
+ width: 1px;
485
+ }
486
+
487
+ .tribe-ui-datepicker .ui-helper-reset {
488
+ margin: 0;
489
+ padding: 0;
490
+ border: 0;
491
+ outline: 0;
492
+ line-height: 1.3;
493
+ text-decoration: none;
494
+ font-size: 100%;
495
+ list-style: none;
496
+ }
497
+
498
+ .tribe-ui-datepicker .ui-helper-clearfix:before,
499
+ .tribe-ui-datepicker .ui-helper-clearfix:after {
500
+ content: "";
501
+ display: table;
502
+ border-collapse: collapse;
503
+ }
504
+
505
+ .tribe-ui-datepicker .ui-helper-clearfix:after {
506
+ clear: both;
507
+ }
508
+
509
+ .tribe-ui-datepicker .ui-helper-zfix {
510
+ width: 100%;
511
+ height: 100%;
512
+ top: 0;
513
+ left: 0;
514
+ position: absolute;
515
+ opacity: 0;
516
+ filter:Alpha(Opacity=0); /* support: IE8 */
517
+ }
518
+
519
+ .tribe-ui-datepicker .ui-front {
520
+ z-index: 100;
521
+ }
522
+
523
+ /* RTL support */
524
+
525
+ .tribe-ui-datepicker.ui-datepicker-rtl {
526
+ direction: rtl;
527
+ }
528
+
529
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-prev {
530
+ right: 2px;
531
+ left: auto;
532
+ }
533
+
534
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-next {
535
+ left: 2px;
536
+ right: auto;
537
+ }
538
+
539
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-prev:hover {
540
+ right: 1px;
541
+ left: auto;
542
+ }
543
+
544
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-next:hover {
545
+ left: 1px;
546
+ right: auto;
547
+ }
548
+
549
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-buttonpane {
550
+ clear: right;
551
+ }
552
+
553
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-buttonpane button {
554
+ float: left;
555
+ }
556
+
557
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
558
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-group {
559
+ float: right;
560
+ }
561
+
562
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
563
+ .tribe-ui-datepicker.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
564
+ border-right-width: 0;
565
+ border-left-width: 1px;
566
+ }
common/src/resources/css/dependency.css ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ /* Dependency CSS */
12
+ .tribe-dependent {
13
+ display: none;
14
+ }
15
+ .tribe-dependent.tribe-active {
16
+ display: inline-block;
17
+ }
18
+ div.tribe-dependent.tribe-active {
19
+ display: block;
20
+ }
21
+ div.tribe-dependent.tribe-active.select2-container {
22
+ display: inline-block;
23
+ }
24
+ td.tribe-dependent.tribe-active,
25
+ th.tribe-dependent.tribe-active {
26
+ display: table-cell;
27
+ }
28
+ tr.tribe-dependent.tribe-active {
29
+ display: table-row;
30
+ }
common/src/resources/css/dialog.css ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ /* = Dialogs
12
+ This can include modals, toasters, confirms. alerts.
13
+ ============================ */
14
+
15
+ /*
16
+ Adding these here for now until common-styles are live
17
+ @TODO: remove when that happens.
18
+ */
19
+
20
+ /* vars */
21
+
22
+ .tribe-common .tribe-dialog {
23
+ --tribe-dialog-background-color: #FFF;
24
+ --tribe-dialog-close-background: #FFF;
25
+ --tribe-dialog-close-border-color: #BABABA;
26
+ --tribe-dialog-close-border-width: 1px;
27
+ --tribe-dialog-close-color: #BABABA;
28
+ --tribe-dialog-close-height: 12px;
29
+ --tribe-dialog-close-height-desktop: 16px;
30
+ --tribe-dialog-overlay-color: transparent;
31
+ --tribe-modal-overlay-color: rgba(20,24,39,0.9);
32
+ --tribe-dialog-border-radius: 4px;
33
+ --tribe-dialog-padding: 16px;
34
+ --tribe-dialog-padding-top: 24px;
35
+ --tribe-dialog-padding-side: 28px;
36
+ }
37
+
38
+ /* The dialog/popup/modal itself */
39
+
40
+ .tribe-common div.tribe-dialog {
41
+ -webkit-box-align: center;
42
+ align-items: center;
43
+ display: -webkit-box;
44
+ display: flex;
45
+ height: 100vh;
46
+ -webkit-box-pack: center;
47
+ justify-content: center;
48
+ left: 0;
49
+ position: fixed;
50
+ top: 0;
51
+ width: 100vw;
52
+ z-index: 1;
53
+ }
54
+
55
+ .tribe-common div.tribe-dialog[aria-hidden='true'] {
56
+ display: none;
57
+ }
58
+
59
+ /* The trigger button" */
60
+
61
+ .tribe-common .tribe-dialog__trigger {}
62
+
63
+ /* The overlay */
64
+
65
+ .tribe-common .tribe-dialog__overlay {
66
+ background-color: var(--tribe-dialog-overlay-color);
67
+ height: 100vh;
68
+ left: 0;
69
+ opacity: .9;
70
+ position: fixed;
71
+ top: 0;
72
+ width: 100vw;
73
+ z-index: 1;
74
+ }
75
+
76
+ /* Content wrapper - includes close button*/
77
+
78
+ .tribe-common .tribe-dialog__wrapper {
79
+ background-color: var(--tribe-dialog-background-color);
80
+ border-radius: var(--tribe-dialog-border-radius);
81
+ box-shadow: 0 2px 54px 0 var(--tribe-modal-overlay-color);
82
+ width: 800px;
83
+ overflow-y: scroll;
84
+ padding: var(--tribe-dialog-padding);
85
+ max-height: 100vh;
86
+ max-width: 100vw;
87
+ z-index: 2;
88
+ }
89
+
90
+ .tribe-common .tribe-dialog__wrapper div[role="document"] {
91
+ -webkit-box-align: end;
92
+ align-items: flex-end;
93
+ display: -webkit-box;
94
+ display: flex;
95
+ -webkit-box-orient: vertical;
96
+ -webkit-box-direction: normal;
97
+ flex-flow: column;
98
+ -webkit-box-pack: justify;
99
+ justify-content: space-between;
100
+ position: relative;
101
+ }
102
+
103
+ /* The "close" button */
104
+
105
+ .tribe-common .tribe-dialog__close-button {
106
+ background: var(--tribe-dialog-close-background);
107
+ background-image: url( "data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cg fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'%3E%3Cpath d='M16 2L2 16M16 16L2 2' stroke='var(--color-icon-secondary)'/%3E%3C/g%3E%3C/svg%3E" );
108
+ background-repeat: no-repeat;
109
+ background-size: contain;
110
+ cursor: pointer;
111
+ display: inline-block;
112
+ font-size: 14px;
113
+ height: var(--tribe-dialog-close-height);
114
+ line-height: var(--tribe-dialog-close-height);
115
+ padding: 0;
116
+ position: absolute;
117
+ width: var(--tribe-dialog-close-height);
118
+ z-index: 1;
119
+ }
120
+
121
+ .tribe-common .tribe-dialog__close-button:focus,
122
+ .tribe-common .tribe-dialog__close-button:hover {
123
+ background: var(--tribe-dialog-close-background);
124
+ background-image: url( "data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cg fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'%3E%3Cpath d='M16 2L2 16M16 16L2 2' stroke='var(--color-icon-primary)'/%3E%3C/g%3E%3C/svg%3E" );
125
+ background-size: contain;
126
+ outline: none;
127
+ }
128
+
129
+ .tribe-common .tribe-dialog__close-button--hidden {
130
+ display: none;
131
+ }
132
+
133
+ .tribe-common .tribe-dialog__close-button--round {
134
+ border-radius: 50%;
135
+ }
136
+
137
+ .tribe-common .tribe-dialog__close-button--border {
138
+ border: var(--tribe-dialog-close-border-width) solid var(--tribe-dialog-close-border-color);
139
+ }
140
+
141
+ .tribe-common h2.tribe-dialog__title {
142
+ align-self: flex-start;
143
+ margin: 0 0 22px;
144
+ padding-right: calc(var(--tribe-dialog-close-height) + 0.5em);
145
+ padding-top: 0;
146
+
147
+ }
148
+
149
+ /* The content container*/
150
+
151
+ .tribe-common .tribe-dialog__content {
152
+ color: #141827;
153
+ font-size: 14px;
154
+ line-height: 1.64em;
155
+ padding-right: calc(var(--tribe-dialog-close-height) + 0.5em);
156
+ padding-top: calc(var(--tribe-dialog-close-height) + 0.5em);
157
+ width: 100%;
158
+ }
159
+
160
+ .tribe-common .tribe-dialog__title + .tribe-dialog__content {
161
+ padding: 0;
162
+ }
163
+
164
+ /* Modal Styles */
165
+
166
+ .tribe-common .tribe-modal__overlay {
167
+ background-color: var(--tribe-modal-overlay-color);
168
+ }
169
+
170
+ /* Confirmation Styles */
171
+
172
+ .tribe-common .tribe-confirm__content {
173
+ padding-right: 0;
174
+ }
175
+
176
+ .tribe-common .tribe-dialog__button_wrap {
177
+ display: -webkit-box;
178
+ display: flex;
179
+ -webkit-box-orient: horizontal;
180
+ -webkit-box-direction: normal;
181
+ flex-flow: row wrap;
182
+ -webkit-box-pack: end;
183
+ justify-content: flex-end;
184
+ }
185
+
186
+ @media screen and (min-width:768px) {
187
+
188
+ .tribe-common .tribe-dialog__wrapper {
189
+ max-height: calc(100vh - 160px);
190
+ padding: var(--tribe-dialog-padding-top) var(--tribe-dialog-padding-side)
191
+ }
192
+
193
+ .tribe-common .tribe-dialog__close-button {
194
+ height: var(--tribe-dialog-close-height-desktop);
195
+ line-height: var(--tribe-dialog-close-height-desktop);
196
+ width: var(--tribe-dialog-close-height-desktop)
197
+ }
198
+ }
199
+
200
+ @media screen and (max-width:768px) {
201
+ .tribe-common .tribe-dialog__content:last-of-type {
202
+ padding-bottom: 36px;
203
+ }
204
+ }
common/src/resources/css/dialog.min.css CHANGED
@@ -1 +1 @@
1
- .tribe-common .tribe-dialog{--tribe-dialog-background-color:#fff;--tribe-dialog-close-background:#fff;--tribe-dialog-close-border-color:#bababa;--tribe-dialog-close-border-width:1px;--tribe-dialog-close-color:#bababa;--tribe-dialog-close-height:12px;--tribe-dialog-close-height-desktop:16px;--tribe-dialog-overlay-color:transparent;--tribe-modal-overlay-color:rgba(20,24,39,.9);--tribe-dialog-border-radius:4px;--tribe-dialog-padding:16px;--tribe-dialog-padding-top:24px;--tribe-dialog-padding-side:28px}.tribe-common div.tribe-dialog{align-items:center;display:flex;height:100vh;justify-content:center;left:0;position:fixed;top:0;width:100vw;z-index:1}.tribe-common div.tribe-dialog[aria-hidden=true]{display:none}.tribe-common .tribe-dialog__overlay{background-color:var(--tribe-dialog-overlay-color);height:100vh;left:0;opacity:.9;position:fixed;top:0;width:100vw;z-index:1}.tribe-common .tribe-dialog__wrapper{background-color:var(--tribe-dialog-background-color);border-radius:var(--tribe-dialog-border-radius);box-shadow:0 2px 54px 0 var(--tribe-modal-overlay-color);width:800px;overflow-y:scroll;padding:var(--tribe-dialog-padding);max-height:100vh;max-width:100vw;z-index:2;-webkit-transform:translateZ(0);-webkit-perspective:1000}.tribe-common .tribe-dialog__wrapper div[role=document]{align-items:flex-end;display:flex;flex-flow:column;justify-content:space-between;position:relative}.tribe-common .tribe-dialog__close-button{background:var(--tribe-dialog-close-background);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cpath d='M16 2L2 16m14 0L2 2' stroke='%23BABABA' fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:contain;cursor:pointer;display:inline-block;font-size:14px;height:var(--tribe-dialog-close-height);line-height:var(--tribe-dialog-close-height);padding:0;position:absolute;width:var(--tribe-dialog-close-height);z-index:1}.tribe-common .tribe-dialog__close-button:focus,.tribe-common .tribe-dialog__close-button:hover{background:var(--tribe-dialog-close-background);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cpath d='M16 2L2 16m14 0L2 2' stroke='%235D5D5D' fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'/%3E%3C/svg%3E");background-size:contain;outline:none}.tribe-common .tribe-dialog__close-button--hidden{display:none}.tribe-common .tribe-dialog__close-button--round{border-radius:50%}.tribe-common .tribe-dialog__close-button--border{border:var(--tribe-dialog-close-border-width) solid var(--tribe-dialog-close-border-color)}.tribe-common h2.tribe-dialog__title{align-self:flex-start;margin:0 0 22px;padding-right:calc(var(--tribe-dialog-close-height) + .5em);padding-top:0}.tribe-common .tribe-dialog__content{color:#141827;font-size:14px;line-height:1.64em;padding-right:calc(var(--tribe-dialog-close-height) + .5em);padding-top:calc(var(--tribe-dialog-close-height) + .5em);width:100%}.tribe-common .tribe-dialog__title+.tribe-dialog__content{padding:0}.tribe-common .tribe-modal__overlay{background-color:var(--tribe-modal-overlay-color)}.tribe-common .tribe-confirm__content{padding-right:0}.tribe-common .tribe-dialog__button_wrap{display:flex;flex-flow:row wrap;justify-content:flex-end}#top .main_color .tribe-common div.tribe-dialog,#top.tribe-theme-enfold .tribe-common div.tribe-dialog,.tribe-theme-avada .tribe-common div.tribe-dialog,.tribe-theme-divi .tribe-common div.tribe-dialog{z-index:99999}@media screen and (min-width:768px){.tribe-common .tribe-dialog__wrapper{max-height:calc(100vh - 160px);padding:var(--tribe-dialog-padding-top) var(--tribe-dialog-padding-side)}.tribe-common .tribe-dialog__close-button{height:var(--tribe-dialog-close-height-desktop);line-height:var(--tribe-dialog-close-height-desktop);width:var(--tribe-dialog-close-height-desktop)}}@media screen and (max-width:768px){.tribe-common .tribe-dialog__content:last-of-type{padding-bottom:36px}}
1
+ .tribe-common .tribe-dialog{--tribe-dialog-background-color:#fff;--tribe-dialog-close-background:#fff;--tribe-dialog-close-border-color:#bababa;--tribe-dialog-close-border-width:1px;--tribe-dialog-close-color:#bababa;--tribe-dialog-close-height:12px;--tribe-dialog-close-height-desktop:16px;--tribe-dialog-overlay-color:transparent;--tribe-modal-overlay-color:rgba(20,24,39,.9);--tribe-dialog-border-radius:4px;--tribe-dialog-padding:16px;--tribe-dialog-padding-top:24px;--tribe-dialog-padding-side:28px}.tribe-common div.tribe-dialog{align-items:center;display:flex;height:100vh;justify-content:center;left:0;position:fixed;top:0;width:100vw;z-index:1}.tribe-common div.tribe-dialog[aria-hidden=true]{display:none}.tribe-common .tribe-dialog__overlay{background-color:var(--tribe-dialog-overlay-color);height:100vh;left:0;opacity:.9;position:fixed;top:0;width:100vw;z-index:1}.tribe-common .tribe-dialog__wrapper{background-color:var(--tribe-dialog-background-color);border-radius:var(--tribe-dialog-border-radius);box-shadow:0 2px 54px 0 var(--tribe-modal-overlay-color);width:800px;overflow-y:scroll;padding:var(--tribe-dialog-padding);max-height:100vh;max-width:100vw;z-index:2}.tribe-common .tribe-dialog__wrapper div[role=document]{align-items:flex-end;display:flex;flex-flow:column;justify-content:space-between;position:relative}.tribe-common .tribe-dialog__close-button{background:var(--tribe-dialog-close-background);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cpath d='M16 2L2 16m14 0L2 2' stroke='var(--color-icon-secondary)' fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:contain;cursor:pointer;display:inline-block;font-size:14px;height:var(--tribe-dialog-close-height);line-height:var(--tribe-dialog-close-height);padding:0;position:absolute;width:var(--tribe-dialog-close-height);z-index:1}.tribe-common .tribe-dialog__close-button:focus,.tribe-common .tribe-dialog__close-button:hover{background:var(--tribe-dialog-close-background);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Cpath d='M16 2L2 16m14 0L2 2' stroke='var(--color-icon-primary)' fill='none' fill-rule='evenodd' stroke-linecap='square' stroke-width='2'/%3E%3C/svg%3E");background-size:contain;outline:none}.tribe-common .tribe-dialog__close-button--hidden{display:none}.tribe-common .tribe-dialog__close-button--round{border-radius:50%}.tribe-common .tribe-dialog__close-button--border{border:var(--tribe-dialog-close-border-width) solid var(--tribe-dialog-close-border-color)}.tribe-common h2.tribe-dialog__title{align-self:flex-start;margin:0 0 22px;padding-right:calc(var(--tribe-dialog-close-height) + .5em);padding-top:0}.tribe-common .tribe-dialog__content{color:#141827;font-size:14px;line-height:1.64em;padding-right:calc(var(--tribe-dialog-close-height) + .5em);padding-top:calc(var(--tribe-dialog-close-height) + .5em);width:100%}.tribe-common .tribe-dialog__title+.tribe-dialog__content{padding:0}.tribe-common .tribe-modal__overlay{background-color:var(--tribe-modal-overlay-color)}.tribe-common .tribe-confirm__content{padding-right:0}.tribe-common .tribe-dialog__button_wrap{display:flex;flex-flow:row wrap;justify-content:flex-end}@media screen and (min-width:768px){.tribe-common .tribe-dialog__wrapper{max-height:calc(100vh - 160px);padding:var(--tribe-dialog-padding-top) var(--tribe-dialog-padding-side)}.tribe-common .tribe-dialog__close-button{height:var(--tribe-dialog-close-height-desktop);line-height:var(--tribe-dialog-close-height-desktop);width:var(--tribe-dialog-close-height-desktop)}}@media screen and (max-width:768px){.tribe-common .tribe-dialog__content:last-of-type{padding-bottom:36px}}
common/src/resources/css/promoter.css ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ #wp-admin-bar-promoter-admin-bar a.ab-item {
12
+ display: -webkit-box;
13
+ display: flex;
14
+ flex-wrap: wrap;
15
+ -webkit-box-align: center;
16
+ align-items: center;
17
+ }
18
+
19
+ #wp-admin-bar-promoter-admin-bar a.ab-item .promoter-admin-bar__icon {
20
+ margin-right: 5px;
21
+ width: 20px;
22
+ height: 20px;
23
+ -webkit-box-flex: 0;
24
+ flex: none;
25
+ }
26
+
27
+ #wp-admin-bar-promoter-admin-bar a.ab-item .promoter-admin-bar__text {
28
+ -webkit-box-flex: 0;
29
+ flex: none;
30
+ }
31
+ #wp-admin-bar-promoter-admin-bar:focus .promoter-admin-bar__icon svg path, #wp-admin-bar-promoter-admin-bar:hover .promoter-admin-bar__icon svg path {
32
+ fill: #00B9EB;
33
+ }
common/src/resources/css/tooltip.css ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ /* = Tooltips
12
+ ============================ */
13
+
14
+ .tribe-tooltip {
15
+ cursor: pointer;
16
+ display: inline-block;
17
+ margin: 0;
18
+ position: relative;
19
+ text-align: left;
20
+ }
21
+
22
+ .tribe-tooltip .dashicons-info {
23
+ color: #a9a9a9;
24
+ font-size: 16px;
25
+ line-height: 1em;
26
+ vertical-align: middle;
27
+ }
28
+
29
+ /* defaults */
30
+
31
+ .tribe-tooltip .down,
32
+ .tribe-tooltip .left,
33
+ .tribe-tooltip .right,
34
+ .tribe-tooltip .up {
35
+ background-color: #fff;
36
+ box-shadow: 0 0 3px 3px rgba(4, 5, 5, 0.05);
37
+ box-sizing: border-box;
38
+ color: #333333;
39
+ font-size: 16px;
40
+ font-weight: 400;
41
+ max-weight: 100vw;
42
+ opacity: 0;
43
+ padding: 15px;
44
+ position: absolute;
45
+ -webkit-transform: translate(-50%, 0);
46
+ transform: translate(-50%, 0);
47
+ -webkit-transition: opacity 0.8s;
48
+ transition: opacity 0.8s;
49
+ visibility: hidden;
50
+ width: 250px;
51
+ z-index: 99999999;
52
+ }
53
+
54
+ .tribe-tooltip .down i, .tribe-tooltip .left i, .tribe-tooltip .right i, .tribe-tooltip .up i {
55
+ height: 12px;
56
+ overflow: hidden;
57
+ position: absolute;
58
+ width: 24px;
59
+ }
60
+
61
+ .tribe-tooltip .down i::after, .tribe-tooltip .left i::after, .tribe-tooltip .right i::after, .tribe-tooltip .up i::after {
62
+ background-color: #fff;
63
+ content: '';
64
+ height: 12px;
65
+ position: absolute;
66
+ width: 24px;
67
+ }
68
+
69
+ .tribe-tooltip.large .down,
70
+ .tribe-tooltip.large .left,
71
+ .tribe-tooltip.large .right,
72
+ .tribe-tooltip.large .up {
73
+ width: 400px;
74
+ }
75
+
76
+ .tribe-tooltip .tooltip-list {
77
+ padding-left: 10px;
78
+ }
79
+
80
+ .tribe-tooltip .tooltip-list li {
81
+ list-style-type: disc;
82
+ }
83
+
84
+ .tribe-tooltip .down {
85
+ left: 50%;
86
+ top: 28px;
87
+ }
88
+
89
+ .tribe-tooltip .down i {
90
+ bottom: 100%;
91
+ left: 50%;
92
+ margin-left: -7px;
93
+ }
94
+
95
+ .tribe-tooltip .down i::after {
96
+ box-shadow: 0 0 3px 3px rgba(4, 5, 5, 0.05);
97
+ left: 50%;
98
+ top: 50%;
99
+ -webkit-transform: translate(-50%, 50%) rotate(45deg);
100
+ transform: translate(-50%, 50%) rotate(45deg);
101
+ }
102
+
103
+ /* active (open) styles */
104
+
105
+ .tribe-tooltip.active .down,
106
+ .tribe-tooltip.active .left,
107
+ .tribe-tooltip.active .right,
108
+ .tribe-tooltip.active .up {
109
+ opacity: 1;
110
+ visibility: visible;
111
+ }
112
+
113
+ @media screen and (max-width: 480px) {
114
+
115
+ .tribe-tooltip.large .down,
116
+ .tribe-tooltip.large .left,
117
+ .tribe-tooltip.large .right,
118
+ .tribe-tooltip.large .up {
119
+ width: 250px
120
+ }
121
+ }
common/src/resources/css/tooltip.min.css CHANGED
@@ -1 +1 @@
1
- .tribe-tooltip{cursor:pointer;display:inline-block;margin:0;position:relative;text-align:left}.tribe-tooltip .dashicons-info{color:#a9a9a9;font-size:16px;line-height:1em;vertical-align:middle}.tribe-tooltip .down,.tribe-tooltip .left,.tribe-tooltip .right,.tribe-tooltip .up{background-color:#fff;box-shadow:0 0 3px 3px rgba(4,5,5,.05);box-sizing:border-box;color:#333;font-size:16px;font-weight:400;max-width:100vw;opacity:0;padding:15px;position:absolute;transform:translate(-50%);transition:opacity .8s;visibility:hidden;width:250px;z-index:99999999}.tribe-tooltip .down i,.tribe-tooltip .left i,.tribe-tooltip .right i,.tribe-tooltip .up i{height:12px;overflow:hidden;position:absolute;width:24px}.tribe-tooltip .down i:after,.tribe-tooltip .left i:after,.tribe-tooltip .right i:after,.tribe-tooltip .up i:after{background-color:#fff;content:"";height:12px;position:absolute;width:24px}.tribe-tooltip.large .down,.tribe-tooltip.large .left,.tribe-tooltip.large .right,.tribe-tooltip.large .up{width:400px}.tribe-tooltip .tooltip-list{padding-left:10px}.tribe-tooltip .tooltip-list li{list-style-type:disc}.tribe-tooltip .down{left:50%;top:28px}.tribe-tooltip .down i{bottom:100%;left:50%;margin-left:-7px}.tribe-tooltip .down i:after{box-shadow:0 0 3px 3px rgba(4,5,5,.05);left:50%;top:50%;transform:translate(-50%,50%) rotate(45deg)}.tribe-tooltip.active .down,.tribe-tooltip.active .left,.tribe-tooltip.active .right,.tribe-tooltip.active .up{opacity:1;visibility:visible}@media screen and (max-width:480px){.tribe-tooltip.large .down,.tribe-tooltip.large .left,.tribe-tooltip.large .right,.tribe-tooltip.large .up{width:250px}}
1
+ .tribe-tooltip{cursor:pointer;display:inline-block;margin:0;position:relative;text-align:left}.tribe-tooltip .dashicons-info{color:#a9a9a9;font-size:16px;line-height:1em;vertical-align:middle}.tribe-tooltip .down,.tribe-tooltip .left,.tribe-tooltip .right,.tribe-tooltip .up{background-color:#fff;box-shadow:0 0 3px 3px rgba(4,5,5,.05);box-sizing:border-box;color:#333;font-size:16px;font-weight:400;max-weight:100vw;opacity:0;padding:15px;position:absolute;transform:translate(-50%);transition:opacity .8s;visibility:hidden;width:250px;z-index:99999999}.tribe-tooltip .down i,.tribe-tooltip .left i,.tribe-tooltip .right i,.tribe-tooltip .up i{height:12px;overflow:hidden;position:absolute;width:24px}.tribe-tooltip .down i:after,.tribe-tooltip .left i:after,.tribe-tooltip .right i:after,.tribe-tooltip .up i:after{background-color:#fff;content:"";height:12px;position:absolute;width:24px}.tribe-tooltip.large .down,.tribe-tooltip.large .left,.tribe-tooltip.large .right,.tribe-tooltip.large .up{width:400px}.tribe-tooltip .tooltip-list{padding-left:10px}.tribe-tooltip .tooltip-list li{list-style-type:disc}.tribe-tooltip .down{left:50%;top:28px}.tribe-tooltip .down i{bottom:100%;left:50%;margin-left:-7px}.tribe-tooltip .down i:after{box-shadow:0 0 3px 3px rgba(4,5,5,.05);left:50%;top:50%;transform:translate(-50%,50%) rotate(45deg)}.tribe-tooltip.active .down,.tribe-tooltip.active .left,.tribe-tooltip.active .right,.tribe-tooltip.active .up{opacity:1;visibility:visible}@media screen and (max-width:480px){.tribe-tooltip.large .down,.tribe-tooltip.large .left,.tribe-tooltip.large .right,.tribe-tooltip.large .up{width:250px}}
common/src/resources/css/tribe-common-admin.css ADDED
@@ -0,0 +1,1387 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ /* = Shared CSS Elements
12
+ =============================================*/
13
+ .invalid input {
14
+ border: 2px solid red !important;
15
+ }
16
+ .valid input {
17
+ border: 1px solid green;
18
+ }
19
+ .clearfix {
20
+ zoom: 1; /* For IE */
21
+ }
22
+ .placeholder {
23
+ color: #999;
24
+ cursor: text;
25
+ padding: 4px 4px 4px 4px;
26
+ }
27
+ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
28
+ color: #999;
29
+ }
30
+ input::-moz-placeholder, textarea::-moz-placeholder {
31
+ color: #999;
32
+ }
33
+ input:-ms-input-placeholder, textarea:-ms-input-placeholder {
34
+ color: #999;
35
+ }
36
+ input::-ms-input-placeholder, textarea::-ms-input-placeholder {
37
+ color: #999;
38
+ }
39
+ input::placeholder,
40
+ textarea::placeholder {
41
+ color: #999;
42
+ }
43
+ input::-webkit-input-placeholder,
44
+ textarea::-webkit-input-placeholder {
45
+ color: #999;
46
+ }
47
+ .bubble {
48
+ background-color: #f9f9f9;
49
+ border-color: #dfdfdf;
50
+ border-radius: 3px;
51
+ border-spacing: 0;
52
+ border-style: solid;
53
+ border-width: 1px;
54
+ padding: 10px;
55
+ }
56
+ .tribe-sticky-tooltip {
57
+ color: #bbb;
58
+ }
59
+ td.tribe_message {
60
+ padding-bottom: 10px !important;
61
+ }
62
+ #tribe_thanks {
63
+ float: left;
64
+ margin: 5px 0 0 0;
65
+ width: 200px;
66
+ }
67
+ .tribe_brand {
68
+ font-family: Georgia, serif !important;
69
+ font-size: 17px !important;
70
+ font-weight: normal;
71
+ margin: 8px 0;
72
+ }
73
+ /* = Upgrade Screen
74
+ =============================================*/
75
+ #tribe-upgrade {
76
+ background: #f6f6f6;
77
+ border: 1px solid #ccc;
78
+ border-radius: 5px;
79
+ margin: 20px 0 30px;
80
+ padding: 0 20px 20px;
81
+ }
82
+ #tribe-upgrade .message {
83
+ background-color: #ffffe0;
84
+ border-color: #e6db55;
85
+ border-radius: 3px;
86
+ border-style: solid;
87
+ border-width: 1px;
88
+ padding: 6px 12px;
89
+ }
90
+ /* = Plugin Screen
91
+ =============================================*/
92
+ table.plugins .tribe-plugin-update-message {
93
+ background: #d54e21; /* taken from color scheme in list-tables.css */
94
+ color: white;
95
+ display: inline-table;
96
+ margin: 6px 0;
97
+ padding: 10px 12px;
98
+ }
99
+ table.plugins .tribe-plugin-update-message h4 {
100
+ display: inline;
101
+ font-weight: bold;
102
+ margin-right: 8px;
103
+ }
104
+ table.plugins .tribe-plugin-update-message h4:after {
105
+ content: ' \00BB ';
106
+ }
107
+ table.plugins .tribe-plugin-update-message a {
108
+ color: white;
109
+ text-decoration: underline;
110
+ }
111
+ /* = Settings Screen
112
+ =============================================*/
113
+ .tribe-settings-form {
114
+ max-width: 1000px;
115
+ }
116
+ .tribe-settings-form fieldset {
117
+ clear: both;
118
+ display: inline-block;
119
+ padding: 10px 0;
120
+ }
121
+ .tribe-settings-form fieldset.tribe-field-license_key legend {
122
+ width: auto;
123
+ }
124
+ .tribe-settings-form legend {
125
+ float: left;
126
+ font-weight: bold;
127
+ margin-right: 20px;
128
+ width: 220px;
129
+ }
130
+ .tribe-settings-form .tribe-field-wrap {
131
+ float: left;
132
+ max-width: 500px;
133
+ }
134
+ .tribe-settings-form .tribe-field-wrap *:first-child {
135
+ margin-top: 0;
136
+ }
137
+ .tribe-settings-form .tribe-field-radio label, .tribe-settings-form .tribe-field-checkbox_list label {
138
+ display: block;
139
+ margin: 5px 0 5px 20px;
140
+ text-indent: -20px;
141
+ }
142
+ .tribe-settings-form .tribe-field-radio label > p, .tribe-settings-form .tribe-field-checkbox_list label > p {
143
+ text-indent: 0;
144
+ margin-left: 1px;
145
+ }
146
+ .tribe-settings-form .tribe-field-radio label input, .tribe-settings-form .tribe-field-checkbox_list label input {
147
+ margin-right: 5px;
148
+ }
149
+ .tribe-settings-form .tribe-settings-form-wrap fieldset,
150
+ .tribe-settings-form .tribe-settings-form-wrap .description,
151
+ .tribe-settings-form fieldset[id^='tribe-field-geoloc_'] {
152
+ padding-left: 12px;
153
+ }
154
+ .tribe-settings-form .tribe-settings-form-wrap fieldset .description {
155
+ margin-left: 0;
156
+ max-width: 450px;
157
+ padding-left: 0;
158
+ }
159
+ .tribe-settings-form .tribe-settings-form-wrap fieldset .tribe-style-selection {
160
+ margin-bottom: 18px;
161
+ }
162
+ .tribe-settings-form .tribe-settings-form-wrap #tribe-field-stylesheetOption .description {
163
+ color: #999;
164
+ margin-left: 1px;
165
+ }
166
+ .tribe-settings-form .tribe-settings-form-wrap h3 {
167
+ background-color: #f9f9f9;
168
+ margin-bottom: 10px;
169
+ padding: 6px 0 6px 12px;
170
+ }
171
+ .tribe-settings-form .tribe-settings-form-wrap .tribe-sysinfo-optin-msg,
172
+ .tribe-settings-form .tribe-settings-form-wrap .system-info,
173
+ .tribe-settings-form .tribe-settings-form-wrap h3 + p,
174
+ .tribe-settings-form .tribe-settings-form-wrap .contained {
175
+ margin: 0 0 10px;
176
+ padding-left: 12px;
177
+ }
178
+ .tribe_settings .tribe-field-indent {
179
+ margin-left: 245px;
180
+ }
181
+ .tribe_settings #pu_dashboard_message {
182
+ display: none;
183
+ }
184
+ .tribe_settings .tribe-errors-list {
185
+ margin-left: 15px;
186
+ }
187
+ .tribe_settings .expiring-license {
188
+ color: red;
189
+ }
190
+ .tribe_settings .tribe-error {
191
+ border: 1px solid #f00;
192
+ }
193
+ .tribe_settings .tribe-field-description {
194
+ margin-bottom: 0;
195
+ position: relative;
196
+ top: -12px;
197
+ }
198
+ .tribe_settings #ical-link {
199
+ top: -14px;
200
+ }
201
+ /* Modern Tribe box */
202
+ #modern-tribe-info {
203
+ background-color: #f9f9f9;
204
+ border: 1px solid #ccc;
205
+ border-radius: 4px;
206
+ margin: 20px 0;
207
+ padding: 8px 20px 12px;
208
+ }
209
+ #modern-tribe-info img {
210
+ height: 18px;
211
+ margin: 10px 0;
212
+ width: 250px;
213
+ }
214
+ #modern-tribe-info ul {
215
+ list-style: disc;
216
+ margin-left: 20px;
217
+ }
218
+ #modern-tribe-info ul ul {
219
+ list-style: circle;
220
+ }
221
+ /* sizes */
222
+ .tribe-field-inline-dropdown {
223
+ margin-left: 0;
224
+ margin-right: 0;
225
+ }
226
+ .tribe-field-inline-text {
227
+ line-height: 28px;
228
+ margin: 0 2px;
229
+ }
230
+ .tribe-field-textarea.tribe-size-small textarea {
231
+ height: 60px;
232
+ width: 180px;
233
+ }
234
+ .tribe-field-textarea.tribe-size-medium textarea {
235
+ height: 80px;
236
+ width: 300px;
237
+ }
238
+ .tribe-field-textarea.tribe-size-large textarea {
239
+ height: 120px;
240
+ width: 450px;
241
+ }
242
+ .tribe-field-text.tribe-size-small input,
243
+ .tribe-field-email.tribe-size-small input,
244
+ .tribe-field-license_key.tribe-size-small input {
245
+ width: 50px;
246
+ }
247
+ .tribe-field-text.tribe-size-medium input,
248
+ .tribe-field-email.tribe-size-medium input,
249
+ .tribe-field-license_key.tribe-size-medium input {
250
+ width: 225px;
251
+ }
252
+ .tribe-field-text.tribe-size-large input,
253
+ .tribe-field-email.tribe-size-large input,
254
+ .tribe-field-license_key.tribe-size-large input {
255
+ width: 450px;
256
+ }
257
+ .tribe-field-dropdown.tribe-size-small select {
258
+ width: 100px;
259
+ }
260
+ .tribe-field-dropdown.tribe-size-medium select {
261
+ width: 300px;
262
+ }
263
+ .tribe-field-dropdown.tribe-size-large select {
264
+ width: 450px;
265
+ }
266
+ .tribe-field-wrapped_html.tribe-size-large .tribe-field-wrap {
267
+ max-width: 600px;
268
+ }
269
+ .tribe-field-wrapped_html.tribe-size-large .tribe-field-wrap .description{
270
+ max-width: 100%;
271
+ }
272
+ .tribe-field-dropdown_chosen.tribe-size-small select {
273
+ width: 100px;
274
+ }
275
+ .tribe-field-dropdown_chosen.tribe-size-medium select {
276
+ width: 200px;
277
+ }
278
+ .tribe-field-dropdown_chosen.tribe-size-large select {
279
+ width: 300px;
280
+ }
281
+ .tribe-field-wrap .tooltip:first-child {
282
+ font-style: normal;
283
+ }
284
+ .tribe-field.indent {
285
+ margin-left: 252px;
286
+ width: 75%;
287
+ }
288
+ .tribe-field.indent legend {
289
+ font-weight: normal;
290
+ width: auto;
291
+ }
292
+ .tribe-field.indent .tribe-field-wrap {
293
+ padding-right: 12px;
294
+ }
295
+ .tribe-field.indent.tribe-field-radio .tribe-field-wrap {
296
+ clear: left;
297
+ margin-top: 12px;
298
+ }
299
+ .tribe-field.light-bordered {
300
+ background-color: white;
301
+ border: solid lightgrey 1px;
302
+ }
303
+ /* license keys */
304
+ .ajax-loading-license,
305
+ .valid-key,
306
+ .invalid-key {
307
+ display: none;
308
+ margin: 0 5px;
309
+ }
310
+ .ajax-loading-license {
311
+ position: relative;
312
+ top: 5px;
313
+ }
314
+ .key-validity {
315
+ display: inline-block;
316
+ }
317
+ .optin-fail,
318
+ .invalid-key {
319
+ color: red;
320
+ }
321
+ .optin-success,
322
+ .valid-key {
323
+ color: green;
324
+ }
325
+ .valid-key.service-msg {
326
+ color: #b72;
327
+ }
328
+ /* additional fields */
329
+ #additional-field-table {
330
+ margin-bottom: 20px;
331
+ }
332
+ /* miscellaneous */
333
+ .tribe-admin-box-left {
334
+ background-color: #f9f9f9;
335
+ border: 1px solid #ccc;
336
+ border-radius: 4px;
337
+ float: left;
338
+ margin: 20px 0;
339
+ padding: 0 20px 15px;
340
+ width: 20%;
341
+ }
342
+ .tribe-admin-box-right {
343
+ background-color: #f9f9f9;
344
+ border: 1px solid #ccc;
345
+ border-radius: 4px;
346
+ float: right;
347
+ margin: 20px 0;
348
+ padding: 0 20px 15px;
349
+ width: 68%;
350
+ }
351
+ .ajax-loader {
352
+ float: right;
353
+ margin: 10px;
354
+ }
355
+ .tribe-arrangeable-item {
356
+ border: 1px solid lightGrey;
357
+ border-radius: 3px;
358
+ }
359
+ .tribe-arrangeable-item .ui-state-default {
360
+ border: none;
361
+ }
362
+ .tribe-arrangeable-item-top {
363
+ padding: 6px;
364
+ }
365
+ .tribe-arrangeable-item-top:hover {
366
+ cursor: move;
367
+ }
368
+ .tribe-arrangeable-action {
369
+ float: right;
370
+ }
371
+ .tribe-arrangeable-child {
372
+ background-color: #f9f9f9;
373
+ border-top: 1px solid lightGrey;
374
+ display: none;
375
+ padding: 25px;
376
+ }
377
+ .tribe-arrangeable-child label {
378
+ display: block;
379
+ margin: 0 0 7px 0;
380
+ }
381
+ .tribe_events_active_filter_type_options {
382
+ margin: 10px 0;
383
+ }
384
+ .tribe_events_active_filter_type_options label {
385
+ margin: 7px 0;
386
+ }
387
+ .OrganizerInfo td small,
388
+ #event_organizer td small {
389
+ display: block;
390
+ margin: 0;
391
+ max-width: 250px;
392
+ }
393
+ .OrganizerInfo .organizer-email,
394
+ #event_organizer .organizer-email {
395
+ vertical-align: top;
396
+ }
397
+ .tribe-table-field-label {
398
+ max-width: 100%;
399
+ width: 200px;
400
+ }
401
+ /* = Help Screen
402
+ =============================================*/
403
+ #tribe-help-general,
404
+ #tribe-help-sidebar {
405
+ float: left;
406
+ margin-top: 20px;
407
+ }
408
+ #tribe-help-general p {
409
+ margin-left: 15px;
410
+ }
411
+ #tribe-help-general ul {
412
+ list-style-type: square;
413
+ margin-bottom: 20px;
414
+ margin-left: 35px;
415
+ }
416
+ #tribe-help-general ol {
417
+ margin-bottom: 20px;
418
+ margin-left: 35px;
419
+ }
420
+ #tribe-help-general h3 {
421
+ background-color: #f9f9f9;
422
+ margin-bottom: 10px;
423
+ padding: 6px 0 6px 12px;
424
+ }
425
+ #tribe-help-general h3 ~ h3 {
426
+ margin-top: 2.25em;
427
+ }
428
+ #tribe-help-general h3 + p {
429
+ margin: 0 0 20px;
430
+ padding-left: 12px;
431
+ }
432
+ #tribe-help-general {
433
+ width: 65%;
434
+ }
435
+ .tribe-help-section {
436
+ padding-bottom: 10px;
437
+ }
438
+ .tribe-section-type-box {
439
+ background-color: #f9f9f9;
440
+ border: 1px solid #ccc;
441
+ border-radius: 4px;
442
+ padding: 8px 20px 12px;
443
+ }
444
+ .tribe-section-type-box img {
445
+ height: auto;
446
+ margin: 10px 0;
447
+ max-width: 300px;
448
+ }
449
+ .tribe-section-type-box ul {
450
+ list-style: disc;
451
+ margin-left: 20px;
452
+ }
453
+ .tribe-section-type-box ul ul {
454
+ list-style: circle;
455
+ }
456
+ #tribe-log-controls {
457
+ padding-bottom: 1rem;
458
+
459
+ /* For consistency with help screen h3 and p elements */
460
+ padding-left: 12px;
461
+ }
462
+ #tribe-log-controls > div {
463
+ display: inline-block;
464
+ padding-right: 1rem;
465
+ }
466
+ #tribe-log-controls .working {
467
+ opacity: 1;
468
+ -webkit-transition: opacity 0.2s;
469
+ transition: opacity 0.2s;
470
+ }
471
+ #tribe-log-controls .working.hidden {
472
+ opacity: 0;
473
+ -webkit-transition: opacity 0.2s;
474
+ transition: opacity 0.2s;
475
+ }
476
+ #tribe-system-info dl.support-stats,
477
+ #tribe-log-viewer,
478
+ .template-updates-wrapper {
479
+ background: #000;
480
+ border-radius: 2px;
481
+ color: #888;
482
+ max-height: 400px;
483
+ overflow: scroll;
484
+ padding: 10px;
485
+ }
486
+ #tribe-system-info dl.support-stats dt,
487
+ .template-updates-wrapper dt {
488
+ clear: both;
489
+ float: left;
490
+ font-weight: bold;
491
+ text-transform: uppercase;
492
+ width: 25%;
493
+ }
494
+ #tribe-system-info dl.support-stats dd,
495
+ .template-updates-wrapper dd {
496
+ margin-left: 25%;
497
+ padding-left: 10px;
498
+ }
499
+ .system-info-copy .system-info-copy-btn {
500
+ padding: 6px;
501
+ }
502
+ .system-info-copy .system-info-copy-btn .dashicons {
503
+ padding-right: 10px;
504
+ }
505
+ .template-updates-wrapper p {
506
+ margin-top: 0;
507
+ }
508
+ #tribe-help-sidebar {
509
+ margin: 20px 0 0 3%;
510
+ max-width: 225px;
511
+ width: 32%;
512
+ }
513
+ .tribe-help-plugin-info {
514
+ border: 1px solid #ccc;
515
+ padding: 0 12px 12px;
516
+ }
517
+ .tribe-help-plugin-info dt,
518
+ .tribe-help-plugin-info dd {
519
+ display: inline;
520
+ margin: 0;
521
+ }
522
+ .tribe-help-plugin-info dt {
523
+ font-weight: bold;
524
+ }
525
+ .tribe-help-plugin-info dd::after {
526
+ content: '';
527
+ display: block;
528
+ height: .4em;
529
+ }
530
+ .tribe-help-plugin-info dd:last-child::after {
531
+ height: 0;
532
+ }
533
+ .tribe-help-plugin-info + .tribe-help-plugin-info {
534
+ margin-top: 20px;
535
+ }
536
+ .tribe-help-plugin-info > div {
537
+ line-height: 2em;
538
+ }
539
+ .tribe-help-plugin-info .star-rating {
540
+ display: inline-block;
541
+ margin-left: 3px;
542
+ position: relative;
543
+ top: -2px;
544
+ }
545
+ .tribe-help-plugin-info .tribe-list-addons {
546
+ color: #21a6cb;
547
+ font-size: 24px;
548
+ list-style: circle inside;
549
+ margin-bottom: 10px;
550
+ margin-top: 10px;
551
+ padding-left: 4px;
552
+ }
553
+ .tribe-help-plugin-info .tribe-list-addons a {
554
+ font-size: 13px;
555
+ left: -5px;
556
+ position: relative;
557
+ top: -5px;
558
+ }
559
+ .tribe-help-plugin-info .tribe-list-addons .tribe-active-addon {
560
+ list-style: disc inside;
561
+ }
562
+ /* = jQuery UI
563
+ =============================================*/
564
+ .ui-widget-overlay {
565
+ background: #666;
566
+ filter: Alpha(Opacity=50);
567
+ opacity: .50;
568
+ }
569
+ .ui-widget-shadow {
570
+ background: #000;
571
+ border-radius: 5px;
572
+ filter: Alpha(Opacity=20);
573
+ margin: -5px 0 0 -5px;
574
+ opacity: .20;
575
+ padding: 5px;
576
+ }
577
+ .ui-resizable {
578
+ position: relative;
579
+ }
580
+ .ui-resizable-handle {
581
+ display: block;
582
+ font-size: .1px;
583
+ position: absolute;
584
+ z-index: 99999;
585
+ }
586
+ .ui-resizable-disabled .ui-resizable-handle,
587
+ .ui-resizable-autohide .ui-resizable-handle {
588
+ display: none;
589
+ }
590
+ .ui-resizable-n {
591
+ cursor: n-resize;
592
+ height: 7px;
593
+ left: 0;
594
+ top: -5px;
595
+ width: 100%;
596
+ }
597
+ .ui-resizable-s {
598
+ bottom: -5px;
599
+ cursor: s-resize;
600
+ height: 7px;
601
+ left: 0;
602
+ width: 100%;
603
+ }
604
+ .ui-resizable-e {
605
+ cursor: e-resize;
606
+ height: 100%;
607
+ right: -5px;
608
+ top: 0;
609
+ width: 7px;
610
+ }
611
+ .ui-resizable-w {
612
+ cursor: w-resize;
613
+ height: 100%;
614
+ left: -5px;
615
+ top: 0;
616
+ width: 7px;
617
+ }
618
+ .ui-resizable-se {
619
+ bottom: 1px;
620
+ cursor: se-resize;
621
+ height: 12px;
622
+ right: 1px;
623
+ width: 12px;
624
+ }
625
+ .ui-resizable-sw {
626
+ bottom: -5px;
627
+ cursor: sw-resize;
628
+ height: 9px;
629
+ left: -5px;
630
+ width: 9px;
631
+ }
632
+ .ui-resizable-nw {
633
+ cursor: nw-resize;
634
+ height: 9px;
635
+ left: -5px;
636
+ top: -5px;
637
+ width: 9px;
638
+ }
639
+ .ui-resizable-ne {
640
+ cursor: ne-resize;
641
+ height: 9px;
642
+ right: -5px;
643
+ top: -5px;
644
+ width: 9px;
645
+ }
646
+ .ui-dialog {
647
+ padding: .2em;
648
+ position: relative;
649
+ width: 375px;
650
+ }
651
+ .ui-dialog .ui-dialog-titlebar {
652
+ padding: .5em .3em .3em 1em;
653
+ position: relative;
654
+ }
655
+ .ui-dialog .ui-dialog-title {
656
+ float: left;
657
+ margin: .1em 0 .2em;
658
+ }
659
+ .ui-dialog .ui-dialog-titlebar-close {
660
+ height: 18px;
661
+ margin: -10px 0 0 0;
662
+ padding: 1px;
663
+ position: absolute;
664
+ right: .3em;
665
+ top: 50%;
666
+ width: 19px;
667
+ }
668
+ .ui-dialog .ui-dialog-titlebar-close span {
669
+ display: block;
670
+ margin-left: -8px;
671
+ margin-top: -8px;
672
+ }
673
+ .ui-dialog .ui-dialog-titlebar-close:hover,
674
+ .ui-dialog .ui-dialog-titlebar-close:focus {
675
+ padding: 0;
676
+ }
677
+ .ui-dialog .ui-dialog-content {
678
+ background: none;
679
+ border: 0;
680
+ overflow: auto;
681
+ padding: .5em 1em;
682
+ zoom: 1;
683
+ }
684
+ .ui-dialog .ui-dialog-buttonpane {
685
+ background-image: none;
686
+ border-width: 1px 0 0 0;
687
+ margin: .5em 0 0 0;
688
+ padding: .3em 1em .5em !important;
689
+ text-align: right;
690
+ }
691
+ .ui-dialog .ui-dialog-buttonpane button {
692
+ cursor: pointer;
693
+ line-height: 1.4em;
694
+ margin: .5em .4em .5em !important;
695
+ overflow: visible;
696
+ padding: .2em .6em .3em;
697
+ text-shadow: none;
698
+ width: auto;
699
+ }
700
+ .ui-dialog .ui-resizable-se {
701
+ bottom: 3px;
702
+ height: 14px;
703
+ right: 3px;
704
+ width: 14px;
705
+ }
706
+ .ui-draggable .ui-dialog-titlebar {
707
+ cursor: move;
708
+ }
709
+ .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
710
+ float: none !important;
711
+ text-align: center;
712
+ }
713
+ .ui-button-text-only .ui-button-text {
714
+ padding: .4em 1em;
715
+ }
716
+ .ui-button .ui-button-text {
717
+ display: block;
718
+ line-height: 1.4;
719
+ }
720
+ #ui-datepicker-div {
721
+ display: none;
722
+ }
723
+ #tribe-loading {
724
+ background: #fff;
725
+ background: rgba(255, 255, 255, .8);
726
+ display: none;
727
+ height: 100%;
728
+ left: 0;
729
+ position: absolute;
730
+ top: 0;
731
+ -webkit-transition: all 1s linear;
732
+ transition: all 1s linear;
733
+ width: 100%;
734
+ z-index: 4;
735
+ }
736
+ #tribe-loading span {
737
+ background: url(../images/tribe-loading.gif) 0 0 no-repeat;
738
+ background-size: 32px 32px;
739
+ height: 32px;
740
+ left: 50%;
741
+ margin: -16px 0 0 -16px;
742
+ position: absolute;
743
+ top: 50%;
744
+ width: 32px;
745
+ }
746
+ /* = Admin Retina Bits
747
+ =============================================*/
748
+ /* = TEC Welcome & Update Pages // Displays after installation & plugin update
749
+ ===============================================================================*/
750
+ .tribe_welcome_page,
751
+ .tribe_update_page {
752
+ max-width: 850px;
753
+ }
754
+ .tribe_welcome_page.wrap h1 {
755
+ font-size: 3em;
756
+ line-height: 1.2;
757
+ margin-top: 1em;
758
+ }
759
+ .tribe_welcome_page.wrap h1:before {
760
+ color: #555d66;
761
+ content: '\f145';
762
+ font-family: dashicons;
763
+ font-size: 0.9em;
764
+ line-height: 1;
765
+ margin-right: 5px;
766
+ position: relative;
767
+ top: 4px;
768
+ }
769
+ .tribe-half-column {
770
+ float: left;
771
+ margin-bottom: 30px;
772
+ margin-right: 5%;
773
+ width: 45%;
774
+ }
775
+ .tribe-row:before,
776
+ .tribe-row:after {
777
+ content: '';
778
+ display: table;
779
+ }
780
+ .tribe-row:after {
781
+ clear: both;
782
+ }
783
+ .tribe-row {
784
+ clear: both;
785
+ }
786
+ .tribe-row .tribe-half-column:last-child {
787
+ margin-right: 0;
788
+ width: 50%;
789
+ }
790
+ .tribe_welcome_page h2,
791
+ .tribe_welcome_page .tribe-half-column h4 {
792
+ font-size: 24px;
793
+ line-height: 1.2;
794
+ margin-bottom: 20px;
795
+ }
796
+ .tribe_update_page h2 {
797
+ font-size: 30px;
798
+ line-height: 1.2;
799
+ margin-bottom: 20px;
800
+ }
801
+ .tribe_welcome_page h3,
802
+ .tribe_update_page h3 {
803
+ font-size: 24px;
804
+ font-weight: 400;
805
+ line-height: 24px;
806
+ margin-top: 0;
807
+ }
808
+ .tribe_welcome_page h4,
809
+ .tribe_update_page h4 {
810
+ font-size: 18px;
811
+ font-weight: 600;
812
+ line-height: 18px;
813
+ margin: 0;
814
+ }
815
+ .tribe_welcome_page p,
816
+ .tribe_update_page p {
817
+ font-size: 15px;
818
+ }
819
+ .tribe_welcome_page li {
820
+ font-size: 14px;
821
+ margin-bottom: 10px;
822
+ }
823
+ p.tribe-welcome-message {
824
+ font-size: 18px;
825
+ font-weight: 400;
826
+ }
827
+ .tribe_welcome_page .tribe-half-column h4 {
828
+ margin-top: 1em;
829
+ }
830
+ /* "Calendar" dashicon */
831
+ .tribe_welcome_page .tribe-half-column h4:before {
832
+ color: #555d66;
833
+ content: '\f145';
834
+ font-family: dashicons;
835
+ font-size: 21px;
836
+ line-height: 1;
837
+ margin-right: 10px;
838
+ position: relative;
839
+ top: 2px;
840
+ }
841
+ /* "Life preserver" dashicon */
842
+ .tribe_welcome_page .tribe-half-column h4[data-tribe-icon="dashicons-sos"]:before {
843
+ content: '\f468';
844
+ }
845
+ /* "Graduation cap" dashicon */
846
+ .tribe_welcome_page .tribe-half-column h4[data-tribe-icon="dashicons-welcome-learn-more"]:before {
847
+ content: '\f118';
848
+ }
849
+ /* "Megaphone" dashicon */
850
+ .tribe_welcome_page .tribe-half-column h4[data-tribe-icon="dashicons-megaphone"]:before {
851
+ content: '\f488';
852
+ }
853
+ /* "Heart" dashicon */
854
+ .tribe_welcome_page .tribe-half-column h4[data-tribe-icon="dashicons-heart"]:before {
855
+ content: '\f487';
856
+ }
857
+ .tribe_update_page h4:before {
858
+ content: '\f145';
859
+ font-family: dashicons;
860
+ font-size: 34px;
861
+ line-height: 1;
862
+ margin-right: 5px;
863
+ position: relative;
864
+ top: 5px;
865
+ }
866
+ .tribe-welcome-video-wrapper {
867
+ height: 0;
868
+ margin-bottom: 40px;
869
+ padding-bottom: 56.25%; /* 16:9 */
870
+ padding-top: 25px;
871
+ position: relative;
872
+ }
873
+ .tribe-welcome-video-wrapper iframe {
874
+ height: 100%;
875
+ left: 0;
876
+ position: absolute;
877
+ top: 0;
878
+ width: 100%;
879
+ }
880
+ a.tribe-rating-link {
881
+ text-decoration: none;
882
+ }
883
+ .tribe-welcome-links,
884
+ .tribe-update-links {
885
+ margin-top: 30px;
886
+ }
887
+ .tribe_welcome_page li:before,
888
+ .tribe_update_page li:before {
889
+ content: '\2022';
890
+ padding-right: 3px;
891
+ }
892
+ .tribe_update_page .rss-widget {
893
+ margin: 1em 0;
894
+ }
895
+ .tribe_update_page a.rsswidget {
896
+ font-size: 14px;
897
+ font-weight: 400;
898
+ line-height: 1;
899
+ }
900
+ .tribe_update_page .rss-widget li:before {
901
+ display: none;
902
+ }
903
+ /* Media Queries for Mobile Dashboard */
904
+ .tribe-update-bar {
905
+ display: inline-block;
906
+ }
907
+ .tribe-update-bar .progress {
908
+ border: 1px solid #ccc;
909
+ float: left;
910
+ margin-right: 1rem;
911
+ padding: 1px;
912
+ width: 18rem;
913
+ }
914
+ .tribe-update-bar .progress .bar {
915
+ background: #ffba00;
916
+ height: 1rem;
917
+ width: 1%;
918
+ }
919
+ .tribe-update-bar .progress .bar {
920
+ background: #7ad03a;
921
+ }
922
+ /* = Modals/thickbox dialogs
923
+ ============================ */
924
+ #tribe-dialog-wrapper > div {
925
+ padding: 1rem;
926
+ }
927
+ #tribe-dialog-wrapper > div .stage {
928
+ display: none;
929
+ }
930
+ #tribe-dialog-wrapper #heading {
931
+ background: white;
932
+ }
933
+ #tribe-dialog-wrapper label {
934
+ display: block;
935
+ }
936
+ #tribe-dialog-wrapper .select-single-container {
937
+ border: 1px solid #888;
938
+ overflow-y: scroll;
939
+ height: 300px;
940
+ }
941
+ #tribe-dialog-wrapper .select-single-container label {
942
+ opacity: 1;
943
+ padding: 3px 5px;
944
+ -webkit-transition: opacity 0.2s;
945
+ transition: opacity 0.2s;
946
+ }
947
+ #tribe-dialog-wrapper .select-single-container label:nth-child(odd) {
948
+ background: white;
949
+ }
950
+ #tribe-dialog-wrapper .select-single-container label.selected {
951
+ background: #0073aa;
952
+ color: white;
953
+ font-weight: bold;
954
+ }
955
+ #tribe-dialog-wrapper .select-single-container label input {
956
+ display: none;
957
+ }
958
+ #tribe-dialog-wrapper .select-single-container.updating label {
959
+ opacity: 0.35;
960
+ -webkit-transition: opacity 0.2s;
961
+ transition: opacity 0.2s;
962
+ }
963
+ /* Useful to ensure modals rise above the grey 'miasma' */
964
+ .ui-front {
965
+ z-index: 1000000;
966
+ }
967
+ /* Select2 Specific rule */
968
+ .select2-container .select2-choice abbr {
969
+ top: 6px;
970
+ }
971
+ .wp-list-table.plugins .column-description .update-message {
972
+ color: #d54e21;
973
+ }
974
+ .api-check {
975
+ padding: 1em;
976
+ min-height: 100px;
977
+ }
978
+ .api-check + .notice-dismiss:hover:before {
979
+ color: #fff;
980
+ }
981
+ .api-check:before,
982
+ .api-check:after {
983
+ content: '';
984
+ display: table;
985
+ }
986
+ .api-check:after {
987
+ clear: both;
988
+ }
989
+ .api-check .tribe-mascot {
990
+ bottom: 0;
991
+ display: none;
992
+ padding: 0 1rem 0 0;
993
+ position: absolute;
994
+ right: 0;
995
+ top: 0;
996
+ }
997
+ .api-check .tribe-mascot img {
998
+ display: inline-block;
999
+ max-height: 150px;
1000
+ max-width: 150px;
1001
+ height: 100%;
1002
+ width: auto;
1003
+ vertical-align: middle;
1004
+ }
1005
+ .api-check p {
1006
+ line-height: 1.7;
1007
+ margin-bottom: 1em;
1008
+ }
1009
+ .api-check a {
1010
+ text-decoration: none;
1011
+ }
1012
+ .api-check a:hover {
1013
+ text-decoration: underline;
1014
+ }
1015
+ .api-check .plugin-list {
1016
+ display: inline;
1017
+ font-weight: 600;
1018
+ margin: 0;
1019
+ padding: 0;
1020
+ }
1021
+ .api-check .plugin-list span.plugin-invalid:after {
1022
+ content: ', ';
1023
+ }
1024
+ .api-check .plugin-list span.plugin-invalid:last-of-type:after {
1025
+ content: '';
1026
+ }
1027
+ .tribe-marketing-notice {
1028
+ padding: 1em;
1029
+ }
1030
+ .tribe-marketing-notice + .notice-dismiss:hover:before {
1031
+ color: #fff;
1032
+ }
1033
+ .tribe-marketing-notice:before,
1034
+ .tribe-marketing-notice:after {
1035
+ content: '';
1036
+ display: table;
1037
+ }
1038
+ .tribe-marketing-notice:after {
1039
+ clear: both;
1040
+ }
1041
+ .tribe-marketing-notice .tribe-notice-icon {
1042
+ bottom: 0;
1043
+ display: none;
1044
+ padding: 1rem;
1045
+ position: absolute;
1046
+ left: 0;
1047
+ top: 0;
1048
+ width: 125px;
1049
+ }
1050
+ .tribe-marketing-notice .tribe-notice-icon:before {
1051
+ content: '';
1052
+ display: inline-block;
1053
+ height: 100%;
1054
+ width: 1%;
1055
+ vertical-align: middle;
1056
+ }
1057
+ .tribe-marketing-notice .tribe-notice-icon img {
1058
+ display: inline-block;
1059
+ max-height: 100%;
1060
+ max-width: 96%;
1061
+ vertical-align: middle;
1062
+ }
1063
+ .tribe-marketing-notice h3 {
1064
+ margin-bottom: 0.5em;
1065
+ margin-top: 0.5em;
1066
+ }
1067
+ .tribe-marketing-notice p {
1068
+ line-height: 1.7;
1069
+ margin-bottom: 0.5em;
1070
+ }
1071
+ .tribe-marketing-notice a {
1072
+ text-decoration: none;
1073
+ }
1074
+ .tribe-marketing-notice a:hover {
1075
+ text-decoration: underline;
1076
+ }
1077
+ .tribe-marketing-notice.tribe-bf-2018-tec .button.button-primary {
1078
+ margin: 10px 10px 0 0;
1079
+ }
1080
+ .tribe-ea-dropdown,
1081
+ .tribe-dropdown {
1082
+ max-width: 100%;
1083
+ width: auto;
1084
+ }
1085
+ .tribe-ea-dropdown.select2-container-active .select2-choice, .tribe-dropdown.select2-container-active .select2-choice {
1086
+ border-color: #5897fb;
1087
+ box-shadow: 0 0 5px rgba( 0, 0, 0, .1 );
1088
+ }
1089
+ .tribe-ea-dropdown.select2-dropdown-open .select2-choice, .tribe-dropdown.select2-dropdown-open .select2-choice {
1090
+ border-bottom-left-radius: 0;
1091
+ border-bottom-right-radius: 0;
1092
+ border-color: #aaa;
1093
+ }
1094
+ .tribe-ea-dropdown .select2-choice, .tribe-dropdown .select2-choice {
1095
+ background-image: none;
1096
+ border-radius: 3px;
1097
+ border: 1px solid #ccc;
1098
+ }
1099
+ .tribe-ea-dropdown .select2-choice > .select2-chosen, .tribe-dropdown .select2-choice > .select2-chosen {
1100
+ white-space: normal;
1101
+ }
1102
+ .tribe-ea-dropdown .select2-choice .select2-arrow, .tribe-dropdown .select2-choice .select2-arrow {
1103
+ background-image: none;
1104
+ background: transparent;
1105
+ border-left: 0;
1106
+ }
1107
+ .tribe-ea-dropdown .select2-choice div, .tribe-dropdown .select2-choice div {
1108
+ background-image: none;
1109
+ background: none;
1110
+ border-left: 0;
1111
+ }
1112
+ .tribe-ea-dropdown.select2-container-multi .select2-choices, .tribe-dropdown.select2-container-multi .select2-choices {
1113
+ background-image: none;
1114
+ border-radius: 3px;
1115
+ border: 1px solid #ccc;
1116
+ min-height: 25px;
1117
+ }
1118
+ .tribe-ea-dropdown.select2-container-multi .select2-choices .select2-search-field, .tribe-dropdown.select2-container-multi .select2-choices .select2-search-field {
1119
+ line-height: 25px;
1120
+ }
1121
+ .tribe-ea-dropdown.select2-container-multi .select2-choices .select2-search-field input, .tribe-dropdown.select2-container-multi .select2-choices .select2-search-field input {
1122
+ padding-top: 0;
1123
+ padding-bottom: 0;
1124
+ }
1125
+ .tribe-ea-dropdown.select2-container-multi .select2-choices .select2-search-choice, .tribe-dropdown.select2-container-multi .select2-choices .select2-search-choice {
1126
+ margin-top: 2px;
1127
+ padding-top: 0;
1128
+ padding-bottom: 0;
1129
+ line-height: 19px;
1130
+ }
1131
+ .tribe-ea-dropdown.select2-container-multi .select2-choices .select2-search-choice div, .tribe-dropdown.select2-container-multi .select2-choices .select2-search-choice div {
1132
+ line-height: inherit;
1133
+ }
1134
+ .tribe-ea-dropdown.select2-container-multi .select2-choices .select2-search-choice-close, .tribe-dropdown.select2-container-multi .select2-choices .select2-search-choice-close {
1135
+ top: 3px;
1136
+ left: 4px;
1137
+ -webkit-transition-property: border,color;
1138
+ transition-property: border,color;
1139
+ }
1140
+ .select2-results .select2-selected {
1141
+ display: block;
1142
+ }
1143
+ .select2-results .select2-selected > .select2-result-label {
1144
+ background-color: #efefef;
1145
+ color: #a1a1a1;
1146
+ cursor: default;
1147
+ }
1148
+ .select2-results li.select2-result-with-children > .select2-result-label {
1149
+ font-weight: normal;
1150
+ }
1151
+ .select2-results li.select2-result-with-children.select2-selected {
1152
+ display: block;
1153
+ }
1154
+ .select2-results li.select2-result-with-children.select2-selected .select2-result {
1155
+ display: block;
1156
+ }
1157
+ .select2-results li.select2-result-with-children.select2-selected > .select2-result-label {
1158
+ background-color: #efefef;
1159
+ color: #a1a1a1;
1160
+ cursor: default;
1161
+ }
1162
+ .select2-results li.select2-result-with-children.select2-result-unselectable > .select2-result-label {
1163
+ color: #939393;
1164
+ font-weight: normal;
1165
+ }
1166
+ /*
1167
+ Red button styles.
1168
+
1169
+ Credit to https://github.com/jensjns/wp-admin-red-button
1170
+ =============================================*/
1171
+ .wp-core-ui .button-red {
1172
+ background-color: #a00;
1173
+ border-bottom-color: #8D1F21;
1174
+ border-color: #9B2124;
1175
+ box-shadow: inset 0 1px 0 rgba(120,200,230,0.5);
1176
+ color: #fff;
1177
+ text-decoration: none;
1178
+ text-shadow: 0 1px 0 rgba(0,0,0,0.1);
1179
+ }
1180
+ .wp-core-ui .button-red.hover,
1181
+ .wp-core-ui .button-red:hover,
1182
+ .wp-core-ui .button-red.focus,
1183
+ .wp-core-ui .button-red:focus {
1184
+ background-color: #a00;
1185
+ border-color: #7F1C1F;
1186
+ box-shadow: inset 0 1px 0 rgba(120,200,230,0.6);
1187
+ color: #fff;
1188
+ text-shadow: 0 -1px 0 rgba(0,0,0,0.3);
1189
+ }
1190
+ .wp-core-ui .button-red.focus,
1191
+ .wp-core-ui .button-red:focus {
1192
+ border-color: #500F0E;
1193
+ box-shadow: inset 0 1px 0 rgba(120,200,230,0.6), 1px 1px 2px rgba(0,0,0,0.4);
1194
+ }
1195
+ .wp-core-ui .button-red.active,
1196
+ .wp-core-ui .button-red.active:hover,
1197
+ .wp-core-ui .button-red.active:focus,
1198
+ .wp-core-ui .button-red:active {
1199
+ background: #7F1C1F;
1200
+ border-color: #601312 #AE2426 #AE2426 #AE2426;
1201
+ box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
1202
+ color: rgba(255,255,255,0.95);
1203
+ text-shadow: 0 1px 0 rgba(0,0,0,0.1);
1204
+ }
1205
+ .wp-core-ui .button-red[disabled],
1206
+ .wp-core-ui .button-red:disabled,
1207
+ .wp-core-ui .button-red-disabled {
1208
+ color: #E79496 !important;
1209
+ background: #BA292B !important;
1210
+ border-color: #7F1C1F !important;
1211
+ box-shadow: none !important;
1212
+ text-shadow: 0 -1px 0 rgba(0,0,0,0.1) !important;
1213
+ cursor: default;
1214
+ }
1215
+ .ticket_form .select2-container .select2-choice .select2-arrow {
1216
+ display: none;
1217
+ }
1218
+ /* Clearfix Utility */
1219
+ .clear {
1220
+ zoom: 1;
1221
+ }
1222
+ .clear:after,
1223
+ .clear:before {
1224
+ content: " ";
1225
+ display: table;
1226
+ }
1227
+ .clear:after {
1228
+ clear: both;
1229
+ }
1230
+ /* from https://codepen.io/lajlev/pen/diKbz */
1231
+ .checkmark:after {
1232
+ /*Add another block-level blank space*/
1233
+ content: '';
1234
+ display: block;
1235
+
1236
+ /*Make it a small rectangle so the border will create an L-shape*/
1237
+ width: 8px;
1238
+ height: 15px;
1239
+
1240
+ /*Add a white border on the bottom and left, creating that 'L' */
1241
+ border: solid #0AB152;
1242
+ border-width: 0 3px 3px 0;
1243
+
1244
+ /*Rotate the L 45 degrees to turn it into a checkmark*/
1245
+ -webkit-transform: rotate(45deg);
1246
+ transform: rotate(45deg);
1247
+ }
1248
+ .checkmark.checkmark-right:after {
1249
+ float: right;
1250
+ margin-right: 2em;
1251
+ }
1252
+ .checkmark.checkmark-left:after {
1253
+ float: left;
1254
+ margin-left: 2em;
1255
+ }
1256
+ .checkmark.no-checkmark:after {
1257
+ display: none;
1258
+ }
1259
+ .complete,
1260
+ .ok,
1261
+ .yes,
1262
+ .on,
1263
+ [data-status="complete"],
1264
+ [data-status="ok"],
1265
+ [data-status="yes"],
1266
+ [data-status="on"] {
1267
+ color: #0AB152;
1268
+ }
1269
+ .incomplete,
1270
+ .ko,
1271
+ .no,
1272
+ .off,
1273
+ [data-status="incomplete"],
1274
+ [data-status="ko"],
1275
+ [data-status="no"],
1276
+ [data-status="off"] {
1277
+ color: #FF2500;
1278
+ }
1279
+ /*
1280
+ * Plugin install CSS
1281
+ */
1282
+ .plugin-card-the-events-calendar .column-rating,
1283
+ .plugin-card-the-events-calendar .column-updated,
1284
+ .plugin-card-the-events-calendar .column-downloaded,
1285
+ .plugin-card-events-calendar-pro .column-rating,
1286
+ .plugin-card-events-calendar-pro .column-updated,
1287
+ .plugin-card-events-calendar-pro .column-downloaded,
1288
+ .plugin-card-event-tickets .column-rating,
1289
+ .plugin-card-event-tickets .column-updated,
1290
+ .plugin-card-event-tickets .column-downloaded,
1291
+ .plugin-card-event-tickets-plus .column-rating,
1292
+ .plugin-card-event-tickets-plus .column-updated,
1293
+ .plugin-card-event-tickets-plus .column-downloaded,
1294
+ .plugin-card-events-community .column-rating,
1295
+ .plugin-card-events-community .column-updated,
1296
+ .plugin-card-events-community .column-downloaded,
1297
+ .plugin-card-events-community-tickets .column-rating,
1298
+ .plugin-card-events-community-tickets .column-updated,
1299
+ .plugin-card-events-community-tickets .column-downloaded,
1300
+ .plugin-card-tribe-eventbrite .column-rating,
1301
+ .plugin-card-tribe-eventbrite .column-updated,
1302
+ .plugin-card-tribe-eventbrite .column-downloaded,
1303
+ .plugin-card-tribe-filterbar .column-rating,
1304
+ .plugin-card-tribe-filterbar .column-updated,
1305
+ .plugin-card-tribe-filterbar .column-downloaded,
1306
+ .plugin-card-image-widget .column-rating,
1307
+ .plugin-card-image-widget .column-updated,
1308
+ .plugin-card-image-widget .column-downloaded,
1309
+ .plugin-card-image-widget-plus .column-rating,
1310
+ .plugin-card-image-widget-plus .column-updated,
1311
+ .plugin-card-image-widget-plus .column-downloaded {
1312
+ display: none;
1313
+ }
1314
+ @media
1315
+ only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) {
1316
+
1317
+ #tribe-loading span {
1318
+ background-image: url(../images/tribe-loading@2x.gif);
1319
+ }
1320
+ }
1321
+ @media screen and (max-width: 782px) {
1322
+
1323
+ .tribe-half-column,
1324
+ .tribe-row .tribe-half-column:last-child {
1325
+ margin: 0 0 20px 0;
1326
+ width: 100%;
1327
+ }
1328
+
1329
+ input[type='email'] {
1330
+ width: 100%;
1331
+ }
1332
+ }
1333
+ @media screen and ( max-width: 782px ) {
1334
+
1335
+ .events-cal .subsubsub {
1336
+ float: none;
1337
+ }
1338
+
1339
+ .events-cal .search-box {
1340
+ width: 98%;
1341
+ }
1342
+
1343
+ .events-cal #search-submit {
1344
+ width: 100%;
1345
+ }
1346
+
1347
+ .events-cal .tablenav.top {
1348
+ display: none;
1349
+ }
1350
+ }
1351
+ @media screen and (min-width: 500px) {
1352
+ .api-check .tribe-mascot {
1353
+ display: block
1354
+ }
1355
+ .api-check .notice-content {
1356
+ margin-right: 180px
1357
+ }
1358
+ }
1359
+ @media screen and (min-width: 600px) and (max-width: 782px ) {
1360
+ .tribe-marketing-notice .tribe-notice-icon {
1361
+ width: 135px
1362
+ }
1363
+ .tribe-marketing-notice .tribe-notice-content {
1364
+ margin-left: 145px
1365
+ }
1366
+ }
1367
+ @media screen and (min-width: 600px) {
1368
+ .tribe-marketing-notice .tribe-notice-icon {
1369
+ display: block
1370
+ }
1371
+ }
1372
+ @media screen and (min-width: 782px) {
1373
+ .tribe-marketing-notice .tribe-notice-content {
1374
+ margin-left: 130px
1375
+ }
1376
+ }
1377
+ @media screen and (max-width: 956px) {
1378
+
1379
+ .tribe-marketing-notice.tribe-bf-2018-tec .button.button-primary {
1380
+ margin: 0 0 10px 0;
1381
+ }
1382
+
1383
+ .tribe-marketing-notice.tribe-bf-2018-tec em {
1384
+ clear: both;
1385
+ display: block;
1386
+ }
1387
+ }
common/src/resources/css/tribe-ui.css ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ .tribe-button {
12
+ border: 0;
13
+ border-radius: 3px;
14
+ background: #009FF1 -webkit-gradient( linear, left top, left bottom, from(#009FF1), to(#0080DB));
15
+ background: #009FF1 linear-gradient( to bottom, #009FF1, #0080DB);
16
+ cursor: pointer;
17
+ color: #fff;
18
+ display: inline-block;
19
+ font-size: 14px;
20
+ font-weight: 400;
21
+ font-family: sans-serif;
22
+ letter-spacing: 1px;
23
+ line-height: 1;
24
+ height: auto;
25
+ padding: 10px;
26
+ text-align: center;
27
+ -webkit-transition: all .15s ease-in;
28
+ transition: all .15s ease-in;
29
+ -webkit-font-smoothing: subpixel-antialiased;
30
+ }
31
+
32
+ .tribe-button:hover,
33
+ .tribe-button:active,
34
+ .tribe-button:focus {
35
+ background: #0080DB;
36
+ }
common/src/resources/css/validation.css ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This CSS file was auto-generated via PostCSS
3
+ *
4
+ * Contributors should avoid editing this file, but instead edit the associated
5
+ * src/resources/postcss/ file. For more information, check out our engineering
6
+ * docs on how we handle CSS in our engineering docs.
7
+ *
8
+ * @see: http://moderntribe.github.io/products-engineering/css/
9
+ */
10
+
11
+ .tribe-validation input[type="text"].tribe-validation-error, .tribe-validation input[type="password"].tribe-validation-error, .tribe-validation input[type="checkbox"].tribe-validation-error, .tribe-validation input[type="color"].tribe-validation-error, .tribe-validation input[type="date"].tribe-validation-error, .tribe-validation input[type="datetime"].tribe-validation-error, .tribe-validation input[type="datetime-local"].tribe-validation-error, .tribe-validation input[type="email"].tribe-validation-error, .tribe-validation input[type="month"].tribe-validation-error, .tribe-validation input[type="number"].tribe-validation-error, .tribe-validation input[type="search"].tribe-validation-error, .tribe-validation input[type="radio"].tribe-validation-error, .tribe-validation input[type="tel"].tribe-validation-error, .tribe-validation input[type="text"].tribe-validation-error, .tribe-validation input[type="time"].tribe-validation-error, .tribe-validation input[type="url"].tribe-validation-error, .tribe-validation input[type="week"].tribe-validation-error, .tribe-validation select.tribe-validation-error, .tribe-validation textarea.tribe-validation-error {
12
+ border-color: #dc3232;
13
+ }
14
+
15
+
16
+ .tribe-validation .tribe-dropdown.tribe-validation-error .select2-choice {
17
+ border-color: #dc3232;
18
+ }
common/src/resources/images/app-shop-community.jpg CHANGED
Binary file
common/src/resources/images/app-shop-eventbrite.jpg CHANGED
Binary file
common/src/resources/images/app-shop-ical.jpg CHANGED
Binary file
common/src/resources/images/app-shop-pro.jpg CHANGED
Binary file
common/src/resources/images/app-shop-promoter.jpg CHANGED
Binary file
common/src/resources/images/app-shop-tickets-plus.jpg CHANGED
Binary file
common/src/resources/images/donate-link-screenshot.png CHANGED
Binary file
common/src/resources/images/gutenberg-admin-notice-TEC.png CHANGED
Binary file
common/src/resources/images/gutenberg-admin-notice-tickets.png CHANGED
Binary file
common/src/resources/images/mascot.png CHANGED
Binary file
common/src/resources/js/app/components.js ADDED
@@ -0,0 +1,21779 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var tribe = typeof tribe === "object" ? tribe : {}; tribe["common"] = tribe["common"] || {}; tribe["common"]["components"] =
2
+ /******/ (function(modules) { // webpackBootstrap
3
+ /******/ // The module cache
4
+ /******/ var installedModules = {};
5
+ /******/
6
+ /******/ // The require function
7
+ /******/ function __webpack_require__(moduleId) {
8
+ /******/
9
+ /******/ // Check if module is in cache
10
+ /******/ if(installedModules[moduleId]) {
11
+ /******/ return installedModules[moduleId].exports;
12
+ /******/ }
13
+ /******/ // Create a new module (and put it into the cache)
14
+ /******/ var module = installedModules[moduleId] = {
15
+ /******/ i: moduleId,
16
+ /******/ l: false,
17
+ /******/ exports: {}
18
+ /******/ };
19
+ /******/
20
+ /******/ // Execute the module function
21
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
22
+ /******/
23
+ /******/ // Flag the module as loaded
24
+ /******/ module.l = true;
25
+ /******/
26
+ /******/ // Return the exports of the module
27
+ /******/ return module.exports;
28
+ /******/ }
29
+ /******/
30
+ /******/
31
+ /******/ // expose the modules object (__webpack_modules__)
32
+ /******/ __webpack_require__.m = modules;
33
+ /******/
34
+ /******/ // expose the module cache
35
+ /******/ __webpack_require__.c = installedModules;
36
+ /******/
37
+ /******/ // define getter function for harmony exports
38
+ /******/ __webpack_require__.d = function(exports, name, getter) {
39
+ /******/ if(!__webpack_require__.o(exports, name)) {
40
+ /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
41
+ /******/ }
42
+ /******/ };
43
+ /******/
44
+ /******/ // define __esModule on exports
45
+ /******/ __webpack_require__.r = function(exports) {
46
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
47
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
48
+ /******/ }
49
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
50
+ /******/ };
51
+ /******/
52
+ /******/ // create a fake namespace object
53
+ /******/ // mode & 1: value is a module id, require it
54
+ /******/ // mode & 2: merge all properties of value into the ns
55
+ /******/ // mode & 4: return value when already ns object
56
+ /******/ // mode & 8|1: behave like require
57
+ /******/ __webpack_require__.t = function(value, mode) {
58
+ /******/ if(mode & 1) value = __webpack_require__(value);
59
+ /******/ if(mode & 8) return value;
60
+ /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
61
+ /******/ var ns = Object.create(null);
62
+ /******/ __webpack_require__.r(ns);
63
+ /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
64
+ /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
65
+ /******/ return ns;
66
+ /******/ };
67
+ /******/
68
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
69
+ /******/ __webpack_require__.n = function(module) {
70
+ /******/ var getter = module && module.__esModule ?
71
+ /******/ function getDefault() { return module['default']; } :
72
+ /******/ function getModuleExports() { return module; };
73
+ /******/ __webpack_require__.d(getter, 'a', getter);
74
+ /******/ return getter;
75
+ /******/ };
76
+ /******/
77
+ /******/ // Object.prototype.hasOwnProperty.call
78
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
79
+ /******/
80
+ /******/ // __webpack_public_path__
81
+ /******/ __webpack_require__.p = "";
82
+ /******/
83
+ /******/
84
+ /******/ // Load entry module and return exports
85
+ /******/ return __webpack_require__(__webpack_require__.s = 669);
86
+ /******/ })
87
+ /************************************************************************/
88
+ /******/ ([
89
+ /* 0 */
90
+ /***/ (function(module, exports, __webpack_require__) {
91
+
92
+ /**
93
+ * Copyright (c) 2013-present, Facebook, Inc.
94
+ *
95
+ * This source code is licensed under the MIT license found in the
96
+ * LICENSE file in the root directory of this source tree.
97
+ */
98
+
99
+ if (false) { var throwOnDirectAccess, ReactIs; } else {
100
+ // By explicitly using `prop-types` you are opting into new production behavior.
101
+ // http://fb.me/prop-types-in-prod
102
+ module.exports = __webpack_require__(311)();
103
+ }
104
+
105
+
106
+ /***/ }),
107
+ /* 1 */,
108
+ /* 2 */
109
+ /***/ (function(module, exports) {
110
+
111
+ module.exports = React;
112
+
113
+ /***/ }),
114
+ /* 3 */,
115
+ /* 4 */
116
+ /***/ (function(module, exports, __webpack_require__) {
117
+
118
+ "use strict";
119
+
120
+
121
+ exports.__esModule = true;
122
+
123
+ var _assign = __webpack_require__(278);
124
+
125
+ var _assign2 = _interopRequireDefault(_assign);
126
+
127
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
128
+
129
+ exports.default = _assign2.default || function (target) {
130
+ for (var i = 1; i < arguments.length; i++) {
131
+ var source = arguments[i];
132
+
133
+ for (var key in source) {
134
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
135
+ target[key] = source[key];
136
+ }
137
+ }
138
+ }
139
+
140
+ return target;
141
+ };
142
+
143
+ /***/ }),
144
+ /* 5 */,
145
+ /* 6 */
146
+ /***/ (function(module, exports) {
147
+
148
+ /**
149
+ * Checks if `value` is classified as an `Array` object.
150
+ *
151
+ * @static
152
+ * @memberOf _
153
+ * @since 0.1.0
154
+ * @category Lang
155
+ * @param {*} value The value to check.
156
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
157
+ * @example
158
+ *
159
+ * _.isArray([1, 2, 3]);
160
+ * // => true
161
+ *
162
+ * _.isArray(document.body.children);
163
+ * // => false
164
+ *
165
+ * _.isArray('abc');
166
+ * // => false
167
+ *
168
+ * _.isArray(_.noop);
169
+ * // => false
170
+ */
171
+ var isArray = Array.isArray;
172
+
173
+ module.exports = isArray;
174
+
175
+
176
+ /***/ }),
177
+ /* 7 */
178
+ /***/ (function(module, exports) {
179
+
180
+ /**
181
+ * This method returns `undefined`.
182
+ *
183
+ * @static
184
+ * @memberOf _
185
+ * @since 2.3.0
186
+ * @category Util
187
+ * @example
188
+ *
189
+ * _.times(2, _.noop);
190
+ * // => [undefined, undefined]
191
+ */
192
+ function noop() {
193
+ // No operation performed.
194
+ }
195
+
196
+ module.exports = noop;
197
+
198
+
199
+ /***/ }),
200
+ /* 8 */,
201
+ /* 9 */
202
+ /***/ (function(module, exports) {
203
+
204
+ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
205
+ var global = module.exports = typeof window != 'undefined' && window.Math == Math
206
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
207
+ // eslint-disable-next-line no-new-func
208
+ : Function('return this')();
209
+ if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
210
+
211
+
212
+ /***/ }),
213
+ /* 10 */
214
+ /***/ (function(module, exports) {
215
+
216
+ var core = module.exports = { version: '2.6.10' };
217
+ if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
218
+
219
+
220
+ /***/ }),
221
+ /* 11 */
222
+ /***/ (function(module, exports, __webpack_require__) {
223
+
224
+ var freeGlobal = __webpack_require__(137);
225
+
226
+ /** Detect free variable `self`. */
227
+ var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
228
+
229
+ /** Used as a reference to the global object. */
230
+ var root = freeGlobal || freeSelf || Function('return this')();
231
+
232
+ module.exports = root;
233
+
234
+
235
+ /***/ }),
236
+ /* 12 */
237
+ /***/ (function(module, exports, __webpack_require__) {
238
+
239
+ var store = __webpack_require__(101)('wks');
240
+ var uid = __webpack_require__(69);
241
+ var Symbol = __webpack_require__(9).Symbol;
242
+ var USE_SYMBOL = typeof Symbol == 'function';
243
+
244
+ var $exports = module.exports = function (name) {
245
+ return store[name] || (store[name] =
246
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
247
+ };
248
+
249
+ $exports.store = store;
250
+
251
+
252
+ /***/ }),
253
+ /* 13 */
254
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
255
+
256
+ "use strict";
257
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return PREFIX_COMMON_STORE; });
258
+ var PREFIX_COMMON_STORE = '@@MT/COMMON';
259
+
260
+ /***/ }),
261
+ /* 14 */
262
+ /***/ (function(module, exports) {
263
+
264
+ /**
265
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
266
+ * and has a `typeof` result of "object".
267
+ *
268
+ * @static
269
+ * @memberOf _
270
+ * @since 4.0.0
271
+ * @category Lang
272
+ * @param {*} value The value to check.
273
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
274
+ * @example
275
+ *
276
+ * _.isObjectLike({});
277
+ * // => true
278
+ *
279
+ * _.isObjectLike([1, 2, 3]);
280
+ * // => true
281
+ *
282
+ * _.isObjectLike(_.noop);
283
+ * // => false
284
+ *
285
+ * _.isObjectLike(null);
286
+ * // => false
287
+ */
288
+ function isObjectLike(value) {
289
+ return value != null && typeof value == 'object';
290
+ }
291
+
292
+ module.exports = isObjectLike;
293
+
294
+
295
+ /***/ }),
296
+ /* 15 */
297
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
298
+
299
+ "use strict";
300
+ __webpack_require__.r(__webpack_exports__);
301
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__DO_NOT_USE__ActionTypes", function() { return ActionTypes; });
302
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "applyMiddleware", function() { return applyMiddleware; });
303
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindActionCreators", function() { return bindActionCreators; });
304
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineReducers", function() { return combineReducers; });
305
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "compose", function() { return compose; });
306
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createStore", function() { return createStore; });
307
+ /* harmony import */ var symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(123);
308
+
309
+
310
+ /**
311
+ * These are private action types reserved by Redux.
312
+ * For any unknown actions, you must return the current state.
313
+ * If the current state is undefined, you must return the initial state.
314
+ * Do not reference these action types directly in your code.
315
+ */
316
+ var randomString = function randomString() {
317
+ return Math.random().toString(36).substring(7).split('').join('.');
318
+ };
319
+
320
+ var ActionTypes = {
321
+ INIT: "@@redux/INIT" + randomString(),
322
+ REPLACE: "@@redux/REPLACE" + randomString(),
323
+ PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {
324
+ return "@@redux/PROBE_UNKNOWN_ACTION" + randomString();
325
+ }
326
+ };
327
+
328
+ /**
329
+ * @param {any} obj The object to inspect.
330
+ * @returns {boolean} True if the argument appears to be a plain object.
331
+ */
332
+ function isPlainObject(obj) {
333
+ if (typeof obj !== 'object' || obj === null) return false;
334
+ var proto = obj;
335
+
336
+ while (Object.getPrototypeOf(proto) !== null) {
337
+ proto = Object.getPrototypeOf(proto);
338
+ }
339
+
340
+ return Object.getPrototypeOf(obj) === proto;
341
+ }
342
+
343
+ /**
344
+ * Creates a Redux store that holds the state tree.
345
+ * The only way to change the data in the store is to call `dispatch()` on it.
346
+ *
347
+ * There should only be a single store in your app. To specify how different
348
+ * parts of the state tree respond to actions, you may combine several reducers
349
+ * into a single reducer function by using `combineReducers`.
350
+ *
351
+ * @param {Function} reducer A function that returns the next state tree, given
352
+ * the current state tree and the action to handle.
353
+ *
354
+ * @param {any} [preloadedState] The initial state. You may optionally specify it
355
+ * to hydrate the state from the server in universal apps, or to restore a
356
+ * previously serialized user session.
357
+ * If you use `combineReducers` to produce the root reducer function, this must be
358
+ * an object with the same shape as `combineReducers` keys.
359
+ *
360
+ * @param {Function} [enhancer] The store enhancer. You may optionally specify it
361
+ * to enhance the store with third-party capabilities such as middleware,
362
+ * time travel, persistence, etc. The only store enhancer that ships with Redux
363
+ * is `applyMiddleware()`.
364
+ *
365
+ * @returns {Store} A Redux store that lets you read the state, dispatch actions
366
+ * and subscribe to changes.
367
+ */
368
+
369
+ function createStore(reducer, preloadedState, enhancer) {
370
+ var _ref2;
371
+
372
+ if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {
373
+ throw new Error('It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function.');
374
+ }
375
+
376
+ if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
377
+ enhancer = preloadedState;
378
+ preloadedState = undefined;
379
+ }
380
+
381
+ if (typeof enhancer !== 'undefined') {
382
+ if (typeof enhancer !== 'function') {
383
+ throw new Error('Expected the enhancer to be a function.');
384
+ }
385
+
386
+ return enhancer(createStore)(reducer, preloadedState);
387
+ }
388
+
389
+ if (typeof reducer !== 'function') {
390
+ throw new Error('Expected the reducer to be a function.');
391
+ }
392
+
393
+ var currentReducer = reducer;
394
+ var currentState = preloadedState;
395
+ var currentListeners = [];
396
+ var nextListeners = currentListeners;
397
+ var isDispatching = false;
398
+ /**
399
+ * This makes a shallow copy of currentListeners so we can use
400
+ * nextListeners as a temporary list while dispatching.
401
+ *
402
+ * This prevents any bugs around consumers calling
403
+ * subscribe/unsubscribe in the middle of a dispatch.
404
+ */
405
+
406
+ function ensureCanMutateNextListeners() {
407
+ if (nextListeners === currentListeners) {
408
+ nextListeners = currentListeners.slice();
409
+ }
410
+ }
411
+ /**
412
+ * Reads the state tree managed by the store.
413
+ *
414
+ * @returns {any} The current state tree of your application.
415
+ */
416
+
417
+
418
+ function getState() {
419
+ if (isDispatching) {
420
+ throw new Error('You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');
421
+ }
422
+
423
+ return currentState;
424
+ }
425
+ /**
426
+ * Adds a change listener. It will be called any time an action is dispatched,
427
+ * and some part of the state tree may potentially have changed. You may then
428
+ * call `getState()` to read the current state tree inside the callback.
429
+ *
430
+ * You may call `dispatch()` from a change listener, with the following
431
+ * caveats:
432
+ *
433
+ * 1. The subscriptions are snapshotted just before every `dispatch()` call.
434
+ * If you subscribe or unsubscribe while the listeners are being invoked, this
435
+ * will not have any effect on the `dispatch()` that is currently in progress.
436
+ * However, the next `dispatch()` call, whether nested or not, will use a more
437
+ * recent snapshot of the subscription list.
438
+ *
439
+ * 2. The listener should not expect to see all state changes, as the state
440
+ * might have been updated multiple times during a nested `dispatch()` before
441
+ * the listener is called. It is, however, guaranteed that all subscribers
442
+ * registered before the `dispatch()` started will be called with the latest
443
+ * state by the time it exits.
444
+ *
445
+ * @param {Function} listener A callback to be invoked on every dispatch.
446
+ * @returns {Function} A function to remove this change listener.
447
+ */
448
+
449
+
450
+ function subscribe(listener) {
451
+ if (typeof listener !== 'function') {
452
+ throw new Error('Expected the listener to be a function.');
453
+ }
454
+
455
+ if (isDispatching) {
456
+ throw new Error('You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');
457
+ }
458
+
459
+ var isSubscribed = true;
460
+ ensureCanMutateNextListeners();
461
+ nextListeners.push(listener);
462
+ return function unsubscribe() {
463
+ if (!isSubscribed) {
464
+ return;
465
+ }
466
+
467
+ if (isDispatching) {
468
+ throw new Error('You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');
469
+ }
470
+
471
+ isSubscribed = false;
472
+ ensureCanMutateNextListeners();
473
+ var index = nextListeners.indexOf(listener);
474
+ nextListeners.splice(index, 1);
475
+ };
476
+ }
477
+ /**
478
+ * Dispatches an action. It is the only way to trigger a state change.
479
+ *
480
+ * The `reducer` function, used to create the store, will be called with the
481
+ * current state tree and the given `action`. Its return value will
482
+ * be considered the **next** state of the tree, and the change listeners
483
+ * will be notified.
484
+ *
485
+ * The base implementation only supports plain object actions. If you want to
486
+ * dispatch a Promise, an Observable, a thunk, or something else, you need to
487
+ * wrap your store creating function into the corresponding middleware. For
488
+ * example, see the documentation for the `redux-thunk` package. Even the
489
+ * middleware will eventually dispatch plain object actions using this method.
490
+ *
491
+ * @param {Object} action A plain object representing “what changed”. It is
492
+ * a good idea to keep actions serializable so you can record and replay user
493
+ * sessions, or use the time travelling `redux-devtools`. An action must have
494
+ * a `type` property which may not be `undefined`. It is a good idea to use
495
+ * string constants for action types.
496
+ *
497
+ * @returns {Object} For convenience, the same action object you dispatched.
498
+ *
499
+ * Note that, if you use a custom middleware, it may wrap `dispatch()` to
500
+ * return something else (for example, a Promise you can await).
501
+ */
502
+
503
+
504
+ function dispatch(action) {
505
+ if (!isPlainObject(action)) {
506
+ throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');
507
+ }
508
+
509
+ if (typeof action.type === 'undefined') {
510
+ throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');
511
+ }
512
+
513
+ if (isDispatching) {
514
+ throw new Error('Reducers may not dispatch actions.');
515
+ }
516
+
517
+ try {
518
+ isDispatching = true;
519
+ currentState = currentReducer(currentState, action);
520
+ } finally {
521
+ isDispatching = false;
522
+ }
523
+
524
+ var listeners = currentListeners = nextListeners;
525
+
526
+ for (var i = 0; i < listeners.length; i++) {
527
+ var listener = listeners[i];
528
+ listener();
529
+ }
530
+
531
+ return action;
532
+ }
533
+ /**
534
+ * Replaces the reducer currently used by the store to calculate the state.
535
+ *
536
+ * You might need this if your app implements code splitting and you want to
537
+ * load some of the reducers dynamically. You might also need this if you
538
+ * implement a hot reloading mechanism for Redux.
539
+ *
540
+ * @param {Function} nextReducer The reducer for the store to use instead.
541
+ * @returns {void}
542
+ */
543
+
544
+
545
+ function replaceReducer(nextReducer) {
546
+ if (typeof nextReducer !== 'function') {
547
+ throw new Error('Expected the nextReducer to be a function.');
548
+ }
549
+
550
+ currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.
551
+ // Any reducers that existed in both the new and old rootReducer
552
+ // will receive the previous state. This effectively populates
553
+ // the new state tree with any relevant data from the old one.
554
+
555
+ dispatch({
556
+ type: ActionTypes.REPLACE
557
+ });
558
+ }
559
+ /**
560
+ * Interoperability point for observable/reactive libraries.
561
+ * @returns {observable} A minimal observable of state changes.
562
+ * For more information, see the observable proposal:
563
+ * https://github.com/tc39/proposal-observable
564
+ */
565
+
566
+
567
+ function observable() {
568
+ var _ref;
569
+
570
+ var outerSubscribe = subscribe;
571
+ return _ref = {
572
+ /**
573
+ * The minimal observable subscription method.
574
+ * @param {Object} observer Any object that can be used as an observer.
575
+ * The observer object should have a `next` method.
576
+ * @returns {subscription} An object with an `unsubscribe` method that can
577
+ * be used to unsubscribe the observable from the store, and prevent further
578
+ * emission of values from the observable.
579
+ */
580
+ subscribe: function subscribe(observer) {
581
+ if (typeof observer !== 'object' || observer === null) {
582
+ throw new TypeError('Expected the observer to be an object.');
583
+ }
584
+
585
+ function observeState() {
586
+ if (observer.next) {
587
+ observer.next(getState());
588
+ }
589
+ }
590
+
591
+ observeState();
592
+ var unsubscribe = outerSubscribe(observeState);
593
+ return {
594
+ unsubscribe: unsubscribe
595
+ };
596
+ }
597
+ }, _ref[symbol_observable__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]] = function () {
598
+ return this;
599
+ }, _ref;
600
+ } // When a store is created, an "INIT" action is dispatched so that every
601
+ // reducer returns their initial state. This effectively populates
602
+ // the initial state tree.
603
+
604
+
605
+ dispatch({
606
+ type: ActionTypes.INIT
607
+ });
608
+ return _ref2 = {
609
+ dispatch: dispatch,
610
+ subscribe: subscribe,
611
+ getState: getState,
612
+ replaceReducer: replaceReducer
613
+ }, _ref2[symbol_observable__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]] = observable, _ref2;
614
+ }
615
+
616
+ /**
617
+ * Prints a warning in the console if it exists.
618
+ *
619
+ * @param {String} message The warning message.
620
+ * @returns {void}
621
+ */
622
+ function warning(message) {
623
+ /* eslint-disable no-console */
624
+ if (typeof console !== 'undefined' && typeof console.error === 'function') {
625
+ console.error(message);
626
+ }
627
+ /* eslint-enable no-console */
628
+
629
+
630
+ try {
631
+ // This error was thrown as a convenience so that if you enable
632
+ // "break on all exceptions" in your console,
633
+ // it would pause the execution at this line.
634
+ throw new Error(message);
635
+ } catch (e) {} // eslint-disable-line no-empty
636
+
637
+ }
638
+
639
+ function getUndefinedStateErrorMessage(key, action) {
640
+ var actionType = action && action.type;
641
+ var actionDescription = actionType && "action \"" + String(actionType) + "\"" || 'an action';
642
+ return "Given " + actionDescription + ", reducer \"" + key + "\" returned undefined. " + "To ignore an action, you must explicitly return the previous state. " + "If you want this reducer to hold no value, you can return null instead of undefined.";
643
+ }
644
+
645
+ function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {
646
+ var reducerKeys = Object.keys(reducers);
647
+ var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';
648
+
649
+ if (reducerKeys.length === 0) {
650
+ return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';
651
+ }
652
+
653
+ if (!isPlainObject(inputState)) {
654
+ return "The " + argumentName + " has unexpected type of \"" + {}.toString.call(inputState).match(/\s([a-z|A-Z]+)/)[1] + "\". Expected argument to be an object with the following " + ("keys: \"" + reducerKeys.join('", "') + "\"");
655
+ }
656
+
657
+ var unexpectedKeys = Object.keys(inputState).filter(function (key) {
658
+ return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];
659
+ });
660
+ unexpectedKeys.forEach(function (key) {
661
+ unexpectedKeyCache[key] = true;
662
+ });
663
+ if (action && action.type === ActionTypes.REPLACE) return;
664
+
665
+ if (unexpectedKeys.length > 0) {
666
+ return "Unexpected " + (unexpectedKeys.length > 1 ? 'keys' : 'key') + " " + ("\"" + unexpectedKeys.join('", "') + "\" found in " + argumentName + ". ") + "Expected to find one of the known reducer keys instead: " + ("\"" + reducerKeys.join('", "') + "\". Unexpected keys will be ignored.");
667
+ }
668
+ }
669
+
670
+ function assertReducerShape(reducers) {
671
+ Object.keys(reducers).forEach(function (key) {
672
+ var reducer = reducers[key];
673
+ var initialState = reducer(undefined, {
674
+ type: ActionTypes.INIT
675
+ });
676
+
677
+ if (typeof initialState === 'undefined') {
678
+ throw new Error("Reducer \"" + key + "\" returned undefined during initialization. " + "If the state passed to the reducer is undefined, you must " + "explicitly return the initial state. The initial state may " + "not be undefined. If you don't want to set a value for this reducer, " + "you can use null instead of undefined.");
679
+ }
680
+
681
+ if (typeof reducer(undefined, {
682
+ type: ActionTypes.PROBE_UNKNOWN_ACTION()
683
+ }) === 'undefined') {
684
+ throw new Error("Reducer \"" + key + "\" returned undefined when probed with a random type. " + ("Don't try to handle " + ActionTypes.INIT + " or other actions in \"redux/*\" ") + "namespace. They are considered private. Instead, you must return the " + "current state for any unknown actions, unless it is undefined, " + "in which case you must return the initial state, regardless of the " + "action type. The initial state may not be undefined, but can be null.");
685
+ }
686
+ });
687
+ }
688
+ /**
689
+ * Turns an object whose values are different reducer functions, into a single
690
+ * reducer function. It will call every child reducer, and gather their results
691
+ * into a single state object, whose keys correspond to the keys of the passed
692
+ * reducer functions.
693
+ *
694
+ * @param {Object} reducers An object whose values correspond to different
695
+ * reducer functions that need to be combined into one. One handy way to obtain
696
+ * it is to use ES6 `import * as reducers` syntax. The reducers may never return
697
+ * undefined for any action. Instead, they should return their initial state
698
+ * if the state passed to them was undefined, and the current state for any
699
+ * unrecognized action.
700
+ *
701
+ * @returns {Function} A reducer function that invokes every reducer inside the
702
+ * passed object, and builds a state object with the same shape.
703
+ */
704
+
705
+
706
+ function combineReducers(reducers) {
707
+ var reducerKeys = Object.keys(reducers);
708
+ var finalReducers = {};
709
+
710
+ for (var i = 0; i < reducerKeys.length; i++) {
711
+ var key = reducerKeys[i];
712
+
713
+ if (false) {}
714
+
715
+ if (typeof reducers[key] === 'function') {
716
+ finalReducers[key] = reducers[key];
717
+ }
718
+ }
719
+
720
+ var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same
721
+ // keys multiple times.
722
+
723
+ var unexpectedKeyCache;
724
+
725
+ if (false) {}
726
+
727
+ var shapeAssertionError;
728
+
729
+ try {
730
+ assertReducerShape(finalReducers);
731
+ } catch (e) {
732
+ shapeAssertionError = e;
733
+ }
734
+
735
+ return function combination(state, action) {
736
+ if (state === void 0) {
737
+ state = {};
738
+ }
739
+
740
+ if (shapeAssertionError) {
741
+ throw shapeAssertionError;
742
+ }
743
+
744
+ if (false) { var warningMessage; }
745
+
746
+ var hasChanged = false;
747
+ var nextState = {};
748
+
749
+ for (var _i = 0; _i < finalReducerKeys.length; _i++) {
750
+ var _key = finalReducerKeys[_i];
751
+ var reducer = finalReducers[_key];
752
+ var previousStateForKey = state[_key];
753
+ var nextStateForKey = reducer(previousStateForKey, action);
754
+
755
+ if (typeof nextStateForKey === 'undefined') {
756
+ var errorMessage = getUndefinedStateErrorMessage(_key, action);
757
+ throw new Error(errorMessage);
758
+ }
759
+
760
+ nextState[_key] = nextStateForKey;
761
+ hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
762
+ }
763
+
764
+ return hasChanged ? nextState : state;
765
+ };
766
+ }
767
+
768
+ function bindActionCreator(actionCreator, dispatch) {
769
+ return function () {
770
+ return dispatch(actionCreator.apply(this, arguments));
771
+ };
772
+ }
773
+ /**
774
+ * Turns an object whose values are action creators, into an object with the
775
+ * same keys, but with every function wrapped into a `dispatch` call so they
776
+ * may be invoked directly. This is just a convenience method, as you can call
777
+ * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.
778
+ *
779
+ * For convenience, you can also pass an action creator as the first argument,
780
+ * and get a dispatch wrapped function in return.
781
+ *
782
+ * @param {Function|Object} actionCreators An object whose values are action
783
+ * creator functions. One handy way to obtain it is to use ES6 `import * as`
784
+ * syntax. You may also pass a single function.
785
+ *
786
+ * @param {Function} dispatch The `dispatch` function available on your Redux
787
+ * store.
788
+ *
789
+ * @returns {Function|Object} The object mimicking the original object, but with
790
+ * every action creator wrapped into the `dispatch` call. If you passed a
791
+ * function as `actionCreators`, the return value will also be a single
792
+ * function.
793
+ */
794
+
795
+
796
+ function bindActionCreators(actionCreators, dispatch) {
797
+ if (typeof actionCreators === 'function') {
798
+ return bindActionCreator(actionCreators, dispatch);
799
+ }
800
+
801
+ if (typeof actionCreators !== 'object' || actionCreators === null) {
802
+ throw new Error("bindActionCreators expected an object or a function, instead received " + (actionCreators === null ? 'null' : typeof actionCreators) + ". " + "Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?");
803
+ }
804
+
805
+ var boundActionCreators = {};
806
+
807
+ for (var key in actionCreators) {
808
+ var actionCreator = actionCreators[key];
809
+
810
+ if (typeof actionCreator === 'function') {
811
+ boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);
812
+ }
813
+ }
814
+
815
+ return boundActionCreators;
816
+ }
817
+
818
+ function _defineProperty(obj, key, value) {
819
+ if (key in obj) {
820
+ Object.defineProperty(obj, key, {
821
+ value: value,
822
+ enumerable: true,
823
+ configurable: true,
824
+ writable: true
825
+ });
826
+ } else {
827
+ obj[key] = value;
828
+ }
829
+
830
+ return obj;
831
+ }
832
+
833
+ function ownKeys(object, enumerableOnly) {
834
+ var keys = Object.keys(object);
835
+
836
+ if (Object.getOwnPropertySymbols) {
837
+ keys.push.apply(keys, Object.getOwnPropertySymbols(object));
838
+ }
839
+
840
+ if (enumerableOnly) keys = keys.filter(function (sym) {
841
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
842
+ });
843
+ return keys;
844
+ }
845
+
846
+ function _objectSpread2(target) {
847
+ for (var i = 1; i < arguments.length; i++) {
848
+ var source = arguments[i] != null ? arguments[i] : {};
849
+
850
+ if (i % 2) {
851
+ ownKeys(source, true).forEach(function (key) {
852
+ _defineProperty(target, key, source[key]);
853
+ });
854
+ } else if (Object.getOwnPropertyDescriptors) {
855
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
856
+ } else {
857
+ ownKeys(source).forEach(function (key) {
858
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
859
+ });
860
+ }
861
+ }
862
+
863
+ return target;
864
+ }
865
+
866
+ /**
867
+ * Composes single-argument functions from right to left. The rightmost
868
+ * function can take multiple arguments as it provides the signature for
869
+ * the resulting composite function.
870
+ *
871
+ * @param {...Function} funcs The functions to compose.
872
+ * @returns {Function} A function obtained by composing the argument functions
873
+ * from right to left. For example, compose(f, g, h) is identical to doing
874
+ * (...args) => f(g(h(...args))).
875
+ */
876
+ function compose() {
877
+ for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {
878
+ funcs[_key] = arguments[_key];
879
+ }
880
+
881
+ if (funcs.length === 0) {
882
+ return function (arg) {
883
+ return arg;
884
+ };
885
+ }
886
+
887
+ if (funcs.length === 1) {
888
+ return funcs[0];
889
+ }
890
+
891
+ return funcs.reduce(function (a, b) {
892
+ return function () {
893
+ return a(b.apply(void 0, arguments));
894
+ };
895
+ });
896
+ }
897
+
898
+ /**
899
+ * Creates a store enhancer that applies middleware to the dispatch method
900
+ * of the Redux store. This is handy for a variety of tasks, such as expressing
901
+ * asynchronous actions in a concise manner, or logging every action payload.
902
+ *
903
+ * See `redux-thunk` package as an example of the Redux middleware.
904
+ *
905
+ * Because middleware is potentially asynchronous, this should be the first
906
+ * store enhancer in the composition chain.
907
+ *
908
+ * Note that each middleware will be given the `dispatch` and `getState` functions
909
+ * as named arguments.
910
+ *
911
+ * @param {...Function} middlewares The middleware chain to be applied.
912
+ * @returns {Function} A store enhancer applying the middleware.
913
+ */
914
+
915
+ function applyMiddleware() {
916
+ for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {
917
+ middlewares[_key] = arguments[_key];
918
+ }
919
+
920
+ return function (createStore) {
921
+ return function () {
922
+ var store = createStore.apply(void 0, arguments);
923
+
924
+ var _dispatch = function dispatch() {
925
+ throw new Error('Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');
926
+ };
927
+
928
+ var middlewareAPI = {
929
+ getState: store.getState,
930
+ dispatch: function dispatch() {
931
+ return _dispatch.apply(void 0, arguments);
932
+ }
933
+ };
934
+ var chain = middlewares.map(function (middleware) {
935
+ return middleware(middlewareAPI);
936
+ });
937
+ _dispatch = compose.apply(void 0, chain)(store.dispatch);
938
+ return _objectSpread2({}, store, {
939
+ dispatch: _dispatch
940
+ });
941
+ };
942
+ };
943
+ }
944
+
945
+ /*
946
+ * This is a dummy function to check if the function name has been altered by minification.
947
+ * If the function has been minified and NODE_ENV !== 'production', warn the user.
948
+ */
949
+
950
+ function isCrushed() {}
951
+
952
+ if (false) {}
953
+
954
+
955
+
956
+
957
+ /***/ }),
958
+ /* 16 */
959
+ /***/ (function(module, exports, __webpack_require__) {
960
+
961
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
962
+ Copyright (c) 2017 Jed Watson.
963
+ Licensed under the MIT License (MIT), see
964
+ http://jedwatson.github.io/classnames
965
+ */
966
+ /* global define */
967
+
968
+ (function () {
969
+ 'use strict';
970
+
971
+ var hasOwn = {}.hasOwnProperty;
972
+
973
+ function classNames () {
974
+ var classes = [];
975
+
976
+ for (var i = 0; i < arguments.length; i++) {
977
+ var arg = arguments[i];
978
+ if (!arg) continue;
979
+
980
+ var argType = typeof arg;
981
+
982
+ if (argType === 'string' || argType === 'number') {
983
+ classes.push(arg);
984
+ } else if (Array.isArray(arg) && arg.length) {
985
+ var inner = classNames.apply(null, arg);
986
+ if (inner) {
987
+ classes.push(inner);
988
+ }
989
+ } else if (argType === 'object') {
990
+ for (var key in arg) {
991
+ if (hasOwn.call(arg, key) && arg[key]) {
992
+ classes.push(key);
993
+ }
994
+ }
995
+ }
996
+ }
997
+
998
+ return classes.join(' ');
999
+ }
1000
+
1001
+ if ( true && module.exports) {
1002
+ classNames.default = classNames;
1003
+ module.exports = classNames;
1004
+ } else if (true) {
1005
+ // register as 'classnames', consistent with npm package name
1006
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
1007
+ return classNames;
1008
+ }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
1009
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1010
+ } else {}
1011
+ }());
1012
+
1013
+
1014
+ /***/ }),
1015
+ /* 17 */
1016
+ /***/ (function(module, exports, __webpack_require__) {
1017
+
1018
+ var isObject = __webpack_require__(24);
1019
+ module.exports = function (it) {
1020
+ if (!isObject(it)) throw TypeError(it + ' is not an object!');
1021
+ return it;
1022
+ };
1023
+
1024
+
1025
+ /***/ }),
1026
+ /* 18 */
1027
+ /***/ (function(module, exports) {
1028
+
1029
+ /**
1030
+ * Checks if `value` is the
1031
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
1032
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
1033
+ *
1034
+ * @static
1035
+ * @memberOf _
1036
+ * @since 0.1.0
1037
+ * @category Lang
1038
+ * @param {*} value The value to check.
1039
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
1040
+ * @example
1041
+ *
1042
+ * _.isObject({});
1043
+ * // => true
1044
+ *
1045
+ * _.isObject([1, 2, 3]);
1046
+ * // => true
1047
+ *
1048
+ * _.isObject(_.noop);
1049
+ * // => true
1050
+ *
1051
+ * _.isObject(null);
1052
+ * // => false
1053
+ */
1054
+ function isObject(value) {
1055
+ var type = typeof value;
1056
+ return value != null && (type == 'object' || type == 'function');
1057
+ }
1058
+
1059
+ module.exports = isObject;
1060
+
1061
+
1062
+ /***/ }),
1063
+ /* 19 */
1064
+ /***/ (function(module, exports, __webpack_require__) {
1065
+
1066
+ var global = __webpack_require__(9);
1067
+ var core = __webpack_require__(10);
1068
+ var ctx = __webpack_require__(40);
1069
+ var hide = __webpack_require__(30);
1070
+ var has = __webpack_require__(36);
1071
+ var PROTOTYPE = 'prototype';
1072
+
1073
+ var $export = function (type, name, source) {
1074
+ var IS_FORCED = type & $export.F;
1075
+ var IS_GLOBAL = type & $export.G;
1076
+ var IS_STATIC = type & $export.S;
1077
+ var IS_PROTO = type & $export.P;
1078
+ var IS_BIND = type & $export.B;
1079
+ var IS_WRAP = type & $export.W;
1080
+ var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
1081
+ var expProto = exports[PROTOTYPE];
1082
+ var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
1083
+ var key, own, out;
1084
+ if (IS_GLOBAL) source = name;
1085
+ for (key in source) {
1086
+ // contains in native
1087
+ own = !IS_FORCED && target && target[key] !== undefined;
1088
+ if (own && has(exports, key)) continue;
1089
+ // export native or passed
1090
+ out = own ? target[key] : source[key];
1091
+ // prevent global pollution for namespaces
1092
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
1093
+ // bind timers to global for call from export context
1094
+ : IS_BIND && own ? ctx(out, global)
1095
+ // wrap global constructors for prevent change them in library
1096
+ : IS_WRAP && target[key] == out ? (function (C) {
1097
+ var F = function (a, b, c) {
1098
+ if (this instanceof C) {
1099
+ switch (arguments.length) {
1100
+ case 0: return new C();
1101
+ case 1: return new C(a);
1102
+ case 2: return new C(a, b);
1103
+ } return new C(a, b, c);
1104
+ } return C.apply(this, arguments);
1105
+ };
1106
+ F[PROTOTYPE] = C[PROTOTYPE];
1107
+ return F;
1108
+ // make static versions for prototype methods
1109
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
1110
+ // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
1111
+ if (IS_PROTO) {
1112
+ (exports.virtual || (exports.virtual = {}))[key] = out;
1113
+ // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
1114
+ if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
1115
+ }
1116
+ }
1117
+ };
1118
+ // type bitmap
1119
+ $export.F = 1; // forced
1120
+ $export.G = 2; // global
1121
+ $export.S = 4; // static
1122
+ $export.P = 8; // proto
1123
+ $export.B = 16; // bind
1124
+ $export.W = 32; // wrap
1125
+ $export.U = 64; // safe
1126
+ $export.R = 128; // real proto method for `library`
1127
+ module.exports = $export;
1128
+
1129
+
1130
+ /***/ }),
1131
+ /* 20 */
1132
+ /***/ (function(module, exports, __webpack_require__) {
1133
+
1134
+ // Thank's IE8 for his funny defineProperty
1135
+ module.exports = !__webpack_require__(50)(function () {
1136
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
1137
+ });
1138
+
1139
+
1140
+ /***/ }),
1141
+ /* 21 */
1142
+ /***/ (function(module, exports, __webpack_require__) {
1143
+
1144
+ var Symbol = __webpack_require__(37),
1145
+ getRawTag = __webpack_require__(222),
1146
+ objectToString = __webpack_require__(223);
1147
+
1148
+ /** `Object#toString` result references. */
1149
+ var nullTag = '[object Null]',
1150
+ undefinedTag = '[object Undefined]';
1151
+
1152
+ /** Built-in value references. */
1153
+ var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
1154
+
1155
+ /**
1156
+ * The base implementation of `getTag` without fallbacks for buggy environments.
1157
+ *
1158
+ * @private
1159
+ * @param {*} value The value to query.
1160
+ * @returns {string} Returns the `toStringTag`.
1161
+ */
1162
+ function baseGetTag(value) {
1163
+ if (value == null) {
1164
+ return value === undefined ? undefinedTag : nullTag;
1165
+ }
1166
+ return (symToStringTag && symToStringTag in Object(value))
1167
+ ? getRawTag(value)
1168
+ : objectToString(value);
1169
+ }
1170
+
1171
+ module.exports = baseGetTag;
1172
+
1173
+
1174
+ /***/ }),
1175
+ /* 22 */
1176
+ /***/ (function(module, exports, __webpack_require__) {
1177
+
1178
+ "use strict";
1179
+
1180
+
1181
+ exports.__esModule = true;
1182
+
1183
+ var _typeof2 = __webpack_require__(204);
1184
+
1185
+ var _typeof3 = _interopRequireDefault(_typeof2);
1186
+
1187
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1188
+
1189
+ exports.default = function (self, call) {
1190
+ if (!self) {
1191
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
1192
+ }
1193
+
1194
+ return call && ((typeof call === "undefined" ? "undefined" : (0, _typeof3.default)(call)) === "object" || typeof call === "function") ? call : self;
1195
+ };
1196
+
1197
+ /***/ }),
1198
+ /* 23 */
1199
+ /***/ (function(module, exports, __webpack_require__) {
1200
+
1201
+ var anObject = __webpack_require__(17);
1202
+ var IE8_DOM_DEFINE = __webpack_require__(166);
1203
+ var toPrimitive = __webpack_require__(112);
1204
+ var dP = Object.defineProperty;
1205
+
1206
+ exports.f = __webpack_require__(20) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
1207
+ anObject(O);
1208
+ P = toPrimitive(P, true);
1209
+ anObject(Attributes);
1210
+ if (IE8_DOM_DEFINE) try {
1211
+ return dP(O, P, Attributes);
1212
+ } catch (e) { /* empty */ }
1213
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
1214
+ if ('value' in Attributes) O[P] = Attributes.value;
1215
+ return O;
1216
+ };
1217
+
1218
+
1219
+ /***/ }),
1220
+ /* 24 */
1221
+ /***/ (function(module, exports) {
1222
+
1223
+ module.exports = function (it) {
1224
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
1225
+ };
1226
+
1227
+
1228
+ /***/ }),
1229
+ /* 25 */
1230
+ /***/ (function(module, exports, __webpack_require__) {
1231
+
1232
+ var baseIsNative = __webpack_require__(221),
1233
+ getValue = __webpack_require__(226);
1234
+
1235
+ /**
1236
+ * Gets the native function at `key` of `object`.
1237
+ *
1238
+ * @private
1239
+ * @param {Object} object The object to query.
1240
+ * @param {string} key The key of the method to get.
1241
+ * @returns {*} Returns the function if it's native, else `undefined`.
1242
+ */
1243
+ function getNative(object, key) {
1244
+ var value = getValue(object, key);
1245
+ return baseIsNative(value) ? value : undefined;
1246
+ }
1247
+
1248
+ module.exports = getNative;
1249
+
1250
+
1251
+ /***/ }),
1252
+ /* 26 */
1253
+ /***/ (function(module, exports, __webpack_require__) {
1254
+
1255
+ "use strict";
1256
+
1257
+
1258
+ exports.__esModule = true;
1259
+
1260
+ exports.default = function (instance, Constructor) {
1261
+ if (!(instance instanceof Constructor)) {
1262
+ throw new TypeError("Cannot call a class as a function");
1263
+ }
1264
+ };
1265
+
1266
+ /***/ }),
1267
+ /* 27 */
1268
+ /***/ (function(module, exports, __webpack_require__) {
1269
+
1270
+ "use strict";
1271
+
1272
+
1273
+ exports.__esModule = true;
1274
+
1275
+ var _defineProperty = __webpack_require__(205);
1276
+
1277
+ var _defineProperty2 = _interopRequireDefault(_defineProperty);
1278
+
1279
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1280
+
1281
+ exports.default = function () {
1282
+ function defineProperties(target, props) {
1283
+ for (var i = 0; i < props.length; i++) {
1284
+ var descriptor = props[i];
1285
+ descriptor.enumerable = descriptor.enumerable || false;
1286
+ descriptor.configurable = true;
1287
+ if ("value" in descriptor) descriptor.writable = true;
1288
+ (0, _defineProperty2.default)(target, descriptor.key, descriptor);
1289
+ }
1290
+ }
1291
+
1292
+ return function (Constructor, protoProps, staticProps) {
1293
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
1294
+ if (staticProps) defineProperties(Constructor, staticProps);
1295
+ return Constructor;
1296
+ };
1297
+ }();
1298
+
1299
+ /***/ }),
1300
+ /* 28 */
1301
+ /***/ (function(module, exports, __webpack_require__) {
1302
+
1303
+ "use strict";
1304
+
1305
+
1306
+ exports.__esModule = true;
1307
+
1308
+ var _setPrototypeOf = __webpack_require__(396);
1309
+
1310
+ var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);
1311
+
1312
+ var _create = __webpack_require__(400);
1313
+
1314
+ var _create2 = _interopRequireDefault(_create);
1315
+
1316
+ var _typeof2 = __webpack_require__(204);
1317
+
1318
+ var _typeof3 = _interopRequireDefault(_typeof2);
1319
+
1320
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1321
+
1322
+ exports.default = function (subClass, superClass) {
1323
+ if (typeof superClass !== "function" && superClass !== null) {
1324
+ throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass)));
1325
+ }
1326
+
1327
+ subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
1328
+ constructor: {
1329
+ value: subClass,
1330
+ enumerable: false,
1331
+ writable: true,
1332
+ configurable: true
1333
+ }
1334
+ });
1335
+ if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;
1336
+ };
1337
+
1338
+ /***/ }),
1339
+ /* 29 */
1340
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1341
+
1342
+ "use strict";
1343
+ __webpack_require__.r(__webpack_exports__);
1344
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get", function() { return get; });
1345
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "google", function() { return google; });
1346
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "config", function() { return config; });
1347
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "common", function() { return common; });
1348
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "adminUrl", function() { return adminUrl; });
1349
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rest", function() { return rest; });
1350
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "restNonce", function() { return restNonce; });
1351
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dateSettings", function() { return dateSettings; });
1352
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "editorConstants", function() { return editorConstants; });
1353
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "list", function() { return list; });
1354
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tec", function() { return tec; });
1355
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "editor", function() { return editor; });
1356
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return settings; });
1357
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapsAPI", function() { return mapsAPI; });
1358
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "priceSettings", function() { return priceSettings; });
1359
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tecDateSettings", function() { return tecDateSettings; });
1360
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timezoneHtml", function() { return timezoneHtml; });
1361
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultTimes", function() { return defaultTimes; });
1362
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pro", function() { return pro; });
1363
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "editorDefaults", function() { return editorDefaults; });
1364
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tickets", function() { return tickets; });
1365
+ /**
1366
+ * @todo: handle globals in a better way
1367
+ */
1368
+ var get = function get(key, defaultValue) {
1369
+ return window[key] || defaultValue;
1370
+ };
1371
+ var google = function google() {
1372
+ return get('google');
1373
+ };
1374
+
1375
+ // Localized Config
1376
+ var config = function config() {
1377
+ return get('tribe_editor_config', {});
1378
+ };
1379
+
1380
+ // Common
1381
+ var common = function common() {
1382
+ return config().common || {};
1383
+ };
1384
+ var adminUrl = function adminUrl() {
1385
+ return common().adminUrl || '';
1386
+ };
1387
+ var rest = function rest() {
1388
+ return common().rest || {};
1389
+ };
1390
+ var restNonce = function restNonce() {
1391
+ return rest().nonce || {};
1392
+ };
1393
+ var dateSettings = function dateSettings() {
1394
+ return common().dateSettings || {};
1395
+ };
1396
+ var editorConstants = function editorConstants() {
1397
+ return common().constants || {};
1398
+ };
1399
+ var list = function list() {
1400
+ return {
1401
+ countries: common().countries || {},
1402
+ us_states: common().usStates || {}
1403
+ };
1404
+ };
1405
+
1406
+ // TEC
1407
+ var tec = function tec() {
1408
+ return config().events || {};
1409
+ };
1410
+ var editor = function editor() {
1411
+ return tec().editor || {};
1412
+ };
1413
+ var settings = function settings() {
1414
+ return tec().settings || {};
1415
+ };
1416
+ var mapsAPI = function mapsAPI() {
1417
+ return tec().googleMap || {};
1418
+ };
1419
+ var priceSettings = function priceSettings() {
1420
+ return tec().priceSettings || {};
1421
+ };
1422
+ var tecDateSettings = function tecDateSettings() {
1423
+ return tec().dateSettings || {};
1424
+ };
1425
+ var timezoneHtml = function timezoneHtml() {
1426
+ return tec().timezoneHTML || '';
1427
+ };
1428
+ var defaultTimes = function defaultTimes() {
1429
+ return tec().defaultTimes || {};
1430
+ };
1431
+
1432
+ // PRO
1433
+ var pro = function pro() {
1434
+ return config().eventsPRO || {};
1435
+ };
1436
+ var editorDefaults = function editorDefaults() {
1437
+ return pro().defaults || {};
1438
+ };
1439
+
1440
+ // Tickets
1441
+ var tickets = function tickets() {
1442
+ return config().tickets || {};
1443
+ };
1444
+
1445
+ /***/ }),
1446
+ /* 30 */
1447
+ /***/ (function(module, exports, __webpack_require__) {
1448
+
1449
+ var dP = __webpack_require__(23);
1450
+ var createDesc = __webpack_require__(51);
1451
+ module.exports = __webpack_require__(20) ? function (object, key, value) {
1452
+ return dP.f(object, key, createDesc(1, value));
1453
+ } : function (object, key, value) {
1454
+ object[key] = value;
1455
+ return object;
1456
+ };
1457
+
1458
+
1459
+ /***/ }),
1460
+ /* 31 */
1461
+ /***/ (function(module, exports, __webpack_require__) {
1462
+
1463
+ var arrayLikeKeys = __webpack_require__(159),
1464
+ baseKeys = __webpack_require__(94),
1465
+ isArrayLike = __webpack_require__(42);
1466
+
1467
+ /**
1468
+ * Creates an array of the own enumerable property names of `object`.
1469
+ *
1470
+ * **Note:** Non-object values are coerced to objects. See the
1471
+ * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
1472
+ * for more details.
1473
+ *
1474
+ * @static
1475
+ * @since 0.1.0
1476
+ * @memberOf _
1477
+ * @category Object
1478
+ * @param {Object} object The object to query.
1479
+ * @returns {Array} Returns the array of property names.
1480
+ * @example
1481
+ *
1482
+ * function Foo() {
1483
+ * this.a = 1;
1484
+ * this.b = 2;
1485
+ * }
1486
+ *
1487
+ * Foo.prototype.c = 3;
1488
+ *
1489
+ * _.keys(new Foo);
1490
+ * // => ['a', 'b'] (iteration order is not guaranteed)
1491
+ *
1492
+ * _.keys('hi');
1493
+ * // => ['0', '1']
1494
+ */
1495
+ function keys(object) {
1496
+ return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
1497
+ }
1498
+
1499
+ module.exports = keys;
1500
+
1501
+
1502
+ /***/ }),
1503
+ /* 32 */
1504
+ /***/ (function(module, exports, __webpack_require__) {
1505
+
1506
+ var baseKeys = __webpack_require__(94),
1507
+ getTag = __webpack_require__(43),
1508
+ isArguments = __webpack_require__(58),
1509
+ isArray = __webpack_require__(6),
1510
+ isArrayLike = __webpack_require__(42),
1511
+ isBuffer = __webpack_require__(59),
1512
+ isPrototype = __webpack_require__(64),
1513
+ isTypedArray = __webpack_require__(86);
1514
+
1515
+ /** `Object#toString` result references. */
1516
+ var mapTag = '[object Map]',
1517
+ setTag = '[object Set]';
1518
+
1519
+ /** Used for built-in method references. */
1520
+ var objectProto = Object.prototype;
1521
+
1522
+ /** Used to check objects for own properties. */
1523
+ var hasOwnProperty = objectProto.hasOwnProperty;
1524
+
1525
+ /**
1526
+ * Checks if `value` is an empty object, collection, map, or set.
1527
+ *
1528
+ * Objects are considered empty if they have no own enumerable string keyed
1529
+ * properties.
1530
+ *
1531
+ * Array-like values such as `arguments` objects, arrays, buffers, strings, or
1532
+ * jQuery-like collections are considered empty if they have a `length` of `0`.
1533
+ * Similarly, maps and sets are considered empty if they have a `size` of `0`.
1534
+ *
1535
+ * @static
1536
+ * @memberOf _
1537
+ * @since 0.1.0
1538
+ * @category Lang
1539
+ * @param {*} value The value to check.
1540
+ * @returns {boolean} Returns `true` if `value` is empty, else `false`.
1541
+ * @example
1542
+ *
1543
+ * _.isEmpty(null);
1544
+ * // => true
1545
+ *
1546
+ * _.isEmpty(true);
1547
+ * // => true
1548
+ *
1549
+ * _.isEmpty(1);
1550
+ * // => true
1551
+ *
1552
+ * _.isEmpty([1, 2, 3]);
1553
+ * // => false
1554
+ *
1555
+ * _.isEmpty({ 'a': 1 });
1556
+ * // => false
1557
+ */
1558
+ function isEmpty(value) {
1559
+ if (value == null) {
1560
+ return true;
1561
+ }
1562
+ if (isArrayLike(value) &&
1563
+ (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
1564
+ isBuffer(value) || isTypedArray(value) || isArguments(value))) {
1565
+ return !value.length;
1566
+ }
1567
+ var tag = getTag(value);
1568
+ if (tag == mapTag || tag == setTag) {
1569
+ return !value.size;
1570
+ }
1571
+ if (isPrototype(value)) {
1572
+ return !baseKeys(value).length;
1573
+ }
1574
+ for (var key in value) {
1575
+ if (hasOwnProperty.call(value, key)) {
1576
+ return false;
1577
+ }
1578
+ }
1579
+ return true;
1580
+ }
1581
+
1582
+ module.exports = isEmpty;
1583
+
1584
+
1585
+ /***/ }),
1586
+ /* 33 */
1587
+ /***/ (function(module, exports, __webpack_require__) {
1588
+
1589
+ "use strict";
1590
+
1591
+
1592
+ exports.__esModule = true;
1593
+
1594
+ var _from = __webpack_require__(208);
1595
+
1596
+ var _from2 = _interopRequireDefault(_from);
1597
+
1598
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1599
+
1600
+ exports.default = function (arr) {
1601
+ if (Array.isArray(arr)) {
1602
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
1603
+ arr2[i] = arr[i];
1604
+ }
1605
+
1606
+ return arr2;
1607
+ } else {
1608
+ return (0, _from2.default)(arr);
1609
+ }
1610
+ };
1611
+
1612
+ /***/ }),
1613
+ /* 34 */
1614
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
1615
+
1616
+ "use strict";
1617
+ __webpack_require__.r(__webpack_exports__);
1618
+ var types_namespaceObject = {};
1619
+ __webpack_require__.r(types_namespaceObject);
1620
+ __webpack_require__.d(types_namespaceObject, "ADD_FORM", function() { return ADD_FORM; });
1621
+ __webpack_require__.d(types_namespaceObject, "SET_FORM_FIELDS", function() { return SET_FORM_FIELDS; });
1622
+ __webpack_require__.d(types_namespaceObject, "CREATE_FORM_DRAFT", function() { return CREATE_FORM_DRAFT; });
1623
+ __webpack_require__.d(types_namespaceObject, "EDIT_FORM_ENTRY", function() { return EDIT_FORM_ENTRY; });
1624
+ __webpack_require__.d(types_namespaceObject, "SUBMIT_FORM", function() { return SUBMIT_FORM; });
1625
+ __webpack_require__.d(types_namespaceObject, "CLEAR_FORM", function() { return CLEAR_FORM; });
1626
+ __webpack_require__.d(types_namespaceObject, "SET_SAVING_FORM", function() { return SET_SAVING_FORM; });
1627
+ __webpack_require__.d(types_namespaceObject, "ADD_VOLATILE_ID", function() { return ADD_VOLATILE_ID; });
1628
+ __webpack_require__.d(types_namespaceObject, "REMOVE_VOLATILE_ID", function() { return REMOVE_VOLATILE_ID; });
1629
+ var selectors_namespaceObject = {};
1630
+ __webpack_require__.r(selectors_namespaceObject);
1631
+ __webpack_require__.d(selectors_namespaceObject, "formSelector", function() { return formSelector; });
1632
+ __webpack_require__.d(selectors_namespaceObject, "getFormType", function() { return getFormType; });
1633
+ __webpack_require__.d(selectors_namespaceObject, "getFormEdit", function() { return getFormEdit; });
1634
+ __webpack_require__.d(selectors_namespaceObject, "getFormCreate", function() { return getFormCreate; });
1635
+ __webpack_require__.d(selectors_namespaceObject, "getFormSubmit", function() { return getFormSubmit; });
1636
+ __webpack_require__.d(selectors_namespaceObject, "getFormFields", function() { return getFormFields; });
1637
+ __webpack_require__.d(selectors_namespaceObject, "getFormSaving", function() { return getFormSaving; });
1638
+ __webpack_require__.d(selectors_namespaceObject, "getVolatile", function() { return getVolatile; });
1639
+ var actions_namespaceObject = {};
1640
+ __webpack_require__.r(actions_namespaceObject);
1641
+ __webpack_require__.d(actions_namespaceObject, "registerForm", function() { return actions_registerForm; });
1642
+ __webpack_require__.d(actions_namespaceObject, "clearForm", function() { return actions_clearForm; });
1643
+ __webpack_require__.d(actions_namespaceObject, "createDraft", function() { return actions_createDraft; });
1644
+ __webpack_require__.d(actions_namespaceObject, "editEntry", function() { return actions_editEntry; });
1645
+ __webpack_require__.d(actions_namespaceObject, "setSubmit", function() { return actions_setSubmit; });
1646
+ __webpack_require__.d(actions_namespaceObject, "setSaving", function() { return actions_setSaving; });
1647
+ __webpack_require__.d(actions_namespaceObject, "addVolatile", function() { return actions_addVolatile; });
1648
+ __webpack_require__.d(actions_namespaceObject, "removeVolatile", function() { return actions_removeVolatile; });
1649
+ __webpack_require__.d(actions_namespaceObject, "sendForm", function() { return actions_sendForm; });
1650
+ __webpack_require__.d(actions_namespaceObject, "maybeRemoveEntry", function() { return actions_maybeRemoveEntry; });
1651
+
1652
+ // EXTERNAL MODULE: ./node_modules/babel-runtime/helpers/defineProperty.js
1653
+ var defineProperty = __webpack_require__(200);
1654
+ var defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty);
1655
+
1656
+ // EXTERNAL MODULE: ./node_modules/babel-runtime/helpers/extends.js
1657
+ var helpers_extends = __webpack_require__(4);
1658
+ var extends_default = /*#__PURE__*/__webpack_require__.n(helpers_extends);
1659
+
1660
+ // EXTERNAL MODULE: ./node_modules/redux/es/redux.js
1661
+ var redux = __webpack_require__(15);
1662
+
1663
+ // EXTERNAL MODULE: ./src/modules/data/utils.js
1664
+ var utils = __webpack_require__(13);
1665
+
1666
+ // CONCATENATED MODULE: ./src/modules/data/forms/types.js
1667
+ /**
1668
+ * Internal dependencies
1669
+ */
1670
+
1671
+
1672
+ var ADD_FORM = utils["a" /* PREFIX_COMMON_STORE */] + '/ADD_FORM';
1673
+ var SET_FORM_FIELDS = utils["a" /* PREFIX_COMMON_STORE */] + '/SET_FORM_FIELDS';
1674
+ var CREATE_FORM_DRAFT = utils["a" /* PREFIX_COMMON_STORE */] + '/CREATE_FORM_DRAFT';
1675
+ var EDIT_FORM_ENTRY = utils["a" /* PREFIX_COMMON_STORE */] + '/EDIT_FORM_ENTRY';
1676
+ var SUBMIT_FORM = utils["a" /* PREFIX_COMMON_STORE */] + '/SUBMIT_FORM';
1677
+ var CLEAR_FORM = utils["a" /* PREFIX_COMMON_STORE */] + '/CLEAR_FORM';
1678
+ var SET_SAVING_FORM = utils["a" /* PREFIX_COMMON_STORE */] + '/SET_SAVING_FORM';
1679
+
1680
+ var ADD_VOLATILE_ID = utils["a" /* PREFIX_COMMON_STORE */] + '/ADD_VOLATILE_ID';
1681
+ var REMOVE_VOLATILE_ID = utils["a" /* PREFIX_COMMON_STORE */] + '/REMOVE_VOLATILE_ID';
1682
+ // EXTERNAL MODULE: ./src/modules/data/editor/post-types.js
1683
+ var post_types = __webpack_require__(77);
1684
+
1685
+ // CONCATENATED MODULE: ./src/modules/data/forms/reducers/form.js
1686
+
1687
+ /**
1688
+ * Internal dependencies
1689
+ */
1690
+
1691
+
1692
+
1693
+ var DEFAULT_STATE = {
1694
+ edit: false,
1695
+ create: false,
1696
+ submit: false,
1697
+ saving: false,
1698
+ fields: {},
1699
+ type: post_types["EVENT"]
1700
+ };
1701
+
1702
+ /* harmony default export */ var reducers_form = (function () {
1703
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE;
1704
+ var action = arguments[1];
1705
+
1706
+ switch (action.type) {
1707
+ case ADD_FORM:
1708
+ return extends_default()({}, state, {
1709
+ type: action.payload.type
1710
+ });
1711
+ case CLEAR_FORM:
1712
+ return extends_default()({}, state, DEFAULT_STATE, {
1713
+ type: state.type
1714
+ });
1715
+ case CREATE_FORM_DRAFT:
1716
+ return extends_default()({}, state, {
1717
+ submit: false,
1718
+ edit: false,
1719
+ create: true,
1720
+ fields: action.payload.fields
1721
+ });
1722
+ case SET_SAVING_FORM:
1723
+ return extends_default()({}, state, {
1724
+ saving: action.payload.saving
1725
+ });
1726
+ case EDIT_FORM_ENTRY:
1727
+ return extends_default()({}, state, {
1728
+ create: false,
1729
+ submit: false,
1730
+ edit: true,
1731
+ fields: action.payload.fields
1732
+ });
1733
+ case SUBMIT_FORM:
1734
+ return extends_default()({}, state, {
1735
+ submit: true
1736
+ });
1737
+ default:
1738
+ return state;
1739
+ }
1740
+ });
1741
+ // EXTERNAL MODULE: ./node_modules/babel-runtime/helpers/toConsumableArray.js
1742
+ var toConsumableArray = __webpack_require__(33);
1743
+ var toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray);
1744
+
1745
+ // CONCATENATED MODULE: ./src/modules/data/forms/reducers/volatile.js
1746
+
1747
+ /**
1748
+ * Internal dependencies
1749
+ */
1750
+
1751
+
1752
+ /* harmony default export */ var reducers_volatile = (function () {
1753
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1754
+ var action = arguments[1];
1755
+
1756
+ switch (action.type) {
1757
+ case ADD_VOLATILE_ID:
1758
+ return [].concat(toConsumableArray_default()(state), [action.payload.id]);
1759
+ case REMOVE_VOLATILE_ID:
1760
+ return state.filter(function (id) {
1761
+ return id !== action.payload.id;
1762
+ });
1763
+ default:
1764
+ return state;
1765
+ }
1766
+ });
1767
+ // CONCATENATED MODULE: ./src/modules/data/forms/reducers/index.js
1768
+
1769
+
1770
+ // CONCATENATED MODULE: ./src/modules/data/forms/reducer.js
1771
+
1772
+
1773
+ /**
1774
+ * External dependencies
1775
+ */
1776
+
1777
+
1778
+ /**
1779
+ * Internal dependencies
1780
+ */
1781
+
1782
+
1783
+
1784
+ var reducer_byId = function byId() {
1785
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1786
+ var action = arguments[1];
1787
+
1788
+ switch (action.type) {
1789
+ case ADD_FORM:
1790
+ case CLEAR_FORM:
1791
+ case SET_FORM_FIELDS:
1792
+ case CREATE_FORM_DRAFT:
1793
+ case EDIT_FORM_ENTRY:
1794
+ case SUBMIT_FORM:
1795
+ case SET_SAVING_FORM:
1796
+ return extends_default()({}, state, defineProperty_default()({}, action.payload.id, reducers_form(state[action.payload.id], action)));
1797
+ default:
1798
+ return state;
1799
+ }
1800
+ };
1801
+
1802
+ /* harmony default export */ var reducer = (Object(redux["combineReducers"])({
1803
+ byId: reducer_byId,
1804
+ volatile: reducers_volatile
1805
+ }));
1806
+ // EXTERNAL MODULE: ./node_modules/lodash/get.js
1807
+ var get = __webpack_require__(44);
1808
+ var get_default = /*#__PURE__*/__webpack_require__.n(get);
1809
+
1810
+ // EXTERNAL MODULE: ./node_modules/lodash/isEmpty.js
1811
+ var isEmpty = __webpack_require__(32);
1812
+ var isEmpty_default = /*#__PURE__*/__webpack_require__.n(isEmpty);
1813
+
1814
+ // EXTERNAL MODULE: ./src/modules/store/middlewares/request/index.js + 4 modules
1815
+ var request = __webpack_require__(38);
1816
+
1817
+ // EXTERNAL MODULE: ./node_modules/reselect/lib/index.js
1818
+ var lib = __webpack_require__(39);
1819
+
1820
+ // CONCATENATED MODULE: ./src/modules/data/forms/selectors.js
1821
+ /**
1822
+ * External dependencies
1823
+ */
1824
+
1825
+
1826
+
1827
+ var formSelector = function formSelector(state, props) {
1828
+ return state.forms.byId[props.name];
1829
+ };
1830
+
1831
+ var getFormType = Object(lib["createSelector"])([formSelector], function (block) {
1832
+ return block ? block.type : DEFAULT_STATE.type;
1833
+ });
1834
+
1835
+ var getFormEdit = Object(lib["createSelector"])([formSelector], function (block) {
1836
+ return block ? block.edit : DEFAULT_STATE.edit;
1837
+ });
1838
+
1839
+ var getFormCreate = Object(lib["createSelector"])([formSelector], function (block) {
1840
+ return block ? block.create : DEFAULT_STATE.create;
1841
+ });
1842
+
1843
+ var getFormSubmit = Object(lib["createSelector"])([formSelector], function (block) {
1844
+ return block ? block.submit : DEFAULT_STATE.submit;
1845
+ });
1846
+
1847
+ var getFormFields = Object(lib["createSelector"])([formSelector], function (block) {
1848
+ return block ? block.fields : DEFAULT_STATE.fields;
1849
+ });
1850
+
1851
+ var getFormSaving = Object(lib["createSelector"])([formSelector], function (block) {
1852
+ return block ? block.saving : DEFAULT_STATE.saving;
1853
+ });
1854
+
1855
+ var getVolatile = function getVolatile(state) {
1856
+ return state.forms.volatile;
1857
+ };
1858
+ // CONCATENATED MODULE: ./src/modules/data/forms/actions.js
1859
+
1860
+ /**
1861
+ * External dependencies
1862
+ */
1863
+
1864
+ /**
1865
+ * Internal dependencies
1866
+ */
1867
+
1868
+
1869
+
1870
+
1871
+
1872
+ var actions_registerForm = function registerForm(id, type) {
1873
+ return {
1874
+ type: ADD_FORM,
1875
+ payload: {
1876
+ id: id,
1877
+ type: type
1878
+ }
1879
+ };
1880
+ };
1881
+
1882
+ var actions_clearForm = function clearForm(id) {
1883
+ return {
1884
+ type: CLEAR_FORM,
1885
+ payload: {
1886
+ id: id
1887
+ }
1888
+ };
1889
+ };
1890
+
1891
+ var actions_createDraft = function createDraft(id, fields) {
1892
+ return {
1893
+ type: CREATE_FORM_DRAFT,
1894
+ payload: {
1895
+ id: id,
1896
+ fields: fields
1897
+ }
1898
+ };
1899
+ };
1900
+
1901
+ var actions_editEntry = function editEntry(id, fields) {
1902
+ return {
1903
+ type: EDIT_FORM_ENTRY,
1904
+ payload: {
1905
+ id: id,
1906
+ fields: fields
1907
+ }
1908
+ };
1909
+ };
1910
+
1911
+ var actions_setSubmit = function setSubmit(id) {
1912
+ return {
1913
+ type: SUBMIT_FORM,
1914
+ payload: {
1915
+ id: id
1916
+ }
1917
+ };
1918
+ };
1919
+
1920
+ var actions_setSaving = function setSaving(id, saving) {
1921
+ return {
1922
+ type: SET_SAVING_FORM,
1923
+ payload: {
1924
+ id: id,
1925
+ saving: saving
1926
+ }
1927
+ };
1928
+ };
1929
+
1930
+ var actions_addVolatile = function addVolatile(id) {
1931
+ return {
1932
+ type: ADD_VOLATILE_ID,
1933
+ payload: {
1934
+ id: id
1935
+ }
1936
+ };
1937
+ };
1938
+
1939
+ var actions_removeVolatile = function removeVolatile(id) {
1940
+ return {
1941
+ type: REMOVE_VOLATILE_ID,
1942
+ payload: {
1943
+ id: id
1944
+ }
1945
+ };
1946
+ };
1947
+
1948
+ var actions_sendForm = function sendForm(id) {
1949
+ var fields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1950
+ var completed = arguments[2];
1951
+ return function (dispatch, getState) {
1952
+ var state = getState();
1953
+ var props = { name: id };
1954
+ var type = getFormType(state, props);
1955
+ var create = getFormCreate(state, props);
1956
+ var details = getFormFields(state, props);
1957
+ var saving = getFormSaving(state, props);
1958
+
1959
+ if (saving) {
1960
+ return;
1961
+ }
1962
+
1963
+ var path = create ? '' + type : type + '/' + details.id;
1964
+
1965
+ var options = {
1966
+ path: path,
1967
+ params: {
1968
+ method: create ? 'POST' : 'PUT',
1969
+ body: JSON.stringify(fields)
1970
+ },
1971
+ actions: {
1972
+ start: function start() {
1973
+ return dispatch(actions_setSaving(id, true));
1974
+ },
1975
+ success: function success(_ref) {
1976
+ var body = _ref.body;
1977
+
1978
+ var postID = get_default()(body, 'id', '');
1979
+
1980
+ if (create && postID) {
1981
+ dispatch(actions_addVolatile(postID));
1982
+ }
1983
+ completed(body);
1984
+ dispatch(actions_clearForm(id));
1985
+ dispatch(actions_setSaving(id, false));
1986
+ },
1987
+ error: function error() {
1988
+ dispatch(actions_clearForm(id));
1989
+ dispatch(actions_setSaving(id, false));
1990
+ }
1991
+ }
1992
+ };
1993
+ dispatch(request["actions"].wpRequest(options));
1994
+ };
1995
+ };
1996
+
1997
+ var actions_deleteEntry = function deleteEntry(dispatch) {
1998
+ return function (path) {
1999
+ return function (_ref2) {
2000
+ var body = _ref2.body;
2001
+ var id = body.id,
2002
+ status = body.status;
2003
+
2004
+
2005
+ if ('draft' !== status) {
2006
+ dispatch(actions_removeVolatile(id));
2007
+ return;
2008
+ }
2009
+
2010
+ var options = {
2011
+ path: path,
2012
+ params: {
2013
+ method: 'DELETE'
2014
+ },
2015
+ actions: {
2016
+ success: function success() {
2017
+ return dispatch(actions_removeVolatile(id));
2018
+ }
2019
+ }
2020
+ };
2021
+ dispatch(request["actions"].wpRequest(options));
2022
+ };
2023
+ };
2024
+ };
2025
+
2026
+ var actions_maybeRemoveEntry = function maybeRemoveEntry(id) {
2027
+ var details = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2028
+ return function (dispatch, getState) {
2029
+ var state = getState();
2030
+ var type = getFormType(state, { name: id });
2031
+
2032
+ if (isEmpty_default()(details)) {
2033
+ return;
2034
+ }
2035
+
2036
+ var path = type + '/' + details.id;
2037
+ var options = {
2038
+ path: path,
2039
+ actions: {
2040
+ success: actions_deleteEntry(dispatch)(path)
2041
+ }
2042
+ };
2043
+ dispatch(request["actions"].wpRequest(options));
2044
+ };
2045
+ };
2046
+ // CONCATENATED MODULE: ./src/modules/data/forms/index.js
2047
+ /* concated harmony reexport types */__webpack_require__.d(__webpack_exports__, "types", function() { return types_namespaceObject; });
2048
+ /* concated harmony reexport actions */__webpack_require__.d(__webpack_exports__, "actions", function() { return actions_namespaceObject; });
2049
+ /* concated harmony reexport selectors */__webpack_require__.d(__webpack_exports__, "selectors", function() { return selectors_namespaceObject; });
2050
+ /**
2051
+ * Internal dependencies
2052
+ */
2053
+
2054
+
2055
+
2056
+
2057
+
2058
+
2059
+ /* harmony default export */ var data_forms = __webpack_exports__["default"] = (reducer);
2060
+
2061
+
2062
+
2063
+ /***/ }),
2064
+ /* 35 */,
2065
+ /* 36 */
2066
+ /***/ (function(module, exports) {
2067
+
2068
+ var hasOwnProperty = {}.hasOwnProperty;
2069
+ module.exports = function (it, key) {
2070
+ return hasOwnProperty.call(it, key);
2071
+ };
2072
+
2073
+
2074
+ /***/ }),
2075
+ /* 37 */
2076
+ /***/ (function(module, exports, __webpack_require__) {
2077
+
2078
+ var root = __webpack_require__(11);
2079
+
2080
+ /** Built-in value references. */
2081
+ var Symbol = root.Symbol;
2082
+
2083
+ module.exports = Symbol;
2084
+
2085
+
2086
+ /***/ }),
2087
+ /* 38 */
2088
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
2089
+
2090
+ "use strict";
2091
+ __webpack_require__.r(__webpack_exports__);
2092
+ var types_namespaceObject = {};
2093
+ __webpack_require__.r(types_namespaceObject);
2094
+ __webpack_require__.d(types_namespaceObject, "WP_REQUEST", function() { return WP_REQUEST; });
2095
+ var actions_namespaceObject = {};
2096
+ __webpack_require__.r(actions_namespaceObject);
2097
+ __webpack_require__.d(actions_namespaceObject, "wpRequest", function() { return actions_wpRequest; });
2098
+ var utils_namespaceObject = {};
2099
+ __webpack_require__.r(utils_namespaceObject);
2100
+ __webpack_require__.d(utils_namespaceObject, "toWpParams", function() { return utils_toWpParams; });
2101
+ __webpack_require__.d(utils_namespaceObject, "toWPQuery", function() { return utils_toWPQuery; });
2102
+ __webpack_require__.d(utils_namespaceObject, "getTotalPages", function() { return getTotalPages; });
2103
+
2104
+ // EXTERNAL MODULE: ./src/modules/data/utils.js
2105
+ var utils = __webpack_require__(13);
2106
+
2107
+ // CONCATENATED MODULE: ./src/modules/store/middlewares/request/types.js
2108
+ /**
2109
+ * Internal dependencies
2110
+ */
2111
+
2112
+
2113
+ var WP_REQUEST = utils["a" /* PREFIX_COMMON_STORE */] + '/WP_REQUEST';
2114
+ // CONCATENATED MODULE: ./src/modules/store/middlewares/request/actions.js
2115
+ /**
2116
+ * Internal dependencies
2117
+ */
2118
+
2119
+
2120
+ var actions_wpRequest = function wpRequest(meta) {
2121
+ return {
2122
+ type: WP_REQUEST,
2123
+ meta: meta
2124
+ };
2125
+ };
2126
+ // EXTERNAL MODULE: ./node_modules/babel-runtime/helpers/extends.js
2127
+ var helpers_extends = __webpack_require__(4);
2128
+ var extends_default = /*#__PURE__*/__webpack_require__.n(helpers_extends);
2129
+
2130
+ // EXTERNAL MODULE: ./node_modules/lodash/isUndefined.js
2131
+ var isUndefined = __webpack_require__(121);
2132
+ var isUndefined_default = /*#__PURE__*/__webpack_require__.n(isUndefined);
2133
+
2134
+ // EXTERNAL MODULE: ./node_modules/lodash/isEmpty.js
2135
+ var isEmpty = __webpack_require__(32);
2136
+ var isEmpty_default = /*#__PURE__*/__webpack_require__.n(isEmpty);
2137
+
2138
+ // EXTERNAL MODULE: ./node_modules/querystringify/index.js
2139
+ var querystringify = __webpack_require__(201);
2140
+
2141
+ // CONCATENATED MODULE: ./src/modules/store/middlewares/request/utils.js
2142
+
2143
+
2144
+ /**
2145
+ * External dependencies
2146
+ */
2147
+
2148
+
2149
+
2150
+ var utils_toWpParams = function toWpParams() {
2151
+ var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
2152
+
2153
+ var params = extends_default()({
2154
+ orderby: 'title',
2155
+ status: ['draft', 'publish'],
2156
+ order: 'asc',
2157
+ page: 1
2158
+ }, args);
2159
+
2160
+ if (!isUndefined_default()(params.search) && !isEmpty_default()(params.search)) {
2161
+ params.orderby = 'relevance';
2162
+ }
2163
+
2164
+ if (isEmpty_default()(params.exclude)) {
2165
+ delete params.exclude;
2166
+ }
2167
+
2168
+ return params;
2169
+ };
2170
+
2171
+ var utils_toWPQuery = function toWPQuery() {
2172
+ var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
2173
+ return Object(querystringify["stringify"])(utils_toWpParams(args));
2174
+ };
2175
+
2176
+ var getTotalPages = function getTotalPages(headers) {
2177
+ var totalPages = parseInt(headers.get('x-wp-totalpages'), 10);
2178
+ return isNaN(totalPages) ? 0 : totalPages;
2179
+ };
2180
+ // EXTERNAL MODULE: ./node_modules/babel-runtime/regenerator/index.js
2181
+ var regenerator = __webpack_require__(67);
2182
+ var regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator);
2183
+
2184
+ // EXTERNAL MODULE: ./node_modules/babel-runtime/helpers/asyncToGenerator.js
2185
+ var asyncToGenerator = __webpack_require__(122);
2186
+ var asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator);
2187
+
2188
+ // EXTERNAL MODULE: ./node_modules/lodash/inRange.js
2189
+ var inRange = __webpack_require__(202);
2190
+ var inRange_default = /*#__PURE__*/__webpack_require__.n(inRange);
2191
+
2192
+ // EXTERNAL MODULE: ./node_modules/lodash/get.js
2193
+ var get = __webpack_require__(44);
2194
+ var get_default = /*#__PURE__*/__webpack_require__.n(get);
2195
+
2196
+ // EXTERNAL MODULE: ./node_modules/lodash/noop.js
2197
+ var noop = __webpack_require__(7);
2198
+ var noop_default = /*#__PURE__*/__webpack_require__.n(noop);
2199
+
2200
+ // EXTERNAL MODULE: ./node_modules/whatwg-fetch/fetch.js
2201
+ var whatwg_fetch_fetch = __webpack_require__(206);
2202
+
2203
+ // EXTERNAL MODULE: ./src/modules/utils/globals.js
2204
+ var globals = __webpack_require__(29);
2205
+
2206
+ // CONCATENATED MODULE: ./src/modules/store/middlewares/request/wp-request.js
2207
+
2208
+
2209
+
2210
+
2211
+
2212
+ /**
2213
+ * External dependencies
2214
+ */
2215
+
2216
+ var _this = undefined;
2217
+
2218
+
2219
+
2220
+ /**
2221
+ * Internal dependencies
2222
+ */
2223
+
2224
+
2225
+
2226
+ /* harmony default export */ var wp_request = (function () {
2227
+ return function (next) {
2228
+ return function () {
2229
+ var _ref = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee(action) {
2230
+ var _action$meta, meta, _meta$path, path, _meta$params, params, _rest, _rest$url, url, _rest$nonce, nonce, wpRESTNonce, namespaces, core, BASE, actions, endpoint, headers, response, status, body;
2231
+
2232
+ return regenerator_default.a.wrap(function _callee$(_context) {
2233
+ while (1) {
2234
+ switch (_context.prev = _context.next) {
2235
+ case 0:
2236
+ if (!(action.type !== types_namespaceObject.WP_REQUEST)) {
2237
+ _context.next = 2;
2238
+ break;
2239
+ }
2240
+
2241
+ return _context.abrupt('return', next(action));
2242
+
2243
+ case 2:
2244
+ _action$meta = action.meta, meta = _action$meta === undefined ? {} : _action$meta;
2245
+ _meta$path = meta.path, path = _meta$path === undefined ? '' : _meta$path, _meta$params = meta.params, params = _meta$params === undefined ? {} : _meta$params;
2246
+
2247
+
2248
+ next(action);
2249
+
2250
+ _rest = Object(globals["rest"])(), _rest$url = _rest.url, url = _rest$url === undefined ? '' : _rest$url, _rest$nonce = _rest.nonce, nonce = _rest$nonce === undefined ? {} : _rest$nonce;
2251
+ wpRESTNonce = nonce.wp_rest || '';
2252
+ namespaces = globals["rest"].namespaces || {};
2253
+ core = namespaces.core || 'wp/v2';
2254
+ BASE = '' + url + core;
2255
+ actions = extends_default()({
2256
+ start: noop_default.a,
2257
+ success: noop_default.a,
2258
+ error: noop_default.a,
2259
+ none: noop_default.a
2260
+ }, get_default()(meta, 'actions', {}));
2261
+
2262
+ if (!(path === '')) {
2263
+ _context.next = 14;
2264
+ break;
2265
+ }
2266
+
2267
+ actions.none(path);
2268
+ return _context.abrupt('return');
2269
+
2270
+ case 14:
2271
+ endpoint = BASE + '/' + path;
2272
+
2273
+
2274
+ actions.start(endpoint, params);
2275
+
2276
+ headers = extends_default()({
2277
+ 'Accept': 'application/json',
2278
+ 'Content-Type': 'application/json'
2279
+ }, get_default()(params, 'headers', {}), {
2280
+ 'X-WP-Nonce': wpRESTNonce
2281
+ });
2282
+ _context.prev = 17;
2283
+ _context.next = 20;
2284
+ return fetch(endpoint, extends_default()({}, params, {
2285
+ credentials: 'include',
2286
+ headers: headers
2287
+ }));
2288
+
2289
+ case 20:
2290
+ response = _context.sent;
2291
+ status = response.status;
2292
+ // inRange includes 200 but excludes 300 from the range so it's from 200 up to 299
2293
+
2294
+ if (inRange_default()(status, 200, 300)) {
2295
+ _context.next = 24;
2296
+ break;
2297
+ }
2298
+
2299
+ throw response;
2300
+
2301
+ case 24:
2302
+ _context.next = 26;
2303
+ return response.json();
2304
+
2305
+ case 26:
2306
+ body = _context.sent;
2307
+
2308
+ actions.success({ body: body, headers: response.headers });
2309
+ return _context.abrupt('return', [response, body]);
2310
+
2311
+ case 31:
2312
+ _context.prev = 31;
2313
+ _context.t0 = _context['catch'](17);
2314
+
2315
+ actions.error(_context.t0);
2316
+ return _context.abrupt('return', _context.t0);
2317
+
2318
+ case 35:
2319
+ case 'end':
2320
+ return _context.stop();
2321
+ }
2322
+ }
2323
+ }, _callee, _this, [[17, 31]]);
2324
+ }));
2325
+
2326
+ return function (_x) {
2327
+ return _ref.apply(this, arguments);
2328
+ };
2329
+ }();
2330
+ };
2331
+ });
2332
+ // CONCATENATED MODULE: ./src/modules/store/middlewares/request/index.js
2333
+ /* concated harmony reexport default */__webpack_require__.d(__webpack_exports__, "default", function() { return wp_request; });
2334
+ /* concated harmony reexport types */__webpack_require__.d(__webpack_exports__, "types", function() { return types_namespaceObject; });
2335
+ /* concated harmony reexport actions */__webpack_require__.d(__webpack_exports__, "actions", function() { return actions_namespaceObject; });
2336
+ /* concated harmony reexport utils */__webpack_require__.d(__webpack_exports__, "utils", function() { return utils_namespaceObject; });
2337
+ /**
2338
+ * Internal dependencies
2339
+ */
2340
+
2341
+
2342
+
2343
+
2344
+
2345
+
2346
+
2347
+ /***/ }),
2348
+ /* 39 */
2349
+ /***/ (function(module, exports, __webpack_require__) {
2350
+
2351
+ "use strict";
2352
+
2353
+
2354
+ exports.__esModule = true;
2355
+ exports.defaultMemoize = defaultMemoize;
2356
+ exports.createSelectorCreator = createSelectorCreator;
2357
+ exports.createStructuredSelector = createStructuredSelector;
2358
+ function defaultEqualityCheck(a, b) {
2359
+ return a === b;
2360
+ }
2361
+
2362
+ function areArgumentsShallowlyEqual(equalityCheck, prev, next) {
2363
+ if (prev === null || next === null || prev.length !== next.length) {
2364
+ return false;
2365
+ }
2366
+
2367
+ // Do this in a for loop (and not a `forEach` or an `every`) so we can determine equality as fast as possible.
2368
+ var length = prev.length;
2369
+ for (var i = 0; i < length; i++) {
2370
+ if (!equalityCheck(prev[i], next[i])) {
2371
+ return false;
2372
+ }
2373
+ }
2374
+
2375
+ return true;
2376
+ }
2377
+
2378
+ function defaultMemoize(func) {
2379
+ var equalityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck;
2380
+
2381
+ var lastArgs = null;
2382
+ var lastResult = null;
2383
+ // we reference arguments instead of spreading them for performance reasons
2384
+ return function () {
2385
+ if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {
2386
+ // apply arguments instead of spreading for performance.
2387
+ lastResult = func.apply(null, arguments);
2388
+ }
2389
+
2390
+ lastArgs = arguments;
2391
+ return lastResult;
2392
+ };
2393
+ }
2394
+
2395
+ function getDependencies(funcs) {
2396
+ var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs;
2397
+
2398
+ if (!dependencies.every(function (dep) {
2399
+ return typeof dep === 'function';
2400
+ })) {
2401
+ var dependencyTypes = dependencies.map(function (dep) {
2402
+ return typeof dep;
2403
+ }).join(', ');
2404
+ throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']'));
2405
+ }
2406
+
2407
+ return dependencies;
2408
+ }
2409
+
2410
+ function createSelectorCreator(memoize) {
2411
+ for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
2412
+ memoizeOptions[_key - 1] = arguments[_key];
2413
+ }
2414
+
2415
+ return function () {
2416
+ for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2417
+ funcs[_key2] = arguments[_key2];
2418
+ }
2419
+
2420
+ var recomputations = 0;
2421
+ var resultFunc = funcs.pop();
2422
+ var dependencies = getDependencies(funcs);
2423
+
2424
+ var memoizedResultFunc = memoize.apply(undefined, [function () {
2425
+ recomputations++;
2426
+ // apply arguments instead of spreading for performance.
2427
+ return resultFunc.apply(null, arguments);
2428
+ }].concat(memoizeOptions));
2429
+
2430
+ // If a selector is called with the exact same arguments we don't need to traverse our dependencies again.
2431
+ var selector = defaultMemoize(function () {
2432
+ var params = [];
2433
+ var length = dependencies.length;
2434
+
2435
+ for (var i = 0; i < length; i++) {
2436
+ // apply arguments instead of spreading and mutate a local list of params for performance.
2437
+ params.push(dependencies[i].apply(null, arguments));
2438
+ }
2439
+
2440
+ // apply arguments instead of spreading for performance.
2441
+ return memoizedResultFunc.apply(null, params);
2442
+ });
2443
+
2444
+ selector.resultFunc = resultFunc;
2445
+ selector.recomputations = function () {
2446
+ return recomputations;
2447
+ };
2448
+ selector.resetRecomputations = function () {
2449
+ return recomputations = 0;
2450
+ };
2451
+ return selector;
2452
+ };
2453
+ }
2454
+
2455
+ var createSelector = exports.createSelector = createSelectorCreator(defaultMemoize);
2456
+
2457
+ function createStructuredSelector(selectors) {
2458
+ var selectorCreator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createSelector;
2459
+
2460
+ if (typeof selectors !== 'object') {
2461
+ throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors));
2462
+ }
2463
+ var objectKeys = Object.keys(selectors);
2464
+ return selectorCreator(objectKeys.map(function (key) {
2465
+ return selectors[key];
2466
+ }), function () {
2467
+ for (var _len3 = arguments.length, values = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
2468
+ values[_key3] = arguments[_key3];
2469
+ }
2470
+
2471
+ return values.reduce(function (composition, value, index) {
2472
+ composition[objectKeys[index]] = value;
2473
+ return composition;
2474
+ }, {});
2475
+ });
2476
+ }
2477
+
2478
+ /***/ }),
2479
+ /* 40 */
2480
+ /***/ (function(module, exports, __webpack_require__) {
2481
+
2482
+ // optional / simple context binding
2483
+ var aFunction = __webpack_require__(53);
2484
+ module.exports = function (fn, that, length) {
2485
+ aFunction(fn);
2486
+ if (that === undefined) return fn;
2487
+ switch (length) {
2488
+ case 1: return function (a) {
2489
+ return fn.call(that, a);
2490
+ };
2491
+ case 2: return function (a, b) {
2492
+ return fn.call(that, a, b);
2493
+ };
2494
+ case 3: return function (a, b, c) {
2495
+ return fn.call(that, a, b, c);
2496
+ };
2497
+ }
2498
+ return function (/* ...args */) {
2499
+ return fn.apply(that, arguments);
2500
+ };
2501
+ };
2502
+
2503
+
2504
+ /***/ }),
2505
+ /* 41 */
2506
+ /***/ (function(module, exports) {
2507
+
2508
+ module.exports = {};
2509
+
2510
+
2511
+ /***/ }),
2512
+ /* 42 */
2513
+ /***/ (function(module, exports, __webpack_require__) {
2514
+
2515
+ var isFunction = __webpack_require__(93),
2516
+ isLength = __webpack_require__(87);
2517
+
2518
+ /**
2519
+ * Checks if `value` is array-like. A value is considered array-like if it's
2520
+ * not a function and has a `value.length` that's an integer greater than or
2521
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
2522
+ *
2523
+ * @static
2524
+ * @memberOf _
2525
+ * @since 4.0.0
2526
+ * @category Lang
2527
+ * @param {*} value The value to check.
2528
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
2529
+ * @example
2530
+ *
2531
+ * _.isArrayLike([1, 2, 3]);
2532
+ * // => true
2533
+ *
2534
+ * _.isArrayLike(document.body.children);
2535
+ * // => true
2536
+ *
2537
+ * _.isArrayLike('abc');
2538
+ * // => true
2539
+ *
2540
+ * _.isArrayLike(_.noop);
2541
+ * // => false
2542
+ */
2543
+ function isArrayLike(value) {
2544
+ return value != null && isLength(value.length) && !isFunction(value);
2545
+ }
2546
+
2547
+ module.exports = isArrayLike;
2548
+
2549
+
2550
+ /***/ }),
2551
+ /* 43 */
2552
+ /***/ (function(module, exports, __webpack_require__) {
2553
+
2554
+ var DataView = __webpack_require__(256),
2555
+ Map = __webpack_require__(84),
2556
+ Promise = __webpack_require__(257),
2557
+ Set = __webpack_require__(153),
2558
+ WeakMap = __webpack_require__(154),
2559
+ baseGetTag = __webpack_require__(21),
2560
+ toSource = __webpack_require__(138);
2561
+
2562
+ /** `Object#toString` result references. */
2563
+ var mapTag = '[object Map]',
2564
+ objectTag = '[object Object]',
2565
+ promiseTag = '[object Promise]',
2566
+ setTag = '[object Set]',
2567
+ weakMapTag = '[object WeakMap]';
2568
+
2569
+ var dataViewTag = '[object DataView]';
2570
+
2571
+ /** Used to detect maps, sets, and weakmaps. */
2572
+ var dataViewCtorString = toSource(DataView),
2573
+ mapCtorString = toSource(Map),
2574
+ promiseCtorString = toSource(Promise),
2575
+ setCtorString = toSource(Set),
2576
+ weakMapCtorString = toSource(WeakMap);
2577
+
2578
+ /**
2579
+ * Gets the `toStringTag` of `value`.
2580
+ *
2581
+ * @private
2582
+ * @param {*} value The value to query.
2583
+ * @returns {string} Returns the `toStringTag`.
2584
+ */
2585
+ var getTag = baseGetTag;
2586
+
2587
+ // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
2588
+ if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
2589
+ (Map && getTag(new Map) != mapTag) ||
2590
+ (Promise && getTag(Promise.resolve()) != promiseTag) ||
2591
+ (Set && getTag(new Set) != setTag) ||
2592
+ (WeakMap && getTag(new WeakMap) != weakMapTag)) {
2593
+ getTag = function(value) {
2594
+ var result = baseGetTag(value),
2595
+ Ctor = result == objectTag ? value.constructor : undefined,
2596
+ ctorString = Ctor ? toSource(Ctor) : '';
2597
+
2598
+ if (ctorString) {
2599
+ switch (ctorString) {
2600
+ case dataViewCtorString: return dataViewTag;
2601
+ case mapCtorString: return mapTag;
2602
+ case promiseCtorString: return promiseTag;
2603
+ case setCtorString: return setTag;
2604
+ case weakMapCtorString: return weakMapTag;
2605
+ }
2606
+ }
2607
+ return result;
2608
+ };
2609
+ }
2610
+
2611
+ module.exports = getTag;
2612
+
2613
+
2614
+ /***/ }),
2615
+ /* 44 */
2616
+ /***/ (function(module, exports, __webpack_require__) {
2617
+
2618
+ var baseGet = __webpack_require__(143);
2619
+
2620
+ /**
2621
+ * Gets the value at `path` of `object`. If the resolved value is
2622
+ * `undefined`, the `defaultValue` is returned in its place.
2623
+ *
2624
+ * @static
2625
+ * @memberOf _
2626
+ * @since 3.7.0
2627
+ * @category Object
2628
+ * @param {Object} object The object to query.
2629
+ * @param {Array|string} path The path of the property to get.
2630
+ * @param {*} [defaultValue] The value returned for `undefined` resolved values.
2631
+ * @returns {*} Returns the resolved value.
2632
+ * @example
2633
+ *
2634
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
2635
+ *
2636
+ * _.get(object, 'a[0].b.c');
2637
+ * // => 3
2638
+ *
2639
+ * _.get(object, ['a', '0', 'b', 'c']);
2640
+ * // => 3
2641
+ *
2642
+ * _.get(object, 'a.b.c', 'default');
2643
+ * // => 'default'
2644
+ */
2645
+ function get(object, path, defaultValue) {
2646
+ var result = object == null ? undefined : baseGet(object, path);
2647
+ return result === undefined ? defaultValue : result;
2648
+ }
2649
+
2650
+ module.exports = get;
2651
+
2652
+
2653
+ /***/ }),
2654
+ /* 45 */
2655
+ /***/ (function(module, exports, __webpack_require__) {
2656
+
2657
+ // to indexed object, toObject with fallback for non-array-like ES3 strings
2658
+ var IObject = __webpack_require__(132);
2659
+ var defined = __webpack_require__(79);
2660
+ module.exports = function (it) {
2661
+ return IObject(defined(it));
2662
+ };
2663
+
2664
+
2665
+ /***/ }),
2666
+ /* 46 */
2667
+ /***/ (function(module, exports, __webpack_require__) {
2668
+
2669
+ var baseGetTag = __webpack_require__(21),
2670
+ isObjectLike = __webpack_require__(14);
2671
+
2672
+ /** `Object#toString` result references. */
2673
+ var symbolTag = '[object Symbol]';
2674
+
2675
+ /**
2676
+ * Checks if `value` is classified as a `Symbol` primitive or object.
2677
+ *
2678
+ * @static
2679
+ * @memberOf _
2680
+ * @since 4.0.0
2681
+ * @category Lang
2682
+ * @param {*} value The value to check.
2683
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
2684
+ * @example
2685
+ *
2686
+ * _.isSymbol(Symbol.iterator);
2687
+ * // => true
2688
+ *
2689
+ * _.isSymbol('abc');
2690
+ * // => false
2691
+ */
2692
+ function isSymbol(value) {
2693
+ return typeof value == 'symbol' ||
2694
+ (isObjectLike(value) && baseGetTag(value) == symbolTag);
2695
+ }
2696
+
2697
+ module.exports = isSymbol;
2698
+
2699
+
2700
+ /***/ }),
2701
+ /* 47 */
2702
+ /***/ (function(module, exports, __webpack_require__) {
2703
+
2704
+ var isSymbol = __webpack_require__(46);
2705
+
2706
+ /** Used as references for various `Number` constants. */
2707
+ var INFINITY = 1 / 0;
2708
+
2709
+ /**
2710
+ * Converts `value` to a string key if it's not a string or symbol.
2711
+ *
2712
+ * @private
2713
+ * @param {*} value The value to inspect.
2714
+ * @returns {string|symbol} Returns the key.
2715
+ */
2716
+ function toKey(value) {
2717
+ if (typeof value == 'string' || isSymbol(value)) {
2718
+ return value;
2719
+ }
2720
+ var result = (value + '');
2721
+ return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
2722
+ }
2723
+
2724
+ module.exports = toKey;
2725
+
2726
+
2727
+ /***/ }),
2728
+ /* 48 */
2729
+ /***/ (function(module, exports) {
2730
+
2731
+ var toString = {}.toString;
2732
+
2733
+ module.exports = function (it) {
2734
+ return toString.call(it).slice(8, -1);
2735
+ };
2736
+
2737
+
2738
+ /***/ }),
2739
+ /* 49 */
2740
+ /***/ (function(module, exports) {
2741
+
2742
+ module.exports = true;
2743
+
2744
+
2745
+ /***/ }),
2746
+ /* 50 */
2747
+ /***/ (function(module, exports) {
2748
+
2749
+ module.exports = function (exec) {
2750
+ try {
2751
+ return !!exec();
2752
+ } catch (e) {
2753
+ return true;
2754
+ }
2755
+ };
2756
+
2757
+
2758
+ /***/ }),
2759
+ /* 51 */
2760
+ /***/ (function(module, exports) {
2761
+
2762
+ module.exports = function (bitmap, value) {
2763
+ return {
2764
+ enumerable: !(bitmap & 1),
2765
+ configurable: !(bitmap & 2),
2766
+ writable: !(bitmap & 4),
2767
+ value: value
2768
+ };
2769
+ };
2770
+
2771
+
2772
+ /***/ }),
2773
+ /* 52 */
2774
+ /***/ (function(module, exports) {
2775
+
2776
+ /**
2777
+ * This method returns the first argument it receives.
2778
+ *
2779
+ * @static
2780
+ * @since 0.1.0
2781
+ * @memberOf _
2782
+ * @category Util
2783
+ * @param {*} value Any value.
2784
+ * @returns {*} Returns `value`.
2785
+ * @example
2786
+ *
2787
+ * var object = { 'a': 1 };
2788
+ *
2789
+ * console.log(_.identity(object) === object);
2790
+ * // => true
2791
+ */
2792
+ function identity(value) {
2793
+ return value;
2794
+ }
2795
+
2796
+ module.exports = identity;
2797
+
2798
+
2799
+ /***/ }),
2800
+ /* 53 */
2801
+ /***/ (function(module, exports) {
2802
+
2803
+ module.exports = function (it) {
2804
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
2805
+ return it;
2806
+ };
2807
+
2808
+
2809
+ /***/ }),
2810
+ /* 54 */
2811
+ /***/ (function(module, exports, __webpack_require__) {
2812
+
2813
+ var getNative = __webpack_require__(25);
2814
+
2815
+ /* Built-in method references that are verified to be native. */
2816
+ var nativeCreate = getNative(Object, 'create');
2817
+
2818
+ module.exports = nativeCreate;
2819
+
2820
+
2821
+ /***/ }),
2822
+ /* 55 */
2823
+ /***/ (function(module, exports, __webpack_require__) {
2824
+
2825
+ var listCacheClear = __webpack_require__(231),
2826
+ listCacheDelete = __webpack_require__(232),
2827
+ listCacheGet = __webpack_require__(233),
2828
+ listCacheHas = __webpack_require__(234),
2829
+ listCacheSet = __webpack_require__(235);
2830
+
2831
+ /**
2832
+ * Creates an list cache object.
2833
+ *
2834
+ * @private
2835
+ * @constructor
2836
+ * @param {Array} [entries] The key-value pairs to cache.
2837
+ */
2838
+ function ListCache(entries) {
2839
+ var index = -1,
2840
+ length = entries == null ? 0 : entries.length;
2841
+
2842
+ this.clear();
2843
+ while (++index < length) {
2844
+ var entry = entries[index];
2845
+ this.set(entry[0], entry[1]);
2846
+ }
2847
+ }
2848
+
2849
+ // Add methods to `ListCache`.
2850
+ ListCache.prototype.clear = listCacheClear;
2851
+ ListCache.prototype['delete'] = listCacheDelete;
2852
+ ListCache.prototype.get = listCacheGet;
2853
+ ListCache.prototype.has = listCacheHas;
2854
+ ListCache.prototype.set = listCacheSet;
2855
+
2856
+ module.exports = ListCache;
2857
+
2858
+
2859
+ /***/ }),
2860
+ /* 56 */
2861
+ /***/ (function(module, exports, __webpack_require__) {
2862
+
2863
+ var eq = __webpack_require__(70);
2864
+
2865
+ /**
2866
+ * Gets the index at which the `key` is found in `array` of key-value pairs.
2867
+ *
2868
+ * @private
2869
+ * @param {Array} array The array to inspect.
2870
+ * @param {*} key The key to search for.
2871
+ * @returns {number} Returns the index of the matched value, else `-1`.
2872
+ */
2873
+ function assocIndexOf(array, key) {
2874
+ var length = array.length;
2875
+ while (length--) {
2876
+ if (eq(array[length][0], key)) {
2877
+ return length;
2878
+ }
2879
+ }
2880
+ return -1;
2881
+ }
2882
+
2883
+ module.exports = assocIndexOf;
2884
+
2885
+
2886
+ /***/ }),
2887
+ /* 57 */
2888
+ /***/ (function(module, exports, __webpack_require__) {
2889
+
2890
+ var isKeyable = __webpack_require__(237);
2891
+
2892
+ /**
2893
+ * Gets the data for `map`.
2894
+ *
2895
+ * @private
2896
+ * @param {Object} map The map to query.
2897
+ * @param {string} key The reference key.
2898
+ * @returns {*} Returns the map data.
2899
+ */
2900
+ function getMapData(map, key) {
2901
+ var data = map.__data__;
2902
+ return isKeyable(key)
2903
+ ? data[typeof key == 'string' ? 'string' : 'hash']
2904
+ : data.map;
2905
+ }
2906
+
2907
+ module.exports = getMapData;
2908
+
2909
+
2910
+ /***/ }),
2911
+ /* 58 */
2912
+ /***/ (function(module, exports, __webpack_require__) {
2913
+
2914
+ var baseIsArguments = __webpack_require__(246),
2915
+ isObjectLike = __webpack_require__(14);
2916
+
2917
+ /** Used for built-in method references. */
2918
+ var objectProto = Object.prototype;
2919
+
2920
+ /** Used to check objects for own properties. */
2921
+ var hasOwnProperty = objectProto.hasOwnProperty;
2922
+
2923
+ /** Built-in value references. */
2924
+ var propertyIsEnumerable = objectProto.propertyIsEnumerable;
2925
+
2926
+ /**
2927
+ * Checks if `value` is likely an `arguments` object.
2928
+ *
2929
+ * @static
2930
+ * @memberOf _
2931
+ * @since 0.1.0
2932
+ * @category Lang
2933
+ * @param {*} value The value to check.
2934
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
2935
+ * else `false`.
2936
+ * @example
2937
+ *
2938
+ * _.isArguments(function() { return arguments; }());
2939
+ * // => true
2940
+ *
2941
+ * _.isArguments([1, 2, 3]);
2942
+ * // => false
2943
+ */
2944
+ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
2945
+ return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
2946
+ !propertyIsEnumerable.call(value, 'callee');
2947
+ };
2948
+
2949
+ module.exports = isArguments;
2950
+
2951
+
2952
+ /***/ }),
2953
+ /* 59 */
2954
+ /***/ (function(module, exports, __webpack_require__) {
2955
+
2956
+ /* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(11),
2957
+ stubFalse = __webpack_require__(247);
2958
+
2959
+ /** Detect free variable `exports`. */
2960
+ var freeExports = true && exports && !exports.nodeType && exports;
2961
+
2962
+ /** Detect free variable `module`. */
2963
+ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
2964
+
2965
+ /** Detect the popular CommonJS extension `module.exports`. */
2966
+ var moduleExports = freeModule && freeModule.exports === freeExports;
2967
+
2968
+ /** Built-in value references. */
2969
+ var Buffer = moduleExports ? root.Buffer : undefined;
2970
+
2971
+ /* Built-in method references for those with the same name as other `lodash` methods. */
2972
+ var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
2973
+
2974
+ /**
2975
+ * Checks if `value` is a buffer.
2976
+ *
2977
+ * @static
2978
+ * @memberOf _
2979
+ * @since 4.3.0
2980
+ * @category Lang
2981
+ * @param {*} value The value to check.
2982
+ * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
2983
+ * @example
2984
+ *
2985
+ * _.isBuffer(new Buffer(2));
2986
+ * // => true
2987
+ *
2988
+ * _.isBuffer(new Uint8Array(2));
2989
+ * // => false
2990
+ */
2991
+ var isBuffer = nativeIsBuffer || stubFalse;
2992
+
2993
+ module.exports = isBuffer;
2994
+
2995
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(66)(module)))
2996
+
2997
+ /***/ }),
2998
+ /* 60 */
2999
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
3000
+
3001
+ "use strict";
3002
+ __webpack_require__.r(__webpack_exports__);
3003
+ var types_namespaceObject = {};
3004
+ __webpack_require__.r(types_namespaceObject);
3005
+ __webpack_require__.d(types_namespaceObject, "ADD_PLUGIN", function() { return ADD_PLUGIN; });
3006
+ __webpack_require__.d(types_namespaceObject, "REMOVE_PLUGIN", function() { return REMOVE_PLUGIN; });
3007
+ var actions_namespaceObject = {};
3008
+ __webpack_require__.r(actions_namespaceObject);
3009
+ __webpack_require__.d(actions_namespaceObject, "addPlugin", function() { return actions_addPlugin; });
3010
+ __webpack_require__.d(actions_namespaceObject, "removePlugin", function() { return actions_removePlugin; });
3011
+ var selectors_namespaceObject = {};
3012
+ __webpack_require__.r(selectors_namespaceObject);
3013
+ __webpack_require__.d(selectors_namespaceObject, "getPlugins", function() { return getPlugins; });
3014
+ __webpack_require__.d(selectors_namespaceObject, "hasPlugin", function() { return hasPlugin; });
3015
+ var constants_namespaceObject = {};
3016
+ __webpack_require__.r(constants_namespaceObject);
3017
+ __webpack_require__.d(constants_namespaceObject, "EVENTS_PLUGIN", function() { return EVENTS_PLUGIN; });
3018
+ __webpack_require__.d(constants_namespaceObject, "EVENTS_PRO_PLUGIN", function() { return EVENTS_PRO_PLUGIN; });
3019
+ __webpack_require__.d(constants_namespaceObject, "TICKETS", function() { return TICKETS; });
3020
+ __webpack_require__.d(constants_namespaceObject, "TICKETS_PLUS", function() { return TICKETS_PLUS; });
3021
+ var proptypes_namespaceObject = {};
3022
+ __webpack_require__.r(proptypes_namespaceObject);
3023
+ __webpack_require__.d(proptypes_namespaceObject, "ReactSelectOption", function() { return ReactSelectOption; });
3024
+ __webpack_require__.d(proptypes_namespaceObject, "ReactSelectOptions", function() { return ReactSelectOptions; });
3025
+
3026
+ // EXTERNAL MODULE: ./node_modules/babel-runtime/helpers/toConsumableArray.js
3027
+ var toConsumableArray = __webpack_require__(33);
3028
+ var toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray);
3029
+
3030
+ // EXTERNAL MODULE: ./node_modules/lodash/uniq.js
3031
+ var uniq = __webpack_require__(198);
3032
+ var uniq_default = /*#__PURE__*/__webpack_require__.n(uniq);
3033
+
3034
+ // CONCATENATED MODULE: ./src/modules/data/plugins/reducer.js
3035
+
3036
+ /**
3037
+ * External dependencies
3038
+ */
3039
+
3040
+ /**
3041
+ * Internal dependencies
3042
+ */
3043
+
3044
+
3045
+ /* harmony default export */ var reducer = (function () {
3046
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
3047
+ var action = arguments[1];
3048
+
3049
+ switch (action.type) {
3050
+ case types_namespaceObject.ADD_PLUGIN:
3051
+ return uniq_default()([].concat(toConsumableArray_default()(state), [action.payload.name]));
3052
+ case types_namespaceObject.REMOVE_PLUGIN:
3053
+ return [].concat(toConsumableArray_default()(state)).filter(function (pluginName) {
3054
+ return pluginName !== action.payload.name;
3055
+ });
3056
+ default:
3057
+ return state;
3058
+ }
3059
+ });
3060
+ // EXTERNAL MODULE: ./src/modules/data/utils.js
3061
+ var utils = __webpack_require__(13);
3062
+
3063
+ // CONCATENATED MODULE: ./src/modules/data/plugins/types.js
3064
+ /**
3065
+ * Internal dependencies
3066
+ */
3067
+
3068
+
3069
+ var ADD_PLUGIN = utils["a" /* PREFIX_COMMON_STORE */] + '/ADD_PLUGIN';
3070
+ var REMOVE_PLUGIN = utils["a" /* PREFIX_COMMON_STORE */] + '/REMOVE_PLUGIN';
3071
+ // CONCATENATED MODULE: ./src/modules/data/plugins/actions.js
3072
+ /**
3073
+ * Internal dependencies
3074
+ */
3075
+
3076
+
3077
+ var actions_addPlugin = function addPlugin(name) {
3078
+ return {
3079
+ type: ADD_PLUGIN,
3080
+ payload: {
3081
+ name: name
3082
+ }
3083
+ };
3084
+ };
3085
+
3086
+ var actions_removePlugin = function removePlugin(name) {
3087
+ return {
3088
+ type: REMOVE_PLUGIN,
3089
+ payload: {
3090
+ name: name
3091
+ }
3092
+ };
3093
+ };
3094
+ // EXTERNAL MODULE: ./node_modules/lodash/fp/curry.js
3095
+ var curry = __webpack_require__(199);
3096
+ var curry_default = /*#__PURE__*/__webpack_require__.n(curry);
3097
+
3098
+ // EXTERNAL MODULE: ./node_modules/lodash/includes.js
3099
+ var includes = __webpack_require__(127);
3100
+ var includes_default = /*#__PURE__*/__webpack_require__.n(includes);
3101
+
3102
+ // CONCATENATED MODULE: ./src/modules/data/plugins/selectors.js
3103
+
3104
+ /**
3105
+ * External dependencies
3106
+ */
3107
+
3108
+ var getPlugins = function getPlugins(state) {
3109
+ return state.plugins;
3110
+ };
3111
+
3112
+ var hasPlugin = curry_default()(function (state, plugin) {
3113
+ return includes_default()(getPlugins(state), plugin);
3114
+ });
3115
+ // CONCATENATED MODULE: ./src/modules/data/plugins/constants.js
3116
+ var EVENTS_PLUGIN = 'events';
3117
+ var EVENTS_PRO_PLUGIN = 'events-pro';
3118
+ var TICKETS = 'tickets';
3119
+ var TICKETS_PLUS = 'tickets-plus';
3120
+ // EXTERNAL MODULE: ./node_modules/prop-types/index.js
3121
+ var prop_types = __webpack_require__(0);
3122
+ var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
3123
+
3124
+ // CONCATENATED MODULE: ./src/modules/data/plugins/proptypes.js
3125
+ /**
3126
+ * External Dependencies
3127
+ */
3128
+
3129
+
3130
+ //
3131
+ // ─── VENDOR ─────────────────────────────────────────────────────────────────────
3132
+ //
3133
+
3134
+ var ReactSelectOption = prop_types_default.a.shape({
3135
+ label: prop_types_default.a.string.isRequired,
3136
+ value: prop_types_default.a.any.isRequired
3137
+ });
3138
+
3139
+ var ReactSelectOptions = prop_types_default.a.arrayOf(ReactSelectOption);
3140
+ // CONCATENATED MODULE: ./src/modules/data/plugins/index.js
3141
+ /* concated harmony reexport types */__webpack_require__.d(__webpack_exports__, "types", function() { return types_namespaceObject; });
3142
+ /* concated harmony reexport actions */__webpack_require__.d(__webpack_exports__, "actions", function() { return actions_namespaceObject; });
3143
+ /* concated harmony reexport selectors */__webpack_require__.d(__webpack_exports__, "selectors", function() { return selectors_namespaceObject; });
3144
+ /* concated harmony reexport constants */__webpack_require__.d(__webpack_exports__, "constants", function() { return constants_namespaceObject; });
3145
+ /* concated harmony reexport proptypes */__webpack_require__.d(__webpack_exports__, "proptypes", function() { return proptypes_namespaceObject; });
3146
+ /**
3147
+ * Internal dependencies
3148
+ */
3149
+
3150
+
3151
+
3152
+
3153
+
3154
+
3155
+
3156
+ /* harmony default export */ var plugins = __webpack_exports__["default"] = (reducer);
3157
+
3158
+
3159
+ /***/ }),
3160
+ /* 61 */
3161
+ /***/ (function(module, exports, __webpack_require__) {
3162
+
3163
+ "use strict";
3164
+
3165
+ var $at = __webpack_require__(210)(true);
3166
+
3167
+ // 21.1.3.27 String.prototype[@@iterator]()
3168
+ __webpack_require__(131)(String, 'String', function (iterated) {
3169
+ this._t = String(iterated); // target
3170
+ this._i = 0; // next index
3171
+ // 21.1.5.2.1 %StringIteratorPrototype%.next()
3172
+ }, function () {
3173
+ var O = this._t;
3174
+ var index = this._i;
3175
+ var point;
3176
+ if (index >= O.length) return { value: undefined, done: true };
3177
+ point = $at(O, index);
3178
+ this._i += point.length;
3179
+ return { value: point, done: false };
3180
+ });
3181
+
3182
+
3183
+ /***/ }),
3184
+ /* 62 */
3185
+ /***/ (function(module, exports, __webpack_require__) {
3186
+
3187
+ var def = __webpack_require__(23).f;
3188
+ var has = __webpack_require__(36);
3189
+ var TAG = __webpack_require__(12)('toStringTag');
3190
+
3191
+ module.exports = function (it, tag, stat) {
3192
+ if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
3193
+ };
3194
+
3195
+
3196
+ /***/ }),
3197
+ /* 63 */
3198
+ /***/ (function(module, exports, __webpack_require__) {
3199
+
3200
+ // 7.1.13 ToObject(argument)
3201
+ var defined = __webpack_require__(79);
3202
+ module.exports = function (it) {
3203
+ return Object(defined(it));
3204
+ };
3205
+
3206
+
3207
+ /***/ }),
3208
+ /* 64 */
3209
+ /***/ (function(module, exports) {
3210
+
3211
+ /** Used for built-in method references. */
3212
+ var objectProto = Object.prototype;
3213
+
3214
+ /**
3215
+ * Checks if `value` is likely a prototype object.
3216
+ *
3217
+ * @private
3218
+ * @param {*} value The value to check.
3219
+ * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
3220
+ */
3221
+ function isPrototype(value) {
3222
+ var Ctor = value && value.constructor,
3223
+ proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
3224
+
3225
+ return value === proto;
3226
+ }
3227
+
3228
+ module.exports = isPrototype;
3229
+
3230
+
3231
+ /***/ }),
3232
+ /* 65 */,
3233
+ /* 66 */
3234
+ /***/ (function(module, exports) {
3235
+
3236
+ module.exports = function(module) {
3237
+ if (!module.webpackPolyfill) {
3238
+ module.deprecate = function() {};
3239
+ module.paths = [];
3240
+ // module.parent = undefined by default
3241
+ if (!module.children) module.children = [];
3242
+ Object.defineProperty(module, "loaded", {
3243
+ enumerable: true,
3244
+ get: function() {
3245
+ return module.l;
3246
+ }
3247
+ });
3248
+ Object.defineProperty(module, "id", {
3249
+ enumerable: true,
3250
+ get: function() {
3251
+ return module.i;
3252
+ }
3253
+ });
3254
+ module.webpackPolyfill = 1;
3255
+ }
3256
+ return module;
3257
+ };
3258
+
3259
+
3260
+ /***/ }),
3261
+ /* 67 */
3262
+ /***/ (function(module, exports, __webpack_require__) {
3263
+
3264
+ module.exports = __webpack_require__(282);
3265
+
3266
+
3267
+ /***/ }),
3268
+ /* 68 */
3269
+ /***/ (function(module, exports, __webpack_require__) {
3270
+
3271
+ // 19.1.2.14 / 15.2.3.14 Object.keys(O)
3272
+ var $keys = __webpack_require__(168);
3273
+ var enumBugKeys = __webpack_require__(102);
3274
+
3275
+ module.exports = Object.keys || function keys(O) {
3276
+ return $keys(O, enumBugKeys);
3277
+ };
3278
+
3279
+
3280
+ /***/ }),
3281
+ /* 69 */
3282
+ /***/ (function(module, exports) {
3283
+
3284
+ var id = 0;
3285
+ var px = Math.random();
3286
+ module.exports = function (key) {
3287
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
3288
+ };
3289
+
3290
+
3291
+ /***/ }),
3292
+ /* 70 */
3293
+ /***/ (function(module, exports) {
3294
+
3295
+ /**
3296
+ * Performs a
3297
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
3298
+ * comparison between two values to determine if they are equivalent.
3299
+ *
3300
+ * @static
3301
+ * @memberOf _
3302
+ * @since 4.0.0
3303
+ * @category Lang
3304
+ * @param {*} value The value to compare.
3305
+ * @param {*} other The other value to compare.
3306
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
3307
+ * @example
3308
+ *
3309
+ * var object = { 'a': 1 };
3310
+ * var other = { 'a': 1 };
3311
+ *
3312
+ * _.eq(object, object);
3313
+ * // => true
3314
+ *
3315
+ * _.eq(object, other);
3316
+ * // => false
3317
+ *
3318
+ * _.eq('a', 'a');
3319
+ * // => true
3320
+ *
3321
+ * _.eq('a', Object('a'));
3322
+ * // => false
3323
+ *
3324
+ * _.eq(NaN, NaN);
3325
+ * // => true
3326
+ */
3327
+ function eq(value, other) {
3328
+ return value === other || (value !== value && other !== other);
3329
+ }
3330
+
3331
+ module.exports = eq;
3332
+
3333
+
3334
+ /***/ }),
3335
+ /* 71 */
3336
+ /***/ (function(module, exports, __webpack_require__) {
3337
+
3338
+ var baseCreate = __webpack_require__(72),
3339
+ isObject = __webpack_require__(18);
3340
+
3341
+ /**
3342
+ * Creates a function that produces an instance of `Ctor` regardless of
3343
+ * whether it was invoked as part of a `new` expression or by `call` or `apply`.
3344
+ *
3345
+ * @private
3346
+ * @param {Function} Ctor The constructor to wrap.
3347
+ * @returns {Function} Returns the new wrapped function.
3348
+ */
3349
+ function createCtor(Ctor) {
3350
+ return function() {
3351
+ // Use a `switch` statement to work with class constructors. See
3352
+ // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
3353
+ // for more details.
3354
+ var args = arguments;
3355
+ switch (args.length) {
3356
+ case 0: return new Ctor;
3357
+ case 1: return new Ctor(args[0]);
3358
+ case 2: return new Ctor(args[0], args[1]);
3359
+ case 3: return new Ctor(args[0], args[1], args[2]);
3360
+ case 4: return new Ctor(args[0], args[1], args[2], args[3]);
3361
+ case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
3362
+ case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
3363
+ case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
3364
+ }
3365
+ var thisBinding = baseCreate(Ctor.prototype),
3366
+ result = Ctor.apply(thisBinding, args);
3367
+
3368
+ // Mimic the constructor's `return` behavior.
3369
+ // See https://es5.github.io/#x13.2.2 for more details.
3370
+ return isObject(result) ? result : thisBinding;
3371
+ };
3372
+ }
3373
+
3374
+ module.exports = createCtor;
3375
+
3376
+
3377
+ /***/ }),
3378
+ /* 72 */
3379
+ /***/ (function(module, exports, __webpack_require__) {
3380
+
3381
+ var isObject = __webpack_require__(18);
3382
+
3383
+ /** Built-in value references. */
3384
+ var objectCreate = Object.create;
3385
+
3386
+ /**
3387
+ * The base implementation of `_.create` without support for assigning
3388
+ * properties to the created object.
3389
+ *
3390
+ * @private
3391
+ * @param {Object} proto The object to inherit from.
3392
+ * @returns {Object} Returns the new object.
3393
+ */
3394
+ var baseCreate = (function() {
3395
+ function object() {}
3396
+ return function(proto) {
3397
+ if (!isObject(proto)) {
3398
+ return {};
3399
+ }
3400
+ if (objectCreate) {
3401
+ return objectCreate(proto);
3402
+ }
3403
+ object.prototype = proto;
3404
+ var result = new object;
3405
+ object.prototype = undefined;
3406
+ return result;
3407
+ };
3408
+ }());
3409
+
3410
+ module.exports = baseCreate;
3411
+
3412
+
3413
+ /***/ }),
3414
+ /* 73 */
3415
+ /***/ (function(module, exports) {
3416
+
3417
+ /**
3418
+ * Copies the values of `source` to `array`.
3419
+ *
3420
+ * @private
3421
+ * @param {Array} source The array to copy values from.
3422
+ * @param {Array} [array=[]] The array to copy values to.
3423
+ * @returns {Array} Returns `array`.
3424
+ */
3425
+ function copyArray(source, array) {
3426
+ var index = -1,
3427
+ length = source.length;
3428
+
3429
+ array || (array = Array(length));
3430
+ while (++index < length) {
3431
+ array[index] = source[index];
3432
+ }
3433
+ return array;
3434
+ }
3435
+
3436
+ module.exports = copyArray;
3437
+
3438
+
3439
+ /***/ }),
3440
+ /* 74 */
3441
+ /***/ (function(module, exports) {
3442
+
3443
+ /** Used as references for various `Number` constants. */
3444
+ var MAX_SAFE_INTEGER = 9007199254740991;
3445
+
3446
+ /** Used to detect unsigned integer values. */
3447
+ var reIsUint = /^(?:0|[1-9]\d*)$/;
3448
+
3449
+ /**
3450
+ * Checks if `value` is a valid array-like index.
3451
+ *
3452
+ * @private
3453
+ * @param {*} value The value to check.
3454
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
3455
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
3456
+ */
3457
+ function isIndex(value, length) {
3458
+ var type = typeof value;
3459
+ length = length == null ? MAX_SAFE_INTEGER : length;
3460
+
3461
+ return !!length &&
3462
+ (type == 'number' ||
3463
+ (type != 'symbol' && reIsUint.test(value))) &&
3464
+ (value > -1 && value % 1 == 0 && value < length);
3465
+ }
3466
+
3467
+ module.exports = isIndex;
3468
+
3469
+
3470
+ /***/ }),
3471
+ /* 75 */
3472
+ /***/ (function(module, exports, __webpack_require__) {
3473
+
3474
+ var assignValue = __webpack_require__(190),
3475
+ baseAssignValue = __webpack_require__(191);
3476
+
3477
+ /**
3478
+ * Copies properties of `source` to `object`.
3479
+ *
3480
+ * @private
3481
+ * @param {Object} source The object to copy properties from.
3482
+ * @param {Array} props The property identifiers to copy.
3483
+ * @param {Object} [object={}] The object to copy properties to.
3484
+ * @param {Function} [customizer] The function to customize copied values.
3485
+ * @returns {Object} Returns `object`.
3486
+ */
3487
+ function copyObject(source, props, object, customizer) {
3488
+ var isNew = !object;
3489
+ object || (object = {});
3490
+
3491
+ var index = -1,
3492
+ length = props.length;
3493
+
3494
+ while (++index < length) {
3495
+ var key = props[index];
3496
+
3497
+ var newValue = customizer
3498
+ ? customizer(object[key], source[key], key, object, source)
3499
+ : undefined;
3500
+
3501
+ if (newValue === undefined) {
3502
+ newValue = source[key];
3503
+ }
3504
+ if (isNew) {
3505
+ baseAssignValue(object, key, newValue);
3506
+ } else {
3507
+ assignValue(object, key, newValue);
3508
+ }
3509
+ }
3510
+ return object;
3511
+ }
3512
+
3513
+ module.exports = copyObject;
3514
+
3515
+
3516
+ /***/ }),
3517
+ /* 76 */
3518
+ /***/ (function(module, exports) {
3519
+
3520
+ /**
3521
+ * A specialized version of `_.map` for arrays without support for iteratee
3522
+ * shorthands.
3523
+ *
3524
+ * @private
3525
+ * @param {Array} [array] The array to iterate over.
3526
+ * @param {Function} iteratee The function invoked per iteration.
3527
+ * @returns {Array} Returns the new mapped array.
3528
+ */
3529
+ function arrayMap(array, iteratee) {
3530
+ var index = -1,
3531
+ length = array == null ? 0 : array.length,
3532
+ result = Array(length);
3533
+
3534
+ while (++index < length) {
3535
+ result[index] = iteratee(array[index], index, array);
3536
+ }
3537
+ return result;
3538
+ }
3539
+
3540
+ module.exports = arrayMap;
3541
+
3542
+
3543
+ /***/ }),
3544
+ /* 77 */
3545
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
3546
+
3547
+ "use strict";
3548
+ __webpack_require__.r(__webpack_exports__);
3549
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EVENT", function() { return EVENT; });
3550
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VENUE", function() { return VENUE; });
3551
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ORGANIZER", function() { return ORGANIZER; });
3552
+ var EVENT = 'tribe_events';
3553
+ var VENUE = 'tribe_venue';
3554
+ var ORGANIZER = 'tribe_organizer';
3555
+
3556
+ /***/ }),
3557
+ /* 78 */
3558
+ /***/ (function(module, exports) {
3559
+
3560
+ // 7.1.4 ToInteger
3561
+ var ceil = Math.ceil;
3562
+ var floor = Math.floor;
3563
+ module.exports = function (it) {
3564
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
3565
+ };
3566
+
3567
+
3568
+ /***/ }),
3569
+ /* 79 */
3570
+ /***/ (function(module, exports) {
3571
+
3572
+ // 7.2.1 RequireObjectCoercible(argument)
3573
+ module.exports = function (it) {
3574
+ if (it == undefined) throw TypeError("Can't call method on " + it);
3575
+ return it;
3576
+ };
3577
+
3578
+
3579
+ /***/ }),
3580
+ /* 80 */
3581
+ /***/ (function(module, exports, __webpack_require__) {
3582
+
3583
+ var isObject = __webpack_require__(24);
3584
+ var document = __webpack_require__(9).document;
3585
+ // typeof document.createElement is 'object' in old IE
3586
+ var is = isObject(document) && isObject(document.createElement);
3587
+ module.exports = function (it) {
3588
+ return is ? document.createElement(it) : {};
3589
+ };
3590
+
3591
+
3592
+ /***/ }),
3593
+ /* 81 */
3594
+ /***/ (function(module, exports, __webpack_require__) {
3595
+
3596
+ // 7.1.15 ToLength
3597
+ var toInteger = __webpack_require__(78);
3598
+ var min = Math.min;
3599
+ module.exports = function (it) {
3600
+ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
3601
+ };
3602
+
3603
+
3604
+ /***/ }),
3605
+ /* 82 */
3606
+ /***/ (function(module, exports, __webpack_require__) {
3607
+
3608
+ var shared = __webpack_require__(101)('keys');
3609
+ var uid = __webpack_require__(69);
3610
+ module.exports = function (key) {
3611
+ return shared[key] || (shared[key] = uid(key));
3612
+ };
3613
+
3614
+
3615
+ /***/ }),
3616
+ /* 83 */
3617
+ /***/ (function(module, exports, __webpack_require__) {
3618
+
3619
+ var mapCacheClear = __webpack_require__(218),
3620
+ mapCacheDelete = __webpack_require__(236),
3621
+ mapCacheGet = __webpack_require__(238),
3622
+ mapCacheHas = __webpack_require__(239),
3623
+ mapCacheSet = __webpack_require__(240);
3624
+
3625
+ /**
3626
+ * Creates a map cache object to store key-value pairs.
3627
+ *
3628
+ * @private
3629
+ * @constructor
3630
+ * @param {Array} [entries] The key-value pairs to cache.
3631
+ */
3632
+ function MapCache(entries) {
3633
+ var index = -1,
3634
+ length = entries == null ? 0 : entries.length;
3635
+
3636
+ this.clear();
3637
+ while (++index < length) {
3638
+ var entry = entries[index];
3639
+ this.set(entry[0], entry[1]);
3640
+ }
3641
+ }
3642
+
3643
+ // Add methods to `MapCache`.
3644
+ MapCache.prototype.clear = mapCacheClear;
3645
+ MapCache.prototype['delete'] = mapCacheDelete;
3646
+ MapCache.prototype.get = mapCacheGet;
3647
+ MapCache.prototype.has = mapCacheHas;
3648
+ MapCache.prototype.set = mapCacheSet;
3649
+
3650
+ module.exports = MapCache;
3651
+
3652
+
3653
+ /***/ }),
3654
+ /* 84 */
3655
+ /***/ (function(module, exports, __webpack_require__) {
3656
+
3657
+ var getNative = __webpack_require__(25),
3658
+ root = __webpack_require__(11);
3659
+
3660
+ /* Built-in method references that are verified to be native. */
3661
+ var Map = getNative(root, 'Map');
3662
+
3663
+ module.exports = Map;
3664
+
3665
+
3666
+ /***/ }),
3667
+ /* 85 */
3668
+ /***/ (function(module, exports, __webpack_require__) {
3669
+
3670
+ var toFinite = __webpack_require__(157);
3671
+
3672
+ /**
3673
+ * Converts `value` to an integer.
3674
+ *
3675
+ * **Note:** This method is loosely based on
3676
+ * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
3677
+ *
3678
+ * @static
3679
+ * @memberOf _
3680
+ * @since 4.0.0
3681
+ * @category Lang
3682
+ * @param {*} value The value to convert.
3683
+ * @returns {number} Returns the converted integer.
3684
+ * @example
3685
+ *
3686
+ * _.toInteger(3.2);
3687
+ * // => 3
3688
+ *
3689
+ * _.toInteger(Number.MIN_VALUE);
3690
+ * // => 0
3691
+ *
3692
+ * _.toInteger(Infinity);
3693
+ * // => 1.7976931348623157e+308
3694
+ *
3695
+ * _.toInteger('3.2');
3696
+ * // => 3
3697
+ */
3698
+ function toInteger(value) {
3699
+ var result = toFinite(value),
3700
+ remainder = result % 1;
3701
+
3702
+ return result === result ? (remainder ? result - remainder : result) : 0;
3703
+ }
3704
+
3705
+ module.exports = toInteger;
3706
+
3707
+
3708
+ /***/ }),
3709
+ /* 86 */
3710
+ /***/ (function(module, exports, __webpack_require__) {
3711
+
3712
+ var baseIsTypedArray = __webpack_require__(248),
3713
+ baseUnary = __webpack_require__(88),
3714
+ nodeUtil = __webpack_require__(89);
3715
+
3716
+ /* Node.js helper references. */
3717
+ var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
3718
+
3719
+ /**
3720
+ * Checks if `value` is classified as a typed array.
3721
+ *
3722
+ * @static
3723
+ * @memberOf _
3724
+ * @since 3.0.0
3725
+ * @category Lang
3726
+ * @param {*} value The value to check.
3727
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
3728
+ * @example
3729
+ *
3730
+ * _.isTypedArray(new Uint8Array);
3731
+ * // => true
3732
+ *
3733
+ * _.isTypedArray([]);
3734
+ * // => false
3735
+ */
3736
+ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
3737
+
3738
+ module.exports = isTypedArray;
3739
+
3740
+
3741
+ /***/ }),
3742
+ /* 87 */
3743
+ /***/ (function(module, exports) {
3744
+
3745
+ /** Used as references for various `Number` constants. */
3746
+ var MAX_SAFE_INTEGER = 9007199254740991;
3747
+
3748
+ /**
3749
+ * Checks if `value` is a valid array-like length.
3750
+ *
3751
+ * **Note:** This method is loosely based on
3752
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
3753
+ *
3754
+ * @static
3755
+ * @memberOf _
3756
+ * @since 4.0.0
3757
+ * @category Lang
3758
+ * @param {*} value The value to check.
3759
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
3760
+ * @example
3761
+ *
3762
+ * _.isLength(3);
3763
+ * // => true
3764
+ *
3765
+ * _.isLength(Number.MIN_VALUE);
3766
+ * // => false
3767
+ *
3768
+ * _.isLength(Infinity);
3769
+ * // => false
3770
+ *
3771
+ * _.isLength('3');
3772
+ * // => false
3773
+ */
3774
+ function isLength(value) {
3775
+ return typeof value == 'number' &&
3776
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
3777
+ }
3778
+
3779
+ module.exports = isLength;
3780
+
3781
+
3782
+ /***/ }),
3783
+ /* 88 */
3784
+ /***/ (function(module, exports) {
3785
+
3786
+ /**
3787
+ * The base implementation of `_.unary` without support for storing metadata.
3788
+ *
3789
+ * @private
3790
+ * @param {Function} func The function to cap arguments for.
3791
+ * @returns {Function} Returns the new capped function.
3792
+ */
3793
+ function baseUnary(func) {
3794
+ return function(value) {
3795
+ return func(value);
3796
+ };
3797
+ }
3798
+
3799
+ module.exports = baseUnary;
3800
+
3801
+
3802
+ /***/ }),
3803
+ /* 89 */
3804
+ /***/ (function(module, exports, __webpack_require__) {
3805
+
3806
+ /* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(137);
3807
+
3808
+ /** Detect free variable `exports`. */
3809
+ var freeExports = true && exports && !exports.nodeType && exports;
3810
+
3811
+ /** Detect free variable `module`. */
3812
+ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
3813
+
3814
+ /** Detect the popular CommonJS extension `module.exports`. */
3815
+ var moduleExports = freeModule && freeModule.exports === freeExports;
3816
+
3817
+ /** Detect free variable `process` from Node.js. */
3818
+ var freeProcess = moduleExports && freeGlobal.process;
3819
+
3820
+ /** Used to access faster Node.js helpers. */
3821
+ var nodeUtil = (function() {
3822
+ try {
3823
+ // Use `util.types` for Node.js 10+.
3824
+ var types = freeModule && freeModule.require && freeModule.require('util').types;
3825
+
3826
+ if (types) {
3827
+ return types;
3828
+ }
3829
+
3830
+ // Legacy `process.binding('util')` for Node.js < 10.
3831
+ return freeProcess && freeProcess.binding && freeProcess.binding('util');
3832
+ } catch (e) {}
3833
+ }());
3834
+
3835
+ module.exports = nodeUtil;
3836
+
3837
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(66)(module)))
3838
+
3839
+ /***/ }),
3840
+ /* 90 */
3841
+ /***/ (function(module, exports, __webpack_require__) {
3842
+
3843
+ var isArray = __webpack_require__(6),
3844
+ isSymbol = __webpack_require__(46);
3845
+
3846
+ /** Used to match property names within property paths. */
3847
+ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
3848
+ reIsPlainProp = /^\w*$/;
3849
+
3850
+ /**
3851
+ * Checks if `value` is a property name and not a property path.
3852
+ *
3853
+ * @private
3854
+ * @param {*} value The value to check.
3855
+ * @param {Object} [object] The object to query keys on.
3856
+ * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
3857
+ */
3858
+ function isKey(value, object) {
3859
+ if (isArray(value)) {
3860
+ return false;
3861
+ }
3862
+ var type = typeof value;
3863
+ if (type == 'number' || type == 'symbol' || type == 'boolean' ||
3864
+ value == null || isSymbol(value)) {
3865
+ return true;
3866
+ }
3867
+ return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
3868
+ (object != null && value in Object(object));
3869
+ }
3870
+
3871
+ module.exports = isKey;
3872
+
3873
+
3874
+ /***/ }),
3875
+ /* 91 */
3876
+ /***/ (function(module, exports) {
3877
+
3878
+ exports.f = {}.propertyIsEnumerable;
3879
+
3880
+
3881
+ /***/ }),
3882
+ /* 92 */
3883
+ /***/ (function(module, exports, __webpack_require__) {
3884
+
3885
+ "use strict";
3886
+
3887
+ // 25.4.1.5 NewPromiseCapability(C)
3888
+ var aFunction = __webpack_require__(53);
3889
+
3890
+ function PromiseCapability(C) {
3891
+ var resolve, reject;
3892
+ this.promise = new C(function ($$resolve, $$reject) {
3893
+ if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
3894
+ resolve = $$resolve;
3895
+ reject = $$reject;
3896
+ });
3897
+ this.resolve = aFunction(resolve);
3898
+ this.reject = aFunction(reject);
3899
+ }
3900
+
3901
+ module.exports.f = function (C) {
3902
+ return new PromiseCapability(C);
3903
+ };
3904
+
3905
+
3906
+ /***/ }),
3907
+ /* 93 */
3908
+ /***/ (function(module, exports, __webpack_require__) {
3909
+
3910
+ var baseGetTag = __webpack_require__(21),
3911
+ isObject = __webpack_require__(18);
3912
+
3913
+ /** `Object#toString` result references. */
3914
+ var asyncTag = '[object AsyncFunction]',
3915
+ funcTag = '[object Function]',
3916
+ genTag = '[object GeneratorFunction]',
3917
+ proxyTag = '[object Proxy]';
3918
+
3919
+ /**
3920
+ * Checks if `value` is classified as a `Function` object.
3921
+ *
3922
+ * @static
3923
+ * @memberOf _
3924
+ * @since 0.1.0
3925
+ * @category Lang
3926
+ * @param {*} value The value to check.
3927
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
3928
+ * @example
3929
+ *
3930
+ * _.isFunction(_);
3931
+ * // => true
3932
+ *
3933
+ * _.isFunction(/abc/);
3934
+ * // => false
3935
+ */
3936
+ function isFunction(value) {
3937
+ if (!isObject(value)) {
3938
+ return false;
3939
+ }
3940
+ // The use of `Object#toString` avoids issues with the `typeof` operator
3941
+ // in Safari 9 which returns 'object' for typed arrays and other constructors.
3942
+ var tag = baseGetTag(value);
3943
+ return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
3944
+ }
3945
+
3946
+ module.exports = isFunction;
3947
+
3948
+
3949
+ /***/ }),
3950
+ /* 94 */
3951
+ /***/ (function(module, exports, __webpack_require__) {
3952
+
3953
+ var isPrototype = __webpack_require__(64),
3954
+ nativeKeys = __webpack_require__(249);
3955
+
3956
+ /** Used for built-in method references. */
3957
+ var objectProto = Object.prototype;
3958
+
3959
+ /** Used to check objects for own properties. */
3960
+ var hasOwnProperty = objectProto.hasOwnProperty;
3961
+
3962
+ /**
3963
+ * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
3964
+ *
3965
+ * @private
3966
+ * @param {Object} object The object to query.
3967
+ * @returns {Array} Returns the array of property names.
3968
+ */
3969
+ function baseKeys(object) {
3970
+ if (!isPrototype(object)) {
3971
+ return nativeKeys(object);
3972
+ }
3973
+ var result = [];
3974
+ for (var key in Object(object)) {
3975
+ if (hasOwnProperty.call(object, key) && key != 'constructor') {
3976
+ result.push(key);
3977
+ }
3978
+ }
3979
+ return result;
3980
+ }
3981
+
3982
+ module.exports = baseKeys;
3983
+
3984
+
3985
+ /***/ }),
3986
+ /* 95 */
3987
+ /***/ (function(module, exports, __webpack_require__) {
3988
+
3989
+ var ListCache = __webpack_require__(55),
3990
+ stackClear = __webpack_require__(250),
3991
+ stackDelete = __webpack_require__(251),
3992
+ stackGet = __webpack_require__(252),
3993
+ stackHas = __webpack_require__(253),
3994
+ stackSet = __webpack_require__(254);
3995
+
3996
+ /**
3997
+ * Creates a stack cache object to store key-value pairs.
3998
+ *
3999
+ * @private
4000
+ * @constructor
4001
+ * @param {Array} [entries] The key-value pairs to cache.
4002
+ */
4003
+ function Stack(entries) {
4004
+ var data = this.__data__ = new ListCache(entries);
4005
+ this.size = data.size;
4006
+ }
4007
+
4008
+ // Add methods to `Stack`.
4009
+ Stack.prototype.clear = stackClear;
4010
+ Stack.prototype['delete'] = stackDelete;
4011
+ Stack.prototype.get = stackGet;
4012
+ Stack.prototype.has = stackHas;
4013
+ Stack.prototype.set = stackSet;
4014
+
4015
+ module.exports = Stack;
4016
+
4017
+
4018
+ /***/ }),
4019
+ /* 96 */
4020
+ /***/ (function(module, exports) {
4021
+
4022
+ /**
4023
+ * Appends the elements of `values` to `array`.
4024
+ *
4025
+ * @private
4026
+ * @param {Array} array The array to modify.
4027
+ * @param {Array} values The values to append.
4028
+ * @returns {Array} Returns `array`.
4029
+ */
4030
+ function arrayPush(array, values) {
4031
+ var index = -1,
4032
+ length = values.length,
4033
+ offset = array.length;
4034
+
4035
+ while (++index < length) {
4036
+ array[offset + index] = values[index];
4037
+ }
4038
+ return array;
4039
+ }
4040
+
4041
+ module.exports = arrayPush;
4042
+
4043
+
4044
+ /***/ }),
4045
+ /* 97 */
4046
+ /***/ (function(module, exports, __webpack_require__) {
4047
+
4048
+ var baseToString = __webpack_require__(169);
4049
+
4050
+ /**
4051
+ * Converts `value` to a string. An empty string is returned for `null`
4052
+ * and `undefined` values. The sign of `-0` is preserved.
4053
+ *
4054
+ * @static
4055
+ * @memberOf _
4056
+ * @since 4.0.0
4057
+ * @category Lang
4058
+ * @param {*} value The value to convert.
4059
+ * @returns {string} Returns the converted string.
4060
+ * @example
4061
+ *
4062
+ * _.toString(null);
4063
+ * // => ''
4064
+ *
4065
+ * _.toString(-0);
4066
+ * // => '-0'
4067
+ *
4068
+ * _.toString([1, 2, 3]);
4069
+ * // => '1,2,3'
4070
+ */
4071
+ function toString(value) {
4072
+ return value == null ? '' : baseToString(value);
4073
+ }
4074
+
4075
+ module.exports = toString;
4076
+
4077
+
4078
+ /***/ }),
4079
+ /* 98 */
4080
+ /***/ (function(module, exports, __webpack_require__) {
4081
+
4082
+ var baseGetTag = __webpack_require__(21),
4083
+ isArray = __webpack_require__(6),
4084
+ isObjectLike = __webpack_require__(14);
4085
+
4086
+ /** `Object#toString` result references. */
4087
+ var stringTag = '[object String]';
4088
+
4089
+ /**
4090
+ * Checks if `value` is classified as a `String` primitive or object.
4091
+ *
4092
+ * @static
4093
+ * @since 0.1.0
4094
+ * @memberOf _
4095
+ * @category Lang
4096
+ * @param {*} value The value to check.
4097
+ * @returns {boolean} Returns `true` if `value` is a string, else `false`.
4098
+ * @example
4099
+ *
4100
+ * _.isString('abc');
4101
+ * // => true
4102
+ *
4103
+ * _.isString(1);
4104
+ * // => false
4105
+ */
4106
+ function isString(value) {
4107
+ return typeof value == 'string' ||
4108
+ (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
4109
+ }
4110
+
4111
+ module.exports = isString;
4112
+
4113
+
4114
+ /***/ }),
4115
+ /* 99 */
4116
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
4117
+
4118
+ "use strict";
4119
+
4120
+ // EXTERNAL MODULE: ./node_modules/redux/es/redux.js
4121
+ var redux = __webpack_require__(15);
4122
+
4123
+ // CONCATENATED MODULE: ./node_modules/deepmerge/dist/es.js
4124
+ var isMergeableObject = function isMergeableObject(value) {
4125
+ return isNonNullObject(value)
4126
+ && !isSpecial(value)
4127
+ };
4128
+
4129
+ function isNonNullObject(value) {
4130
+ return !!value && typeof value === 'object'
4131
+ }
4132
+
4133
+ function isSpecial(value) {
4134
+ var stringValue = Object.prototype.toString.call(value);
4135
+
4136
+ return stringValue === '[object RegExp]'
4137
+ || stringValue === '[object Date]'
4138
+ || isReactElement(value)
4139
+ }
4140
+
4141
+ // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25
4142
+ var canUseSymbol = typeof Symbol === 'function' && Symbol.for;
4143
+ var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;
4144
+
4145
+ function isReactElement(value) {
4146
+ return value.$$typeof === REACT_ELEMENT_TYPE
4147
+ }
4148
+
4149
+ function emptyTarget(val) {
4150
+ return Array.isArray(val) ? [] : {}
4151
+ }
4152
+
4153
+ function cloneUnlessOtherwiseSpecified(value, options) {
4154
+ return (options.clone !== false && options.isMergeableObject(value))
4155
+ ? deepmerge(emptyTarget(value), value, options)
4156
+ : value
4157
+ }
4158
+
4159
+ function defaultArrayMerge(target, source, options) {
4160
+ return target.concat(source).map(function(element) {
4161
+ return cloneUnlessOtherwiseSpecified(element, options)
4162
+ })
4163
+ }
4164
+
4165
+ function mergeObject(target, source, options) {
4166
+ var destination = {};
4167
+ if (options.isMergeableObject(target)) {
4168
+ Object.keys(target).forEach(function(key) {
4169
+ destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);
4170
+ });
4171
+ }
4172
+ Object.keys(source).forEach(function(key) {
4173
+ if (!options.isMergeableObject(source[key]) || !target[key]) {
4174
+ destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);
4175
+ } else {
4176
+ destination[key] = deepmerge(target[key], source[key], options);
4177
+ }
4178
+ });
4179
+ return destination
4180
+ }
4181
+
4182
+ function deepmerge(target, source, options) {
4183
+ options = options || {};
4184
+ options.arrayMerge = options.arrayMerge || defaultArrayMerge;
4185
+ options.isMergeableObject = options.isMergeableObject || isMergeableObject;
4186
+
4187
+ var sourceIsArray = Array.isArray(source);
4188
+ var targetIsArray = Array.isArray(target);
4189
+ var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;
4190
+
4191
+ if (!sourceAndTargetTypesMatch) {
4192
+ return cloneUnlessOtherwiseSpecified(source, options)
4193
+ } else if (sourceIsArray) {
4194
+ return options.arrayMerge(target, source, options)
4195
+ } else {
4196
+ return mergeObject(target, source, options)
4197
+ }
4198
+ }
4199
+
4200
+ deepmerge.all = function deepmergeAll(array, options) {
4201
+ if (!Array.isArray(array)) {
4202
+ throw new Error('first argument should be an array')
4203
+ }
4204
+
4205
+ return array.reduce(function(prev, next) {
4206
+ return deepmerge(prev, next, options)
4207
+ }, {})
4208
+ };
4209
+
4210
+ var deepmerge_1 = deepmerge;
4211
+
4212
+ /* harmony default export */ var es = (deepmerge_1);
4213
+
4214
+ // CONCATENATED MODULE: ./node_modules/@nfen/redux-reducer-injector/es/utils/fp.js
4215
+ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
4216
+
4217
+
4218
+
4219
+ /* eslint-disable import/prefer-default-export */
4220
+ var curry = function curry(fn) {
4221
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
4222
+ args[_key - 1] = arguments[_key];
4223
+ }
4224
+
4225
+ return fn.length <= args.length ? fn.apply(undefined, args) : function () {
4226
+ for (var _len2 = arguments.length, more = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
4227
+ more[_key2] = arguments[_key2];
4228
+ }
4229
+
4230
+ return curry.apply(undefined, [fn].concat(args, more));
4231
+ };
4232
+ };
4233
+
4234
+ var fp_pipe = function pipe() {
4235
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
4236
+ args[_key3] = arguments[_key3];
4237
+ }
4238
+
4239
+ return redux["compose"].apply(undefined, _toConsumableArray(args.reverse()));
4240
+ };
4241
+ // CONCATENATED MODULE: ./node_modules/@nfen/redux-reducer-injector/es/reducer.js
4242
+ var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
4243
+
4244
+ var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
4245
+
4246
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4247
+
4248
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4249
+
4250
+
4251
+
4252
+
4253
+
4254
+ var isFunction = function isFunction(arg) {
4255
+ return typeof arg === 'function';
4256
+ };
4257
+ var isObject = function isObject(arg) {
4258
+ return arg !== null && (typeof arg === 'undefined' ? 'undefined' : _typeof(arg)) === 'object';
4259
+ };
4260
+
4261
+ var isReducer = function isReducer(reducer) {
4262
+ return isFunction(reducer);
4263
+ };
4264
+ var hasNestedReducer = function hasNestedReducer(reducer) {
4265
+ return Object.values(reducer).some(isReducer);
4266
+ };
4267
+ var shouldCombineNextLevel = function shouldCombineNextLevel(reducer) {
4268
+ return (isReducer(reducer) || isObject(reducer)) && hasNestedReducer(reducer);
4269
+ };
4270
+
4271
+ /**
4272
+ * Merge all reducers together
4273
+ *
4274
+ * @export
4275
+ * @param {Object} reducers
4276
+ * @returns {Object} Merged reducers
4277
+ */
4278
+ var reducer_mergeReducers = function mergeReducers(reducers) {
4279
+ return reducers.reduce(function (result, reducer) {
4280
+ return es(result, reducer);
4281
+ }, {});
4282
+ };
4283
+
4284
+ /**
4285
+ * Recursively nest reducers
4286
+ *
4287
+ * @export
4288
+ * @param {Object} asyncReducers
4289
+ * @returns Merged nested reducers
4290
+ */
4291
+ var nestAsyncReducers = fp_pipe(getReducersAtLevel, function (reducers) {
4292
+ return reducers.filter(isObject);
4293
+ }, reducer_mergeReducers);
4294
+
4295
+ /**
4296
+ *
4297
+ *
4298
+ * @export
4299
+ * @param {Object} asyncReducers
4300
+ * @returns Array of possible empty items and reducer objects
4301
+ */
4302
+ function getReducersAtLevel(asyncReducers) {
4303
+ return Object.entries(asyncReducers).map(function (_ref) {
4304
+ var _ref2 = _slicedToArray(_ref, 2),
4305
+ key = _ref2[0],
4306
+ reducer = _ref2[1];
4307
+
4308
+ // Set the key to a combination of the next level
4309
+ // NOTE: This will replace any reducer already set to this key
4310
+ if (shouldCombineNextLevel(reducer)) {
4311
+ return _defineProperty({}, key, Object(redux["combineReducers"])(
4312
+ // Recursive call
4313
+ nestAsyncReducers(reducer)));
4314
+
4315
+ // No nested levels, then return the reducer
4316
+ } else if (isReducer(reducer)) {
4317
+ return _defineProperty({}, key, reducer);
4318
+ }
4319
+ });
4320
+ }
4321
+
4322
+ /**
4323
+ * Create a combined reducer
4324
+ *
4325
+ * @param {Object} [initialReducers={}]
4326
+ * @param {Object} [asyncReducers={}]
4327
+ * @returns combined reducer
4328
+ */
4329
+ function _createReducer(initialReducers, asyncReducers) {
4330
+ return Object(redux["combineReducers"])(_extends({}, initialReducers, nestAsyncReducers(asyncReducers)));
4331
+ }
4332
+
4333
+ var reducer_createReducer = curry(_createReducer);
4334
+
4335
+ /**
4336
+ * Setup createReducer with initial reducers
4337
+ * Will return a new function that will take async reducers to be injected
4338
+ *
4339
+ * @export
4340
+ * @param {Object} initialReducers
4341
+ * @returns Function
4342
+ */
4343
+ function setupCreateReducer(initialReducers) {
4344
+ return reducer_createReducer(initialReducers);
4345
+ }
4346
+ // EXTERNAL MODULE: ./node_modules/object-path/index.js
4347
+ var object_path = __webpack_require__(124);
4348
+
4349
+ // CONCATENATED MODULE: ./node_modules/@nfen/redux-reducer-injector/es/store.js
4350
+ var store_slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
4351
+
4352
+
4353
+
4354
+
4355
+ function augmentStore(createReducer, store) {
4356
+ store.injectedReducers = {};
4357
+ store.injectReducers = function injectReducers(reducers) {
4358
+ Object.entries(reducers).forEach(function (_ref) {
4359
+ var _ref2 = store_slicedToArray(_ref, 2),
4360
+ key = _ref2[0],
4361
+ reducer = _ref2[1];
4362
+
4363
+ if (!Object(object_path["has"])(store.injectedReducers, key)) {
4364
+ Object(object_path["set"])(store.injectedReducers, key, reducer);
4365
+ store.replaceReducer(createReducer(store.injectedReducers));
4366
+ }
4367
+ });
4368
+ };
4369
+ return store;
4370
+ }
4371
+
4372
+ /* harmony default export */ var es_store = (curry(augmentStore));
4373
+ // CONCATENATED MODULE: ./node_modules/@nfen/redux-reducer-injector/es/index.js
4374
+ /* concated harmony reexport setupCreateReducer */__webpack_require__.d(__webpack_exports__, "b", function() { return setupCreateReducer; });
4375
+ /* concated harmony reexport augmentStore */__webpack_require__.d(__webpack_exports__, "a", function() { return es_store; });
4376
+
4377
+
4378
+
4379
+ /***/ }),
4380
+ /* 100 */,
4381
+ /* 101 */
4382
+ /***/ (function(module, exports, __webpack_require__) {
4383
+
4384
+ var core = __webpack_require__(10);
4385
+ var global = __webpack_require__(9);
4386
+ var SHARED = '__core-js_shared__';
4387
+ var store = global[SHARED] || (global[SHARED] = {});
4388
+
4389
+ (module.exports = function (key, value) {
4390
+ return store[key] || (store[key] = value !== undefined ? value : {});
4391
+ })('versions', []).push({
4392
+ version: core.version,
4393
+ mode: __webpack_require__(49) ? 'pure' : 'global',
4394
+ copyright: '© 2019 Denis Pushkarev (zloirock.ru)'
4395
+ });
4396
+
4397
+
4398
+ /***/ }),
4399
+ /* 102 */
4400
+ /***/ (function(module, exports) {
4401
+
4402
+ // IE 8- don't enum bug keys
4403
+ module.exports = (
4404
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
4405
+ ).split(',');
4406
+
4407
+
4408
+ /***/ }),
4409
+ /* 103 */
4410
+ /***/ (function(module, exports) {
4411
+
4412
+ /**
4413
+ * Converts `set` to an array of its values.
4414
+ *
4415
+ * @private
4416
+ * @param {Object} set The set to convert.
4417
+ * @returns {Array} Returns the values.
4418
+ */
4419
+ function setToArray(set) {
4420
+ var index = -1,
4421
+ result = Array(set.size);
4422
+
4423
+ set.forEach(function(value) {
4424
+ result[++index] = value;
4425
+ });
4426
+ return result;
4427
+ }
4428
+
4429
+ module.exports = setToArray;
4430
+
4431
+
4432
+ /***/ }),
4433
+ /* 104 */
4434
+ /***/ (function(module, exports, __webpack_require__) {
4435
+
4436
+ var baseSetData = __webpack_require__(177),
4437
+ createBind = __webpack_require__(322),
4438
+ createCurry = __webpack_require__(323),
4439
+ createHybrid = __webpack_require__(179),
4440
+ createPartial = __webpack_require__(336),
4441
+ getData = __webpack_require__(183),
4442
+ mergeData = __webpack_require__(337),
4443
+ setData = __webpack_require__(185),
4444
+ setWrapToString = __webpack_require__(187),
4445
+ toInteger = __webpack_require__(85);
4446
+
4447
+ /** Error message constants. */
4448
+ var FUNC_ERROR_TEXT = 'Expected a function';
4449
+
4450
+ /** Used to compose bitmasks for function metadata. */
4451
+ var WRAP_BIND_FLAG = 1,
4452
+ WRAP_BIND_KEY_FLAG = 2,
4453
+ WRAP_CURRY_FLAG = 8,
4454
+ WRAP_CURRY_RIGHT_FLAG = 16,
4455
+ WRAP_PARTIAL_FLAG = 32,
4456
+ WRAP_PARTIAL_RIGHT_FLAG = 64;
4457
+
4458
+ /* Built-in method references for those with the same name as other `lodash` methods. */
4459
+ var nativeMax = Math.max;
4460
+
4461
+ /**
4462
+ * Creates a function that either curries or invokes `func` with optional
4463
+ * `this` binding and partially applied arguments.
4464
+ *
4465
+ * @private
4466
+ * @param {Function|string} func The function or method name to wrap.
4467
+ * @param {number} bitmask The bitmask flags.
4468
+ * 1 - `_.bind`
4469
+ * 2 - `_.bindKey`
4470
+ * 4 - `_.curry` or `_.curryRight` of a bound function
4471
+ * 8 - `_.curry`
4472
+ * 16 - `_.curryRight`
4473
+ * 32 - `_.partial`
4474
+ * 64 - `_.partialRight`
4475
+ * 128 - `_.rearg`
4476
+ * 256 - `_.ary`
4477
+ * 512 - `_.flip`
4478
+ * @param {*} [thisArg] The `this` binding of `func`.
4479
+ * @param {Array} [partials] The arguments to be partially applied.
4480
+ * @param {Array} [holders] The `partials` placeholder indexes.
4481
+ * @param {Array} [argPos] The argument positions of the new function.
4482
+ * @param {number} [ary] The arity cap of `func`.
4483
+ * @param {number} [arity] The arity of `func`.
4484
+ * @returns {Function} Returns the new wrapped function.
4485
+ */
4486
+ function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
4487
+ var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
4488
+ if (!isBindKey && typeof func != 'function') {
4489
+ throw new TypeError(FUNC_ERROR_TEXT);
4490
+ }
4491
+ var length = partials ? partials.length : 0;
4492
+ if (!length) {
4493
+ bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
4494
+ partials = holders = undefined;
4495
+ }
4496
+ ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
4497
+ arity = arity === undefined ? arity : toInteger(arity);
4498
+ length -= holders ? holders.length : 0;
4499
+
4500
+ if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
4501
+ var partialsRight = partials,
4502
+ holdersRight = holders;
4503
+
4504
+ partials = holders = undefined;
4505
+ }
4506
+ var data = isBindKey ? undefined : getData(func);
4507
+
4508
+ var newData = [
4509
+ func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
4510
+ argPos, ary, arity
4511
+ ];
4512
+
4513
+ if (data) {
4514
+ mergeData(newData, data);
4515
+ }
4516
+ func = newData[0];
4517
+ bitmask = newData[1];
4518
+ thisArg = newData[2];
4519
+ partials = newData[3];
4520
+ holders = newData[4];
4521
+ arity = newData[9] = newData[9] === undefined
4522
+ ? (isBindKey ? 0 : func.length)
4523
+ : nativeMax(newData[9] - length, 0);
4524
+
4525
+ if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
4526
+ bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
4527
+ }
4528
+ if (!bitmask || bitmask == WRAP_BIND_FLAG) {
4529
+ var result = createBind(func, bitmask, thisArg);
4530
+ } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
4531
+ result = createCurry(func, bitmask, arity);
4532
+ } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
4533
+ result = createPartial(func, bitmask, thisArg, partials);
4534
+ } else {
4535
+ result = createHybrid.apply(undefined, newData);
4536
+ }
4537
+ var setter = data ? baseSetData : setData;
4538
+ return setWrapToString(setter(result, newData), func, bitmask);
4539
+ }
4540
+
4541
+ module.exports = createWrap;
4542
+
4543
+
4544
+ /***/ }),
4545
+ /* 105 */
4546
+ /***/ (function(module, exports) {
4547
+
4548
+ /** Used as the internal argument placeholder. */
4549
+ var PLACEHOLDER = '__lodash_placeholder__';
4550
+
4551
+ /**
4552
+ * Replaces all `placeholder` elements in `array` with an internal placeholder
4553
+ * and returns an array of their indexes.
4554
+ *
4555
+ * @private
4556
+ * @param {Array} array The array to modify.
4557
+ * @param {*} placeholder The placeholder to replace.
4558
+ * @returns {Array} Returns the new array of placeholder indexes.
4559
+ */
4560
+ function replaceHolders(array, placeholder) {
4561
+ var index = -1,
4562
+ length = array.length,
4563
+ resIndex = 0,
4564
+ result = [];
4565
+
4566
+ while (++index < length) {
4567
+ var value = array[index];
4568
+ if (value === placeholder || value === PLACEHOLDER) {
4569
+ array[index] = PLACEHOLDER;
4570
+ result[resIndex++] = index;
4571
+ }
4572
+ }
4573
+ return result;
4574
+ }
4575
+
4576
+ module.exports = replaceHolders;
4577
+
4578
+
4579
+ /***/ }),
4580
+ /* 106 */
4581
+ /***/ (function(module, exports, __webpack_require__) {
4582
+
4583
+ var arrayFilter = __webpack_require__(255),
4584
+ stubArray = __webpack_require__(161);
4585
+
4586
+ /** Used for built-in method references. */
4587
+ var objectProto = Object.prototype;
4588
+
4589
+ /** Built-in value references. */
4590
+ var propertyIsEnumerable = objectProto.propertyIsEnumerable;
4591
+
4592
+ /* Built-in method references for those with the same name as other `lodash` methods. */
4593
+ var nativeGetSymbols = Object.getOwnPropertySymbols;
4594
+
4595
+ /**
4596
+ * Creates an array of the own enumerable symbols of `object`.
4597
+ *
4598
+ * @private
4599
+ * @param {Object} object The object to query.
4600
+ * @returns {Array} Returns the array of symbols.
4601
+ */
4602
+ var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
4603
+ if (object == null) {
4604
+ return [];
4605
+ }
4606
+ object = Object(object);
4607
+ return arrayFilter(nativeGetSymbols(object), function(symbol) {
4608
+ return propertyIsEnumerable.call(object, symbol);
4609
+ });
4610
+ };
4611
+
4612
+ module.exports = getSymbols;
4613
+
4614
+
4615
+ /***/ }),
4616
+ /* 107 */
4617
+ /***/ (function(module, exports, __webpack_require__) {
4618
+
4619
+ var baseMatches = __webpack_require__(258),
4620
+ baseMatchesProperty = __webpack_require__(266),
4621
+ identity = __webpack_require__(52),
4622
+ isArray = __webpack_require__(6),
4623
+ property = __webpack_require__(272);
4624
+
4625
+ /**
4626
+ * The base implementation of `_.iteratee`.
4627
+ *
4628
+ * @private
4629
+ * @param {*} [value=_.identity] The value to convert to an iteratee.
4630
+ * @returns {Function} Returns the iteratee.
4631
+ */
4632
+ function baseIteratee(value) {
4633
+ // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
4634
+ // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
4635
+ if (typeof value == 'function') {
4636
+ return value;
4637
+ }
4638
+ if (value == null) {
4639
+ return identity;
4640
+ }
4641
+ if (typeof value == 'object') {
4642
+ return isArray(value)
4643
+ ? baseMatchesProperty(value[0], value[1])
4644
+ : baseMatches(value);
4645
+ }
4646
+ return property(value);
4647
+ }
4648
+
4649
+ module.exports = baseIteratee;
4650
+
4651
+
4652
+ /***/ }),
4653
+ /* 108 */
4654
+ /***/ (function(module, exports, __webpack_require__) {
4655
+
4656
+ __webpack_require__(286);
4657
+ var global = __webpack_require__(9);
4658
+ var hide = __webpack_require__(30);
4659
+ var Iterators = __webpack_require__(41);
4660
+ var TO_STRING_TAG = __webpack_require__(12)('toStringTag');
4661
+
4662
+ var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
4663
+ 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
4664
+ 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
4665
+ 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
4666
+ 'TextTrackList,TouchList').split(',');
4667
+
4668
+ for (var i = 0; i < DOMIterables.length; i++) {
4669
+ var NAME = DOMIterables[i];
4670
+ var Collection = global[NAME];
4671
+ var proto = Collection && Collection.prototype;
4672
+ if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
4673
+ Iterators[NAME] = Iterators.Array;
4674
+ }
4675
+
4676
+
4677
+ /***/ }),
4678
+ /* 109 */
4679
+ /***/ (function(module, exports, __webpack_require__) {
4680
+
4681
+ var classof = __webpack_require__(110);
4682
+ var ITERATOR = __webpack_require__(12)('iterator');
4683
+ var Iterators = __webpack_require__(41);
4684
+ module.exports = __webpack_require__(10).getIteratorMethod = function (it) {
4685
+ if (it != undefined) return it[ITERATOR]
4686
+ || it['@@iterator']
4687
+ || Iterators[classof(it)];
4688
+ };
4689
+
4690
+
4691
+ /***/ }),
4692
+ /* 110 */
4693
+ /***/ (function(module, exports, __webpack_require__) {
4694
+
4695
+ // getting tag from 19.1.3.6 Object.prototype.toString()
4696
+ var cof = __webpack_require__(48);
4697
+ var TAG = __webpack_require__(12)('toStringTag');
4698
+ // ES3 wrong here
4699
+ var ARG = cof(function () { return arguments; }()) == 'Arguments';
4700
+
4701
+ // fallback for IE11 Script Access Denied error
4702
+ var tryGet = function (it, key) {
4703
+ try {
4704
+ return it[key];
4705
+ } catch (e) { /* empty */ }
4706
+ };
4707
+
4708
+ module.exports = function (it) {
4709
+ var O, T, B;
4710
+ return it === undefined ? 'Undefined' : it === null ? 'Null'
4711
+ // @@toStringTag case
4712
+ : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
4713
+ // builtinTag case
4714
+ : ARG ? cof(O)
4715
+ // ES3 arguments fallback
4716
+ : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
4717
+ };
4718
+
4719
+
4720
+ /***/ }),
4721
+ /* 111 */,
4722
+ /* 112 */
4723
+ /***/ (function(module, exports, __webpack_require__) {
4724
+
4725
+ // 7.1.1 ToPrimitive(input [, PreferredType])
4726
+ var isObject = __webpack_require__(24);
4727
+ // instead of the ES6 spec version, we didn't implement @@toPrimitive case
4728
+ // and the second argument - flag - preferred type is a string
4729
+ module.exports = function (it, S) {
4730
+ if (!isObject(it)) return it;
4731
+ var fn, val;
4732
+ if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
4733
+ if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
4734
+ if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
4735
+ throw TypeError("Can't convert object to primitive value");
4736
+ };
4737
+
4738
+
4739
+ /***/ }),
4740
+ /* 113 */
4741
+ /***/ (function(module, exports, __webpack_require__) {
4742
+
4743
+ var baseFindIndex = __webpack_require__(175),
4744
+ baseIsNaN = __webpack_require__(243),
4745
+ strictIndexOf = __webpack_require__(244);
4746
+
4747
+ /**
4748
+ * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
4749
+ *
4750
+ * @private
4751
+ * @param {Array} array The array to inspect.
4752
+ * @param {*} value The value to search for.
4753
+ * @param {number} fromIndex The index to search from.
4754
+ * @returns {number} Returns the index of the matched value, else `-1`.
4755
+ */
4756
+ function baseIndexOf(array, value, fromIndex) {
4757
+ return value === value
4758
+ ? strictIndexOf(array, value, fromIndex)
4759
+ : baseFindIndex(array, baseIsNaN, fromIndex);
4760
+ }
4761
+
4762
+ module.exports = baseIndexOf;
4763
+
4764
+
4765
+ /***/ }),
4766
+ /* 114 */
4767
+ /***/ (function(module, exports) {
4768
+
4769
+ /**
4770
+ * A faster alternative to `Function#apply`, this function invokes `func`
4771
+ * with the `this` binding of `thisArg` and the arguments of `args`.
4772
+ *
4773
+ * @private
4774
+ * @param {Function} func The function to invoke.
4775
+ * @param {*} thisArg The `this` binding of `func`.
4776
+ * @param {Array} args The arguments to invoke `func` with.
4777
+ * @returns {*} Returns the result of `func`.
4778
+ */
4779
+ function apply(func, thisArg, args) {
4780
+ switch (args.length) {
4781
+ case 0: return func.call(thisArg);
4782
+ case 1: return func.call(thisArg, args[0]);
4783
+ case 2: return func.call(thisArg, args[0], args[1]);
4784
+ case 3: return func.call(thisArg, args[0], args[1], args[2]);
4785
+ }
4786
+ return func.apply(thisArg, args);
4787
+ }
4788
+
4789
+ module.exports = apply;
4790
+
4791
+
4792
+ /***/ }),
4793
+ /* 115 */
4794
+ /***/ (function(module, exports, __webpack_require__) {
4795
+
4796
+ var baseCreate = __webpack_require__(72),
4797
+ baseLodash = __webpack_require__(116);
4798
+
4799
+ /** Used as references for the maximum length and index of an array. */
4800
+ var MAX_ARRAY_LENGTH = 4294967295;
4801
+
4802
+ /**
4803
+ * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
4804
+ *
4805
+ * @private
4806
+ * @constructor
4807
+ * @param {*} value The value to wrap.
4808
+ */
4809
+ function LazyWrapper(value) {
4810
+ this.__wrapped__ = value;
4811
+ this.__actions__ = [];
4812
+ this.__dir__ = 1;
4813
+ this.__filtered__ = false;
4814
+ this.__iteratees__ = [];
4815
+ this.__takeCount__ = MAX_ARRAY_LENGTH;
4816
+ this.__views__ = [];
4817
+ }
4818
+
4819
+ // Ensure `LazyWrapper` is an instance of `baseLodash`.
4820
+ LazyWrapper.prototype = baseCreate(baseLodash.prototype);
4821
+ LazyWrapper.prototype.constructor = LazyWrapper;
4822
+
4823
+ module.exports = LazyWrapper;
4824
+
4825
+
4826
+ /***/ }),
4827
+ /* 116 */
4828
+ /***/ (function(module, exports) {
4829
+
4830
+ /**
4831
+ * The function whose prototype chain sequence wrappers inherit from.
4832
+ *
4833
+ * @private
4834
+ */
4835
+ function baseLodash() {
4836
+ // No operation performed.
4837
+ }
4838
+
4839
+ module.exports = baseLodash;
4840
+
4841
+
4842
+ /***/ }),
4843
+ /* 117 */
4844
+ /***/ (function(module, exports) {
4845
+
4846
+ /**
4847
+ * A specialized version of `_.forEach` for arrays without support for
4848
+ * iteratee shorthands.
4849
+ *
4850
+ * @private
4851
+ * @param {Array} [array] The array to iterate over.
4852
+ * @param {Function} iteratee The function invoked per iteration.
4853
+ * @returns {Array} Returns `array`.
4854
+ */
4855
+ function arrayEach(array, iteratee) {
4856
+ var index = -1,
4857
+ length = array == null ? 0 : array.length;
4858
+
4859
+ while (++index < length) {
4860
+ if (iteratee(array[index], index, array) === false) {
4861
+ break;
4862
+ }
4863
+ }
4864
+ return array;
4865
+ }
4866
+
4867
+ module.exports = arrayEach;
4868
+
4869
+
4870
+ /***/ }),
4871
+ /* 118 */
4872
+ /***/ (function(module, exports, __webpack_require__) {
4873
+
4874
+ var overArg = __webpack_require__(160);
4875
+
4876
+ /** Built-in value references. */
4877
+ var getPrototype = overArg(Object.getPrototypeOf, Object);
4878
+
4879
+ module.exports = getPrototype;
4880
+
4881
+
4882
+ /***/ }),
4883
+ /* 119 */
4884
+ /***/ (function(module, exports, __webpack_require__) {
4885
+
4886
+ var Uint8Array = __webpack_require__(164);
4887
+
4888
+ /**
4889
+ * Creates a clone of `arrayBuffer`.
4890
+ *
4891
+ * @private
4892
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
4893
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
4894
+ */
4895
+ function cloneArrayBuffer(arrayBuffer) {
4896
+ var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
4897
+ new Uint8Array(result).set(new Uint8Array(arrayBuffer));
4898
+ return result;
4899
+ }
4900
+
4901
+ module.exports = cloneArrayBuffer;
4902
+
4903
+
4904
+ /***/ }),
4905
+ /* 120 */
4906
+ /***/ (function(module, exports) {
4907
+
4908
+ exports.f = Object.getOwnPropertySymbols;
4909
+
4910
+
4911
+ /***/ }),
4912
+ /* 121 */
4913
+ /***/ (function(module, exports) {
4914
+
4915
+ /**
4916
+ * Checks if `value` is `undefined`.
4917
+ *
4918
+ * @static
4919
+ * @since 0.1.0
4920
+ * @memberOf _
4921
+ * @category Lang
4922
+ * @param {*} value The value to check.
4923
+ * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
4924
+ * @example
4925
+ *
4926
+ * _.isUndefined(void 0);
4927
+ * // => true
4928
+ *
4929
+ * _.isUndefined(null);
4930
+ * // => false
4931
+ */
4932
+ function isUndefined(value) {
4933
+ return value === undefined;
4934
+ }
4935
+
4936
+ module.exports = isUndefined;
4937
+
4938
+
4939
+ /***/ }),
4940
+ /* 122 */
4941
+ /***/ (function(module, exports, __webpack_require__) {
4942
+
4943
+ "use strict";
4944
+
4945
+
4946
+ exports.__esModule = true;
4947
+
4948
+ var _promise = __webpack_require__(284);
4949
+
4950
+ var _promise2 = _interopRequireDefault(_promise);
4951
+
4952
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
4953
+
4954
+ exports.default = function (fn) {
4955
+ return function () {
4956
+ var gen = fn.apply(this, arguments);
4957
+ return new _promise2.default(function (resolve, reject) {
4958
+ function step(key, arg) {
4959
+ try {
4960
+ var info = gen[key](arg);
4961
+ var value = info.value;
4962
+ } catch (error) {
4963
+ reject(error);
4964
+ return;
4965
+ }
4966
+
4967
+ if (info.done) {
4968
+ resolve(value);
4969
+ } else {
4970
+ return _promise2.default.resolve(value).then(function (value) {
4971
+ step("next", value);
4972
+ }, function (err) {
4973
+ step("throw", err);
4974
+ });
4975
+ }
4976
+ }
4977
+
4978
+ return step("next");
4979
+ });
4980
+ };
4981
+ };
4982
+
4983
+ /***/ }),
4984
+ /* 123 */
4985
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
4986
+
4987
+ "use strict";
4988
+ /* WEBPACK VAR INJECTION */(function(global, module) {/* harmony import */ var _ponyfill_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(197);
4989
+ /* global window */
4990
+
4991
+
4992
+ var root;
4993
+
4994
+ if (typeof self !== 'undefined') {
4995
+ root = self;
4996
+ } else if (typeof window !== 'undefined') {
4997
+ root = window;
4998
+ } else if (typeof global !== 'undefined') {
4999
+ root = global;
5000
+ } else if (true) {
5001
+ root = module;
5002
+ } else {}
5003
+
5004
+ var result = Object(_ponyfill_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(root);
5005
+ /* harmony default export */ __webpack_exports__["a"] = (result);
5006
+
5007
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(125), __webpack_require__(313)(module)))
5008
+
5009
+ /***/ }),
5010
+ /* 124 */
5011
+ /***/ (function(module, exports, __webpack_require__) {
5012
+
5013
+ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory){
5014
+ 'use strict';
5015
+
5016
+ /*istanbul ignore next:cant test*/
5017
+ if ( true && typeof module.exports === 'object') {
5018
+ module.exports = factory();
5019
+ } else if (true) {
5020
+ // AMD. Register as an anonymous module.
5021
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
5022
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
5023
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
5024
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
5025
+ } else {}
5026
+ })(this, function(){
5027
+ 'use strict';
5028
+
5029
+ var toStr = Object.prototype.toString;
5030
+ function hasOwnProperty(obj, prop) {
5031
+ if(obj == null) {
5032
+ return false
5033
+ }
5034
+ //to handle objects with null prototypes (too edge case?)
5035
+ return Object.prototype.hasOwnProperty.call(obj, prop)
5036
+ }
5037
+
5038
+ function isEmpty(value){
5039
+ if (!value) {
5040
+ return true;
5041
+ }
5042
+ if (isArray(value) && value.length === 0) {
5043
+ return true;
5044
+ } else if (typeof value !== 'string') {
5045
+ for (var i in value) {
5046
+ if (hasOwnProperty(value, i)) {
5047
+ return false;
5048
+ }
5049
+ }
5050
+ return true;
5051
+ }
5052
+ return false;
5053
+ }
5054
+
5055
+ function toString(type){
5056
+ return toStr.call(type);
5057
+ }
5058
+
5059
+ function isObject(obj){
5060
+ return typeof obj === 'object' && toString(obj) === "[object Object]";
5061
+ }
5062
+
5063
+ var isArray = Array.isArray || function(obj){
5064
+ /*istanbul ignore next:cant test*/
5065
+ return toStr.call(obj) === '[object Array]';
5066
+ }
5067
+
5068
+ function isBoolean(obj){
5069
+ return typeof obj === 'boolean' || toString(obj) === '[object Boolean]';
5070
+ }
5071
+
5072
+ function getKey(key){
5073
+ var intKey = parseInt(key);
5074
+ if (intKey.toString() === key) {
5075
+ return intKey;
5076
+ }
5077
+ return key;
5078
+ }
5079
+
5080
+ function factory(options) {
5081
+ options = options || {}
5082
+
5083
+ var objectPath = function(obj) {
5084
+ return Object.keys(objectPath).reduce(function(proxy, prop) {
5085
+ if(prop === 'create') {
5086
+ return proxy;
5087
+ }
5088
+
5089
+ /*istanbul ignore else*/
5090
+ if (typeof objectPath[prop] === 'function') {
5091
+ proxy[prop] = objectPath[prop].bind(objectPath, obj);
5092
+ }
5093
+
5094
+ return proxy;
5095
+ }, {});
5096
+ };
5097
+
5098
+ function hasShallowProperty(obj, prop) {
5099
+ return (options.includeInheritedProps || (typeof prop === 'number' && Array.isArray(obj)) || hasOwnProperty(obj, prop))
5100
+ }
5101
+
5102
+ function getShallowProperty(obj, prop) {
5103
+ if (hasShallowProperty(obj, prop)) {
5104
+ return obj[prop];
5105
+ }
5106
+ }
5107
+
5108
+ function set(obj, path, value, doNotReplace){
5109
+ if (typeof path === 'number') {
5110
+ path = [path];
5111
+ }
5112
+ if (!path || path.length === 0) {
5113
+ return obj;
5114
+ }
5115
+ if (typeof path === 'string') {
5116
+ return set(obj, path.split('.').map(getKey), value, doNotReplace);
5117
+ }
5118
+ var currentPath = path[0];
5119
+ var currentValue = getShallowProperty(obj, currentPath);
5120
+ if (path.length === 1) {
5121
+ if (currentValue === void 0 || !doNotReplace) {
5122
+ obj[currentPath] = value;
5123
+ }
5124
+ return currentValue;
5125
+ }
5126
+
5127
+ if (currentValue === void 0) {
5128
+ //check if we assume an array
5129
+ if(typeof path[1] === 'number') {
5130
+ obj[currentPath] = [];
5131
+ } else {
5132
+ obj[currentPath] = {};
5133
+ }
5134
+ }
5135
+
5136
+ return set(obj[currentPath], path.slice(1), value, doNotReplace);
5137
+ }
5138
+
5139
+ objectPath.has = function (obj, path) {
5140
+ if (typeof path === 'number') {
5141
+ path = [path];
5142
+ } else if (typeof path === 'string') {
5143
+ path = path.split('.');
5144
+ }
5145
+
5146
+ if (!path || path.length === 0) {
5147
+ return !!obj;
5148
+ }
5149
+
5150
+ for (var i = 0; i < path.length; i++) {
5151
+ var j = getKey(path[i]);
5152
+
5153
+ if((typeof j === 'number' && isArray(obj) && j < obj.length) ||
5154
+ (options.includeInheritedProps ? (j in Object(obj)) : hasOwnProperty(obj, j))) {
5155
+ obj = obj[j];
5156
+ } else {
5157
+ return false;
5158
+ }
5159
+ }
5160
+
5161
+ return true;
5162
+ };
5163
+
5164
+ objectPath.ensureExists = function (obj, path, value){
5165
+ return set(obj, path, value, true);
5166
+ };
5167
+
5168
+ objectPath.set = function (obj, path, value, doNotReplace){
5169
+ return set(obj, path, value, doNotReplace);
5170
+ };
5171
+
5172
+ objectPath.insert = function (obj, path, value, at){
5173
+ var arr = objectPath.get(obj, path);
5174
+ at = ~~at;
5175
+ if (!isArray(arr)) {
5176
+ arr = [];
5177
+ objectPath.set(obj, path, arr);
5178
+ }
5179
+ arr.splice(at, 0, value);
5180
+ };
5181
+
5182
+ objectPath.empty = function(obj, path) {
5183
+ if (isEmpty(path)) {
5184
+ return void 0;
5185
+ }
5186
+ if (obj == null) {
5187
+ return void 0;
5188
+ }
5189
+
5190
+ var value, i;
5191
+ if (!(value = objectPath.get(obj, path))) {
5192
+ return void 0;
5193
+ }
5194
+
5195
+ if (typeof value === 'string') {
5196
+ return objectPath.set(obj, path, '');
5197
+ } else if (isBoolean(value)) {
5198
+ return objectPath.set(obj, path, false);
5199
+ } else if (typeof value === 'number') {
5200
+ return objectPath.set(obj, path, 0);
5201
+ } else if (isArray(value)) {
5202
+ value.length = 0;
5203
+ } else if (isObject(value)) {
5204
+ for (i in value) {
5205
+ if (hasShallowProperty(value, i)) {
5206
+ delete value[i];
5207
+ }
5208
+ }
5209
+ } else {
5210
+ return objectPath.set(obj, path, null);
5211
+ }
5212
+ };
5213
+
5214
+ objectPath.push = function (obj, path /*, values */){
5215
+ var arr = objectPath.get(obj, path);
5216
+ if (!isArray(arr)) {
5217
+ arr = [];
5218
+ objectPath.set(obj, path, arr);
5219
+ }
5220
+
5221
+ arr.push.apply(arr, Array.prototype.slice.call(arguments, 2));
5222
+ };
5223
+
5224
+ objectPath.coalesce = function (obj, paths, defaultValue) {
5225
+ var value;
5226
+
5227
+ for (var i = 0, len = paths.length; i < len; i++) {
5228
+ if ((value = objectPath.get(obj, paths[i])) !== void 0) {
5229
+ return value;
5230
+ }
5231
+ }
5232
+
5233
+ return defaultValue;
5234
+ };
5235
+
5236
+ objectPath.get = function (obj, path, defaultValue){
5237
+ if (typeof path === 'number') {
5238
+ path = [path];
5239
+ }
5240
+ if (!path || path.length === 0) {
5241
+ return obj;
5242
+ }
5243
+ if (obj == null) {
5244
+ return defaultValue;
5245
+ }
5246
+ if (typeof path === 'string') {
5247
+ return objectPath.get(obj, path.split('.'), defaultValue);
5248
+ }
5249
+
5250
+ var currentPath = getKey(path[0]);
5251
+ var nextObj = getShallowProperty(obj, currentPath)
5252
+ if (nextObj === void 0) {
5253
+ return defaultValue;
5254
+ }
5255
+
5256
+ if (path.length === 1) {
5257
+ return nextObj;
5258
+ }
5259
+
5260
+ return objectPath.get(obj[currentPath], path.slice(1), defaultValue);
5261
+ };
5262
+
5263
+ objectPath.del = function del(obj, path) {
5264
+ if (typeof path === 'number') {
5265
+ path = [path];
5266
+ }
5267
+
5268
+ if (obj == null) {
5269
+ return obj;
5270
+ }
5271
+
5272
+ if (isEmpty(path)) {
5273
+ return obj;
5274
+ }
5275
+ if(typeof path === 'string') {
5276
+ return objectPath.del(obj, path.split('.'));
5277
+ }
5278
+
5279
+ var currentPath = getKey(path[0]);
5280
+ if (!hasShallowProperty(obj, currentPath)) {
5281
+ return obj;
5282
+ }
5283
+
5284
+ if(path.length === 1) {
5285
+ if (isArray(obj)) {
5286
+ obj.splice(currentPath, 1);
5287
+ } else {
5288
+ delete obj[currentPath];
5289
+ }
5290
+ } else {
5291
+ return objectPath.del(obj[currentPath], path.slice(1));
5292
+ }
5293
+
5294
+ return obj;
5295
+ }
5296
+
5297
+ return objectPath;
5298
+ }
5299
+
5300
+ var mod = factory();
5301
+ mod.create = factory;
5302
+ mod.withInheritedProps = factory({includeInheritedProps: true})
5303
+ return mod;
5304
+ });
5305
+
5306
+
5307
+ /***/ }),
5308
+ /* 125 */
5309
+ /***/ (function(module, exports) {
5310
+
5311
+ var g;
5312
+
5313
+ // This works in non-strict mode
5314
+ g = (function() {
5315
+ return this;
5316
+ })();
5317
+
5318
+ try {
5319
+ // This works if eval is allowed (see CSP)
5320
+ g = g || new Function("return this")();
5321
+ } catch (e) {
5322
+ // This works if the window reference is available
5323
+ if (typeof window === "object") g = window;
5324
+ }
5325
+
5326
+ // g can still be undefined, but nothing to do about it...
5327
+ // We return undefined, instead of nothing here, so it's
5328
+ // easier to handle this case. if(!global) { ...}
5329
+
5330
+ module.exports = g;
5331
+
5332
+
5333
+ /***/ }),
5334
+ /* 126 */
5335
+ /***/ (function(module, exports, __webpack_require__) {
5336
+
5337
+ // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
5338
+ var anObject = __webpack_require__(17);
5339
+ var dPs = __webpack_require__(212);
5340
+ var enumBugKeys = __webpack_require__(102);
5341
+ var IE_PROTO = __webpack_require__(82)('IE_PROTO');
5342
+ var Empty = function () { /* empty */ };
5343
+ var PROTOTYPE = 'prototype';
5344
+
5345
+ // Create object with fake `null` prototype: use iframe Object with cleared prototype
5346
+ var createDict = function () {
5347
+ // Thrash, waste and sodomy: IE GC bug
5348
+ var iframe = __webpack_require__(80)('iframe');
5349
+ var i = enumBugKeys.length;
5350
+ var lt = '<';
5351
+ var gt = '>';
5352
+ var iframeDocument;
5353
+ iframe.style.display = 'none';
5354
+ __webpack_require__(133).appendChild(iframe);
5355
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
5356
+ // createDict = iframe.contentWindow.Object;
5357
+ // html.removeChild(iframe);
5358
+ iframeDocument = iframe.contentWindow.document;
5359
+ iframeDocument.open();
5360
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
5361
+ iframeDocument.close();
5362
+ createDict = iframeDocument.F;
5363
+ while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
5364
+ return createDict();
5365
+ };
5366
+
5367
+ module.exports = Object.create || function create(O, Properties) {
5368
+ var result;
5369
+ if (O !== null) {
5370
+ Empty[PROTOTYPE] = anObject(O);
5371
+ result = new Empty();
5372
+ Empty[PROTOTYPE] = null;
5373
+ // add "__proto__" for Object.getPrototypeOf polyfill
5374
+ result[IE_PROTO] = O;
5375
+ } else result = createDict();
5376
+ return Properties === undefined ? result : dPs(result, Properties);
5377
+ };
5378
+
5379
+
5380
+ /***/ }),
5381
+ /* 127 */
5382
+ /***/ (function(module, exports, __webpack_require__) {
5383
+
5384
+ var baseIndexOf = __webpack_require__(113),
5385
+ isArrayLike = __webpack_require__(42),
5386
+ isString = __webpack_require__(98),
5387
+ toInteger = __webpack_require__(85),
5388
+ values = __webpack_require__(364);
5389
+
5390
+ /* Built-in method references for those with the same name as other `lodash` methods. */
5391
+ var nativeMax = Math.max;
5392
+
5393
+ /**
5394
+ * Checks if `value` is in `collection`. If `collection` is a string, it's
5395
+ * checked for a substring of `value`, otherwise
5396
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
5397
+ * is used for equality comparisons. If `fromIndex` is negative, it's used as
5398
+ * the offset from the end of `collection`.
5399
+ *
5400
+ * @static
5401
+ * @memberOf _
5402
+ * @since 0.1.0
5403
+ * @category Collection
5404
+ * @param {Array|Object|string} collection The collection to inspect.
5405
+ * @param {*} value The value to search for.
5406
+ * @param {number} [fromIndex=0] The index to search from.
5407
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
5408
+ * @returns {boolean} Returns `true` if `value` is found, else `false`.
5409
+ * @example
5410
+ *
5411
+ * _.includes([1, 2, 3], 1);
5412
+ * // => true
5413
+ *
5414
+ * _.includes([1, 2, 3], 1, 2);
5415
+ * // => false
5416
+ *
5417
+ * _.includes({ 'a': 1, 'b': 2 }, 1);
5418
+ * // => true
5419
+ *
5420
+ * _.includes('abcd', 'bc');
5421
+ * // => true
5422
+ */
5423
+ function includes(collection, value, fromIndex, guard) {
5424
+ collection = isArrayLike(collection) ? collection : values(collection);
5425
+ fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
5426
+
5427
+ var length = collection.length;
5428
+ if (fromIndex < 0) {
5429
+ fromIndex = nativeMax(length + fromIndex, 0);
5430
+ }
5431
+ return isString(collection)
5432
+ ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
5433
+ : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
5434
+ }
5435
+
5436
+ module.exports = includes;
5437
+
5438
+
5439
+ /***/ }),
5440
+ /* 128 */
5441
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
5442
+
5443
+ "use strict";
5444
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return EVENT_NAMESPACE; });
5445
+ /* unused harmony export dispatch */
5446
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return intercept; });
5447
+ /* harmony import */ var babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26);
5448
+ /* harmony import */ var babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
5449
+ /* harmony import */ var babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27);
5450
+ /* harmony import */ var babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
5451
+ /* harmony import */ var babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(22);
5452
+ /* harmony import */ var babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
5453
+ /* harmony import */ var babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28);
5454
+ /* harmony import */ var babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__);
5455
+ /* harmony import */ var lodash_noop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);
5456
+ /* harmony import */ var lodash_noop__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_noop__WEBPACK_IMPORTED_MODULE_4__);
5457
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(2);
5458
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);
5459
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(0);
5460
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__);
5461
+
5462
+
5463
+
5464
+
5465
+
5466
+ /* eslint-disable max-len */
5467
+ /**
5468
+ * External dependencies
5469
+ */
5470
+
5471
+
5472
+
5473
+
5474
+ var ESCAPE_KEY = 27;
5475
+ var EVENT_NAMESPACE = 'tribe:click:proxy';
5476
+ var dispatch = function dispatch(e) {
5477
+ e.target.dispatchEvent(new CustomEvent(EVENT_NAMESPACE, { bubbles: true }));
5478
+ };
5479
+ var intercept = function intercept(e) {
5480
+ return e.stopPropagation();
5481
+ };
5482
+
5483
+ /* harmony default export */ __webpack_exports__["b"] = (function (WrappedComponent) {
5484
+ /**
5485
+ * Prevents clicks on block or blacklisted DOM elements
5486
+ * from closing the block
5487
+ *
5488
+ * @class WithBlockCloser
5489
+ * @extends {PureComponent}
5490
+ */
5491
+ var WithBlockCloser = function (_PureComponent) {
5492
+ babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(WithBlockCloser, _PureComponent);
5493
+
5494
+ function WithBlockCloser() {
5495
+ var _ref;
5496
+
5497
+ var _temp, _this, _ret;
5498
+
5499
+ babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, WithBlockCloser);
5500
+
5501
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
5502
+ args[_key] = arguments[_key];
5503
+ }
5504
+
5505
+ return _ret = (_temp = (_this = babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, (_ref = WithBlockCloser.__proto__ || Object.getPrototypeOf(WithBlockCloser)).call.apply(_ref, [this].concat(args))), _this), _this.nodeRef = react__WEBPACK_IMPORTED_MODULE_5___default.a.createRef(), _this._eventNamespace = EVENT_NAMESPACE, _this._dispatchClickProxyEvent = dispatch, _this._interceptClickProxyEvent = intercept, _this.handleKeyDown = function (e) {
5506
+ if (e.keyCode === ESCAPE_KEY) {
5507
+ _this.props.onClose();
5508
+ }
5509
+ }, _this.handleClick = function () {
5510
+ return _this.props.onClose();
5511
+ }, _temp), babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(_this, _ret);
5512
+ }
5513
+
5514
+ /**
5515
+ * dispatches custom events
5516
+ *
5517
+ * @memberof WithBlockCloser
5518
+ * @param {Event} e event
5519
+ */
5520
+
5521
+
5522
+ // Prevent CustomEvents from propagating to document proxy listeners
5523
+
5524
+
5525
+ /**
5526
+ * keydown handler
5527
+ *
5528
+ * @memberof WithBlockCloser
5529
+ * @param {Event} e event
5530
+ */
5531
+
5532
+
5533
+ babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(WithBlockCloser, [{
5534
+ key: 'componentDidMount',
5535
+ value: function componentDidMount() {
5536
+ this.props.isOpen && this._addEventListeners();
5537
+ }
5538
+ }, {
5539
+ key: 'componentDidUpdate',
5540
+ value: function componentDidUpdate(prevProps) {
5541
+ if (prevProps.isOpen !== this.props.isOpen) {
5542
+ this.props.isOpen ? this._addEventListeners() : this._removeEventListeners();
5543
+ }
5544
+ }
5545
+ }, {
5546
+ key: 'componentWillUnmount',
5547
+ value: function componentWillUnmount() {
5548
+ this._removeEventListeners();
5549
+ }
5550
+ }, {
5551
+ key: '_addEventListeners',
5552
+ value: function _addEventListeners() {
5553
+ var _this2 = this;
5554
+
5555
+ // Intercept custom events bubbled in block or blacklisted nodes
5556
+ this.node.addEventListener(this._eventNamespace, this._interceptClickProxyEvent);
5557
+ this.blacklistedNodes.forEach(function (node) {
5558
+ return node.addEventListener(_this2._eventNamespace, _this2._interceptClickProxyEvent);
5559
+ });
5560
+
5561
+ // Wait to receive custom events, if not intercepted, then go to click handler
5562
+ document.addEventListener(this._eventNamespace, this.handleClick);
5563
+ // Dispatch custom event on regular clicks
5564
+ document.addEventListener('click', this._dispatchClickProxyEvent);
5565
+
5566
+ // Close on certain keypresses
5567
+ document.addEventListener('keydown', this.handleKeyDown);
5568
+ }
5569
+ }, {
5570
+ key: '_removeEventListeners',
5571
+ value: function _removeEventListeners() {
5572
+ var _this3 = this;
5573
+
5574
+ this.node.removeEventListener(this._eventNamespace, this._interceptClickProxyEvent);
5575
+ this.blacklistedNodes.forEach(function (node) {
5576
+ return node.removeEventListener(_this3._eventNamespace, _this3._interceptClickProxyEvent);
5577
+ });
5578
+
5579
+ document.removeEventListener('keydown', this.handleKeyDown);
5580
+ document.removeEventListener(this._eventNamespace, this.handleClick);
5581
+ document.removeEventListener('click', this._dispatchClickProxyEvent);
5582
+ }
5583
+ }, {
5584
+ key: 'render',
5585
+ value: function render() {
5586
+ return wp.element.createElement(
5587
+ 'div',
5588
+ { ref: this.nodeRef },
5589
+ wp.element.createElement(WrappedComponent, this.props)
5590
+ );
5591
+ }
5592
+ }, {
5593
+ key: 'blacklistedNodes',
5594
+ get: function get() {
5595
+ var classNames = this.props.classNameClickBlacklist.join(', ');
5596
+ return Array.from(document.querySelectorAll(classNames));
5597
+ }
5598
+ }, {
5599
+ key: 'node',
5600
+ get: function get() {
5601
+ return this.nodeRef.current;
5602
+ }
5603
+ }]);
5604
+
5605
+ return WithBlockCloser;
5606
+ }(react__WEBPACK_IMPORTED_MODULE_5__["PureComponent"]);
5607
+
5608
+ WithBlockCloser.displayName = 'WithBlockCloser( ' + (WrappedComponent.displayName || WrappedComponent.name || 'Component ');
5609
+ WithBlockCloser.propTypes = {
5610
+ onClose: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func.isRequired,
5611
+ classNameClickBlacklist: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string).isRequired,
5612
+ isOpen: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool.isRequired
5613
+ };
5614
+ WithBlockCloser.defaultProps = {
5615
+ classNameClickBlacklist: ['.edit-post-sidebar'],
5616
+ onClose: lodash_noop__WEBPACK_IMPORTED_MODULE_4___default.a,
5617
+ isOpen: false
5618
+ };
5619
+
5620
+
5621
+ return WithBlockCloser;
5622
+ });
5623
+
5624
+ /***/ }),
5625
+ /* 129 */
5626
+ /***/ (function(module, exports, __webpack_require__) {
5627
+
5628
+ "use strict";
5629
+
5630
+
5631
+ exports.__esModule = true;
5632
+
5633
+ var _isIterable2 = __webpack_require__(405);
5634
+
5635
+ var _isIterable3 = _interopRequireDefault(_isIterable2);
5636
+
5637
+ var _getIterator2 = __webpack_require__(408);
5638
+
5639
+ var _getIterator3 = _interopRequireDefault(_getIterator2);
5640
+
5641
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
5642
+
5643
+ exports.default = function () {
5644
+ function sliceIterator(arr, i) {
5645
+ var _arr = [];
5646
+ var _n = true;
5647
+ var _d = false;
5648
+ var _e = undefined;
5649
+
5650
+ try {
5651
+ for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
5652
+ _arr.push(_s.value);
5653
+
5654
+ if (i && _arr.length === i) break;
5655
+ }
5656
+ } catch (err) {
5657
+ _d = true;
5658
+ _e = err;
5659
+ } finally {
5660
+ try {
5661
+ if (!_n && _i["return"]) _i["return"]();
5662
+ } finally {
5663
+ if (_d) throw _e;
5664
+ }
5665
+ }
5666
+
5667
+ return _arr;
5668
+ }
5669
+
5670
+ return function (arr, i) {
5671
+ if (Array.isArray(arr)) {
5672
+ return arr;
5673
+ } else if ((0, _isIterable3.default)(Object(arr))) {
5674
+ return sliceIterator(arr, i);
5675
+ } else {
5676
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
5677
+ }
5678
+ };
5679
+ }();
5680
+
5681
+ /***/ }),
5682
+ /* 130 */
5683
+ /***/ (function(module, exports) {
5684
+
5685
+ module.exports = wp.components;
5686
+
5687
+ /***/ }),
5688
+ /* 131 */
5689
+ /***/ (function(module, exports, __webpack_require__) {
5690
+
5691
+ "use strict";
5692
+
5693
+ var LIBRARY = __webpack_require__(49);
5694
+ var $export = __webpack_require__(19);
5695
+ var redefine = __webpack_require__(167);
5696
+ var hide = __webpack_require__(30);
5697
+ var Iterators = __webpack_require__(41);
5698
+ var $iterCreate = __webpack_require__(211);
5699
+ var setToStringTag = __webpack_require__(62);
5700
+ var getPrototypeOf = __webpack_require__(215);
5701
+ var ITERATOR = __webpack_require__(12)('iterator');
5702
+ var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
5703
+ var FF_ITERATOR = '@@iterator';
5704
+ var KEYS = 'keys';
5705
+ var VALUES = 'values';
5706
+
5707
+ var returnThis = function () { return this; };
5708
+
5709
+ module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
5710
+ $iterCreate(Constructor, NAME, next);
5711
+ var getMethod = function (kind) {
5712
+ if (!BUGGY && kind in proto) return proto[kind];
5713
+ switch (kind) {
5714
+ case KEYS: return function keys() { return new Constructor(this, kind); };
5715
+ case VALUES: return function values() { return new Constructor(this, kind); };
5716
+ } return function entries() { return new Constructor(this, kind); };
5717
+ };
5718
+ var TAG = NAME + ' Iterator';
5719
+ var DEF_VALUES = DEFAULT == VALUES;
5720
+ var VALUES_BUG = false;
5721
+ var proto = Base.prototype;
5722
+ var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
5723
+ var $default = $native || getMethod(DEFAULT);
5724
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
5725
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
5726
+ var methods, key, IteratorPrototype;
5727
+ // Fix native
5728
+ if ($anyNative) {
5729
+ IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
5730
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
5731
+ // Set @@toStringTag to native iterators
5732
+ setToStringTag(IteratorPrototype, TAG, true);
5733
+ // fix for some old engines
5734
+ if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
5735
+ }
5736
+ }
5737
+ // fix Array#{values, @@iterator}.name in V8 / FF
5738
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
5739
+ VALUES_BUG = true;
5740
+ $default = function values() { return $native.call(this); };
5741
+ }
5742
+ // Define iterator
5743
+ if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
5744
+ hide(proto, ITERATOR, $default);
5745
+ }
5746
+ // Plug for library
5747
+ Iterators[NAME] = $default;
5748
+ Iterators[TAG] = returnThis;
5749
+ if (DEFAULT) {
5750
+ methods = {
5751
+ values: DEF_VALUES ? $default : getMethod(VALUES),
5752
+ keys: IS_SET ? $default : getMethod(KEYS),
5753
+ entries: $entries
5754
+ };
5755
+ if (FORCED) for (key in methods) {
5756
+ if (!(key in proto)) redefine(proto, key, methods[key]);
5757
+ } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
5758
+ }
5759
+ return methods;
5760
+ };
5761
+
5762
+
5763
+ /***/ }),
5764
+ /* 132 */
5765
+ /***/ (function(module, exports, __webpack_require__) {
5766
+
5767
+ // fallback for non-array-like ES3 and non-enumerable old V8 strings
5768
+ var cof = __webpack_require__(48);
5769
+ // eslint-disable-next-line no-prototype-builtins
5770
+ module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
5771
+ return cof(it) == 'String' ? it.split('') : Object(it);
5772
+ };
5773
+
5774
+
5775
+ /***/ }),
5776
+ /* 133 */
5777
+ /***/ (function(module, exports, __webpack_require__) {
5778
+
5779
+ var document = __webpack_require__(9).document;
5780
+ module.exports = document && document.documentElement;
5781
+
5782
+
5783
+ /***/ }),
5784
+ /* 134 */
5785
+ /***/ (function(module, exports, __webpack_require__) {
5786
+
5787
+ // call something on iterator step with safe closing on error
5788
+ var anObject = __webpack_require__(17);
5789
+ module.exports = function (iterator, fn, value, entries) {
5790
+ try {
5791
+ return entries ? fn(anObject(value)[0], value[1]) : fn(value);
5792
+ // 7.4.6 IteratorClose(iterator, completion)
5793
+ } catch (e) {
5794
+ var ret = iterator['return'];
5795
+ if (ret !== undefined) anObject(ret.call(iterator));
5796
+ throw e;
5797
+ }
5798
+ };
5799
+
5800
+
5801
+ /***/ }),
5802
+ /* 135 */
5803
+ /***/ (function(module, exports, __webpack_require__) {
5804
+
5805
+ // check on default Array iterator
5806
+ var Iterators = __webpack_require__(41);
5807
+ var ITERATOR = __webpack_require__(12)('iterator');
5808
+ var ArrayProto = Array.prototype;
5809
+
5810
+ module.exports = function (it) {
5811
+ return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
5812
+ };
5813
+
5814
+
5815
+ /***/ }),
5816
+ /* 136 */
5817
+ /***/ (function(module, exports, __webpack_require__) {
5818
+
5819
+ var ITERATOR = __webpack_require__(12)('iterator');
5820
+ var SAFE_CLOSING = false;
5821
+
5822
+ try {
5823
+ var riter = [7][ITERATOR]();
5824
+ riter['return'] = function () { SAFE_CLOSING = true; };
5825
+ // eslint-disable-next-line no-throw-literal
5826
+ Array.from(riter, function () { throw 2; });
5827
+ } catch (e) { /* empty */ }
5828
+
5829
+ module.exports = function (exec, skipClosing) {
5830
+ if (!skipClosing && !SAFE_CLOSING) return false;
5831
+ var safe = false;
5832
+ try {
5833
+ var arr = [7];
5834
+ var iter = arr[ITERATOR]();
5835
+ iter.next = function () { return { done: safe = true }; };
5836
+ arr[ITERATOR] = function () { return iter; };
5837
+ exec(arr);
5838
+ } catch (e) { /* empty */ }
5839
+ return safe;
5840
+ };
5841
+
5842
+
5843
+ /***/ }),
5844
+ /* 137 */
5845
+ /***/ (function(module, exports, __webpack_require__) {
5846
+
5847
+ /* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
5848
+ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
5849
+
5850
+ module.exports = freeGlobal;
5851
+
5852
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(125)))
5853
+
5854
+ /***/ }),
5855
+ /* 138 */
5856
+ /***/ (function(module, exports) {
5857
+
5858
+ /** Used for built-in method references. */
5859
+ var funcProto = Function.prototype;
5860
+
5861
+ /** Used to resolve the decompiled source of functions. */
5862
+ var funcToString = funcProto.toString;
5863
+
5864
+ /**
5865
+ * Converts `func` to its source code.
5866
+ *
5867
+ * @private
5868
+ * @param {Function} func The function to convert.
5869
+ * @returns {string} Returns the source code.
5870
+ */
5871
+ function toSource(func) {
5872
+ if (func != null) {
5873
+ try {
5874
+ return funcToString.call(func);
5875
+ } catch (e) {}
5876
+ try {
5877
+ return (func + '');
5878
+ } catch (e) {}
5879
+ }
5880
+ return '';
5881
+ }
5882
+
5883
+ module.exports = toSource;
5884
+
5885
+
5886
+ /***/ }),
5887
+ /* 139 */
5888
+ /***/ (function(module, exports, __webpack_require__) {
5889
+
5890
+ var baseIsEqualDeep = __webpack_require__(260),
5891
+ isObjectLike = __webpack_require__(14);
5892
+
5893
+ /**
5894
+ * The base implementation of `_.isEqual` which supports partial comparisons
5895
+ * and tracks traversed objects.
5896
+ *
5897
+ * @private
5898
+ * @param {*} value The value to compare.
5899
+ * @param {*} other The other value to compare.
5900
+ * @param {boolean} bitmask The bitmask flags.
5901
+ * 1 - Unordered comparison
5902
+ * 2 - Partial comparison
5903
+ * @param {Function} [customizer] The function to customize comparisons.
5904
+ * @param {Object} [stack] Tracks traversed `value` and `other` objects.
5905
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
5906
+ */
5907
+ function baseIsEqual(value, other, bitmask, customizer, stack) {
5908
+ if (value === other) {
5909
+ return true;
5910
+ }
5911
+ if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
5912
+ return value !== value && other !== other;
5913
+ }
5914
+ return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
5915
+ }
5916
+
5917
+ module.exports = baseIsEqual;
5918
+
5919
+
5920
+ /***/ }),
5921
+ /* 140 */
5922
+ /***/ (function(module, exports, __webpack_require__) {
5923
+
5924
+ var SetCache = __webpack_require__(151),
5925
+ arraySome = __webpack_require__(261),
5926
+ cacheHas = __webpack_require__(152);
5927
+
5928
+ /** Used to compose bitmasks for value comparisons. */
5929
+ var COMPARE_PARTIAL_FLAG = 1,
5930
+ COMPARE_UNORDERED_FLAG = 2;
5931
+
5932
+ /**
5933
+ * A specialized version of `baseIsEqualDeep` for arrays with support for
5934
+ * partial deep comparisons.
5935
+ *
5936
+ * @private
5937
+ * @param {Array} array The array to compare.
5938
+ * @param {Array} other The other array to compare.
5939
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5940
+ * @param {Function} customizer The function to customize comparisons.
5941
+ * @param {Function} equalFunc The function to determine equivalents of values.
5942
+ * @param {Object} stack Tracks traversed `array` and `other` objects.
5943
+ * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
5944
+ */
5945
+ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
5946
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5947
+ arrLength = array.length,
5948
+ othLength = other.length;
5949
+
5950
+ if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
5951
+ return false;
5952
+ }
5953
+ // Assume cyclic values are equal.
5954
+ var stacked = stack.get(array);
5955
+ if (stacked && stack.get(other)) {
5956
+ return stacked == other;
5957
+ }
5958
+ var index = -1,
5959
+ result = true,
5960
+ seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
5961
+
5962
+ stack.set(array, other);
5963
+ stack.set(other, array);
5964
+
5965
+ // Ignore non-index properties.
5966
+ while (++index < arrLength) {
5967
+ var arrValue = array[index],
5968
+ othValue = other[index];
5969
+
5970
+ if (customizer) {
5971
+ var compared = isPartial
5972
+ ? customizer(othValue, arrValue, index, other, array, stack)
5973
+ : customizer(arrValue, othValue, index, array, other, stack);
5974
+ }
5975
+ if (compared !== undefined) {
5976
+ if (compared) {
5977
+ continue;
5978
+ }
5979
+ result = false;
5980
+ break;
5981
+ }
5982
+ // Recursively compare arrays (susceptible to call stack limits).
5983
+ if (seen) {
5984
+ if (!arraySome(other, function(othValue, othIndex) {
5985
+ if (!cacheHas(seen, othIndex) &&
5986
+ (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
5987
+ return seen.push(othIndex);
5988
+ }
5989
+ })) {
5990
+ result = false;
5991
+ break;
5992
+ }
5993
+ } else if (!(
5994
+ arrValue === othValue ||
5995
+ equalFunc(arrValue, othValue, bitmask, customizer, stack)
5996
+ )) {
5997
+ result = false;
5998
+ break;
5999
+ }
6000
+ }
6001
+ stack['delete'](array);
6002
+ stack['delete'](other);
6003
+ return result;
6004
+ }
6005
+
6006
+ module.exports = equalArrays;
6007
+
6008
+
6009
+ /***/ }),
6010
+ /* 141 */
6011
+ /***/ (function(module, exports, __webpack_require__) {
6012
+
6013
+ var isObject = __webpack_require__(18);
6014
+
6015
+ /**
6016
+ * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
6017
+ *
6018
+ * @private
6019
+ * @param {*} value The value to check.
6020
+ * @returns {boolean} Returns `true` if `value` if suitable for strict
6021
+ * equality comparisons, else `false`.
6022
+ */
6023
+ function isStrictComparable(value) {
6024
+ return value === value && !isObject(value);
6025
+ }
6026
+
6027
+ module.exports = isStrictComparable;
6028
+
6029
+
6030
+ /***/ }),
6031
+ /* 142 */
6032
+ /***/ (function(module, exports) {
6033
+
6034
+ /**
6035
+ * A specialized version of `matchesProperty` for source values suitable
6036
+ * for strict equality comparisons, i.e. `===`.
6037
+ *
6038
+ * @private
6039
+ * @param {string} key The key of the property to get.
6040
+ * @param {*} srcValue The value to match.
6041
+ * @returns {Function} Returns the new spec function.
6042
+ */
6043
+ function matchesStrictComparable(key, srcValue) {
6044
+ return function(object) {
6045
+ if (object == null) {
6046
+ return false;
6047
+ }
6048
+ return object[key] === srcValue &&
6049
+ (srcValue !== undefined || (key in Object(object)));
6050
+ };
6051
+ }
6052
+
6053
+ module.exports = matchesStrictComparable;
6054
+
6055
+
6056
+ /***/ }),
6057
+ /* 143 */
6058
+ /***/ (function(module, exports, __webpack_require__) {
6059
+
6060
+ var castPath = __webpack_require__(144),
6061
+ toKey = __webpack_require__(47);
6062
+
6063
+ /**
6064
+ * The base implementation of `_.get` without support for default values.
6065
+ *
6066
+ * @private
6067
+ * @param {Object} object The object to query.
6068
+ * @param {Array|string} path The path of the property to get.
6069
+ * @returns {*} Returns the resolved value.
6070
+ */
6071
+ function baseGet(object, path) {
6072
+ path = castPath(path, object);
6073
+
6074
+ var index = 0,
6075
+ length = path.length;
6076
+
6077
+ while (object != null && index < length) {
6078
+ object = object[toKey(path[index++])];
6079
+ }
6080
+ return (index && index == length) ? object : undefined;
6081
+ }
6082
+
6083
+ module.exports = baseGet;
6084
+
6085
+
6086
+ /***/ }),
6087
+ /* 144 */
6088
+ /***/ (function(module, exports, __webpack_require__) {
6089
+
6090
+ var isArray = __webpack_require__(6),
6091
+ isKey = __webpack_require__(90),
6092
+ stringToPath = __webpack_require__(165),
6093
+ toString = __webpack_require__(97);
6094
+
6095
+ /**
6096
+ * Casts `value` to a path array if it's not one.
6097
+ *
6098
+ * @private
6099
+ * @param {*} value The value to inspect.
6100
+ * @param {Object} [object] The object to query keys on.
6101
+ * @returns {Array} Returns the cast property path array.
6102
+ */
6103
+ function castPath(value, object) {
6104
+ if (isArray(value)) {
6105
+ return value;
6106
+ }
6107
+ return isKey(value, object) ? [value] : stringToPath(toString(value));
6108
+ }
6109
+
6110
+ module.exports = castPath;
6111
+
6112
+
6113
+ /***/ }),
6114
+ /* 145 */
6115
+ /***/ (function(module, exports, __webpack_require__) {
6116
+
6117
+ // 7.3.20 SpeciesConstructor(O, defaultConstructor)
6118
+ var anObject = __webpack_require__(17);
6119
+ var aFunction = __webpack_require__(53);
6120
+ var SPECIES = __webpack_require__(12)('species');
6121
+ module.exports = function (O, D) {
6122
+ var C = anObject(O).constructor;
6123
+ var S;
6124
+ return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
6125
+ };
6126
+
6127
+
6128
+ /***/ }),
6129
+ /* 146 */
6130
+ /***/ (function(module, exports, __webpack_require__) {
6131
+
6132
+ var ctx = __webpack_require__(40);
6133
+ var invoke = __webpack_require__(292);
6134
+ var html = __webpack_require__(133);
6135
+ var cel = __webpack_require__(80);
6136
+ var global = __webpack_require__(9);
6137
+ var process = global.process;
6138
+ var setTask = global.setImmediate;
6139
+ var clearTask = global.clearImmediate;
6140
+ var MessageChannel = global.MessageChannel;
6141
+ var Dispatch = global.Dispatch;
6142
+ var counter = 0;
6143
+ var queue = {};
6144
+ var ONREADYSTATECHANGE = 'onreadystatechange';
6145
+ var defer, channel, port;
6146
+ var run = function () {
6147
+ var id = +this;
6148
+ // eslint-disable-next-line no-prototype-builtins
6149
+ if (queue.hasOwnProperty(id)) {
6150
+ var fn = queue[id];
6151
+ delete queue[id];
6152
+ fn();
6153
+ }
6154
+ };
6155
+ var listener = function (event) {
6156
+ run.call(event.data);
6157
+ };
6158
+ // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
6159
+ if (!setTask || !clearTask) {
6160
+ setTask = function setImmediate(fn) {
6161
+ var args = [];
6162
+ var i = 1;
6163
+ while (arguments.length > i) args.push(arguments[i++]);
6164
+ queue[++counter] = function () {
6165
+ // eslint-disable-next-line no-new-func
6166
+ invoke(typeof fn == 'function' ? fn : Function(fn), args);
6167
+ };
6168
+ defer(counter);
6169
+ return counter;
6170
+ };
6171
+ clearTask = function clearImmediate(id) {
6172
+ delete queue[id];
6173
+ };
6174
+ // Node.js 0.8-
6175
+ if (__webpack_require__(48)(process) == 'process') {
6176
+ defer = function (id) {
6177
+ process.nextTick(ctx(run, id, 1));
6178
+ };
6179
+ // Sphere (JS game engine) Dispatch API
6180
+ } else if (Dispatch && Dispatch.now) {
6181
+ defer = function (id) {
6182
+ Dispatch.now(ctx(run, id, 1));
6183
+ };
6184
+ // Browsers with MessageChannel, includes WebWorkers
6185
+ } else if (MessageChannel) {
6186
+ channel = new MessageChannel();
6187
+ port = channel.port2;
6188
+ channel.port1.onmessage = listener;
6189
+ defer = ctx(port.postMessage, port, 1);
6190
+ // Browsers with postMessage, skip WebWorkers
6191
+ // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
6192
+ } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
6193
+ defer = function (id) {
6194
+ global.postMessage(id + '', '*');
6195
+ };
6196
+ global.addEventListener('message', listener, false);
6197
+ // IE8-
6198
+ } else if (ONREADYSTATECHANGE in cel('script')) {
6199
+ defer = function (id) {
6200
+ html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
6201
+ html.removeChild(this);
6202
+ run.call(id);
6203
+ };
6204
+ };
6205
+ // Rest old browsers
6206
+ } else {
6207
+ defer = function (id) {
6208
+ setTimeout(ctx(run, id, 1), 0);
6209
+ };
6210
+ }
6211
+ }
6212
+ module.exports = {
6213
+ set: setTask,
6214
+ clear: clearTask
6215
+ };
6216
+
6217
+
6218
+ /***/ }),
6219
+ /* 147 */
6220
+ /***/ (function(module, exports) {
6221
+
6222
+ module.exports = function (exec) {
6223
+ try {
6224
+ return { e: false, v: exec() };
6225
+ } catch (e) {
6226
+ return { e: true, v: e };
6227
+ }
6228
+ };
6229
+
6230
+
6231
+ /***/ }),
6232
+ /* 148 */
6233
+ /***/ (function(module, exports, __webpack_require__) {
6234
+
6235
+ var anObject = __webpack_require__(17);
6236
+ var isObject = __webpack_require__(24);
6237
+ var newPromiseCapability = __webpack_require__(92);
6238
+
6239
+ module.exports = function (C, x) {
6240
+ anObject(C);
6241
+ if (isObject(x) && x.constructor === C) return x;
6242
+ var promiseCapability = newPromiseCapability.f(C);
6243
+ var resolve = promiseCapability.resolve;
6244
+ resolve(x);
6245
+ return promiseCapability.promise;
6246
+ };
6247
+
6248
+
6249
+ /***/ }),
6250
+ /* 149 */,
6251
+ /* 150 */
6252
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
6253
+
6254
+ "use strict";
6255
+ __webpack_require__.r(__webpack_exports__);
6256
+
6257
+ // EXTERNAL MODULE: ./src/modules/data/editor/post-types.js
6258
+ var post_types = __webpack_require__(77);
6259
+
6260
+ // EXTERNAL MODULE: ./src/modules/data/forms/index.js + 7 modules
6261
+ var data_forms = __webpack_require__(34);
6262
+
6263
+ // EXTERNAL MODULE: ./src/modules/data/plugins/index.js + 6 modules
6264
+ var plugins = __webpack_require__(60);
6265
+
6266
+ // EXTERNAL MODULE: ./node_modules/@nfen/redux-reducer-injector/es/index.js + 4 modules
6267
+ var es = __webpack_require__(99);
6268
+
6269
+ // CONCATENATED MODULE: ./src/modules/data/reducers.js
6270
+ /**
6271
+ * External dependencies
6272
+ */
6273
+
6274
+
6275
+
6276
+ /**
6277
+ * Internal dependencies
6278
+ */
6279
+
6280
+
6281
+ /* harmony default export */ var reducers = (Object(es["b" /* setupCreateReducer */])({
6282
+ plugins: plugins["default"],
6283
+ forms: data_forms["default"]
6284
+ }));
6285
+ // CONCATENATED MODULE: ./src/modules/data/index.js
6286
+ /* concated harmony reexport default */__webpack_require__.d(__webpack_exports__, "default", function() { return reducers; });
6287
+ /* concated harmony reexport editor */__webpack_require__.d(__webpack_exports__, "editor", function() { return post_types; });
6288
+ /* concated harmony reexport forms */__webpack_require__.d(__webpack_exports__, "forms", function() { return data_forms; });
6289
+ /* concated harmony reexport plugins */__webpack_require__.d(__webpack_exports__, "plugins", function() { return plugins; });
6290
+ /**
6291
+ * Internal Dependencies
6292
+ */
6293
+
6294
+
6295
+
6296
+
6297
+
6298
+
6299
+
6300
+ /***/ }),
6301
+ /* 151 */
6302
+ /***/ (function(module, exports, __webpack_require__) {
6303
+
6304
+ var MapCache = __webpack_require__(83),
6305
+ setCacheAdd = __webpack_require__(241),
6306
+ setCacheHas = __webpack_require__(242);
6307
+
6308
+ /**
6309
+ *
6310
+ * Creates an array cache object to store unique values.
6311
+ *
6312
+ * @private
6313
+ * @constructor
6314
+ * @param {Array} [values] The values to cache.
6315
+ */
6316
+ function SetCache(values) {
6317
+ var index = -1,
6318
+ length = values == null ? 0 : values.length;
6319
+
6320
+ this.__data__ = new MapCache;
6321
+ while (++index < length) {
6322
+ this.add(values[index]);
6323
+ }
6324
+ }
6325
+
6326
+ // Add methods to `SetCache`.
6327
+ SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
6328
+ SetCache.prototype.has = setCacheHas;
6329
+
6330
+ module.exports = SetCache;
6331
+
6332
+
6333
+ /***/ }),
6334
+ /* 152 */
6335
+ /***/ (function(module, exports) {
6336
+
6337
+ /**
6338
+ * Checks if a `cache` value for `key` exists.
6339
+ *
6340
+ * @private
6341
+ * @param {Object} cache The cache to query.
6342
+ * @param {string} key The key of the entry to check.
6343
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
6344
+ */
6345
+ function cacheHas(cache, key) {
6346
+ return cache.has(key);
6347
+ }
6348
+
6349
+ module.exports = cacheHas;
6350
+
6351
+
6352
+ /***/ }),
6353
+ /* 153 */
6354
+ /***/ (function(module, exports, __webpack_require__) {
6355
+
6356
+ var getNative = __webpack_require__(25),
6357
+ root = __webpack_require__(11);
6358
+
6359
+ /* Built-in method references that are verified to be native. */
6360
+ var Set = getNative(root, 'Set');
6361
+
6362
+ module.exports = Set;
6363
+
6364
+
6365
+ /***/ }),
6366
+ /* 154 */
6367
+ /***/ (function(module, exports, __webpack_require__) {
6368
+
6369
+ var getNative = __webpack_require__(25),
6370
+ root = __webpack_require__(11);
6371
+
6372
+ /* Built-in method references that are verified to be native. */
6373
+ var WeakMap = getNative(root, 'WeakMap');
6374
+
6375
+ module.exports = WeakMap;
6376
+
6377
+
6378
+ /***/ }),
6379
+ /* 155 */
6380
+ /***/ (function(module, exports, __webpack_require__) {
6381
+
6382
+ var baseSetToString = __webpack_require__(332),
6383
+ shortOut = __webpack_require__(186);
6384
+
6385
+ /**
6386
+ * Sets the `toString` method of `func` to return `string`.
6387
+ *
6388
+ * @private
6389
+ * @param {Function} func The function to modify.
6390
+ * @param {Function} string The `toString` result.
6391
+ * @returns {Function} Returns `func`.
6392
+ */
6393
+ var setToString = shortOut(baseSetToString);
6394
+
6395
+ module.exports = setToString;
6396
+
6397
+
6398
+ /***/ }),
6399
+ /* 156 */
6400
+ /***/ (function(module, exports) {
6401
+
6402
+ /**
6403
+ * Gets the argument placeholder value for `func`.
6404
+ *
6405
+ * @private
6406
+ * @param {Function} func The function to inspect.
6407
+ * @returns {*} Returns the placeholder value.
6408
+ */
6409
+ function getHolder(func) {
6410
+ var object = func;
6411
+ return object.placeholder;
6412
+ }
6413
+
6414
+ module.exports = getHolder;
6415
+
6416
+
6417
+ /***/ }),
6418
+ /* 157 */
6419
+ /***/ (function(module, exports, __webpack_require__) {
6420
+
6421
+ var toNumber = __webpack_require__(158);
6422
+
6423
+ /** Used as references for various `Number` constants. */
6424
+ var INFINITY = 1 / 0,
6425
+ MAX_INTEGER = 1.7976931348623157e+308;
6426
+
6427
+ /**
6428
+ * Converts `value` to a finite number.
6429
+ *
6430
+ * @static
6431
+ * @memberOf _
6432
+ * @since 4.12.0
6433
+ * @category Lang
6434
+ * @param {*} value The value to convert.
6435
+ * @returns {number} Returns the converted number.
6436
+ * @example
6437
+ *
6438
+ * _.toFinite(3.2);
6439
+ * // => 3.2
6440
+ *
6441
+ * _.toFinite(Number.MIN_VALUE);
6442
+ * // => 5e-324
6443
+ *
6444
+ * _.toFinite(Infinity);
6445
+ * // => 1.7976931348623157e+308
6446
+ *
6447
+ * _.toFinite('3.2');
6448
+ * // => 3.2
6449
+ */
6450
+ function toFinite(value) {
6451
+ if (!value) {
6452
+ return value === 0 ? value : 0;
6453
+ }
6454
+ value = toNumber(value);
6455
+ if (value === INFINITY || value === -INFINITY) {
6456
+ var sign = (value < 0 ? -1 : 1);
6457
+ return sign * MAX_INTEGER;
6458
+ }
6459
+ return value === value ? value : 0;
6460
+ }
6461
+
6462
+ module.exports = toFinite;
6463
+
6464
+
6465
+ /***/ }),
6466
+ /* 158 */
6467
+ /***/ (function(module, exports, __webpack_require__) {
6468
+
6469
+ var isObject = __webpack_require__(18),
6470
+ isSymbol = __webpack_require__(46);
6471
+
6472
+ /** Used as references for various `Number` constants. */
6473
+ var NAN = 0 / 0;
6474
+
6475
+ /** Used to match leading and trailing whitespace. */
6476
+ var reTrim = /^\s+|\s+$/g;
6477
+
6478
+ /** Used to detect bad signed hexadecimal string values. */
6479
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
6480
+
6481
+ /** Used to detect binary string values. */
6482
+ var reIsBinary = /^0b[01]+$/i;
6483
+
6484
+ /** Used to detect octal string values. */
6485
+ var reIsOctal = /^0o[0-7]+$/i;
6486
+
6487
+ /** Built-in method references without a dependency on `root`. */
6488
+ var freeParseInt = parseInt;
6489
+
6490
+ /**
6491
+ * Converts `value` to a number.
6492
+ *
6493
+ * @static
6494
+ * @memberOf _
6495
+ * @since 4.0.0
6496
+ * @category Lang
6497
+ * @param {*} value The value to process.
6498
+ * @returns {number} Returns the number.
6499
+ * @example
6500
+ *
6501
+ * _.toNumber(3.2);
6502
+ * // => 3.2
6503
+ *
6504
+ * _.toNumber(Number.MIN_VALUE);
6505
+ * // => 5e-324
6506
+ *
6507
+ * _.toNumber(Infinity);
6508
+ * // => Infinity
6509
+ *
6510
+ * _.toNumber('3.2');
6511
+ * // => 3.2
6512
+ */
6513
+ function toNumber(value) {
6514
+ if (typeof value == 'number') {
6515
+ return value;
6516
+ }
6517
+ if (isSymbol(value)) {
6518
+ return NAN;
6519
+ }
6520
+ if (isObject(value)) {
6521
+ var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
6522
+ value = isObject(other) ? (other + '') : other;
6523
+ }
6524
+ if (typeof value != 'string') {
6525
+ return value === 0 ? value : +value;
6526
+ }
6527
+ value = value.replace(reTrim, '');
6528
+ var isBinary = reIsBinary.test(value);
6529
+ return (isBinary || reIsOctal.test(value))
6530
+ ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
6531
+ : (reIsBadHex.test(value) ? NAN : +value);
6532
+ }
6533
+
6534
+ module.exports = toNumber;
6535
+
6536
+
6537
+ /***/ }),
6538
+ /* 159 */
6539
+ /***/ (function(module, exports, __webpack_require__) {
6540
+
6541
+ var baseTimes = __webpack_require__(245),
6542
+ isArguments = __webpack_require__(58),
6543
+ isArray = __webpack_require__(6),
6544
+ isBuffer = __webpack_require__(59),
6545
+ isIndex = __webpack_require__(74),
6546
+ isTypedArray = __webpack_require__(86);
6547
+
6548
+ /** Used for built-in method references. */
6549
+ var objectProto = Object.prototype;
6550
+
6551
+ /** Used to check objects for own properties. */
6552
+ var hasOwnProperty = objectProto.hasOwnProperty;
6553
+
6554
+ /**
6555
+ * Creates an array of the enumerable property names of the array-like `value`.
6556
+ *
6557
+ * @private
6558
+ * @param {*} value The value to query.
6559
+ * @param {boolean} inherited Specify returning inherited property names.
6560
+ * @returns {Array} Returns the array of property names.
6561
+ */
6562
+ function arrayLikeKeys(value, inherited) {
6563
+ var isArr = isArray(value),
6564
+ isArg = !isArr && isArguments(value),
6565
+ isBuff = !isArr && !isArg && isBuffer(value),
6566
+ isType = !isArr && !isArg && !isBuff && isTypedArray(value),
6567
+ skipIndexes = isArr || isArg || isBuff || isType,
6568
+ result = skipIndexes ? baseTimes(value.length, String) : [],
6569
+ length = result.length;
6570
+
6571
+ for (var key in value) {
6572
+ if ((inherited || hasOwnProperty.call(value, key)) &&
6573
+ !(skipIndexes && (
6574
+ // Safari 9 has enumerable `arguments.length` in strict mode.
6575
+ key == 'length' ||
6576
+ // Node.js 0.10 has enumerable non-index properties on buffers.
6577
+ (isBuff && (key == 'offset' || key == 'parent')) ||
6578
+ // PhantomJS 2 has enumerable non-index properties on typed arrays.
6579
+ (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
6580
+ // Skip index properties.
6581
+ isIndex(key, length)
6582
+ ))) {
6583
+ result.push(key);
6584
+ }
6585
+ }
6586
+ return result;
6587
+ }
6588
+
6589
+ module.exports = arrayLikeKeys;
6590
+
6591
+
6592
+ /***/ }),
6593
+ /* 160 */
6594
+ /***/ (function(module, exports) {
6595
+
6596
+ /**
6597
+ * Creates a unary function that invokes `func` with its argument transformed.
6598
+ *
6599
+ * @private
6600
+ * @param {Function} func The function to wrap.
6601
+ * @param {Function} transform The argument transform.
6602
+ * @returns {Function} Returns the new function.
6603
+ */
6604
+ function overArg(func, transform) {
6605
+ return function(arg) {
6606
+ return func(transform(arg));
6607
+ };
6608
+ }
6609
+
6610
+ module.exports = overArg;
6611
+
6612
+
6613
+ /***/ }),
6614
+ /* 161 */
6615
+ /***/ (function(module, exports) {
6616
+
6617
+ /**
6618
+ * This method returns a new empty array.
6619
+ *
6620
+ * @static
6621
+ * @memberOf _
6622
+ * @since 4.13.0
6623
+ * @category Util
6624
+ * @returns {Array} Returns the new empty array.
6625
+ * @example
6626
+ *
6627
+ * var arrays = _.times(2, _.stubArray);
6628
+ *
6629
+ * console.log(arrays);
6630
+ * // => [[], []]
6631
+ *
6632
+ * console.log(arrays[0] === arrays[1]);
6633
+ * // => false
6634
+ */
6635
+ function stubArray() {
6636
+ return [];
6637
+ }
6638
+
6639
+ module.exports = stubArray;
6640
+
6641
+
6642
+ /***/ }),
6643
+ /* 162 */
6644
+ /***/ (function(module, exports, __webpack_require__) {
6645
+
6646
+ var baseGetAllKeys = __webpack_require__(163),
6647
+ getSymbols = __webpack_require__(106),
6648
+ keys = __webpack_require__(31);
6649
+
6650
+ /**
6651
+ * Creates an array of own enumerable property names and symbols of `object`.
6652
+ *
6653
+ * @private
6654
+ * @param {Object} object The object to query.
6655
+ * @returns {Array} Returns the array of property names and symbols.
6656
+ */
6657
+ function getAllKeys(object) {
6658
+ return baseGetAllKeys(object, keys, getSymbols);
6659
+ }
6660
+
6661
+ module.exports = getAllKeys;
6662
+
6663
+
6664
+ /***/ }),
6665
+ /* 163 */
6666
+ /***/ (function(module, exports, __webpack_require__) {
6667
+
6668
+ var arrayPush = __webpack_require__(96),
6669
+ isArray = __webpack_require__(6);
6670
+
6671
+ /**
6672
+ * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
6673
+ * `keysFunc` and `symbolsFunc` to get the enumerable property names and
6674
+ * symbols of `object`.
6675
+ *
6676
+ * @private
6677
+ * @param {Object} object The object to query.
6678
+ * @param {Function} keysFunc The function to get the keys of `object`.
6679
+ * @param {Function} symbolsFunc The function to get the symbols of `object`.
6680
+ * @returns {Array} Returns the array of property names and symbols.
6681
+ */
6682
+ function baseGetAllKeys(object, keysFunc, symbolsFunc) {
6683
+ var result = keysFunc(object);
6684
+ return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
6685
+ }
6686
+
6687
+ module.exports = baseGetAllKeys;
6688
+
6689
+
6690
+ /***/ }),
6691
+ /* 164 */
6692
+ /***/ (function(module, exports, __webpack_require__) {
6693
+
6694
+ var root = __webpack_require__(11);
6695
+
6696
+ /** Built-in value references. */
6697
+ var Uint8Array = root.Uint8Array;
6698
+
6699
+ module.exports = Uint8Array;
6700
+
6701
+
6702
+ /***/ }),
6703
+ /* 165 */
6704
+ /***/ (function(module, exports, __webpack_require__) {
6705
+
6706
+ var memoizeCapped = __webpack_require__(267);
6707
+
6708
+ /** Used to match property names within property paths. */
6709
+ var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
6710
+
6711
+ /** Used to match backslashes in property paths. */
6712
+ var reEscapeChar = /\\(\\)?/g;
6713
+
6714
+ /**
6715
+ * Converts `string` to a property path array.
6716
+ *
6717
+ * @private
6718
+ * @param {string} string The string to convert.
6719
+ * @returns {Array} Returns the property path array.
6720
+ */
6721
+ var stringToPath = memoizeCapped(function(string) {
6722
+ var result = [];
6723
+ if (string.charCodeAt(0) === 46 /* . */) {
6724
+ result.push('');
6725
+ }
6726
+ string.replace(rePropName, function(match, number, quote, subString) {
6727
+ result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
6728
+ });
6729
+ return result;
6730
+ });
6731
+
6732
+ module.exports = stringToPath;
6733
+
6734
+
6735
+ /***/ }),
6736
+ /* 166 */
6737
+ /***/ (function(module, exports, __webpack_require__) {
6738
+
6739
+ module.exports = !__webpack_require__(20) && !__webpack_require__(50)(function () {
6740
+ return Object.defineProperty(__webpack_require__(80)('div'), 'a', { get: function () { return 7; } }).a != 7;
6741
+ });
6742
+
6743
+
6744
+ /***/ }),
6745
+ /* 167 */
6746
+ /***/ (function(module, exports, __webpack_require__) {
6747
+
6748
+ module.exports = __webpack_require__(30);
6749
+
6750
+
6751
+ /***/ }),
6752
+ /* 168 */
6753
+ /***/ (function(module, exports, __webpack_require__) {
6754
+
6755
+ var has = __webpack_require__(36);
6756
+ var toIObject = __webpack_require__(45);
6757
+ var arrayIndexOf = __webpack_require__(213)(false);
6758
+ var IE_PROTO = __webpack_require__(82)('IE_PROTO');
6759
+
6760
+ module.exports = function (object, names) {
6761
+ var O = toIObject(object);
6762
+ var i = 0;
6763
+ var result = [];
6764
+ var key;
6765
+ for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
6766
+ // Don't enum bug & hidden keys
6767
+ while (names.length > i) if (has(O, key = names[i++])) {
6768
+ ~arrayIndexOf(result, key) || result.push(key);
6769
+ }
6770
+ return result;
6771
+ };
6772
+
6773
+
6774
+ /***/ }),
6775
+ /* 169 */
6776
+ /***/ (function(module, exports, __webpack_require__) {
6777
+
6778
+ var Symbol = __webpack_require__(37),
6779
+ arrayMap = __webpack_require__(76),
6780
+ isArray = __webpack_require__(6),
6781
+ isSymbol = __webpack_require__(46);
6782
+
6783
+ /** Used as references for various `Number` constants. */
6784
+ var INFINITY = 1 / 0;
6785
+
6786
+ /** Used to convert symbols to primitives and strings. */
6787
+ var symbolProto = Symbol ? Symbol.prototype : undefined,
6788
+ symbolToString = symbolProto ? symbolProto.toString : undefined;
6789
+
6790
+ /**
6791
+ * The base implementation of `_.toString` which doesn't convert nullish
6792
+ * values to empty strings.
6793
+ *
6794
+ * @private
6795
+ * @param {*} value The value to process.
6796
+ * @returns {string} Returns the string.
6797
+ */
6798
+ function baseToString(value) {
6799
+ // Exit early for strings to avoid a performance hit in some environments.
6800
+ if (typeof value == 'string') {
6801
+ return value;
6802
+ }
6803
+ if (isArray(value)) {
6804
+ // Recursively convert values (susceptible to call stack limits).
6805
+ return arrayMap(value, baseToString) + '';
6806
+ }
6807
+ if (isSymbol(value)) {
6808
+ return symbolToString ? symbolToString.call(value) : '';
6809
+ }
6810
+ var result = (value + '');
6811
+ return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
6812
+ }
6813
+
6814
+ module.exports = baseToString;
6815
+
6816
+
6817
+ /***/ }),
6818
+ /* 170 */
6819
+ /***/ (function(module, exports) {
6820
+
6821
+
6822
+
6823
+ /***/ }),
6824
+ /* 171 */
6825
+ /***/ (function(module, exports, __webpack_require__) {
6826
+
6827
+ exports.f = __webpack_require__(12);
6828
+
6829
+
6830
+ /***/ }),
6831
+ /* 172 */
6832
+ /***/ (function(module, exports, __webpack_require__) {
6833
+
6834
+ var global = __webpack_require__(9);
6835
+ var core = __webpack_require__(10);
6836
+ var LIBRARY = __webpack_require__(49);
6837
+ var wksExt = __webpack_require__(171);
6838
+ var defineProperty = __webpack_require__(23).f;
6839
+ module.exports = function (name) {
6840
+ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
6841
+ if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
6842
+ };
6843
+
6844
+
6845
+ /***/ }),
6846
+ /* 173 */,
6847
+ /* 174 */
6848
+ /***/ (function(module, exports, __webpack_require__) {
6849
+
6850
+ var baseIndexOf = __webpack_require__(113);
6851
+
6852
+ /**
6853
+ * A specialized version of `_.includes` for arrays without support for
6854
+ * specifying an index to search from.
6855
+ *
6856
+ * @private
6857
+ * @param {Array} [array] The array to inspect.
6858
+ * @param {*} target The value to search for.
6859
+ * @returns {boolean} Returns `true` if `target` is found, else `false`.
6860
+ */
6861
+ function arrayIncludes(array, value) {
6862
+ var length = array == null ? 0 : array.length;
6863
+ return !!length && baseIndexOf(array, value, 0) > -1;
6864
+ }
6865
+
6866
+ module.exports = arrayIncludes;
6867
+
6868
+
6869
+ /***/ }),
6870
+ /* 175 */
6871
+ /***/ (function(module, exports) {
6872
+
6873
+ /**
6874
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
6875
+ * support for iteratee shorthands.
6876
+ *
6877
+ * @private
6878
+ * @param {Array} array The array to inspect.
6879
+ * @param {Function} predicate The function invoked per iteration.
6880
+ * @param {number} fromIndex The index to search from.
6881
+ * @param {boolean} [fromRight] Specify iterating from right to left.
6882
+ * @returns {number} Returns the index of the matched value, else `-1`.
6883
+ */
6884
+ function baseFindIndex(array, predicate, fromIndex, fromRight) {
6885
+ var length = array.length,
6886
+ index = fromIndex + (fromRight ? 1 : -1);
6887
+
6888
+ while ((fromRight ? index-- : ++index < length)) {
6889
+ if (predicate(array[index], index, array)) {
6890
+ return index;
6891
+ }
6892
+ }
6893
+ return -1;
6894
+ }
6895
+
6896
+ module.exports = baseFindIndex;
6897
+
6898
+
6899
+ /***/ }),
6900
+ /* 176 */
6901
+ /***/ (function(module, exports) {
6902
+
6903
+ /**
6904
+ * The default argument placeholder value for methods.
6905
+ *
6906
+ * @type {Object}
6907
+ */
6908
+ module.exports = {};
6909
+
6910
+
6911
+ /***/ }),
6912
+ /* 177 */
6913
+ /***/ (function(module, exports, __webpack_require__) {
6914
+
6915
+ var identity = __webpack_require__(52),
6916
+ metaMap = __webpack_require__(178);
6917
+
6918
+ /**
6919
+ * The base implementation of `setData` without support for hot loop shorting.
6920
+ *
6921
+ * @private
6922
+ * @param {Function} func The function to associate metadata with.
6923
+ * @param {*} data The metadata.
6924
+ * @returns {Function} Returns `func`.
6925
+ */
6926
+ var baseSetData = !metaMap ? identity : function(func, data) {
6927
+ metaMap.set(func, data);
6928
+ return func;
6929
+ };
6930
+
6931
+ module.exports = baseSetData;
6932
+
6933
+
6934
+ /***/ }),
6935
+ /* 178 */
6936
+ /***/ (function(module, exports, __webpack_require__) {
6937
+
6938
+ var WeakMap = __webpack_require__(154);
6939
+
6940
+ /** Used to store function metadata. */
6941
+ var metaMap = WeakMap && new WeakMap;
6942
+
6943
+ module.exports = metaMap;
6944
+
6945
+
6946
+ /***/ }),
6947
+ /* 179 */
6948
+ /***/ (function(module, exports, __webpack_require__) {
6949
+
6950
+ var composeArgs = __webpack_require__(180),
6951
+ composeArgsRight = __webpack_require__(181),
6952
+ countHolders = __webpack_require__(324),
6953
+ createCtor = __webpack_require__(71),
6954
+ createRecurry = __webpack_require__(182),
6955
+ getHolder = __webpack_require__(156),
6956
+ reorder = __webpack_require__(335),
6957
+ replaceHolders = __webpack_require__(105),
6958
+ root = __webpack_require__(11);
6959
+
6960
+ /** Used to compose bitmasks for function metadata. */
6961
+ var WRAP_BIND_FLAG = 1,
6962
+ WRAP_BIND_KEY_FLAG = 2,
6963
+ WRAP_CURRY_FLAG = 8,
6964
+ WRAP_CURRY_RIGHT_FLAG = 16,
6965
+ WRAP_ARY_FLAG = 128,
6966
+ WRAP_FLIP_FLAG = 512;
6967
+
6968
+ /**
6969
+ * Creates a function that wraps `func` to invoke it with optional `this`
6970
+ * binding of `thisArg`, partial application, and currying.
6971
+ *
6972
+ * @private
6973
+ * @param {Function|string} func The function or method name to wrap.
6974
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6975
+ * @param {*} [thisArg] The `this` binding of `func`.
6976
+ * @param {Array} [partials] The arguments to prepend to those provided to
6977
+ * the new function.
6978
+ * @param {Array} [holders] The `partials` placeholder indexes.
6979
+ * @param {Array} [partialsRight] The arguments to append to those provided
6980
+ * to the new function.
6981
+ * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
6982
+ * @param {Array} [argPos] The argument positions of the new function.
6983
+ * @param {number} [ary] The arity cap of `func`.
6984
+ * @param {number} [arity] The arity of `func`.
6985
+ * @returns {Function} Returns the new wrapped function.
6986
+ */
6987
+ function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
6988
+ var isAry = bitmask & WRAP_ARY_FLAG,
6989
+ isBind = bitmask & WRAP_BIND_FLAG,
6990
+ isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
6991
+ isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
6992
+ isFlip = bitmask & WRAP_FLIP_FLAG,
6993
+ Ctor = isBindKey ? undefined : createCtor(func);
6994
+
6995
+ function wrapper() {
6996
+ var length = arguments.length,
6997
+ args = Array(length),
6998
+ index = length;
6999
+
7000
+ while (index--) {
7001
+ args[index] = arguments[index];
7002
+ }
7003
+ if (isCurried) {
7004
+ var placeholder = getHolder(wrapper),
7005
+ holdersCount = countHolders(args, placeholder);
7006
+ }
7007
+ if (partials) {
7008
+ args = composeArgs(args, partials, holders, isCurried);
7009
+ }
7010
+ if (partialsRight) {
7011
+ args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
7012
+ }
7013
+ length -= holdersCount;
7014
+ if (isCurried && length < arity) {
7015
+ var newHolders = replaceHolders(args, placeholder);
7016
+ return createRecurry(
7017
+ func, bitmask, createHybrid, wrapper.placeholder, thisArg,
7018
+ args, newHolders, argPos, ary, arity - length
7019
+ );
7020
+ }
7021
+ var thisBinding = isBind ? thisArg : this,
7022
+ fn = isBindKey ? thisBinding[func] : func;
7023
+
7024
+ length = args.length;
7025
+ if (argPos) {
7026
+ args = reorder(args, argPos);
7027
+ } else if (isFlip && length > 1) {
7028
+ args.reverse();
7029
+ }
7030
+ if (isAry && ary < length) {
7031
+ args.length = ary;
7032
+ }
7033
+ if (this && this !== root && this instanceof wrapper) {
7034
+ fn = Ctor || createCtor(fn);
7035
+ }
7036
+ return fn.apply(thisBinding, args);
7037
+ }
7038
+ return wrapper;
7039
+ }
7040
+
7041
+ module.exports = createHybrid;
7042
+
7043
+
7044
+ /***/ }),
7045
+ /* 180 */
7046
+ /***/ (function(module, exports) {
7047
+
7048
+ /* Built-in method references for those with the same name as other `lodash` methods. */
7049
+ var nativeMax = Math.max;
7050
+
7051
+ /**
7052
+ * Creates an array that is the composition of partially applied arguments,
7053
+ * placeholders, and provided arguments into a single array of arguments.
7054
+ *
7055
+ * @private
7056
+ * @param {Array} args The provided arguments.
7057
+ * @param {Array} partials The arguments to prepend to those provided.
7058
+ * @param {Array} holders The `partials` placeholder indexes.
7059
+ * @params {boolean} [isCurried] Specify composing for a curried function.
7060
+ * @returns {Array} Returns the new array of composed arguments.
7061
+ */
7062
+ function composeArgs(args, partials, holders, isCurried) {
7063
+ var argsIndex = -1,
7064
+ argsLength = args.length,
7065
+ holdersLength = holders.length,
7066
+ leftIndex = -1,
7067
+ leftLength = partials.length,
7068
+ rangeLength = nativeMax(argsLength - holdersLength, 0),
7069
+ result = Array(leftLength + rangeLength),
7070
+ isUncurried = !isCurried;
7071
+
7072
+ while (++leftIndex < leftLength) {
7073
+ result[leftIndex] = partials[leftIndex];
7074
+ }
7075
+ while (++argsIndex < holdersLength) {
7076
+ if (isUncurried || argsIndex < argsLength) {
7077
+ result[holders[argsIndex]] = args[argsIndex];
7078
+ }
7079
+ }
7080
+ while (rangeLength--) {
7081
+ result[leftIndex++] = args[argsIndex++];
7082
+ }
7083
+ return result;
7084
+ }
7085
+
7086
+ module.exports = composeArgs;
7087
+
7088
+
7089
+ /***/ }),
7090
+ /* 181 */
7091
+ /***/ (function(module, exports) {
7092
+
7093
+ /* Built-in method references for those with the same name as other `lodash` methods. */
7094
+ var nativeMax = Math.max;
7095
+
7096
+ /**
7097
+ * This function is like `composeArgs` except that the arguments composition
7098
+ * is tailored for `_.partialRight`.
7099
+ *
7100
+ * @private
7101
+ * @param {Array} args The provided arguments.
7102
+ * @param {Array} partials The arguments to append to those provided.
7103
+ * @param {Array} holders The `partials` placeholder indexes.
7104
+ * @params {boolean} [isCurried] Specify composing for a curried function.
7105
+ * @returns {Array} Returns the new array of composed arguments.
7106
+ */
7107
+ function composeArgsRight(args, partials, holders, isCurried) {
7108
+ var argsIndex = -1,
7109
+ argsLength = args.length,
7110
+ holdersIndex = -1,
7111
+ holdersLength = holders.length,
7112
+ rightIndex = -1,
7113
+ rightLength = partials.length,
7114
+ rangeLength = nativeMax(argsLength - holdersLength, 0),
7115
+ result = Array(rangeLength + rightLength),
7116
+ isUncurried = !isCurried;
7117
+
7118
+ while (++argsIndex < rangeLength) {
7119
+ result[argsIndex] = args[argsIndex];
7120
+ }
7121
+ var offset = argsIndex;
7122
+ while (++rightIndex < rightLength) {
7123
+ result[offset + rightIndex] = partials[rightIndex];
7124
+ }
7125
+ while (++holdersIndex < holdersLength) {
7126
+ if (isUncurried || argsIndex < argsLength) {
7127
+ result[offset + holders[holdersIndex]] = args[argsIndex++];
7128
+ }
7129
+ }
7130
+ return result;
7131
+ }
7132
+
7133
+ module.exports = composeArgsRight;
7134
+
7135
+
7136
+ /***/ }),
7137
+ /* 182 */
7138
+ /***/ (function(module, exports, __webpack_require__) {
7139
+
7140
+ var isLaziable = __webpack_require__(325),
7141
+ setData = __webpack_require__(185),
7142
+ setWrapToString = __webpack_require__(187);
7143
+
7144
+ /** Used to compose bitmasks for function metadata. */
7145
+ var WRAP_BIND_FLAG = 1,
7146
+ WRAP_BIND_KEY_FLAG = 2,
7147
+ WRAP_CURRY_BOUND_FLAG = 4,
7148
+ WRAP_CURRY_FLAG = 8,
7149
+ WRAP_PARTIAL_FLAG = 32,
7150
+ WRAP_PARTIAL_RIGHT_FLAG = 64;
7151
+
7152
+ /**
7153
+ * Creates a function that wraps `func` to continue currying.
7154
+ *
7155
+ * @private
7156
+ * @param {Function} func The function to wrap.
7157
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
7158
+ * @param {Function} wrapFunc The function to create the `func` wrapper.
7159
+ * @param {*} placeholder The placeholder value.
7160
+ * @param {*} [thisArg] The `this` binding of `func`.
7161
+ * @param {Array} [partials] The arguments to prepend to those provided to
7162
+ * the new function.
7163
+ * @param {Array} [holders] The `partials` placeholder indexes.
7164
+ * @param {Array} [argPos] The argument positions of the new function.
7165
+ * @param {number} [ary] The arity cap of `func`.
7166
+ * @param {number} [arity] The arity of `func`.
7167
+ * @returns {Function} Returns the new wrapped function.
7168
+ */
7169
+ function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
7170
+ var isCurry = bitmask & WRAP_CURRY_FLAG,
7171
+ newHolders = isCurry ? holders : undefined,
7172
+ newHoldersRight = isCurry ? undefined : holders,
7173
+ newPartials = isCurry ? partials : undefined,
7174
+ newPartialsRight = isCurry ? undefined : partials;
7175
+
7176
+ bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
7177
+ bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
7178
+
7179
+ if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
7180
+ bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
7181
+ }
7182
+ var newData = [
7183
+ func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
7184
+ newHoldersRight, argPos, ary, arity
7185
+ ];
7186
+
7187
+ var result = wrapFunc.apply(undefined, newData);
7188
+ if (isLaziable(func)) {
7189
+ setData(result, newData);
7190
+ }
7191
+ result.placeholder = placeholder;
7192
+ return setWrapToString(result, func, bitmask);
7193
+ }
7194
+
7195
+ module.exports = createRecurry;
7196
+
7197
+
7198
+ /***/ }),
7199
+ /* 183 */
7200
+ /***/ (function(module, exports, __webpack_require__) {
7201
+
7202
+ var metaMap = __webpack_require__(178),
7203
+ noop = __webpack_require__(7);
7204
+
7205
+ /**
7206
+ * Gets metadata for `func`.
7207
+ *
7208
+ * @private
7209
+ * @param {Function} func The function to query.
7210
+ * @returns {*} Returns the metadata for `func`.
7211
+ */
7212
+ var getData = !metaMap ? noop : function(func) {
7213
+ return metaMap.get(func);
7214
+ };
7215
+
7216
+ module.exports = getData;
7217
+
7218
+
7219
+ /***/ }),
7220
+ /* 184 */
7221
+ /***/ (function(module, exports, __webpack_require__) {
7222
+
7223
+ var baseCreate = __webpack_require__(72),
7224
+ baseLodash = __webpack_require__(116);
7225
+
7226
+ /**
7227
+ * The base constructor for creating `lodash` wrapper objects.
7228
+ *
7229
+ * @private
7230
+ * @param {*} value The value to wrap.
7231
+ * @param {boolean} [chainAll] Enable explicit method chain sequences.
7232
+ */
7233
+ function LodashWrapper(value, chainAll) {
7234
+ this.__wrapped__ = value;
7235
+ this.__actions__ = [];
7236
+ this.__chain__ = !!chainAll;
7237
+ this.__index__ = 0;
7238
+ this.__values__ = undefined;
7239
+ }
7240
+
7241
+ LodashWrapper.prototype = baseCreate(baseLodash.prototype);
7242
+ LodashWrapper.prototype.constructor = LodashWrapper;
7243
+
7244
+ module.exports = LodashWrapper;
7245
+
7246
+
7247
+ /***/ }),
7248
+ /* 185 */
7249
+ /***/ (function(module, exports, __webpack_require__) {
7250
+
7251
+ var baseSetData = __webpack_require__(177),
7252
+ shortOut = __webpack_require__(186);
7253
+
7254
+ /**
7255
+ * Sets metadata for `func`.
7256
+ *
7257
+ * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
7258
+ * period of time, it will trip its breaker and transition to an identity
7259
+ * function to avoid garbage collection pauses in V8. See
7260
+ * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
7261
+ * for more details.
7262
+ *
7263
+ * @private
7264
+ * @param {Function} func The function to associate metadata with.
7265
+ * @param {*} data The metadata.
7266
+ * @returns {Function} Returns `func`.
7267
+ */
7268
+ var setData = shortOut(baseSetData);
7269
+
7270
+ module.exports = setData;
7271
+
7272
+
7273
+ /***/ }),
7274
+ /* 186 */
7275
+ /***/ (function(module, exports) {
7276
+
7277
+ /** Used to detect hot functions by number of calls within a span of milliseconds. */
7278
+ var HOT_COUNT = 800,
7279
+ HOT_SPAN = 16;
7280
+
7281
+ /* Built-in method references for those with the same name as other `lodash` methods. */
7282
+ var nativeNow = Date.now;
7283
+
7284
+ /**
7285
+ * Creates a function that'll short out and invoke `identity` instead
7286
+ * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
7287
+ * milliseconds.
7288
+ *
7289
+ * @private
7290
+ * @param {Function} func The function to restrict.
7291
+ * @returns {Function} Returns the new shortable function.
7292
+ */
7293
+ function shortOut(func) {
7294
+ var count = 0,
7295
+ lastCalled = 0;
7296
+
7297
+ return function() {
7298
+ var stamp = nativeNow(),
7299
+ remaining = HOT_SPAN - (stamp - lastCalled);
7300
+
7301
+ lastCalled = stamp;
7302
+ if (remaining > 0) {
7303
+ if (++count >= HOT_COUNT) {
7304
+ return arguments[0];
7305
+ }
7306
+ } else {
7307
+ count = 0;
7308
+ }
7309
+ return func.apply(undefined, arguments);
7310
+ };
7311
+ }
7312
+
7313
+ module.exports = shortOut;
7314
+
7315
+
7316
+ /***/ }),
7317
+ /* 187 */
7318
+ /***/ (function(module, exports, __webpack_require__) {
7319
+
7320
+ var getWrapDetails = __webpack_require__(330),
7321
+ insertWrapDetails = __webpack_require__(331),
7322
+ setToString = __webpack_require__(155),
7323
+ updateWrapDetails = __webpack_require__(334);
7324
+
7325
+ /**
7326
+ * Sets the `toString` method of `wrapper` to mimic the source of `reference`
7327
+ * with wrapper details in a comment at the top of the source body.
7328
+ *
7329
+ * @private
7330
+ * @param {Function} wrapper The function to modify.
7331
+ * @param {Function} reference The reference function.
7332
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
7333
+ * @returns {Function} Returns `wrapper`.
7334
+ */
7335
+ function setWrapToString(wrapper, reference, bitmask) {
7336
+ var source = (reference + '');
7337
+ return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
7338
+ }
7339
+
7340
+ module.exports = setWrapToString;
7341
+
7342
+
7343
+ /***/ }),
7344
+ /* 188 */
7345
+ /***/ (function(module, exports, __webpack_require__) {
7346
+
7347
+ var getNative = __webpack_require__(25);
7348
+
7349
+ var defineProperty = (function() {
7350
+ try {
7351
+ var func = getNative(Object, 'defineProperty');
7352
+ func({}, '', {});
7353
+ return func;
7354
+ } catch (e) {}
7355
+ }());
7356
+
7357
+ module.exports = defineProperty;
7358
+
7359
+
7360
+ /***/ }),
7361
+ /* 189 */
7362
+ /***/ (function(module, exports, __webpack_require__) {
7363
+
7364
+ var copyObject = __webpack_require__(75),
7365
+ keys = __webpack_require__(31);
7366
+
7367
+ /**
7368
+ * The base implementation of `_.assign` without support for multiple sources
7369
+ * or `customizer` functions.
7370
+ *
7371
+ * @private
7372
+ * @param {Object} object The destination object.
7373
+ * @param {Object} source The source object.
7374
+ * @returns {Object} Returns `object`.
7375
+ */
7376
+ function baseAssign(object, source) {
7377
+ return object && copyObject(source, keys(source), object);
7378
+ }
7379
+
7380
+ module.exports = baseAssign;
7381
+
7382
+
7383
+ /***/ }),
7384
+ /* 190 */
7385
+ /***/ (function(module, exports, __webpack_require__) {
7386
+
7387
+ var baseAssignValue = __webpack_require__(191),
7388
+ eq = __webpack_require__(70);
7389
+
7390
+ /** Used for built-in method references. */
7391
+ var objectProto = Object.prototype;
7392
+
7393
+ /** Used to check objects for own properties. */
7394
+ var hasOwnProperty = objectProto.hasOwnProperty;
7395
+
7396
+ /**
7397
+ * Assigns `value` to `key` of `object` if the existing value is not equivalent
7398
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7399
+ * for equality comparisons.
7400
+ *
7401
+ * @private
7402
+ * @param {Object} object The object to modify.
7403
+ * @param {string} key The key of the property to assign.
7404
+ * @param {*} value The value to assign.
7405
+ */
7406
+ function assignValue(object, key, value) {
7407
+ var objValue = object[key];
7408
+ if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
7409
+ (value === undefined && !(key in object))) {
7410
+ baseAssignValue(object, key, value);
7411
+ }
7412
+ }
7413
+
7414
+ module.exports = assignValue;
7415
+
7416
+
7417
+ /***/ }),
7418
+ /* 191 */
7419
+ /***/ (function(module, exports, __webpack_require__) {
7420
+
7421
+ var defineProperty = __webpack_require__(188);
7422
+
7423
+ /**
7424
+ * The base implementation of `assignValue` and `assignMergeValue` without
7425
+ * value checks.
7426
+ *
7427
+ * @private
7428
+ * @param {Object} object The object to modify.
7429
+ * @param {string} key The key of the property to assign.
7430
+ * @param {*} value The value to assign.
7431
+ */
7432
+ function baseAssignValue(object, key, value) {
7433
+ if (key == '__proto__' && defineProperty) {
7434
+ defineProperty(object, key, {
7435
+ 'configurable': true,
7436
+ 'enumerable': true,
7437
+ 'value': value,
7438
+ 'writable': true
7439
+ });
7440
+ } else {
7441
+ object[key] = value;
7442
+ }
7443
+ }
7444
+
7445
+ module.exports = baseAssignValue;
7446
+
7447
+
7448
+ /***/ }),
7449
+ /* 192 */
7450
+ /***/ (function(module, exports, __webpack_require__) {
7451
+
7452
+ var Stack = __webpack_require__(95),
7453
+ arrayEach = __webpack_require__(117),
7454
+ assignValue = __webpack_require__(190),
7455
+ baseAssign = __webpack_require__(189),
7456
+ baseAssignIn = __webpack_require__(339),
7457
+ cloneBuffer = __webpack_require__(342),
7458
+ copyArray = __webpack_require__(73),
7459
+ copySymbols = __webpack_require__(343),
7460
+ copySymbolsIn = __webpack_require__(344),
7461
+ getAllKeys = __webpack_require__(162),
7462
+ getAllKeysIn = __webpack_require__(345),
7463
+ getTag = __webpack_require__(43),
7464
+ initCloneArray = __webpack_require__(346),
7465
+ initCloneByTag = __webpack_require__(347),
7466
+ initCloneObject = __webpack_require__(352),
7467
+ isArray = __webpack_require__(6),
7468
+ isBuffer = __webpack_require__(59),
7469
+ isMap = __webpack_require__(353),
7470
+ isObject = __webpack_require__(18),
7471
+ isSet = __webpack_require__(355),
7472
+ keys = __webpack_require__(31);
7473
+
7474
+ /** Used to compose bitmasks for cloning. */
7475
+ var CLONE_DEEP_FLAG = 1,
7476
+ CLONE_FLAT_FLAG = 2,
7477
+ CLONE_SYMBOLS_FLAG = 4;
7478
+
7479
+ /** `Object#toString` result references. */
7480
+ var argsTag = '[object Arguments]',
7481
+ arrayTag = '[object Array]',
7482
+ boolTag = '[object Boolean]',
7483
+ dateTag = '[object Date]',
7484
+ errorTag = '[object Error]',
7485
+ funcTag = '[object Function]',
7486
+ genTag = '[object GeneratorFunction]',
7487
+ mapTag = '[object Map]',
7488
+ numberTag = '[object Number]',
7489
+ objectTag = '[object Object]',
7490
+ regexpTag = '[object RegExp]',
7491
+ setTag = '[object Set]',
7492
+ stringTag = '[object String]',
7493
+ symbolTag = '[object Symbol]',
7494
+ weakMapTag = '[object WeakMap]';
7495
+
7496
+ var arrayBufferTag = '[object ArrayBuffer]',
7497
+ dataViewTag = '[object DataView]',
7498
+ float32Tag = '[object Float32Array]',
7499
+ float64Tag = '[object Float64Array]',
7500
+ int8Tag = '[object Int8Array]',
7501
+ int16Tag = '[object Int16Array]',
7502
+ int32Tag = '[object Int32Array]',
7503
+ uint8Tag = '[object Uint8Array]',
7504
+ uint8ClampedTag = '[object Uint8ClampedArray]',
7505
+ uint16Tag = '[object Uint16Array]',
7506
+ uint32Tag = '[object Uint32Array]';
7507
+
7508
+ /** Used to identify `toStringTag` values supported by `_.clone`. */
7509
+ var cloneableTags = {};
7510
+ cloneableTags[argsTag] = cloneableTags[arrayTag] =
7511
+ cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
7512
+ cloneableTags[boolTag] = cloneableTags[dateTag] =
7513
+ cloneableTags[float32Tag] = cloneableTags[float64Tag] =
7514
+ cloneableTags[int8Tag] = cloneableTags[int16Tag] =
7515
+ cloneableTags[int32Tag] = cloneableTags[mapTag] =
7516
+ cloneableTags[numberTag] = cloneableTags[objectTag] =
7517
+ cloneableTags[regexpTag] = cloneableTags[setTag] =
7518
+ cloneableTags[stringTag] = cloneableTags[symbolTag] =
7519
+ cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
7520
+ cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
7521
+ cloneableTags[errorTag] = cloneableTags[funcTag] =
7522
+ cloneableTags[weakMapTag] = false;
7523
+
7524
+ /**
7525
+ * The base implementation of `_.clone` and `_.cloneDeep` which tracks
7526
+ * traversed objects.
7527
+ *
7528
+ * @private
7529
+ * @param {*} value The value to clone.
7530
+ * @param {boolean} bitmask The bitmask flags.
7531
+ * 1 - Deep clone
7532
+ * 2 - Flatten inherited properties
7533
+ * 4 - Clone symbols
7534
+ * @param {Function} [customizer] The function to customize cloning.
7535
+ * @param {string} [key] The key of `value`.
7536
+ * @param {Object} [object] The parent object of `value`.
7537
+ * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
7538
+ * @returns {*} Returns the cloned value.
7539
+ */
7540
+ function baseClone(value, bitmask, customizer, key, object, stack) {
7541
+ var result,
7542
+ isDeep = bitmask & CLONE_DEEP_FLAG,
7543
+ isFlat = bitmask & CLONE_FLAT_FLAG,
7544
+ isFull = bitmask & CLONE_SYMBOLS_FLAG;
7545
+
7546
+ if (customizer) {
7547
+ result = object ? customizer(value, key, object, stack) : customizer(value);
7548
+ }
7549
+ if (result !== undefined) {
7550
+ return result;
7551
+ }
7552
+ if (!isObject(value)) {
7553
+ return value;
7554
+ }
7555
+ var isArr = isArray(value);
7556
+ if (isArr) {
7557
+ result = initCloneArray(value);
7558
+ if (!isDeep) {
7559
+ return copyArray(value, result);
7560
+ }
7561
+ } else {
7562
+ var tag = getTag(value),
7563
+ isFunc = tag == funcTag || tag == genTag;
7564
+
7565
+ if (isBuffer(value)) {
7566
+ return cloneBuffer(value, isDeep);
7567
+ }
7568
+ if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
7569
+ result = (isFlat || isFunc) ? {} : initCloneObject(value);
7570
+ if (!isDeep) {
7571
+ return isFlat
7572
+ ? copySymbolsIn(value, baseAssignIn(result, value))
7573
+ : copySymbols(value, baseAssign(result, value));
7574
+ }
7575
+ } else {
7576
+ if (!cloneableTags[tag]) {
7577
+ return object ? value : {};
7578
+ }
7579
+ result = initCloneByTag(value, tag, isDeep);
7580
+ }
7581
+ }
7582
+ // Check for circular references and return its corresponding clone.
7583
+ stack || (stack = new Stack);
7584
+ var stacked = stack.get(value);
7585
+ if (stacked) {
7586
+ return stacked;
7587
+ }
7588
+ stack.set(value, result);
7589
+
7590
+ if (isSet(value)) {
7591
+ value.forEach(function(subValue) {
7592
+ result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
7593
+ });
7594
+ } else if (isMap(value)) {
7595
+ value.forEach(function(subValue, key) {
7596
+ result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
7597
+ });
7598
+ }
7599
+
7600
+ var keysFunc = isFull
7601
+ ? (isFlat ? getAllKeysIn : getAllKeys)
7602
+ : (isFlat ? keysIn : keys);
7603
+
7604
+ var props = isArr ? undefined : keysFunc(value);
7605
+ arrayEach(props || value, function(subValue, key) {
7606
+ if (props) {
7607
+ key = subValue;
7608
+ subValue = value[key];
7609
+ }
7610
+ // Recursively populate clone (susceptible to call stack limits).
7611
+ assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
7612
+ });
7613
+ return result;
7614
+ }
7615
+
7616
+ module.exports = baseClone;
7617
+
7618
+
7619
+ /***/ }),
7620
+ /* 193 */
7621
+ /***/ (function(module, exports, __webpack_require__) {
7622
+
7623
+ var arrayLikeKeys = __webpack_require__(159),
7624
+ baseKeysIn = __webpack_require__(340),
7625
+ isArrayLike = __webpack_require__(42);
7626
+
7627
+ /**
7628
+ * Creates an array of the own and inherited enumerable property names of `object`.
7629
+ *
7630
+ * **Note:** Non-object values are coerced to objects.
7631
+ *
7632
+ * @static
7633
+ * @memberOf _
7634
+ * @since 3.0.0
7635
+ * @category Object
7636
+ * @param {Object} object The object to query.
7637
+ * @returns {Array} Returns the array of property names.
7638
+ * @example
7639
+ *
7640
+ * function Foo() {
7641
+ * this.a = 1;
7642
+ * this.b = 2;
7643
+ * }
7644
+ *
7645
+ * Foo.prototype.c = 3;
7646
+ *
7647
+ * _.keysIn(new Foo);
7648
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
7649
+ */
7650
+ function keysIn(object) {
7651
+ return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
7652
+ }
7653
+
7654
+ module.exports = keysIn;
7655
+
7656
+
7657
+ /***/ }),
7658
+ /* 194 */
7659
+ /***/ (function(module, exports, __webpack_require__) {
7660
+
7661
+ var arrayPush = __webpack_require__(96),
7662
+ getPrototype = __webpack_require__(118),
7663
+ getSymbols = __webpack_require__(106),
7664
+ stubArray = __webpack_require__(161);
7665
+
7666
+ /* Built-in method references for those with the same name as other `lodash` methods. */
7667
+ var nativeGetSymbols = Object.getOwnPropertySymbols;
7668
+
7669
+ /**
7670
+ * Creates an array of the own and inherited enumerable symbols of `object`.
7671
+ *
7672
+ * @private
7673
+ * @param {Object} object The object to query.
7674
+ * @returns {Array} Returns the array of symbols.
7675
+ */
7676
+ var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
7677
+ var result = [];
7678
+ while (object) {
7679
+ arrayPush(result, getSymbols(object));
7680
+ object = getPrototype(object);
7681
+ }
7682
+ return result;
7683
+ };
7684
+
7685
+ module.exports = getSymbolsIn;
7686
+
7687
+
7688
+ /***/ }),
7689
+ /* 195 */
7690
+ /***/ (function(module, exports, __webpack_require__) {
7691
+
7692
+ var createWrap = __webpack_require__(104);
7693
+
7694
+ /** Used to compose bitmasks for function metadata. */
7695
+ var WRAP_CURRY_FLAG = 8;
7696
+
7697
+ /**
7698
+ * Creates a function that accepts arguments of `func` and either invokes
7699
+ * `func` returning its result, if at least `arity` number of arguments have
7700
+ * been provided, or returns a function that accepts the remaining `func`
7701
+ * arguments, and so on. The arity of `func` may be specified if `func.length`
7702
+ * is not sufficient.
7703
+ *
7704
+ * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
7705
+ * may be used as a placeholder for provided arguments.
7706
+ *
7707
+ * **Note:** This method doesn't set the "length" property of curried functions.
7708
+ *
7709
+ * @static
7710
+ * @memberOf _
7711
+ * @since 2.0.0
7712
+ * @category Function
7713
+ * @param {Function} func The function to curry.
7714
+ * @param {number} [arity=func.length] The arity of `func`.
7715
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7716
+ * @returns {Function} Returns the new curried function.
7717
+ * @example
7718
+ *
7719
+ * var abc = function(a, b, c) {
7720
+ * return [a, b, c];
7721
+ * };
7722
+ *
7723
+ * var curried = _.curry(abc);
7724
+ *
7725
+ * curried(1)(2)(3);
7726
+ * // => [1, 2, 3]
7727
+ *
7728
+ * curried(1, 2)(3);
7729
+ * // => [1, 2, 3]
7730
+ *
7731
+ * curried(1, 2, 3);
7732
+ * // => [1, 2, 3]
7733
+ *
7734
+ * // Curried with placeholders.
7735
+ * curried(1)(_, 3)(2);
7736
+ * // => [1, 2, 3]
7737
+ */
7738
+ function curry(func, arity, guard) {
7739
+ arity = guard ? undefined : arity;
7740
+ var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
7741
+ result.placeholder = curry.placeholder;
7742
+ return result;
7743
+ }
7744
+
7745
+ // Assign default placeholders.
7746
+ curry.placeholder = {};
7747
+
7748
+ module.exports = curry;
7749
+
7750
+
7751
+ /***/ }),
7752
+ /* 196 */
7753
+ /***/ (function(module, exports, __webpack_require__) {
7754
+
7755
+ var baseFlatten = __webpack_require__(275);
7756
+
7757
+ /**
7758
+ * Flattens `array` a single level deep.
7759
+ *
7760
+ * @static
7761
+ * @memberOf _
7762
+ * @since 0.1.0
7763
+ * @category Array
7764
+ * @param {Array} array The array to flatten.
7765
+ * @returns {Array} Returns the new flattened array.
7766
+ * @example
7767
+ *
7768
+ * _.flatten([1, [2, [3, [4]], 5]]);
7769
+ * // => [1, 2, [3, [4]], 5]
7770
+ */
7771
+ function flatten(array) {
7772
+ var length = array == null ? 0 : array.length;
7773
+ return length ? baseFlatten(array, 1) : [];
7774
+ }
7775
+
7776
+ module.exports = flatten;
7777
+
7778
+
7779
+ /***/ }),
7780
+ /* 197 */
7781
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
7782
+
7783
+ "use strict";
7784
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return symbolObservablePonyfill; });
7785
+ function symbolObservablePonyfill(root) {
7786
+ var result;
7787
+ var Symbol = root.Symbol;
7788
+
7789
+ if (typeof Symbol === 'function') {
7790
+ if (Symbol.observable) {
7791
+ result = Symbol.observable;
7792
+ } else {
7793
+ result = Symbol('observable');
7794
+ Symbol.observable = result;
7795
+ }
7796
+ } else {
7797
+ result = '@@observable';
7798
+ }
7799
+
7800
+ return result;
7801
+ };
7802
+
7803
+
7804
+ /***/ }),
7805
+ /* 198 */
7806
+ /***/ (function(module, exports, __webpack_require__) {
7807
+
7808
+ var baseUniq = __webpack_require__(314);
7809
+
7810
+ /**
7811
+ * Creates a duplicate-free version of an array, using
7812
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7813
+ * for equality comparisons, in which only the first occurrence of each element
7814
+ * is kept. The order of result values is determined by the order they occur
7815
+ * in the array.
7816
+ *
7817
+ * @static
7818
+ * @memberOf _
7819
+ * @since 0.1.0
7820
+ * @category Array
7821
+ * @param {Array} array The array to inspect.
7822
+ * @returns {Array} Returns the new duplicate free array.
7823
+ * @example
7824
+ *
7825
+ * _.uniq([2, 1, 2]);
7826
+ * // => [2, 1]
7827
+ */
7828
+ function uniq(array) {
7829
+ return (array && array.length) ? baseUniq(array) : [];
7830
+ }
7831
+
7832
+ module.exports = uniq;
7833
+
7834
+
7835
+ /***/ }),
7836
+ /* 199 */
7837
+ /***/ (function(module, exports, __webpack_require__) {
7838
+
7839
+ var convert = __webpack_require__(317),
7840
+ func = convert('curry', __webpack_require__(195));
7841
+
7842
+ func.placeholder = __webpack_require__(176);
7843
+ module.exports = func;
7844
+
7845
+
7846
+ /***/ }),
7847
+ /* 200 */
7848
+ /***/ (function(module, exports, __webpack_require__) {
7849
+
7850
+ "use strict";
7851
+
7852
+
7853
+ exports.__esModule = true;
7854
+
7855
+ var _defineProperty = __webpack_require__(205);
7856
+
7857
+ var _defineProperty2 = _interopRequireDefault(_defineProperty);
7858
+
7859
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7860
+
7861
+ exports.default = function (obj, key, value) {
7862
+ if (key in obj) {
7863
+ (0, _defineProperty2.default)(obj, key, {
7864
+ value: value,
7865
+ enumerable: true,
7866
+ configurable: true,
7867
+ writable: true
7868
+ });
7869
+ } else {
7870
+ obj[key] = value;
7871
+ }
7872
+
7873
+ return obj;
7874
+ };
7875
+
7876
+ /***/ }),
7877
+ /* 201 */
7878
+ /***/ (function(module, exports, __webpack_require__) {
7879
+
7880
+ "use strict";
7881
+
7882
+
7883
+ var has = Object.prototype.hasOwnProperty;
7884
+
7885
+ /**
7886
+ * Decode a URI encoded string.
7887
+ *
7888
+ * @param {String} input The URI encoded string.
7889
+ * @returns {String} The decoded string.
7890
+ * @api private
7891
+ */
7892
+ function decode(input) {
7893
+ return decodeURIComponent(input.replace(/\+/g, ' '));
7894
+ }
7895
+
7896
+ /**
7897
+ * Simple query string parser.
7898
+ *
7899
+ * @param {String} query The query string that needs to be parsed.
7900
+ * @returns {Object}
7901
+ * @api public
7902
+ */
7903
+ function querystring(query) {
7904
+ var parser = /([^=?&]+)=?([^&]*)/g
7905
+ , result = {}
7906
+ , part;
7907
+
7908
+ //
7909
+ // Little nifty parsing hack, leverage the fact that RegExp.exec increments
7910
+ // the lastIndex property so we can continue executing this loop until we've
7911
+ // parsed all results.
7912
+ //
7913
+ for (;
7914
+ part = parser.exec(query);
7915
+ result[decode(part[1])] = decode(part[2])
7916
+ );
7917
+
7918
+ return result;
7919
+ }
7920
+
7921
+ /**
7922
+ * Transform a query string to an object.
7923
+ *
7924
+ * @param {Object} obj Object that should be transformed.
7925
+ * @param {String} prefix Optional prefix.
7926
+ * @returns {String}
7927
+ * @api public
7928
+ */
7929
+ function querystringify(obj, prefix) {
7930
+ prefix = prefix || '';
7931
+
7932
+ var pairs = [];
7933
+
7934
+ //
7935
+ // Optionally prefix with a '?' if needed
7936
+ //
7937
+ if ('string' !== typeof prefix) prefix = '?';
7938
+
7939
+ for (var key in obj) {
7940
+ if (has.call(obj, key)) {
7941
+ pairs.push(encodeURIComponent(key) +'='+ encodeURIComponent(obj[key]));
7942
+ }
7943
+ }
7944
+
7945
+ return pairs.length ? prefix + pairs.join('&') : '';
7946
+ }
7947
+
7948
+ //
7949
+ // Expose the module.
7950
+ //
7951
+ exports.stringify = querystringify;
7952
+ exports.parse = querystring;
7953
+
7954
+
7955
+ /***/ }),
7956
+ /* 202 */
7957
+ /***/ (function(module, exports, __webpack_require__) {
7958
+
7959
+ var baseInRange = __webpack_require__(368),
7960
+ toFinite = __webpack_require__(157),
7961
+ toNumber = __webpack_require__(158);
7962
+
7963
+ /**
7964
+ * Checks if `n` is between `start` and up to, but not including, `end`. If
7965
+ * `end` is not specified, it's set to `start` with `start` then set to `0`.
7966
+ * If `start` is greater than `end` the params are swapped to support
7967
+ * negative ranges.
7968
+ *
7969
+ * @static
7970
+ * @memberOf _
7971
+ * @since 3.3.0
7972
+ * @category Number
7973
+ * @param {number} number The number to check.
7974
+ * @param {number} [start=0] The start of the range.
7975
+ * @param {number} end The end of the range.
7976
+ * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
7977
+ * @see _.range, _.rangeRight
7978
+ * @example
7979
+ *
7980
+ * _.inRange(3, 2, 4);
7981
+ * // => true
7982
+ *
7983
+ * _.inRange(4, 8);
7984
+ * // => true
7985
+ *
7986
+ * _.inRange(4, 2);
7987
+ * // => false
7988
+ *
7989
+ * _.inRange(2, 2);
7990
+ * // => false
7991
+ *
7992
+ * _.inRange(1.2, 2);
7993
+ * // => true
7994
+ *
7995
+ * _.inRange(5.2, 4);
7996
+ * // => false
7997
+ *
7998
+ * _.inRange(-3, -2, -6);
7999
+ * // => true
8000
+ */
8001
+ function inRange(number, start, end) {
8002
+ start = toFinite(start);
8003
+ if (end === undefined) {
8004
+ end = start;
8005
+ start = 0;
8006
+ } else {
8007
+ end = toFinite(end);
8008
+ }
8009
+ number = toNumber(number);
8010
+ return baseInRange(number, start, end);
8011
+ }
8012
+
8013
+ module.exports = inRange;
8014
+
8015
+
8016
+ /***/ }),
8017
+ /* 203 */
8018
+ /***/ (function(module, exports, __webpack_require__) {
8019
+
8020
+ "use strict";
8021
+ /**
8022
+ * Copyright (c) 2013-present, Facebook, Inc.
8023
+ *
8024
+ * This source code is licensed under the MIT license found in the
8025
+ * LICENSE file in the root directory of this source tree.
8026
+ */
8027
+
8028
+
8029
+
8030
+ /**
8031
+ * Use invariant() to assert state which your program assumes to be true.
8032
+ *
8033
+ * Provide sprintf-style format (only %s is supported) and arguments
8034
+ * to provide information about what broke and what you were
8035
+ * expecting.
8036
+ *
8037
+ * The invariant message will be stripped in production, but the invariant
8038
+ * will remain to ensure logic does not differ in production.
8039
+ */
8040
+
8041
+ var invariant = function(condition, format, a, b, c, d, e, f) {
8042
+ if (false) {}
8043
+
8044
+ if (!condition) {
8045
+ var error;
8046
+ if (format === undefined) {
8047
+ error = new Error(
8048
+ 'Minified exception occurred; use the non-minified dev environment ' +
8049
+ 'for the full error message and additional helpful warnings.'
8050
+ );
8051
+ } else {
8052
+ var args = [a, b, c, d, e, f];
8053
+ var argIndex = 0;
8054
+ error = new Error(
8055
+ format.replace(/%s/g, function() { return args[argIndex++]; })
8056
+ );
8057
+ error.name = 'Invariant Violation';
8058
+ }
8059
+
8060
+ error.framesToPop = 1; // we don't care about invariant's own frame
8061
+ throw error;
8062
+ }
8063
+ };
8064
+
8065
+ module.exports = invariant;
8066
+
8067
+
8068
+ /***/ }),
8069
+ /* 204 */
8070
+ /***/ (function(module, exports, __webpack_require__) {
8071
+
8072
+ "use strict";
8073
+
8074
+
8075
+ exports.__esModule = true;
8076
+
8077
+ var _iterator = __webpack_require__(375);
8078
+
8079
+ var _iterator2 = _interopRequireDefault(_iterator);
8080
+
8081
+ var _symbol = __webpack_require__(377);
8082
+
8083
+ var _symbol2 = _interopRequireDefault(_symbol);
8084
+
8085
+ var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
8086
+
8087
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8088
+
8089
+ exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
8090
+ return typeof obj === "undefined" ? "undefined" : _typeof(obj);
8091
+ } : function (obj) {
8092
+ return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
8093
+ };
8094
+
8095
+ /***/ }),
8096
+ /* 205 */
8097
+ /***/ (function(module, exports, __webpack_require__) {
8098
+
8099
+ module.exports = { "default": __webpack_require__(366), __esModule: true };
8100
+
8101
+ /***/ }),
8102
+ /* 206 */
8103
+ /***/ (function(module, exports) {
8104
+
8105
+ (function(self) {
8106
+ 'use strict';
8107
+
8108
+ if (self.fetch) {
8109
+ return
8110
+ }
8111
+
8112
+ var support = {
8113
+ searchParams: 'URLSearchParams' in self,
8114
+ iterable: 'Symbol' in self && 'iterator' in Symbol,
8115
+ blob: 'FileReader' in self && 'Blob' in self && (function() {
8116
+ try {
8117
+ new Blob()
8118
+ return true
8119
+ } catch(e) {
8120
+ return false
8121
+ }
8122
+ })(),
8123
+ formData: 'FormData' in self,
8124
+ arrayBuffer: 'ArrayBuffer' in self
8125
+ }
8126
+
8127
+ if (support.arrayBuffer) {
8128
+ var viewClasses = [
8129
+ '[object Int8Array]',
8130
+ '[object Uint8Array]',
8131
+ '[object Uint8ClampedArray]',
8132
+ '[object Int16Array]',
8133
+ '[object Uint16Array]',
8134
+ '[object Int32Array]',
8135
+ '[object Uint32Array]',
8136
+ '[object Float32Array]',
8137
+ '[object Float64Array]'
8138
+ ]
8139
+
8140
+ var isDataView = function(obj) {
8141
+ return obj && DataView.prototype.isPrototypeOf(obj)
8142
+ }
8143
+
8144
+ var isArrayBufferView = ArrayBuffer.isView || function(obj) {
8145
+ return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
8146
+ }
8147
+ }
8148
+
8149
+ function normalizeName(name) {
8150
+ if (typeof name !== 'string') {
8151
+ name = String(name)
8152
+ }
8153
+ if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
8154
+ throw new TypeError('Invalid character in header field name')
8155
+ }
8156
+ return name.toLowerCase()
8157
+ }
8158
+
8159
+ function normalizeValue(value) {
8160
+ if (typeof value !== 'string') {
8161
+ value = String(value)
8162
+ }
8163
+ return value
8164
+ }
8165
+
8166
+ // Build a destructive iterator for the value list
8167
+ function iteratorFor(items) {
8168
+ var iterator = {
8169
+ next: function() {
8170
+ var value = items.shift()
8171
+ return {done: value === undefined, value: value}
8172
+ }
8173
+ }
8174
+
8175
+ if (support.iterable) {
8176
+ iterator[Symbol.iterator] = function() {
8177
+ return iterator
8178
+ }
8179
+ }
8180
+
8181
+ return iterator
8182
+ }
8183
+
8184
+ function Headers(headers) {
8185
+ this.map = {}
8186
+
8187
+ if (headers instanceof Headers) {
8188
+ headers.forEach(function(value, name) {
8189
+ this.append(name, value)
8190
+ }, this)
8191
+ } else if (Array.isArray(headers)) {
8192
+ headers.forEach(function(header) {
8193
+ this.append(header[0], header[1])
8194
+ }, this)
8195
+ } else if (headers) {
8196
+ Object.getOwnPropertyNames(headers).forEach(function(name) {
8197
+ this.append(name, headers[name])
8198
+ }, this)
8199
+ }
8200
+ }
8201
+
8202
+ Headers.prototype.append = function(name, value) {
8203
+ name = normalizeName(name)
8204
+ value = normalizeValue(value)
8205
+ var oldValue = this.map[name]
8206
+ this.map[name] = oldValue ? oldValue+','+value : value
8207
+ }
8208
+
8209
+ Headers.prototype['delete'] = function(name) {
8210
+ delete this.map[normalizeName(name)]
8211
+ }
8212
+
8213
+ Headers.prototype.get = function(name) {
8214
+ name = normalizeName(name)
8215
+ return this.has(name) ? this.map[name] : null
8216
+ }
8217
+
8218
+ Headers.prototype.has = function(name) {
8219
+ return this.map.hasOwnProperty(normalizeName(name))
8220
+ }
8221
+
8222
+ Headers.prototype.set = function(name, value) {
8223
+ this.map[normalizeName(name)] = normalizeValue(value)
8224
+ }
8225
+
8226
+ Headers.prototype.forEach = function(callback, thisArg) {
8227
+ for (var name in this.map) {
8228
+ if (this.map.hasOwnProperty(name)) {
8229
+ callback.call(thisArg, this.map[name], name, this)
8230
+ }
8231
+ }
8232
+ }
8233
+
8234
+ Headers.prototype.keys = function() {
8235
+ var items = []
8236
+ this.forEach(function(value, name) { items.push(name) })
8237
+ return iteratorFor(items)
8238
+ }
8239
+
8240
+ Headers.prototype.values = function() {
8241
+ var items = []
8242
+ this.forEach(function(value) { items.push(value) })
8243
+ return iteratorFor(items)
8244
+ }
8245
+
8246
+ Headers.prototype.entries = function() {
8247
+ var items = []
8248
+ this.forEach(function(value, name) { items.push([name, value]) })
8249
+ return iteratorFor(items)
8250
+ }
8251
+
8252
+ if (support.iterable) {
8253
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries
8254
+ }
8255
+
8256
+ function consumed(body) {
8257
+ if (body.bodyUsed) {
8258
+ return Promise.reject(new TypeError('Already read'))
8259
+ }
8260
+ body.bodyUsed = true
8261
+ }
8262
+
8263
+ function fileReaderReady(reader) {
8264
+ return new Promise(function(resolve, reject) {
8265
+ reader.onload = function() {
8266
+ resolve(reader.result)
8267
+ }
8268
+ reader.onerror = function() {
8269
+ reject(reader.error)
8270
+ }
8271
+ })
8272
+ }
8273
+
8274
+ function readBlobAsArrayBuffer(blob) {
8275
+ var reader = new FileReader()
8276
+ var promise = fileReaderReady(reader)
8277
+ reader.readAsArrayBuffer(blob)
8278
+ return promise
8279
+ }
8280
+
8281
+ function readBlobAsText(blob) {
8282
+ var reader = new FileReader()
8283
+ var promise = fileReaderReady(reader)
8284
+ reader.readAsText(blob)
8285
+ return promise
8286
+ }
8287
+
8288
+ function readArrayBufferAsText(buf) {
8289
+ var view = new Uint8Array(buf)
8290
+ var chars = new Array(view.length)
8291
+
8292
+ for (var i = 0; i < view.length; i++) {
8293
+ chars[i] = String.fromCharCode(view[i])
8294
+ }
8295
+ return chars.join('')
8296
+ }
8297
+
8298
+ function bufferClone(buf) {
8299
+ if (buf.slice) {
8300
+ return buf.slice(0)
8301
+ } else {
8302
+ var view = new Uint8Array(buf.byteLength)
8303
+ view.set(new Uint8Array(buf))
8304
+ return view.buffer
8305
+ }
8306
+ }
8307
+
8308
+ function Body() {
8309
+ this.bodyUsed = false
8310
+
8311
+ this._initBody = function(body) {
8312
+ this._bodyInit = body
8313
+ if (!body) {
8314
+ this._bodyText = ''
8315
+ } else if (typeof body === 'string') {
8316
+ this._bodyText = body
8317
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
8318
+ this._bodyBlob = body
8319
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
8320
+ this._bodyFormData = body
8321
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
8322
+ this._bodyText = body.toString()
8323
+ } else if (support.arrayBuffer && support.blob && isDataView(body)) {
8324
+ this._bodyArrayBuffer = bufferClone(body.buffer)
8325
+ // IE 10-11 can't handle a DataView body.
8326
+ this._bodyInit = new Blob([this._bodyArrayBuffer])
8327
+ } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
8328
+ this._bodyArrayBuffer = bufferClone(body)
8329
+ } else {
8330
+ throw new Error('unsupported BodyInit type')
8331
+ }
8332
+
8333
+ if (!this.headers.get('content-type')) {
8334
+ if (typeof body === 'string') {
8335
+ this.headers.set('content-type', 'text/plain;charset=UTF-8')
8336
+ } else if (this._bodyBlob && this._bodyBlob.type) {
8337
+ this.headers.set('content-type', this._bodyBlob.type)
8338
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
8339
+ this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
8340
+ }
8341
+ }
8342
+ }
8343
+
8344
+ if (support.blob) {
8345
+ this.blob = function() {
8346
+ var rejected = consumed(this)
8347
+ if (rejected) {
8348
+ return rejected
8349
+ }
8350
+
8351
+ if (this._bodyBlob) {
8352
+ return Promise.resolve(this._bodyBlob)
8353
+ } else if (this._bodyArrayBuffer) {
8354
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]))
8355
+ } else if (this._bodyFormData) {
8356
+ throw new Error('could not read FormData body as blob')
8357
+ } else {
8358
+ return Promise.resolve(new Blob([this._bodyText]))
8359
+ }
8360
+ }
8361
+
8362
+ this.arrayBuffer = function() {
8363
+ if (this._bodyArrayBuffer) {
8364
+ return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
8365
+ } else {
8366
+ return this.blob().then(readBlobAsArrayBuffer)
8367
+ }
8368
+ }
8369
+ }
8370
+
8371
+ this.text = function() {
8372
+ var rejected = consumed(this)
8373
+ if (rejected) {
8374
+ return rejected
8375
+ }
8376
+
8377
+ if (this._bodyBlob) {
8378
+ return readBlobAsText(this._bodyBlob)
8379
+ } else if (this._bodyArrayBuffer) {
8380
+ return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
8381
+ } else if (this._bodyFormData) {
8382
+ throw new Error('could not read FormData body as text')
8383
+ } else {
8384
+ return Promise.resolve(this._bodyText)
8385
+ }
8386
+ }
8387
+
8388
+ if (support.formData) {
8389
+ this.formData = function() {
8390
+ return this.text().then(decode)
8391
+ }
8392
+ }
8393
+
8394
+ this.json = function() {
8395
+ return this.text().then(JSON.parse)
8396
+ }
8397
+
8398
+ return this
8399
+ }
8400
+
8401
+ // HTTP methods whose capitalization should be normalized
8402
+ var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
8403
+
8404
+ function normalizeMethod(method) {
8405
+ var upcased = method.toUpperCase()
8406
+ return (methods.indexOf(upcased) > -1) ? upcased : method
8407
+ }
8408
+
8409
+ function Request(input, options) {
8410
+ options = options || {}
8411
+ var body = options.body
8412
+
8413
+ if (input instanceof Request) {
8414
+ if (input.bodyUsed) {
8415
+ throw new TypeError('Already read')
8416
+ }
8417
+ this.url = input.url
8418
+ this.credentials = input.credentials
8419
+ if (!options.headers) {
8420
+ this.headers = new Headers(input.headers)
8421
+ }
8422
+ this.method = input.method
8423
+ this.mode = input.mode
8424
+ if (!body && input._bodyInit != null) {
8425
+ body = input._bodyInit
8426
+ input.bodyUsed = true
8427
+ }
8428
+ } else {
8429
+ this.url = String(input)
8430
+ }
8431
+
8432
+ this.credentials = options.credentials || this.credentials || 'omit'
8433
+ if (options.headers || !this.headers) {
8434
+ this.headers = new Headers(options.headers)
8435
+ }
8436
+ this.method = normalizeMethod(options.method || this.method || 'GET')
8437
+ this.mode = options.mode || this.mode || null
8438
+ this.referrer = null
8439
+
8440
+ if ((this.method === 'GET' || this.method === 'HEAD') && body) {
8441
+ throw new TypeError('Body not allowed for GET or HEAD requests')
8442
+ }
8443
+ this._initBody(body)
8444
+ }
8445
+
8446
+ Request.prototype.clone = function() {
8447
+ return new Request(this, { body: this._bodyInit })
8448
+ }
8449
+
8450
+ function decode(body) {
8451
+ var form = new FormData()
8452
+ body.trim().split('&').forEach(function(bytes) {
8453
+ if (bytes) {
8454
+ var split = bytes.split('=')
8455
+ var name = split.shift().replace(/\+/g, ' ')
8456
+ var value = split.join('=').replace(/\+/g, ' ')
8457
+ form.append(decodeURIComponent(name), decodeURIComponent(value))
8458
+ }
8459
+ })
8460
+ return form
8461
+ }
8462
+
8463
+ function parseHeaders(rawHeaders) {
8464
+ var headers = new Headers()
8465
+ // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
8466
+ // https://tools.ietf.org/html/rfc7230#section-3.2
8467
+ var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ')
8468
+ preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
8469
+ var parts = line.split(':')
8470
+ var key = parts.shift().trim()
8471
+ if (key) {
8472
+ var value = parts.join(':').trim()
8473
+ headers.append(key, value)
8474
+ }
8475
+ })
8476
+ return headers
8477
+ }
8478
+
8479
+ Body.call(Request.prototype)
8480
+
8481
+ function Response(bodyInit, options) {
8482
+ if (!options) {
8483
+ options = {}
8484
+ }
8485
+
8486
+ this.type = 'default'
8487
+ this.status = options.status === undefined ? 200 : options.status
8488
+ this.ok = this.status >= 200 && this.status < 300
8489
+ this.statusText = 'statusText' in options ? options.statusText : 'OK'
8490
+ this.headers = new Headers(options.headers)
8491
+ this.url = options.url || ''
8492
+ this._initBody(bodyInit)
8493
+ }
8494
+
8495
+ Body.call(Response.prototype)
8496
+
8497
+ Response.prototype.clone = function() {
8498
+ return new Response(this._bodyInit, {
8499
+ status: this.status,
8500
+ statusText: this.statusText,
8501
+ headers: new Headers(this.headers),
8502
+ url: this.url
8503
+ })
8504
+ }
8505
+
8506
+ Response.error = function() {
8507
+ var response = new Response(null, {status: 0, statusText: ''})
8508
+ response.type = 'error'
8509
+ return response
8510
+ }
8511
+
8512
+ var redirectStatuses = [301, 302, 303, 307, 308]
8513
+
8514
+ Response.redirect = function(url, status) {
8515
+ if (redirectStatuses.indexOf(status) === -1) {
8516
+ throw new RangeError('Invalid status code')
8517
+ }
8518
+
8519
+ return new Response(null, {status: status, headers: {location: url}})
8520
+ }
8521
+
8522
+ self.Headers = Headers
8523
+ self.Request = Request
8524
+ self.Response = Response
8525
+
8526
+ self.fetch = function(input, init) {
8527
+ return new Promise(function(resolve, reject) {
8528
+ var request = new Request(input, init)
8529
+ var xhr = new XMLHttpRequest()
8530
+
8531
+ xhr.onload = function() {
8532
+ var options = {
8533
+ status: xhr.status,
8534
+ statusText: xhr.statusText,
8535
+ headers: parseHeaders(xhr.getAllResponseHeaders() || '')
8536
+ }
8537
+ options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
8538
+ var body = 'response' in xhr ? xhr.response : xhr.responseText
8539
+ resolve(new Response(body, options))
8540
+ }
8541
+
8542
+ xhr.onerror = function() {
8543
+ reject(new TypeError('Network request failed'))
8544
+ }
8545
+
8546
+ xhr.ontimeout = function() {
8547
+ reject(new TypeError('Network request failed'))
8548
+ }
8549
+
8550
+ xhr.open(request.method, request.url, true)
8551
+
8552
+ if (request.credentials === 'include') {
8553
+ xhr.withCredentials = true
8554
+ } else if (request.credentials === 'omit') {
8555
+ xhr.withCredentials = false
8556
+ }
8557
+
8558
+ if ('responseType' in xhr && support.blob) {
8559
+ xhr.responseType = 'blob'
8560
+ }
8561
+
8562
+ request.headers.forEach(function(value, name) {
8563
+ xhr.setRequestHeader(name, value)
8564
+ })
8565
+
8566
+ xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
8567
+ })
8568
+ }
8569
+ self.fetch.polyfill = true
8570
+ })(typeof self !== 'undefined' ? self : this);
8571
+
8572
+
8573
+ /***/ }),
8574
+ /* 207 */
8575
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
8576
+
8577
+ "use strict";
8578
+
8579
+ // CONCATENATED MODULE: ./node_modules/react-redux/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js
8580
+ function _inheritsLoose(subClass, superClass) {
8581
+ subClass.prototype = Object.create(superClass.prototype);
8582
+ subClass.prototype.constructor = subClass;
8583
+ subClass.__proto__ = superClass;
8584
+ }
8585
+ // EXTERNAL MODULE: external "React"
8586
+ var external_React_ = __webpack_require__(2);
8587
+ var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
8588
+
8589
+ // EXTERNAL MODULE: ./node_modules/prop-types/index.js
8590
+ var prop_types = __webpack_require__(0);
8591
+ var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
8592
+
8593
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/utils/PropTypes.js
8594
+
8595
+ var subscriptionShape = prop_types_default.a.shape({
8596
+ trySubscribe: prop_types_default.a.func.isRequired,
8597
+ tryUnsubscribe: prop_types_default.a.func.isRequired,
8598
+ notifyNestedSubs: prop_types_default.a.func.isRequired,
8599
+ isSubscribed: prop_types_default.a.func.isRequired
8600
+ });
8601
+ var storeShape = prop_types_default.a.shape({
8602
+ subscribe: prop_types_default.a.func.isRequired,
8603
+ dispatch: prop_types_default.a.func.isRequired,
8604
+ getState: prop_types_default.a.func.isRequired
8605
+ });
8606
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/utils/warning.js
8607
+ /**
8608
+ * Prints a warning in the console if it exists.
8609
+ *
8610
+ * @param {String} message The warning message.
8611
+ * @returns {void}
8612
+ */
8613
+ function warning(message) {
8614
+ /* eslint-disable no-console */
8615
+ if (typeof console !== 'undefined' && typeof console.error === 'function') {
8616
+ console.error(message);
8617
+ }
8618
+ /* eslint-enable no-console */
8619
+
8620
+
8621
+ try {
8622
+ // This error was thrown as a convenience so that if you enable
8623
+ // "break on all exceptions" in your console,
8624
+ // it would pause the execution at this line.
8625
+ throw new Error(message);
8626
+ /* eslint-disable no-empty */
8627
+ } catch (e) {}
8628
+ /* eslint-enable no-empty */
8629
+
8630
+ }
8631
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/components/Provider.js
8632
+
8633
+
8634
+
8635
+
8636
+
8637
+ var prefixUnsafeLifecycleMethods = typeof external_React_default.a.forwardRef !== "undefined";
8638
+ var didWarnAboutReceivingStore = false;
8639
+
8640
+ function warnAboutReceivingStore() {
8641
+ if (didWarnAboutReceivingStore) {
8642
+ return;
8643
+ }
8644
+
8645
+ didWarnAboutReceivingStore = true;
8646
+ warning('<Provider> does not support changing `store` on the fly. ' + 'It is most likely that you see this error because you updated to ' + 'Redux 2.x and React Redux 2.x which no longer hot reload reducers ' + 'automatically. See https://github.com/reduxjs/react-redux/releases/' + 'tag/v2.0.0 for the migration instructions.');
8647
+ }
8648
+
8649
+ function createProvider(storeKey) {
8650
+ var _Provider$childContex;
8651
+
8652
+ if (storeKey === void 0) {
8653
+ storeKey = 'store';
8654
+ }
8655
+
8656
+ var subscriptionKey = storeKey + "Subscription";
8657
+
8658
+ var Provider =
8659
+ /*#__PURE__*/
8660
+ function (_Component) {
8661
+ _inheritsLoose(Provider, _Component);
8662
+
8663
+ var _proto = Provider.prototype;
8664
+
8665
+ _proto.getChildContext = function getChildContext() {
8666
+ var _ref;
8667
+
8668
+ return _ref = {}, _ref[storeKey] = this[storeKey], _ref[subscriptionKey] = null, _ref;
8669
+ };
8670
+
8671
+ function Provider(props, context) {
8672
+ var _this;
8673
+
8674
+ _this = _Component.call(this, props, context) || this;
8675
+ _this[storeKey] = props.store;
8676
+ return _this;
8677
+ }
8678
+
8679
+ _proto.render = function render() {
8680
+ return external_React_["Children"].only(this.props.children);
8681
+ };
8682
+
8683
+ return Provider;
8684
+ }(external_React_["Component"]);
8685
+
8686
+ if (false) { var eventName; }
8687
+
8688
+ Provider.propTypes = {
8689
+ store: storeShape.isRequired,
8690
+ children: prop_types_default.a.element.isRequired
8691
+ };
8692
+ Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[storeKey] = storeShape.isRequired, _Provider$childContex[subscriptionKey] = subscriptionShape, _Provider$childContex);
8693
+ return Provider;
8694
+ }
8695
+ /* harmony default export */ var components_Provider = (createProvider());
8696
+ // CONCATENATED MODULE: ./node_modules/react-redux/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js
8697
+ function _assertThisInitialized(self) {
8698
+ if (self === void 0) {
8699
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
8700
+ }
8701
+
8702
+ return self;
8703
+ }
8704
+ // CONCATENATED MODULE: ./node_modules/react-redux/node_modules/@babel/runtime/helpers/esm/extends.js
8705
+ function _extends() {
8706
+ _extends = Object.assign || function (target) {
8707
+ for (var i = 1; i < arguments.length; i++) {
8708
+ var source = arguments[i];
8709
+
8710
+ for (var key in source) {
8711
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
8712
+ target[key] = source[key];
8713
+ }
8714
+ }
8715
+ }
8716
+
8717
+ return target;
8718
+ };
8719
+
8720
+ return _extends.apply(this, arguments);
8721
+ }
8722
+ // CONCATENATED MODULE: ./node_modules/react-redux/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js
8723
+ function _objectWithoutPropertiesLoose(source, excluded) {
8724
+ if (source == null) return {};
8725
+ var target = {};
8726
+ var sourceKeys = Object.keys(source);
8727
+ var key, i;
8728
+
8729
+ for (i = 0; i < sourceKeys.length; i++) {
8730
+ key = sourceKeys[i];
8731
+ if (excluded.indexOf(key) >= 0) continue;
8732
+ target[key] = source[key];
8733
+ }
8734
+
8735
+ return target;
8736
+ }
8737
+ // EXTERNAL MODULE: ./node_modules/react-redux/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js
8738
+ var hoist_non_react_statics_cjs = __webpack_require__(373);
8739
+ var hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs);
8740
+
8741
+ // EXTERNAL MODULE: ./node_modules/invariant/browser.js
8742
+ var browser = __webpack_require__(203);
8743
+ var browser_default = /*#__PURE__*/__webpack_require__.n(browser);
8744
+
8745
+ // EXTERNAL MODULE: ./node_modules/react-is/index.js
8746
+ var react_is = __webpack_require__(301);
8747
+
8748
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/utils/Subscription.js
8749
+ // encapsulates the subscription logic for connecting a component to the redux store, as
8750
+ // well as nesting subscriptions of descendant components, so that we can ensure the
8751
+ // ancestor components re-render before descendants
8752
+ var CLEARED = null;
8753
+ var nullListeners = {
8754
+ notify: function notify() {}
8755
+ };
8756
+
8757
+ function createListenerCollection() {
8758
+ // the current/next pattern is copied from redux's createStore code.
8759
+ // TODO: refactor+expose that code to be reusable here?
8760
+ var current = [];
8761
+ var next = [];
8762
+ return {
8763
+ clear: function clear() {
8764
+ next = CLEARED;
8765
+ current = CLEARED;
8766
+ },
8767
+ notify: function notify() {
8768
+ var listeners = current = next;
8769
+
8770
+ for (var i = 0; i < listeners.length; i++) {
8771
+ listeners[i]();
8772
+ }
8773
+ },
8774
+ get: function get() {
8775
+ return next;
8776
+ },
8777
+ subscribe: function subscribe(listener) {
8778
+ var isSubscribed = true;
8779
+ if (next === current) next = current.slice();
8780
+ next.push(listener);
8781
+ return function unsubscribe() {
8782
+ if (!isSubscribed || current === CLEARED) return;
8783
+ isSubscribed = false;
8784
+ if (next === current) next = current.slice();
8785
+ next.splice(next.indexOf(listener), 1);
8786
+ };
8787
+ }
8788
+ };
8789
+ }
8790
+
8791
+ var Subscription =
8792
+ /*#__PURE__*/
8793
+ function () {
8794
+ function Subscription(store, parentSub, onStateChange) {
8795
+ this.store = store;
8796
+ this.parentSub = parentSub;
8797
+ this.onStateChange = onStateChange;
8798
+ this.unsubscribe = null;
8799
+ this.listeners = nullListeners;
8800
+ }
8801
+
8802
+ var _proto = Subscription.prototype;
8803
+
8804
+ _proto.addNestedSub = function addNestedSub(listener) {
8805
+ this.trySubscribe();
8806
+ return this.listeners.subscribe(listener);
8807
+ };
8808
+
8809
+ _proto.notifyNestedSubs = function notifyNestedSubs() {
8810
+ this.listeners.notify();
8811
+ };
8812
+
8813
+ _proto.isSubscribed = function isSubscribed() {
8814
+ return Boolean(this.unsubscribe);
8815
+ };
8816
+
8817
+ _proto.trySubscribe = function trySubscribe() {
8818
+ if (!this.unsubscribe) {
8819
+ this.unsubscribe = this.parentSub ? this.parentSub.addNestedSub(this.onStateChange) : this.store.subscribe(this.onStateChange);
8820
+ this.listeners = createListenerCollection();
8821
+ }
8822
+ };
8823
+
8824
+ _proto.tryUnsubscribe = function tryUnsubscribe() {
8825
+ if (this.unsubscribe) {
8826
+ this.unsubscribe();
8827
+ this.unsubscribe = null;
8828
+ this.listeners.clear();
8829
+ this.listeners = nullListeners;
8830
+ }
8831
+ };
8832
+
8833
+ return Subscription;
8834
+ }();
8835
+
8836
+
8837
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/components/connectAdvanced.js
8838
+
8839
+
8840
+
8841
+
8842
+
8843
+
8844
+
8845
+
8846
+
8847
+
8848
+ var connectAdvanced_prefixUnsafeLifecycleMethods = typeof external_React_default.a.forwardRef !== "undefined";
8849
+ var hotReloadingVersion = 0;
8850
+ var dummyState = {};
8851
+
8852
+ function noop() {}
8853
+
8854
+ function makeSelectorStateful(sourceSelector, store) {
8855
+ // wrap the selector in an object that tracks its results between runs.
8856
+ var selector = {
8857
+ run: function runComponentSelector(props) {
8858
+ try {
8859
+ var nextProps = sourceSelector(store.getState(), props);
8860
+
8861
+ if (nextProps !== selector.props || selector.error) {
8862
+ selector.shouldComponentUpdate = true;
8863
+ selector.props = nextProps;
8864
+ selector.error = null;
8865
+ }
8866
+ } catch (error) {
8867
+ selector.shouldComponentUpdate = true;
8868
+ selector.error = error;
8869
+ }
8870
+ }
8871
+ };
8872
+ return selector;
8873
+ }
8874
+
8875
+ function connectAdvanced(
8876
+ /*
8877
+ selectorFactory is a func that is responsible for returning the selector function used to
8878
+ compute new props from state, props, and dispatch. For example:
8879
+ export default connectAdvanced((dispatch, options) => (state, props) => ({
8880
+ thing: state.things[props.thingId],
8881
+ saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),
8882
+ }))(YourComponent)
8883
+ Access to dispatch is provided to the factory so selectorFactories can bind actionCreators
8884
+ outside of their selector as an optimization. Options passed to connectAdvanced are passed to
8885
+ the selectorFactory, along with displayName and WrappedComponent, as the second argument.
8886
+ Note that selectorFactory is responsible for all caching/memoization of inbound and outbound
8887
+ props. Do not use connectAdvanced directly without memoizing results between calls to your
8888
+ selector, otherwise the Connect component will re-render on every state or props change.
8889
+ */
8890
+ selectorFactory, // options object:
8891
+ _ref) {
8892
+ var _contextTypes, _childContextTypes;
8893
+
8894
+ if (_ref === void 0) {
8895
+ _ref = {};
8896
+ }
8897
+
8898
+ var _ref2 = _ref,
8899
+ _ref2$getDisplayName = _ref2.getDisplayName,
8900
+ getDisplayName = _ref2$getDisplayName === void 0 ? function (name) {
8901
+ return "ConnectAdvanced(" + name + ")";
8902
+ } : _ref2$getDisplayName,
8903
+ _ref2$methodName = _ref2.methodName,
8904
+ methodName = _ref2$methodName === void 0 ? 'connectAdvanced' : _ref2$methodName,
8905
+ _ref2$renderCountProp = _ref2.renderCountProp,
8906
+ renderCountProp = _ref2$renderCountProp === void 0 ? undefined : _ref2$renderCountProp,
8907
+ _ref2$shouldHandleSta = _ref2.shouldHandleStateChanges,
8908
+ shouldHandleStateChanges = _ref2$shouldHandleSta === void 0 ? true : _ref2$shouldHandleSta,
8909
+ _ref2$storeKey = _ref2.storeKey,
8910
+ storeKey = _ref2$storeKey === void 0 ? 'store' : _ref2$storeKey,
8911
+ _ref2$withRef = _ref2.withRef,
8912
+ withRef = _ref2$withRef === void 0 ? false : _ref2$withRef,
8913
+ connectOptions = _objectWithoutPropertiesLoose(_ref2, ["getDisplayName", "methodName", "renderCountProp", "shouldHandleStateChanges", "storeKey", "withRef"]);
8914
+
8915
+ var subscriptionKey = storeKey + 'Subscription';
8916
+ var version = hotReloadingVersion++;
8917
+ var contextTypes = (_contextTypes = {}, _contextTypes[storeKey] = storeShape, _contextTypes[subscriptionKey] = subscriptionShape, _contextTypes);
8918
+ var childContextTypes = (_childContextTypes = {}, _childContextTypes[subscriptionKey] = subscriptionShape, _childContextTypes);
8919
+ return function wrapWithConnect(WrappedComponent) {
8920
+ browser_default()(Object(react_is["isValidElementType"])(WrappedComponent), "You must pass a component to the function returned by " + (methodName + ". Instead received " + JSON.stringify(WrappedComponent)));
8921
+ var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';
8922
+ var displayName = getDisplayName(wrappedComponentName);
8923
+
8924
+ var selectorFactoryOptions = _extends({}, connectOptions, {
8925
+ getDisplayName: getDisplayName,
8926
+ methodName: methodName,
8927
+ renderCountProp: renderCountProp,
8928
+ shouldHandleStateChanges: shouldHandleStateChanges,
8929
+ storeKey: storeKey,
8930
+ withRef: withRef,
8931
+ displayName: displayName,
8932
+ wrappedComponentName: wrappedComponentName,
8933
+ WrappedComponent: WrappedComponent // TODO Actually fix our use of componentWillReceiveProps
8934
+
8935
+ /* eslint-disable react/no-deprecated */
8936
+
8937
+ });
8938
+
8939
+ var Connect =
8940
+ /*#__PURE__*/
8941
+ function (_Component) {
8942
+ _inheritsLoose(Connect, _Component);
8943
+
8944
+ function Connect(props, context) {
8945
+ var _this;
8946
+
8947
+ _this = _Component.call(this, props, context) || this;
8948
+ _this.version = version;
8949
+ _this.state = {};
8950
+ _this.renderCount = 0;
8951
+ _this.store = props[storeKey] || context[storeKey];
8952
+ _this.propsMode = Boolean(props[storeKey]);
8953
+ _this.setWrappedInstance = _this.setWrappedInstance.bind(_assertThisInitialized(_assertThisInitialized(_this)));
8954
+ browser_default()(_this.store, "Could not find \"" + storeKey + "\" in either the context or props of " + ("\"" + displayName + "\". Either wrap the root component in a <Provider>, ") + ("or explicitly pass \"" + storeKey + "\" as a prop to \"" + displayName + "\"."));
8955
+
8956
+ _this.initSelector();
8957
+
8958
+ _this.initSubscription();
8959
+
8960
+ return _this;
8961
+ }
8962
+
8963
+ var _proto = Connect.prototype;
8964
+
8965
+ _proto.getChildContext = function getChildContext() {
8966
+ var _ref3;
8967
+
8968
+ // If this component received store from props, its subscription should be transparent
8969
+ // to any descendants receiving store+subscription from context; it passes along
8970
+ // subscription passed to it. Otherwise, it shadows the parent subscription, which allows
8971
+ // Connect to control ordering of notifications to flow top-down.
8972
+ var subscription = this.propsMode ? null : this.subscription;
8973
+ return _ref3 = {}, _ref3[subscriptionKey] = subscription || this.context[subscriptionKey], _ref3;
8974
+ };
8975
+
8976
+ _proto.componentDidMount = function componentDidMount() {
8977
+ if (!shouldHandleStateChanges) return; // componentWillMount fires during server side rendering, but componentDidMount and
8978
+ // componentWillUnmount do not. Because of this, trySubscribe happens during ...didMount.
8979
+ // Otherwise, unsubscription would never take place during SSR, causing a memory leak.
8980
+ // To handle the case where a child component may have triggered a state change by
8981
+ // dispatching an action in its componentWillMount, we have to re-run the select and maybe
8982
+ // re-render.
8983
+
8984
+ this.subscription.trySubscribe();
8985
+ this.selector.run(this.props);
8986
+ if (this.selector.shouldComponentUpdate) this.forceUpdate();
8987
+ }; // Note: this is renamed below to the UNSAFE_ version in React >=16.3.0
8988
+
8989
+
8990
+ _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
8991
+ this.selector.run(nextProps);
8992
+ };
8993
+
8994
+ _proto.shouldComponentUpdate = function shouldComponentUpdate() {
8995
+ return this.selector.shouldComponentUpdate;
8996
+ };
8997
+
8998
+ _proto.componentWillUnmount = function componentWillUnmount() {
8999
+ if (this.subscription) this.subscription.tryUnsubscribe();
9000
+ this.subscription = null;
9001
+ this.notifyNestedSubs = noop;
9002
+ this.store = null;
9003
+ this.selector.run = noop;
9004
+ this.selector.shouldComponentUpdate = false;
9005
+ };
9006
+
9007
+ _proto.getWrappedInstance = function getWrappedInstance() {
9008
+ browser_default()(withRef, "To access the wrapped instance, you need to specify " + ("{ withRef: true } in the options argument of the " + methodName + "() call."));
9009
+ return this.wrappedInstance;
9010
+ };
9011
+
9012
+ _proto.setWrappedInstance = function setWrappedInstance(ref) {
9013
+ this.wrappedInstance = ref;
9014
+ };
9015
+
9016
+ _proto.initSelector = function initSelector() {
9017
+ var sourceSelector = selectorFactory(this.store.dispatch, selectorFactoryOptions);
9018
+ this.selector = makeSelectorStateful(sourceSelector, this.store);
9019
+ this.selector.run(this.props);
9020
+ };
9021
+
9022
+ _proto.initSubscription = function initSubscription() {
9023
+ if (!shouldHandleStateChanges) return; // parentSub's source should match where store came from: props vs. context. A component
9024
+ // connected to the store via props shouldn't use subscription from context, or vice versa.
9025
+
9026
+ var parentSub = (this.propsMode ? this.props : this.context)[subscriptionKey];
9027
+ this.subscription = new Subscription(this.store, parentSub, this.onStateChange.bind(this)); // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in
9028
+ // the middle of the notification loop, where `this.subscription` will then be null. An
9029
+ // extra null check every change can be avoided by copying the method onto `this` and then
9030
+ // replacing it with a no-op on unmount. This can probably be avoided if Subscription's
9031
+ // listeners logic is changed to not call listeners that have been unsubscribed in the
9032
+ // middle of the notification loop.
9033
+
9034
+ this.notifyNestedSubs = this.subscription.notifyNestedSubs.bind(this.subscription);
9035
+ };
9036
+
9037
+ _proto.onStateChange = function onStateChange() {
9038
+ this.selector.run(this.props);
9039
+
9040
+ if (!this.selector.shouldComponentUpdate) {
9041
+ this.notifyNestedSubs();
9042
+ } else {
9043
+ this.componentDidUpdate = this.notifyNestedSubsOnComponentDidUpdate;
9044
+ this.setState(dummyState);
9045
+ }
9046
+ };
9047
+
9048
+ _proto.notifyNestedSubsOnComponentDidUpdate = function notifyNestedSubsOnComponentDidUpdate() {
9049
+ // `componentDidUpdate` is conditionally implemented when `onStateChange` determines it
9050
+ // needs to notify nested subs. Once called, it unimplements itself until further state
9051
+ // changes occur. Doing it this way vs having a permanent `componentDidUpdate` that does
9052
+ // a boolean check every time avoids an extra method call most of the time, resulting
9053
+ // in some perf boost.
9054
+ this.componentDidUpdate = undefined;
9055
+ this.notifyNestedSubs();
9056
+ };
9057
+
9058
+ _proto.isSubscribed = function isSubscribed() {
9059
+ return Boolean(this.subscription) && this.subscription.isSubscribed();
9060
+ };
9061
+
9062
+ _proto.addExtraProps = function addExtraProps(props) {
9063
+ if (!withRef && !renderCountProp && !(this.propsMode && this.subscription)) return props; // make a shallow copy so that fields added don't leak to the original selector.
9064
+ // this is especially important for 'ref' since that's a reference back to the component
9065
+ // instance. a singleton memoized selector would then be holding a reference to the
9066
+ // instance, preventing the instance from being garbage collected, and that would be bad
9067
+
9068
+ var withExtras = _extends({}, props);
9069
+
9070
+ if (withRef) withExtras.ref = this.setWrappedInstance;
9071
+ if (renderCountProp) withExtras[renderCountProp] = this.renderCount++;
9072
+ if (this.propsMode && this.subscription) withExtras[subscriptionKey] = this.subscription;
9073
+ return withExtras;
9074
+ };
9075
+
9076
+ _proto.render = function render() {
9077
+ var selector = this.selector;
9078
+ selector.shouldComponentUpdate = false;
9079
+
9080
+ if (selector.error) {
9081
+ throw selector.error;
9082
+ } else {
9083
+ return Object(external_React_["createElement"])(WrappedComponent, this.addExtraProps(selector.props));
9084
+ }
9085
+ };
9086
+
9087
+ return Connect;
9088
+ }(external_React_["Component"]);
9089
+
9090
+ if (connectAdvanced_prefixUnsafeLifecycleMethods) {
9091
+ // Use UNSAFE_ event name where supported
9092
+ Connect.prototype.UNSAFE_componentWillReceiveProps = Connect.prototype.componentWillReceiveProps;
9093
+ delete Connect.prototype.componentWillReceiveProps;
9094
+ }
9095
+ /* eslint-enable react/no-deprecated */
9096
+
9097
+
9098
+ Connect.WrappedComponent = WrappedComponent;
9099
+ Connect.displayName = displayName;
9100
+ Connect.childContextTypes = childContextTypes;
9101
+ Connect.contextTypes = contextTypes;
9102
+ Connect.propTypes = contextTypes;
9103
+
9104
+ if (false) { var eventName; }
9105
+
9106
+ return hoist_non_react_statics_cjs_default()(Connect, WrappedComponent);
9107
+ };
9108
+ }
9109
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/utils/shallowEqual.js
9110
+ var hasOwn = Object.prototype.hasOwnProperty;
9111
+
9112
+ function is(x, y) {
9113
+ if (x === y) {
9114
+ return x !== 0 || y !== 0 || 1 / x === 1 / y;
9115
+ } else {
9116
+ return x !== x && y !== y;
9117
+ }
9118
+ }
9119
+
9120
+ function shallowEqual(objA, objB) {
9121
+ if (is(objA, objB)) return true;
9122
+
9123
+ if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
9124
+ return false;
9125
+ }
9126
+
9127
+ var keysA = Object.keys(objA);
9128
+ var keysB = Object.keys(objB);
9129
+ if (keysA.length !== keysB.length) return false;
9130
+
9131
+ for (var i = 0; i < keysA.length; i++) {
9132
+ if (!hasOwn.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
9133
+ return false;
9134
+ }
9135
+ }
9136
+
9137
+ return true;
9138
+ }
9139
+ // EXTERNAL MODULE: ./node_modules/redux/es/redux.js
9140
+ var redux = __webpack_require__(15);
9141
+
9142
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/utils/isPlainObject.js
9143
+ /**
9144
+ * @param {any} obj The object to inspect.
9145
+ * @returns {boolean} True if the argument appears to be a plain object.
9146
+ */
9147
+ function isPlainObject(obj) {
9148
+ if (typeof obj !== 'object' || obj === null) return false;
9149
+ var proto = Object.getPrototypeOf(obj);
9150
+ if (proto === null) return true;
9151
+ var baseProto = proto;
9152
+
9153
+ while (Object.getPrototypeOf(baseProto) !== null) {
9154
+ baseProto = Object.getPrototypeOf(baseProto);
9155
+ }
9156
+
9157
+ return proto === baseProto;
9158
+ }
9159
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/utils/verifyPlainObject.js
9160
+
9161
+
9162
+ function verifyPlainObject(value, displayName, methodName) {
9163
+ if (!isPlainObject(value)) {
9164
+ warning(methodName + "() in " + displayName + " must return a plain object. Instead received " + value + ".");
9165
+ }
9166
+ }
9167
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/connect/wrapMapToProps.js
9168
+
9169
+ function wrapMapToPropsConstant(getConstant) {
9170
+ return function initConstantSelector(dispatch, options) {
9171
+ var constant = getConstant(dispatch, options);
9172
+
9173
+ function constantSelector() {
9174
+ return constant;
9175
+ }
9176
+
9177
+ constantSelector.dependsOnOwnProps = false;
9178
+ return constantSelector;
9179
+ };
9180
+ } // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args
9181
+ // to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine
9182
+ // whether mapToProps needs to be invoked when props have changed.
9183
+ //
9184
+ // A length of one signals that mapToProps does not depend on props from the parent component.
9185
+ // A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and
9186
+ // therefore not reporting its length accurately..
9187
+
9188
+ function getDependsOnOwnProps(mapToProps) {
9189
+ return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;
9190
+ } // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,
9191
+ // this function wraps mapToProps in a proxy function which does several things:
9192
+ //
9193
+ // * Detects whether the mapToProps function being called depends on props, which
9194
+ // is used by selectorFactory to decide if it should reinvoke on props changes.
9195
+ //
9196
+ // * On first call, handles mapToProps if returns another function, and treats that
9197
+ // new function as the true mapToProps for subsequent calls.
9198
+ //
9199
+ // * On first call, verifies the first result is a plain object, in order to warn
9200
+ // the developer that their mapToProps function is not returning a valid result.
9201
+ //
9202
+
9203
+ function wrapMapToPropsFunc(mapToProps, methodName) {
9204
+ return function initProxySelector(dispatch, _ref) {
9205
+ var displayName = _ref.displayName;
9206
+
9207
+ var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {
9208
+ return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);
9209
+ }; // allow detectFactoryAndVerify to get ownProps
9210
+
9211
+
9212
+ proxy.dependsOnOwnProps = true;
9213
+
9214
+ proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {
9215
+ proxy.mapToProps = mapToProps;
9216
+ proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);
9217
+ var props = proxy(stateOrDispatch, ownProps);
9218
+
9219
+ if (typeof props === 'function') {
9220
+ proxy.mapToProps = props;
9221
+ proxy.dependsOnOwnProps = getDependsOnOwnProps(props);
9222
+ props = proxy(stateOrDispatch, ownProps);
9223
+ }
9224
+
9225
+ if (false) {}
9226
+ return props;
9227
+ };
9228
+
9229
+ return proxy;
9230
+ };
9231
+ }
9232
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/connect/mapDispatchToProps.js
9233
+
9234
+
9235
+ function whenMapDispatchToPropsIsFunction(mapDispatchToProps) {
9236
+ return typeof mapDispatchToProps === 'function' ? wrapMapToPropsFunc(mapDispatchToProps, 'mapDispatchToProps') : undefined;
9237
+ }
9238
+ function whenMapDispatchToPropsIsMissing(mapDispatchToProps) {
9239
+ return !mapDispatchToProps ? wrapMapToPropsConstant(function (dispatch) {
9240
+ return {
9241
+ dispatch: dispatch
9242
+ };
9243
+ }) : undefined;
9244
+ }
9245
+ function whenMapDispatchToPropsIsObject(mapDispatchToProps) {
9246
+ return mapDispatchToProps && typeof mapDispatchToProps === 'object' ? wrapMapToPropsConstant(function (dispatch) {
9247
+ return Object(redux["bindActionCreators"])(mapDispatchToProps, dispatch);
9248
+ }) : undefined;
9249
+ }
9250
+ /* harmony default export */ var connect_mapDispatchToProps = ([whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject]);
9251
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/connect/mapStateToProps.js
9252
+
9253
+ function whenMapStateToPropsIsFunction(mapStateToProps) {
9254
+ return typeof mapStateToProps === 'function' ? wrapMapToPropsFunc(mapStateToProps, 'mapStateToProps') : undefined;
9255
+ }
9256
+ function whenMapStateToPropsIsMissing(mapStateToProps) {
9257
+ return !mapStateToProps ? wrapMapToPropsConstant(function () {
9258
+ return {};
9259
+ }) : undefined;
9260
+ }
9261
+ /* harmony default export */ var connect_mapStateToProps = ([whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing]);
9262
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/connect/mergeProps.js
9263
+
9264
+
9265
+ function defaultMergeProps(stateProps, dispatchProps, ownProps) {
9266
+ return _extends({}, ownProps, stateProps, dispatchProps);
9267
+ }
9268
+ function wrapMergePropsFunc(mergeProps) {
9269
+ return function initMergePropsProxy(dispatch, _ref) {
9270
+ var displayName = _ref.displayName,
9271
+ pure = _ref.pure,
9272
+ areMergedPropsEqual = _ref.areMergedPropsEqual;
9273
+ var hasRunOnce = false;
9274
+ var mergedProps;
9275
+ return function mergePropsProxy(stateProps, dispatchProps, ownProps) {
9276
+ var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);
9277
+
9278
+ if (hasRunOnce) {
9279
+ if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;
9280
+ } else {
9281
+ hasRunOnce = true;
9282
+ mergedProps = nextMergedProps;
9283
+ if (false) {}
9284
+ }
9285
+
9286
+ return mergedProps;
9287
+ };
9288
+ };
9289
+ }
9290
+ function whenMergePropsIsFunction(mergeProps) {
9291
+ return typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : undefined;
9292
+ }
9293
+ function whenMergePropsIsOmitted(mergeProps) {
9294
+ return !mergeProps ? function () {
9295
+ return defaultMergeProps;
9296
+ } : undefined;
9297
+ }
9298
+ /* harmony default export */ var connect_mergeProps = ([whenMergePropsIsFunction, whenMergePropsIsOmitted]);
9299
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/connect/verifySubselectors.js
9300
+
9301
+
9302
+ function verify(selector, methodName, displayName) {
9303
+ if (!selector) {
9304
+ throw new Error("Unexpected value for " + methodName + " in " + displayName + ".");
9305
+ } else if (methodName === 'mapStateToProps' || methodName === 'mapDispatchToProps') {
9306
+ if (!selector.hasOwnProperty('dependsOnOwnProps')) {
9307
+ warning("The selector for " + methodName + " of " + displayName + " did not specify a value for dependsOnOwnProps.");
9308
+ }
9309
+ }
9310
+ }
9311
+
9312
+ function verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, displayName) {
9313
+ verify(mapStateToProps, 'mapStateToProps', displayName);
9314
+ verify(mapDispatchToProps, 'mapDispatchToProps', displayName);
9315
+ verify(mergeProps, 'mergeProps', displayName);
9316
+ }
9317
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/connect/selectorFactory.js
9318
+
9319
+
9320
+ function impureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch) {
9321
+ return function impureFinalPropsSelector(state, ownProps) {
9322
+ return mergeProps(mapStateToProps(state, ownProps), mapDispatchToProps(dispatch, ownProps), ownProps);
9323
+ };
9324
+ }
9325
+ function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref) {
9326
+ var areStatesEqual = _ref.areStatesEqual,
9327
+ areOwnPropsEqual = _ref.areOwnPropsEqual,
9328
+ areStatePropsEqual = _ref.areStatePropsEqual;
9329
+ var hasRunAtLeastOnce = false;
9330
+ var state;
9331
+ var ownProps;
9332
+ var stateProps;
9333
+ var dispatchProps;
9334
+ var mergedProps;
9335
+
9336
+ function handleFirstCall(firstState, firstOwnProps) {
9337
+ state = firstState;
9338
+ ownProps = firstOwnProps;
9339
+ stateProps = mapStateToProps(state, ownProps);
9340
+ dispatchProps = mapDispatchToProps(dispatch, ownProps);
9341
+ mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
9342
+ hasRunAtLeastOnce = true;
9343
+ return mergedProps;
9344
+ }
9345
+
9346
+ function handleNewPropsAndNewState() {
9347
+ stateProps = mapStateToProps(state, ownProps);
9348
+ if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);
9349
+ mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
9350
+ return mergedProps;
9351
+ }
9352
+
9353
+ function handleNewProps() {
9354
+ if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);
9355
+ if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);
9356
+ mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
9357
+ return mergedProps;
9358
+ }
9359
+
9360
+ function handleNewState() {
9361
+ var nextStateProps = mapStateToProps(state, ownProps);
9362
+ var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);
9363
+ stateProps = nextStateProps;
9364
+ if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
9365
+ return mergedProps;
9366
+ }
9367
+
9368
+ function handleSubsequentCalls(nextState, nextOwnProps) {
9369
+ var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);
9370
+ var stateChanged = !areStatesEqual(nextState, state);
9371
+ state = nextState;
9372
+ ownProps = nextOwnProps;
9373
+ if (propsChanged && stateChanged) return handleNewPropsAndNewState();
9374
+ if (propsChanged) return handleNewProps();
9375
+ if (stateChanged) return handleNewState();
9376
+ return mergedProps;
9377
+ }
9378
+
9379
+ return function pureFinalPropsSelector(nextState, nextOwnProps) {
9380
+ return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);
9381
+ };
9382
+ } // TODO: Add more comments
9383
+ // If pure is true, the selector returned by selectorFactory will memoize its results,
9384
+ // allowing connectAdvanced's shouldComponentUpdate to return false if final
9385
+ // props have not changed. If false, the selector will always return a new
9386
+ // object and shouldComponentUpdate will always return true.
9387
+
9388
+ function finalPropsSelectorFactory(dispatch, _ref2) {
9389
+ var initMapStateToProps = _ref2.initMapStateToProps,
9390
+ initMapDispatchToProps = _ref2.initMapDispatchToProps,
9391
+ initMergeProps = _ref2.initMergeProps,
9392
+ options = _objectWithoutPropertiesLoose(_ref2, ["initMapStateToProps", "initMapDispatchToProps", "initMergeProps"]);
9393
+
9394
+ var mapStateToProps = initMapStateToProps(dispatch, options);
9395
+ var mapDispatchToProps = initMapDispatchToProps(dispatch, options);
9396
+ var mergeProps = initMergeProps(dispatch, options);
9397
+
9398
+ if (false) {}
9399
+
9400
+ var selectorFactory = options.pure ? pureFinalPropsSelectorFactory : impureFinalPropsSelectorFactory;
9401
+ return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);
9402
+ }
9403
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/connect/connect.js
9404
+
9405
+
9406
+
9407
+
9408
+
9409
+
9410
+
9411
+
9412
+ /*
9413
+ connect is a facade over connectAdvanced. It turns its args into a compatible
9414
+ selectorFactory, which has the signature:
9415
+
9416
+ (dispatch, options) => (nextState, nextOwnProps) => nextFinalProps
9417
+
9418
+ connect passes its args to connectAdvanced as options, which will in turn pass them to
9419
+ selectorFactory each time a Connect component instance is instantiated or hot reloaded.
9420
+
9421
+ selectorFactory returns a final props selector from its mapStateToProps,
9422
+ mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,
9423
+ mergePropsFactories, and pure args.
9424
+
9425
+ The resulting final props selector is called by the Connect component instance whenever
9426
+ it receives new props or store state.
9427
+ */
9428
+
9429
+ function match(arg, factories, name) {
9430
+ for (var i = factories.length - 1; i >= 0; i--) {
9431
+ var result = factories[i](arg);
9432
+ if (result) return result;
9433
+ }
9434
+
9435
+ return function (dispatch, options) {
9436
+ throw new Error("Invalid value of type " + typeof arg + " for " + name + " argument when connecting component " + options.wrappedComponentName + ".");
9437
+ };
9438
+ }
9439
+
9440
+ function strictEqual(a, b) {
9441
+ return a === b;
9442
+ } // createConnect with default args builds the 'official' connect behavior. Calling it with
9443
+ // different options opens up some testing and extensibility scenarios
9444
+
9445
+
9446
+ function createConnect(_temp) {
9447
+ var _ref = _temp === void 0 ? {} : _temp,
9448
+ _ref$connectHOC = _ref.connectHOC,
9449
+ connectHOC = _ref$connectHOC === void 0 ? connectAdvanced : _ref$connectHOC,
9450
+ _ref$mapStateToPropsF = _ref.mapStateToPropsFactories,
9451
+ mapStateToPropsFactories = _ref$mapStateToPropsF === void 0 ? connect_mapStateToProps : _ref$mapStateToPropsF,
9452
+ _ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,
9453
+ mapDispatchToPropsFactories = _ref$mapDispatchToPro === void 0 ? connect_mapDispatchToProps : _ref$mapDispatchToPro,
9454
+ _ref$mergePropsFactor = _ref.mergePropsFactories,
9455
+ mergePropsFactories = _ref$mergePropsFactor === void 0 ? connect_mergeProps : _ref$mergePropsFactor,
9456
+ _ref$selectorFactory = _ref.selectorFactory,
9457
+ selectorFactory = _ref$selectorFactory === void 0 ? finalPropsSelectorFactory : _ref$selectorFactory;
9458
+
9459
+ return function connect(mapStateToProps, mapDispatchToProps, mergeProps, _ref2) {
9460
+ if (_ref2 === void 0) {
9461
+ _ref2 = {};
9462
+ }
9463
+
9464
+ var _ref3 = _ref2,
9465
+ _ref3$pure = _ref3.pure,
9466
+ pure = _ref3$pure === void 0 ? true : _ref3$pure,
9467
+ _ref3$areStatesEqual = _ref3.areStatesEqual,
9468
+ areStatesEqual = _ref3$areStatesEqual === void 0 ? strictEqual : _ref3$areStatesEqual,
9469
+ _ref3$areOwnPropsEqua = _ref3.areOwnPropsEqual,
9470
+ areOwnPropsEqual = _ref3$areOwnPropsEqua === void 0 ? shallowEqual : _ref3$areOwnPropsEqua,
9471
+ _ref3$areStatePropsEq = _ref3.areStatePropsEqual,
9472
+ areStatePropsEqual = _ref3$areStatePropsEq === void 0 ? shallowEqual : _ref3$areStatePropsEq,
9473
+ _ref3$areMergedPropsE = _ref3.areMergedPropsEqual,
9474
+ areMergedPropsEqual = _ref3$areMergedPropsE === void 0 ? shallowEqual : _ref3$areMergedPropsE,
9475
+ extraOptions = _objectWithoutPropertiesLoose(_ref3, ["pure", "areStatesEqual", "areOwnPropsEqual", "areStatePropsEqual", "areMergedPropsEqual"]);
9476
+
9477
+ var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, 'mapStateToProps');
9478
+ var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, 'mapDispatchToProps');
9479
+ var initMergeProps = match(mergeProps, mergePropsFactories, 'mergeProps');
9480
+ return connectHOC(selectorFactory, _extends({
9481
+ // used in error messages
9482
+ methodName: 'connect',
9483
+ // used to compute Connect's displayName from the wrapped component's displayName.
9484
+ getDisplayName: function getDisplayName(name) {
9485
+ return "Connect(" + name + ")";
9486
+ },
9487
+ // if mapStateToProps is falsy, the Connect component doesn't subscribe to store state changes
9488
+ shouldHandleStateChanges: Boolean(mapStateToProps),
9489
+ // passed through to selectorFactory
9490
+ initMapStateToProps: initMapStateToProps,
9491
+ initMapDispatchToProps: initMapDispatchToProps,
9492
+ initMergeProps: initMergeProps,
9493
+ pure: pure,
9494
+ areStatesEqual: areStatesEqual,
9495
+ areOwnPropsEqual: areOwnPropsEqual,
9496
+ areStatePropsEqual: areStatePropsEqual,
9497
+ areMergedPropsEqual: areMergedPropsEqual
9498
+ }, extraOptions));
9499
+ };
9500
+ }
9501
+ /* harmony default export */ var connect_connect = (createConnect());
9502
+ // CONCATENATED MODULE: ./node_modules/react-redux/es/index.js
9503
+ /* unused concated harmony import Provider */
9504
+ /* unused concated harmony import createProvider */
9505
+ /* unused concated harmony import connectAdvanced */
9506
+ /* concated harmony reexport connect */__webpack_require__.d(__webpack_exports__, "a", function() { return connect_connect; });
9507
+
9508
+
9509
+
9510
+
9511
+
9512
+ /***/ }),
9513
+ /* 208 */
9514
+ /***/ (function(module, exports, __webpack_require__) {
9515
+
9516
+ module.exports = { "default": __webpack_require__(209), __esModule: true };
9517
+
9518
+ /***/ }),
9519
+ /* 209 */
9520
+ /***/ (function(module, exports, __webpack_require__) {
9521
+
9522
+ __webpack_require__(61);
9523
+ __webpack_require__(216);
9524
+ module.exports = __webpack_require__(10).Array.from;
9525
+
9526
+
9527
+ /***/ }),
9528
+ /* 210 */
9529
+ /***/ (function(module, exports, __webpack_require__) {
9530
+
9531
+ var toInteger = __webpack_require__(78);
9532
+ var defined = __webpack_require__(79);
9533
+ // true -> String#at
9534
+ // false -> String#codePointAt
9535
+ module.exports = function (TO_STRING) {
9536
+ return function (that, pos) {
9537
+ var s = String(defined(that));
9538
+ var i = toInteger(pos);
9539
+ var l = s.length;
9540
+ var a, b;
9541
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
9542
+ a = s.charCodeAt(i);
9543
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
9544
+ ? TO_STRING ? s.charAt(i) : a
9545
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
9546
+ };
9547
+ };
9548
+
9549
+
9550
+ /***/ }),
9551
+ /* 211 */
9552
+ /***/ (function(module, exports, __webpack_require__) {
9553
+
9554
+ "use strict";
9555
+
9556
+ var create = __webpack_require__(126);
9557
+ var descriptor = __webpack_require__(51);
9558
+ var setToStringTag = __webpack_require__(62);
9559
+ var IteratorPrototype = {};
9560
+
9561
+ // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
9562
+ __webpack_require__(30)(IteratorPrototype, __webpack_require__(12)('iterator'), function () { return this; });
9563
+
9564
+ module.exports = function (Constructor, NAME, next) {
9565
+ Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
9566
+ setToStringTag(Constructor, NAME + ' Iterator');
9567
+ };
9568
+
9569
+
9570
+ /***/ }),
9571
+ /* 212 */
9572
+ /***/ (function(module, exports, __webpack_require__) {
9573
+
9574
+ var dP = __webpack_require__(23);
9575
+ var anObject = __webpack_require__(17);
9576
+ var getKeys = __webpack_require__(68);
9577
+
9578
+ module.exports = __webpack_require__(20) ? Object.defineProperties : function defineProperties(O, Properties) {
9579
+ anObject(O);
9580
+ var keys = getKeys(Properties);
9581
+ var length = keys.length;
9582
+ var i = 0;
9583
+ var P;
9584
+ while (length > i) dP.f(O, P = keys[i++], Properties[P]);
9585
+ return O;
9586
+ };
9587
+
9588
+
9589
+ /***/ }),
9590
+ /* 213 */
9591
+ /***/ (function(module, exports, __webpack_require__) {
9592
+
9593
+ // false -> Array#indexOf
9594
+ // true -> Array#includes
9595
+ var toIObject = __webpack_require__(45);
9596
+ var toLength = __webpack_require__(81);
9597
+ var toAbsoluteIndex = __webpack_require__(214);
9598
+ module.exports = function (IS_INCLUDES) {
9599
+ return function ($this, el, fromIndex) {
9600
+ var O = toIObject($this);
9601
+ var length = toLength(O.length);
9602
+ var index = toAbsoluteIndex(fromIndex, length);
9603
+ var value;
9604
+ // Array#includes uses SameValueZero equality algorithm
9605
+ // eslint-disable-next-line no-self-compare
9606
+ if (IS_INCLUDES && el != el) while (length > index) {
9607
+ value = O[index++];
9608
+ // eslint-disable-next-line no-self-compare
9609
+ if (value != value) return true;
9610
+ // Array#indexOf ignores holes, Array#includes - not
9611
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
9612
+ if (O[index] === el) return IS_INCLUDES || index || 0;
9613
+ } return !IS_INCLUDES && -1;
9614
+ };
9615
+ };
9616
+
9617
+
9618
+ /***/ }),
9619
+ /* 214 */
9620
+ /***/ (function(module, exports, __webpack_require__) {
9621
+
9622
+ var toInteger = __webpack_require__(78);
9623
+ var max = Math.max;
9624
+ var min = Math.min;
9625
+ module.exports = function (index, length) {
9626
+ index = toInteger(index);
9627
+ return index < 0 ? max(index + length, 0) : min(index, length);
9628
+ };
9629
+
9630
+
9631
+ /***/ }),
9632
+ /* 215 */
9633
+ /***/ (function(module, exports, __webpack_require__) {
9634
+
9635
+ // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
9636
+ var has = __webpack_require__(36);
9637
+ var toObject = __webpack_require__(63);
9638
+ var IE_PROTO = __webpack_require__(82)('IE_PROTO');
9639
+ var ObjectProto = Object.prototype;
9640
+
9641
+ module.exports = Object.getPrototypeOf || function (O) {
9642
+ O = toObject(O);
9643
+ if (has(O, IE_PROTO)) return O[IE_PROTO];
9644
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
9645
+ return O.constructor.prototype;
9646
+ } return O instanceof Object ? ObjectProto : null;
9647
+ };
9648
+
9649
+
9650
+ /***/ }),
9651
+ /* 216 */
9652
+ /***/ (function(module, exports, __webpack_require__) {
9653
+
9654
+ "use strict";
9655
+
9656
+ var ctx = __webpack_require__(40);
9657
+ var $export = __webpack_require__(19);
9658
+ var toObject = __webpack_require__(63);
9659
+ var call = __webpack_require__(134);
9660
+ var isArrayIter = __webpack_require__(135);
9661
+ var toLength = __webpack_require__(81);
9662
+ var createProperty = __webpack_require__(217);
9663
+ var getIterFn = __webpack_require__(109);
9664
+
9665
+ $export($export.S + $export.F * !__webpack_require__(136)(function (iter) { Array.from(iter); }), 'Array', {
9666
+ // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
9667
+ from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
9668
+ var O = toObject(arrayLike);
9669
+ var C = typeof this == 'function' ? this : Array;
9670
+ var aLen = arguments.length;
9671
+ var mapfn = aLen > 1 ? arguments[1] : undefined;
9672
+ var mapping = mapfn !== undefined;
9673
+ var index = 0;
9674
+ var iterFn = getIterFn(O);
9675
+ var length, result, step, iterator;
9676
+ if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
9677
+ // if object isn't iterable or it's array with default iterator - use simple case
9678
+ if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
9679
+ for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
9680
+ createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
9681
+ }
9682
+ } else {
9683
+ length = toLength(O.length);
9684
+ for (result = new C(length); length > index; index++) {
9685
+ createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
9686
+ }
9687
+ }
9688
+ result.length = index;
9689
+ return result;
9690
+ }
9691
+ });
9692
+
9693
+
9694
+ /***/ }),
9695
+ /* 217 */
9696
+ /***/ (function(module, exports, __webpack_require__) {
9697
+
9698
+ "use strict";
9699
+
9700
+ var $defineProperty = __webpack_require__(23);
9701
+ var createDesc = __webpack_require__(51);
9702
+
9703
+ module.exports = function (object, index, value) {
9704
+ if (index in object) $defineProperty.f(object, index, createDesc(0, value));
9705
+ else object[index] = value;
9706
+ };
9707
+
9708
+
9709
+ /***/ }),
9710
+ /* 218 */
9711
+ /***/ (function(module, exports, __webpack_require__) {
9712
+
9713
+ var Hash = __webpack_require__(219),
9714
+ ListCache = __webpack_require__(55),
9715
+ Map = __webpack_require__(84);
9716
+
9717
+ /**
9718
+ * Removes all key-value entries from the map.
9719
+ *
9720
+ * @private
9721
+ * @name clear
9722
+ * @memberOf MapCache
9723
+ */
9724
+ function mapCacheClear() {
9725
+ this.size = 0;
9726
+ this.__data__ = {
9727
+ 'hash': new Hash,
9728
+ 'map': new (Map || ListCache),
9729
+ 'string': new Hash
9730
+ };
9731
+ }
9732
+
9733
+ module.exports = mapCacheClear;
9734
+
9735
+
9736
+ /***/ }),
9737
+ /* 219 */
9738
+ /***/ (function(module, exports, __webpack_require__) {
9739
+
9740
+ var hashClear = __webpack_require__(220),
9741
+ hashDelete = __webpack_require__(227),
9742
+ hashGet = __webpack_require__(228),
9743
+ hashHas = __webpack_require__(229),
9744
+ hashSet = __webpack_require__(230);
9745
+
9746
+ /**
9747
+ * Creates a hash object.
9748
+ *
9749
+ * @private
9750
+ * @constructor
9751
+ * @param {Array} [entries] The key-value pairs to cache.
9752
+ */
9753
+ function Hash(entries) {
9754
+ var index = -1,
9755
+ length = entries == null ? 0 : entries.length;
9756
+
9757
+ this.clear();
9758
+ while (++index < length) {
9759
+ var entry = entries[index];
9760
+ this.set(entry[0], entry[1]);
9761
+ }
9762
+ }
9763
+
9764
+ // Add methods to `Hash`.
9765
+ Hash.prototype.clear = hashClear;
9766
+ Hash.prototype['delete'] = hashDelete;
9767
+ Hash.prototype.get = hashGet;
9768
+ Hash.prototype.has = hashHas;
9769
+ Hash.prototype.set = hashSet;
9770
+
9771
+ module.exports = Hash;
9772
+
9773
+
9774
+ /***/ }),
9775
+ /* 220 */
9776
+ /***/ (function(module, exports, __webpack_require__) {
9777
+
9778
+ var nativeCreate = __webpack_require__(54);
9779
+
9780
+ /**
9781
+ * Removes all key-value entries from the hash.
9782
+ *
9783
+ * @private
9784
+ * @name clear
9785
+ * @memberOf Hash
9786
+ */
9787
+ function hashClear() {
9788
+ this.__data__ = nativeCreate ? nativeCreate(null) : {};
9789
+ this.size = 0;
9790
+ }
9791
+
9792
+ module.exports = hashClear;
9793
+
9794
+
9795
+ /***/ }),
9796
+ /* 221 */
9797
+ /***/ (function(module, exports, __webpack_require__) {
9798
+
9799
+ var isFunction = __webpack_require__(93),
9800
+ isMasked = __webpack_require__(224),
9801
+ isObject = __webpack_require__(18),
9802
+ toSource = __webpack_require__(138);
9803
+
9804
+ /**
9805
+ * Used to match `RegExp`
9806
+ * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
9807
+ */
9808
+ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
9809
+
9810
+ /** Used to detect host constructors (Safari). */
9811
+ var reIsHostCtor = /^\[object .+?Constructor\]$/;
9812
+
9813
+ /** Used for built-in method references. */
9814
+ var funcProto = Function.prototype,
9815
+ objectProto = Object.prototype;
9816
+
9817
+ /** Used to resolve the decompiled source of functions. */
9818
+ var funcToString = funcProto.toString;
9819
+
9820
+ /** Used to check objects for own properties. */
9821
+ var hasOwnProperty = objectProto.hasOwnProperty;
9822
+
9823
+ /** Used to detect if a method is native. */
9824
+ var reIsNative = RegExp('^' +
9825
+ funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
9826
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
9827
+ );
9828
+
9829
+ /**
9830
+ * The base implementation of `_.isNative` without bad shim checks.
9831
+ *
9832
+ * @private
9833
+ * @param {*} value The value to check.
9834
+ * @returns {boolean} Returns `true` if `value` is a native function,
9835
+ * else `false`.
9836
+ */
9837
+ function baseIsNative(value) {
9838
+ if (!isObject(value) || isMasked(value)) {
9839
+ return false;
9840
+ }
9841
+ var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
9842
+ return pattern.test(toSource(value));
9843
+ }
9844
+
9845
+ module.exports = baseIsNative;
9846
+
9847
+
9848
+ /***/ }),
9849
+ /* 222 */
9850
+ /***/ (function(module, exports, __webpack_require__) {
9851
+
9852
+ var Symbol = __webpack_require__(37);
9853
+
9854
+ /** Used for built-in method references. */
9855
+ var objectProto = Object.prototype;
9856
+
9857
+ /** Used to check objects for own properties. */
9858
+ var hasOwnProperty = objectProto.hasOwnProperty;
9859
+
9860
+ /**
9861
+ * Used to resolve the
9862
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
9863
+ * of values.
9864
+ */
9865
+ var nativeObjectToString = objectProto.toString;
9866
+
9867
+ /** Built-in value references. */
9868
+ var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
9869
+
9870
+ /**
9871
+ * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
9872
+ *
9873
+ * @private
9874
+ * @param {*} value The value to query.
9875
+ * @returns {string} Returns the raw `toStringTag`.
9876
+ */
9877
+ function getRawTag(value) {
9878
+ var isOwn = hasOwnProperty.call(value, symToStringTag),
9879
+ tag = value[symToStringTag];
9880
+
9881
+ try {
9882
+ value[symToStringTag] = undefined;
9883
+ var unmasked = true;
9884
+ } catch (e) {}
9885
+
9886
+ var result = nativeObjectToString.call(value);
9887
+ if (unmasked) {
9888
+ if (isOwn) {
9889
+ value[symToStringTag] = tag;
9890
+ } else {
9891
+ delete value[symToStringTag];
9892
+ }
9893
+ }
9894
+ return result;
9895
+ }
9896
+
9897
+ module.exports = getRawTag;
9898
+
9899
+
9900
+ /***/ }),
9901
+ /* 223 */
9902
+ /***/ (function(module, exports) {
9903
+
9904
+ /** Used for built-in method references. */
9905
+ var objectProto = Object.prototype;
9906
+
9907
+ /**
9908
+ * Used to resolve the
9909
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
9910
+ * of values.
9911
+ */
9912
+ var nativeObjectToString = objectProto.toString;
9913
+
9914
+ /**
9915
+ * Converts `value` to a string using `Object.prototype.toString`.
9916
+ *
9917
+ * @private
9918
+ * @param {*} value The value to convert.
9919
+ * @returns {string} Returns the converted string.
9920
+ */
9921
+ function objectToString(value) {
9922
+ return nativeObjectToString.call(value);
9923
+ }
9924
+
9925
+ module.exports = objectToString;
9926
+
9927
+
9928
+ /***/ }),
9929
+ /* 224 */
9930
+ /***/ (function(module, exports, __webpack_require__) {
9931
+
9932
+ var coreJsData = __webpack_require__(225);
9933
+
9934
+ /** Used to detect methods masquerading as native. */
9935
+ var maskSrcKey = (function() {
9936
+ var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
9937
+ return uid ? ('Symbol(src)_1.' + uid) : '';
9938
+ }());
9939
+
9940
+ /**
9941
+ * Checks if `func` has its source masked.
9942
+ *
9943
+ * @private
9944
+ * @param {Function} func The function to check.
9945
+ * @returns {boolean} Returns `true` if `func` is masked, else `false`.
9946
+ */
9947
+ function isMasked(func) {
9948
+ return !!maskSrcKey && (maskSrcKey in func);
9949
+ }
9950
+
9951
+ module.exports = isMasked;
9952
+
9953
+
9954
+ /***/ }),
9955
+ /* 225 */
9956
+ /***/ (function(module, exports, __webpack_require__) {
9957
+
9958
+ var root = __webpack_require__(11);
9959
+
9960
+ /** Used to detect overreaching core-js shims. */
9961
+ var coreJsData = root['__core-js_shared__'];
9962
+
9963
+ module.exports = coreJsData;
9964
+
9965
+
9966
+ /***/ }),
9967
+ /* 226 */
9968
+ /***/ (function(module, exports) {
9969
+
9970
+ /**
9971
+ * Gets the value at `key` of `object`.
9972
+ *
9973
+ * @private
9974
+ * @param {Object} [object] The object to query.
9975
+ * @param {string} key The key of the property to get.
9976
+ * @returns {*} Returns the property value.
9977
+ */
9978
+ function getValue(object, key) {
9979
+ return object == null ? undefined : object[key];
9980
+ }
9981
+
9982
+ module.exports = getValue;
9983
+
9984
+
9985
+ /***/ }),
9986
+ /* 227 */
9987
+ /***/ (function(module, exports) {
9988
+
9989
+ /**
9990
+ * Removes `key` and its value from the hash.
9991
+ *
9992
+ * @private
9993
+ * @name delete
9994
+ * @memberOf Hash
9995
+ * @param {Object} hash The hash to modify.
9996
+ * @param {string} key The key of the value to remove.
9997
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
9998
+ */
9999
+ function hashDelete(key) {
10000
+ var result = this.has(key) && delete this.__data__[key];
10001
+ this.size -= result ? 1 : 0;
10002
+ return result;
10003
+ }
10004
+
10005
+ module.exports = hashDelete;
10006
+
10007
+
10008
+ /***/ }),
10009
+ /* 228 */
10010
+ /***/ (function(module, exports, __webpack_require__) {
10011
+
10012
+ var nativeCreate = __webpack_require__(54);
10013
+
10014
+ /** Used to stand-in for `undefined` hash values. */
10015
+ var HASH_UNDEFINED = '__lodash_hash_undefined__';
10016
+
10017
+ /** Used for built-in method references. */
10018
+ var objectProto = Object.prototype;
10019
+
10020
+ /** Used to check objects for own properties. */
10021
+ var hasOwnProperty = objectProto.hasOwnProperty;
10022
+
10023
+ /**
10024
+ * Gets the hash value for `key`.
10025
+ *
10026
+ * @private
10027
+ * @name get
10028
+ * @memberOf Hash
10029
+ * @param {string} key The key of the value to get.
10030
+ * @returns {*} Returns the entry value.
10031
+ */
10032
+ function hashGet(key) {
10033
+ var data = this.__data__;
10034
+ if (nativeCreate) {
10035
+ var result = data[key];
10036
+ return result === HASH_UNDEFINED ? undefined : result;
10037
+ }
10038
+ return hasOwnProperty.call(data, key) ? data[key] : undefined;
10039
+ }
10040
+
10041
+ module.exports = hashGet;
10042
+
10043
+
10044
+ /***/ }),
10045
+ /* 229 */
10046
+ /***/ (function(module, exports, __webpack_require__) {
10047
+
10048
+ var nativeCreate = __webpack_require__(54);
10049
+
10050
+ /** Used for built-in method references. */
10051
+ var objectProto = Object.prototype;
10052
+
10053
+ /** Used to check objects for own properties. */
10054
+ var hasOwnProperty = objectProto.hasOwnProperty;
10055
+
10056
+ /**
10057
+ * Checks if a hash value for `key` exists.
10058
+ *
10059
+ * @private
10060
+ * @name has
10061
+ * @memberOf Hash
10062
+ * @param {string} key The key of the entry to check.
10063
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
10064
+ */
10065
+ function hashHas(key) {
10066
+ var data = this.__data__;
10067
+ return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
10068
+ }
10069
+
10070
+ module.exports = hashHas;
10071
+
10072
+
10073
+ /***/ }),
10074
+ /* 230 */
10075
+ /***/ (function(module, exports, __webpack_require__) {
10076
+
10077
+ var nativeCreate = __webpack_require__(54);
10078
+
10079
+ /** Used to stand-in for `undefined` hash values. */
10080
+ var HASH_UNDEFINED = '__lodash_hash_undefined__';
10081
+
10082
+ /**
10083
+ * Sets the hash `key` to `value`.
10084
+ *
10085
+ * @private
10086
+ * @name set
10087
+ * @memberOf Hash
10088
+ * @param {string} key The key of the value to set.
10089
+ * @param {*} value The value to set.
10090
+ * @returns {Object} Returns the hash instance.
10091
+ */
10092
+ function hashSet(key, value) {
10093
+ var data = this.__data__;
10094
+ this.size += this.has(key) ? 0 : 1;
10095
+ data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
10096
+ return this;
10097
+ }
10098
+
10099
+ module.exports = hashSet;
10100
+
10101
+
10102
+ /***/ }),
10103
+ /* 231 */
10104
+ /***/ (function(module, exports) {
10105
+
10106
+ /**
10107
+ * Removes all key-value entries from the list cache.
10108
+ *
10109
+ * @private
10110
+ * @name clear
10111
+ * @memberOf ListCache
10112
+ */
10113
+ function listCacheClear() {
10114
+ this.__data__ = [];
10115
+ this.size = 0;
10116
+ }
10117
+
10118
+ module.exports = listCacheClear;
10119
+
10120
+
10121
+ /***/ }),
10122
+ /* 232 */
10123
+ /***/ (function(module, exports, __webpack_require__) {
10124
+
10125
+ var assocIndexOf = __webpack_require__(56);
10126
+
10127
+ /** Used for built-in method references. */
10128
+ var arrayProto = Array.prototype;
10129
+
10130
+ /** Built-in value references. */
10131
+ var splice = arrayProto.splice;
10132
+
10133
+ /**
10134
+ * Removes `key` and its value from the list cache.
10135
+ *
10136
+ * @private
10137
+ * @name delete
10138
+ * @memberOf ListCache
10139
+ * @param {string} key The key of the value to remove.
10140
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
10141
+ */
10142
+ function listCacheDelete(key) {
10143
+ var data = this.__data__,
10144
+ index = assocIndexOf(data, key);
10145
+
10146
+ if (index < 0) {
10147
+ return false;
10148
+ }
10149
+ var lastIndex = data.length - 1;
10150
+ if (index == lastIndex) {
10151
+ data.pop();
10152
+ } else {
10153
+ splice.call(data, index, 1);
10154
+ }
10155
+ --this.size;
10156
+ return true;
10157
+ }
10158
+
10159
+ module.exports = listCacheDelete;
10160
+
10161
+
10162
+ /***/ }),
10163
+ /* 233 */
10164
+ /***/ (function(module, exports, __webpack_require__) {
10165
+
10166
+ var assocIndexOf = __webpack_require__(56);
10167
+
10168
+ /**
10169
+ * Gets the list cache value for `key`.
10170
+ *
10171
+ * @private
10172
+ * @name get
10173
+ * @memberOf ListCache
10174
+ * @param {string} key The key of the value to get.
10175
+ * @returns {*} Returns the entry value.
10176
+ */
10177
+ function listCacheGet(key) {
10178
+ var data = this.__data__,
10179
+ index = assocIndexOf(data, key);
10180
+
10181
+ return index < 0 ? undefined : data[index][1];
10182
+ }
10183
+
10184
+ module.exports = listCacheGet;
10185
+
10186
+
10187
+ /***/ }),
10188
+ /* 234 */
10189
+ /***/ (function(module, exports, __webpack_require__) {
10190
+
10191
+ var assocIndexOf = __webpack_require__(56);
10192
+
10193
+ /**
10194
+ * Checks if a list cache value for `key` exists.
10195
+ *
10196
+ * @private
10197
+ * @name has
10198
+ * @memberOf ListCache
10199
+ * @param {string} key The key of the entry to check.
10200
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
10201
+ */
10202
+ function listCacheHas(key) {
10203
+ return assocIndexOf(this.__data__, key) > -1;
10204
+ }
10205
+
10206
+ module.exports = listCacheHas;
10207
+
10208
+
10209
+ /***/ }),
10210
+ /* 235 */
10211
+ /***/ (function(module, exports, __webpack_require__) {
10212
+
10213
+ var assocIndexOf = __webpack_require__(56);
10214
+
10215
+ /**
10216
+ * Sets the list cache `key` to `value`.
10217
+ *
10218
+ * @private
10219
+ * @name set
10220
+ * @memberOf ListCache
10221
+ * @param {string} key The key of the value to set.
10222
+ * @param {*} value The value to set.
10223
+ * @returns {Object} Returns the list cache instance.
10224
+ */
10225
+ function listCacheSet(key, value) {
10226
+ var data = this.__data__,
10227
+ index = assocIndexOf(data, key);
10228
+
10229
+ if (index < 0) {
10230
+ ++this.size;
10231
+ data.push([key, value]);
10232
+ } else {
10233
+ data[index][1] = value;
10234
+ }
10235
+ return this;
10236
+ }
10237
+
10238
+ module.exports = listCacheSet;
10239
+
10240
+
10241
+ /***/ }),
10242
+ /* 236 */
10243
+ /***/ (function(module, exports, __webpack_require__) {
10244
+
10245
+ var getMapData = __webpack_require__(57);
10246
+
10247
+ /**
10248
+ * Removes `key` and its value from the map.
10249
+ *
10250
+ * @private
10251
+ * @name delete
10252
+ * @memberOf MapCache
10253
+ * @param {string} key The key of the value to remove.
10254
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
10255
+ */
10256
+ function mapCacheDelete(key) {
10257
+ var result = getMapData(this, key)['delete'](key);
10258
+ this.size -= result ? 1 : 0;
10259
+ return result;
10260
+ }
10261
+
10262
+ module.exports = mapCacheDelete;
10263
+
10264
+
10265
+ /***/ }),
10266
+ /* 237 */
10267
+ /***/ (function(module, exports) {
10268
+
10269
+ /**
10270
+ * Checks if `value` is suitable for use as unique object key.
10271
+ *
10272
+ * @private
10273
+ * @param {*} value The value to check.
10274
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
10275
+ */
10276
+ function isKeyable(value) {
10277
+ var type = typeof value;
10278
+ return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
10279
+ ? (value !== '__proto__')
10280
+ : (value === null);
10281
+ }
10282
+
10283
+ module.exports = isKeyable;
10284
+
10285
+
10286
+ /***/ }),
10287
+ /* 238 */
10288
+ /***/ (function(module, exports, __webpack_require__) {
10289
+
10290
+ var getMapData = __webpack_require__(57);
10291
+
10292
+ /**
10293
+ * Gets the map value for `key`.
10294
+ *
10295
+ * @private
10296
+ * @name get
10297
+ * @memberOf MapCache
10298
+ * @param {string} key The key of the value to get.
10299
+ * @returns {*} Returns the entry value.
10300
+ */
10301
+ function mapCacheGet(key) {
10302
+ return getMapData(this, key).get(key);
10303
+ }
10304
+
10305
+ module.exports = mapCacheGet;
10306
+
10307
+
10308
+ /***/ }),
10309
+ /* 239 */
10310
+ /***/ (function(module, exports, __webpack_require__) {
10311
+
10312
+ var getMapData = __webpack_require__(57);
10313
+
10314
+ /**
10315
+ * Checks if a map value for `key` exists.
10316
+ *
10317
+ * @private
10318
+ * @name has
10319
+ * @memberOf MapCache
10320
+ * @param {string} key The key of the entry to check.
10321
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
10322
+ */
10323
+ function mapCacheHas(key) {
10324
+ return getMapData(this, key).has(key);
10325
+ }
10326
+
10327
+ module.exports = mapCacheHas;
10328
+
10329
+
10330
+ /***/ }),
10331
+ /* 240 */
10332
+ /***/ (function(module, exports, __webpack_require__) {
10333
+
10334
+ var getMapData = __webpack_require__(57);
10335
+
10336
+ /**
10337
+ * Sets the map `key` to `value`.
10338
+ *
10339
+ * @private
10340
+ * @name set
10341
+ * @memberOf MapCache
10342
+ * @param {string} key The key of the value to set.
10343
+ * @param {*} value The value to set.
10344
+ * @returns {Object} Returns the map cache instance.
10345
+ */
10346
+ function mapCacheSet(key, value) {
10347
+ var data = getMapData(this, key),
10348
+ size = data.size;
10349
+
10350
+ data.set(key, value);
10351
+ this.size += data.size == size ? 0 : 1;
10352
+ return this;
10353
+ }
10354
+
10355
+ module.exports = mapCacheSet;
10356
+
10357
+
10358
+ /***/ }),
10359
+ /* 241 */
10360
+ /***/ (function(module, exports) {
10361
+
10362
+ /** Used to stand-in for `undefined` hash values. */
10363
+ var HASH_UNDEFINED = '__lodash_hash_undefined__';
10364
+
10365
+ /**
10366
+ * Adds `value` to the array cache.
10367
+ *
10368
+ * @private
10369
+ * @name add
10370
+ * @memberOf SetCache
10371
+ * @alias push
10372
+ * @param {*} value The value to cache.
10373
+ * @returns {Object} Returns the cache instance.
10374
+ */
10375
+ function setCacheAdd(value) {
10376
+ this.__data__.set(value, HASH_UNDEFINED);
10377
+ return this;
10378
+ }
10379
+
10380
+ module.exports = setCacheAdd;
10381
+
10382
+
10383
+ /***/ }),
10384
+ /* 242 */
10385
+ /***/ (function(module, exports) {
10386
+
10387
+ /**
10388
+ * Checks if `value` is in the array cache.
10389
+ *
10390
+ * @private
10391
+ * @name has
10392
+ * @memberOf SetCache
10393
+ * @param {*} value The value to search for.
10394
+ * @returns {number} Returns `true` if `value` is found, else `false`.
10395
+ */
10396
+ function setCacheHas(value) {
10397
+ return this.__data__.has(value);
10398
+ }
10399
+
10400
+ module.exports = setCacheHas;
10401
+
10402
+
10403
+ /***/ }),
10404
+ /* 243 */
10405
+ /***/ (function(module, exports) {
10406
+
10407
+ /**
10408
+ * The base implementation of `_.isNaN` without support for number objects.
10409
+ *
10410
+ * @private
10411
+ * @param {*} value The value to check.
10412
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
10413
+ */
10414
+ function baseIsNaN(value) {
10415
+ return value !== value;
10416
+ }
10417
+
10418
+ module.exports = baseIsNaN;
10419
+
10420
+
10421
+ /***/ }),
10422
+ /* 244 */
10423
+ /***/ (function(module, exports) {
10424
+
10425
+ /**
10426
+ * A specialized version of `_.indexOf` which performs strict equality
10427
+ * comparisons of values, i.e. `===`.
10428
+ *
10429
+ * @private
10430
+ * @param {Array} array The array to inspect.
10431
+ * @param {*} value The value to search for.
10432
+ * @param {number} fromIndex The index to search from.
10433
+ * @returns {number} Returns the index of the matched value, else `-1`.
10434
+ */
10435
+ function strictIndexOf(array, value, fromIndex) {
10436
+ var index = fromIndex - 1,
10437
+ length = array.length;
10438
+
10439
+ while (++index < length) {
10440
+ if (array[index] === value) {
10441
+ return index;
10442
+ }
10443
+ }
10444
+ return -1;
10445
+ }
10446
+
10447
+ module.exports = strictIndexOf;
10448
+
10449
+
10450
+ /***/ }),
10451
+ /* 245 */
10452
+ /***/ (function(module, exports) {
10453
+
10454
+ /**
10455
+ * The base implementation of `_.times` without support for iteratee shorthands
10456
+ * or max array length checks.
10457
+ *
10458
+ * @private
10459
+ * @param {number} n The number of times to invoke `iteratee`.
10460
+ * @param {Function} iteratee The function invoked per iteration.
10461
+ * @returns {Array} Returns the array of results.
10462
+ */
10463
+ function baseTimes(n, iteratee) {
10464
+ var index = -1,
10465
+ result = Array(n);
10466
+
10467
+ while (++index < n) {
10468
+ result[index] = iteratee(index);
10469
+ }
10470
+ return result;
10471
+ }
10472
+
10473
+ module.exports = baseTimes;
10474
+
10475
+
10476
+ /***/ }),
10477
+ /* 246 */
10478
+ /***/ (function(module, exports, __webpack_require__) {
10479
+
10480
+ var baseGetTag = __webpack_require__(21),
10481
+ isObjectLike = __webpack_require__(14);
10482
+
10483
+ /** `Object#toString` result references. */
10484
+ var argsTag = '[object Arguments]';
10485
+
10486
+ /**
10487
+ * The base implementation of `_.isArguments`.
10488
+ *
10489
+ * @private
10490
+ * @param {*} value The value to check.
10491
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
10492
+ */
10493
+ function baseIsArguments(value) {
10494
+ return isObjectLike(value) && baseGetTag(value) == argsTag;
10495
+ }
10496
+
10497
+ module.exports = baseIsArguments;
10498
+
10499
+
10500
+ /***/ }),
10501
+ /* 247 */
10502
+ /***/ (function(module, exports) {
10503
+
10504
+ /**
10505
+ * This method returns `false`.
10506
+ *
10507
+ * @static
10508
+ * @memberOf _
10509
+ * @since 4.13.0
10510
+ * @category Util
10511
+ * @returns {boolean} Returns `false`.
10512
+ * @example
10513
+ *
10514
+ * _.times(2, _.stubFalse);
10515
+ * // => [false, false]
10516
+ */
10517
+ function stubFalse() {
10518
+ return false;
10519
+ }
10520
+
10521
+ module.exports = stubFalse;
10522
+
10523
+
10524
+ /***/ }),
10525
+ /* 248 */
10526
+ /***/ (function(module, exports, __webpack_require__) {
10527
+
10528
+ var baseGetTag = __webpack_require__(21),
10529
+ isLength = __webpack_require__(87),
10530
+ isObjectLike = __webpack_require__(14);
10531
+
10532
+ /** `Object#toString` result references. */
10533
+ var argsTag = '[object Arguments]',
10534
+ arrayTag = '[object Array]',
10535
+ boolTag = '[object Boolean]',
10536
+ dateTag = '[object Date]',
10537
+ errorTag = '[object Error]',
10538
+ funcTag = '[object Function]',
10539
+ mapTag = '[object Map]',
10540
+ numberTag = '[object Number]',
10541
+ objectTag = '[object Object]',
10542
+ regexpTag = '[object RegExp]',
10543
+ setTag = '[object Set]',
10544
+ stringTag = '[object String]',
10545
+ weakMapTag = '[object WeakMap]';
10546
+
10547
+ var arrayBufferTag = '[object ArrayBuffer]',
10548
+ dataViewTag = '[object DataView]',
10549
+ float32Tag = '[object Float32Array]',
10550
+ float64Tag = '[object Float64Array]',
10551
+ int8Tag = '[object Int8Array]',
10552
+ int16Tag = '[object Int16Array]',
10553
+ int32Tag = '[object Int32Array]',
10554
+ uint8Tag = '[object Uint8Array]',
10555
+ uint8ClampedTag = '[object Uint8ClampedArray]',
10556
+ uint16Tag = '[object Uint16Array]',
10557
+ uint32Tag = '[object Uint32Array]';
10558
+
10559
+ /** Used to identify `toStringTag` values of typed arrays. */
10560
+ var typedArrayTags = {};
10561
+ typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
10562
+ typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
10563
+ typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
10564
+ typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
10565
+ typedArrayTags[uint32Tag] = true;
10566
+ typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
10567
+ typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
10568
+ typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
10569
+ typedArrayTags[errorTag] = typedArrayTags[funcTag] =
10570
+ typedArrayTags[mapTag] = typedArrayTags[numberTag] =
10571
+ typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
10572
+ typedArrayTags[setTag] = typedArrayTags[stringTag] =
10573
+ typedArrayTags[weakMapTag] = false;
10574
+
10575
+ /**
10576
+ * The base implementation of `_.isTypedArray` without Node.js optimizations.
10577
+ *
10578
+ * @private
10579
+ * @param {*} value The value to check.
10580
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
10581
+ */
10582
+ function baseIsTypedArray(value) {
10583
+ return isObjectLike(value) &&
10584
+ isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
10585
+ }
10586
+
10587
+ module.exports = baseIsTypedArray;
10588
+
10589
+
10590
+ /***/ }),
10591
+ /* 249 */
10592
+ /***/ (function(module, exports, __webpack_require__) {
10593
+
10594
+ var overArg = __webpack_require__(160);
10595
+
10596
+ /* Built-in method references for those with the same name as other `lodash` methods. */
10597
+ var nativeKeys = overArg(Object.keys, Object);
10598
+
10599
+ module.exports = nativeKeys;
10600
+
10601
+
10602
+ /***/ }),
10603
+ /* 250 */
10604
+ /***/ (function(module, exports, __webpack_require__) {
10605
+
10606
+ var ListCache = __webpack_require__(55);
10607
+
10608
+ /**
10609
+ * Removes all key-value entries from the stack.
10610
+ *
10611
+ * @private
10612
+ * @name clear
10613
+ * @memberOf Stack
10614
+ */
10615
+ function stackClear() {
10616
+ this.__data__ = new ListCache;
10617
+ this.size = 0;
10618
+ }
10619
+
10620
+ module.exports = stackClear;
10621
+
10622
+
10623
+ /***/ }),
10624
+ /* 251 */
10625
+ /***/ (function(module, exports) {
10626
+
10627
+ /**
10628
+ * Removes `key` and its value from the stack.
10629
+ *
10630
+ * @private
10631
+ * @name delete
10632
+ * @memberOf Stack
10633
+ * @param {string} key The key of the value to remove.
10634
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
10635
+ */
10636
+ function stackDelete(key) {
10637
+ var data = this.__data__,
10638
+ result = data['delete'](key);
10639
+
10640
+ this.size = data.size;
10641
+ return result;
10642
+ }
10643
+
10644
+ module.exports = stackDelete;
10645
+
10646
+
10647
+ /***/ }),
10648
+ /* 252 */
10649
+ /***/ (function(module, exports) {
10650
+
10651
+ /**
10652
+ * Gets the stack value for `key`.
10653
+ *
10654
+ * @private
10655
+ * @name get
10656
+ * @memberOf Stack
10657
+ * @param {string} key The key of the value to get.
10658
+ * @returns {*} Returns the entry value.
10659
+ */
10660
+ function stackGet(key) {
10661
+ return this.__data__.get(key);
10662
+ }
10663
+
10664
+ module.exports = stackGet;
10665
+
10666
+
10667
+ /***/ }),
10668
+ /* 253 */
10669
+ /***/ (function(module, exports) {
10670
+
10671
+ /**
10672
+ * Checks if a stack value for `key` exists.
10673
+ *
10674
+ * @private
10675
+ * @name has
10676
+ * @memberOf Stack
10677
+ * @param {string} key The key of the entry to check.
10678
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
10679
+ */
10680
+ function stackHas(key) {
10681
+ return this.__data__.has(key);
10682
+ }
10683
+
10684
+ module.exports = stackHas;
10685
+
10686
+
10687
+ /***/ }),
10688
+ /* 254 */
10689
+ /***/ (function(module, exports, __webpack_require__) {
10690
+
10691
+ var ListCache = __webpack_require__(55),
10692
+ Map = __webpack_require__(84),
10693
+ MapCache = __webpack_require__(83);
10694
+
10695
+ /** Used as the size to enable large array optimizations. */
10696
+ var LARGE_ARRAY_SIZE = 200;
10697
+
10698
+ /**
10699
+ * Sets the stack `key` to `value`.
10700
+ *
10701
+ * @private
10702
+ * @name set
10703
+ * @memberOf Stack
10704
+ * @param {string} key The key of the value to set.
10705
+ * @param {*} value The value to set.
10706
+ * @returns {Object} Returns the stack cache instance.
10707
+ */
10708
+ function stackSet(key, value) {
10709
+ var data = this.__data__;
10710
+ if (data instanceof ListCache) {
10711
+ var pairs = data.__data__;
10712
+ if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
10713
+ pairs.push([key, value]);
10714
+ this.size = ++data.size;
10715
+ return this;
10716
+ }
10717
+ data = this.__data__ = new MapCache(pairs);
10718
+ }
10719
+ data.set(key, value);
10720
+ this.size = data.size;
10721
+ return this;
10722
+ }
10723
+
10724
+ module.exports = stackSet;
10725
+
10726
+
10727
+ /***/ }),
10728
+ /* 255 */
10729
+ /***/ (function(module, exports) {
10730
+
10731
+ /**
10732
+ * A specialized version of `_.filter` for arrays without support for
10733
+ * iteratee shorthands.
10734
+ *
10735
+ * @private
10736
+ * @param {Array} [array] The array to iterate over.
10737
+ * @param {Function} predicate The function invoked per iteration.
10738
+ * @returns {Array} Returns the new filtered array.
10739
+ */
10740
+ function arrayFilter(array, predicate) {
10741
+ var index = -1,
10742
+ length = array == null ? 0 : array.length,
10743
+ resIndex = 0,
10744
+ result = [];
10745
+
10746
+ while (++index < length) {
10747
+ var value = array[index];
10748
+ if (predicate(value, index, array)) {
10749
+ result[resIndex++] = value;
10750
+ }
10751
+ }
10752
+ return result;
10753
+ }
10754
+
10755
+ module.exports = arrayFilter;
10756
+
10757
+
10758
+ /***/ }),
10759
+ /* 256 */
10760
+ /***/ (function(module, exports, __webpack_require__) {
10761
+
10762
+ var getNative = __webpack_require__(25),
10763
+ root = __webpack_require__(11);
10764
+
10765
+ /* Built-in method references that are verified to be native. */
10766
+ var DataView = getNative(root, 'DataView');
10767
+
10768
+ module.exports = DataView;
10769
+
10770
+
10771
+ /***/ }),
10772
+ /* 257 */
10773
+ /***/ (function(module, exports, __webpack_require__) {
10774
+
10775
+ var getNative = __webpack_require__(25),
10776
+ root = __webpack_require__(11);
10777
+
10778
+ /* Built-in method references that are verified to be native. */
10779
+ var Promise = getNative(root, 'Promise');
10780
+
10781
+ module.exports = Promise;
10782
+
10783
+
10784
+ /***/ }),
10785
+ /* 258 */
10786
+ /***/ (function(module, exports, __webpack_require__) {
10787
+
10788
+ var baseIsMatch = __webpack_require__(259),
10789
+ getMatchData = __webpack_require__(265),
10790
+ matchesStrictComparable = __webpack_require__(142);
10791
+
10792
+ /**
10793
+ * The base implementation of `_.matches` which doesn't clone `source`.
10794
+ *
10795
+ * @private
10796
+ * @param {Object} source The object of property values to match.
10797
+ * @returns {Function} Returns the new spec function.
10798
+ */
10799
+ function baseMatches(source) {
10800
+ var matchData = getMatchData(source);
10801
+ if (matchData.length == 1 && matchData[0][2]) {
10802
+ return matchesStrictComparable(matchData[0][0], matchData[0][1]);
10803
+ }
10804
+ return function(object) {
10805
+ return object === source || baseIsMatch(object, source, matchData);
10806
+ };
10807
+ }
10808
+
10809
+ module.exports = baseMatches;
10810
+
10811
+
10812
+ /***/ }),
10813
+ /* 259 */
10814
+ /***/ (function(module, exports, __webpack_require__) {
10815
+
10816
+ var Stack = __webpack_require__(95),
10817
+ baseIsEqual = __webpack_require__(139);
10818
+
10819
+ /** Used to compose bitmasks for value comparisons. */
10820
+ var COMPARE_PARTIAL_FLAG = 1,
10821
+ COMPARE_UNORDERED_FLAG = 2;
10822
+
10823
+ /**
10824
+ * The base implementation of `_.isMatch` without support for iteratee shorthands.
10825
+ *
10826
+ * @private
10827
+ * @param {Object} object The object to inspect.
10828
+ * @param {Object} source The object of property values to match.
10829
+ * @param {Array} matchData The property names, values, and compare flags to match.
10830
+ * @param {Function} [customizer] The function to customize comparisons.
10831
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
10832
+ */
10833
+ function baseIsMatch(object, source, matchData, customizer) {
10834
+ var index = matchData.length,
10835
+ length = index,
10836
+ noCustomizer = !customizer;
10837
+
10838
+ if (object == null) {
10839
+ return !length;
10840
+ }
10841
+ object = Object(object);
10842
+ while (index--) {
10843
+ var data = matchData[index];
10844
+ if ((noCustomizer && data[2])
10845
+ ? data[1] !== object[data[0]]
10846
+ : !(data[0] in object)
10847
+ ) {
10848
+ return false;
10849
+ }
10850
+ }
10851
+ while (++index < length) {
10852
+ data = matchData[index];
10853
+ var key = data[0],
10854
+ objValue = object[key],
10855
+ srcValue = data[1];
10856
+
10857
+ if (noCustomizer && data[2]) {
10858
+ if (objValue === undefined && !(key in object)) {
10859
+ return false;
10860
+ }
10861
+ } else {
10862
+ var stack = new Stack;
10863
+ if (customizer) {
10864
+ var result = customizer(objValue, srcValue, key, object, source, stack);
10865
+ }
10866
+ if (!(result === undefined
10867
+ ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
10868
+ : result
10869
+ )) {
10870
+ return false;
10871
+ }
10872
+ }
10873
+ }
10874
+ return true;
10875
+ }
10876
+
10877
+ module.exports = baseIsMatch;
10878
+
10879
+
10880
+ /***/ }),
10881
+ /* 260 */
10882
+ /***/ (function(module, exports, __webpack_require__) {
10883
+
10884
+ var Stack = __webpack_require__(95),
10885
+ equalArrays = __webpack_require__(140),
10886
+ equalByTag = __webpack_require__(262),
10887
+ equalObjects = __webpack_require__(264),
10888
+ getTag = __webpack_require__(43),
10889
+ isArray = __webpack_require__(6),
10890
+ isBuffer = __webpack_require__(59),
10891
+ isTypedArray = __webpack_require__(86);
10892
+
10893
+ /** Used to compose bitmasks for value comparisons. */
10894
+ var COMPARE_PARTIAL_FLAG = 1;
10895
+
10896
+ /** `Object#toString` result references. */
10897
+ var argsTag = '[object Arguments]',
10898
+ arrayTag = '[object Array]',
10899
+ objectTag = '[object Object]';
10900
+
10901
+ /** Used for built-in method references. */
10902
+ var objectProto = Object.prototype;
10903
+
10904
+ /** Used to check objects for own properties. */
10905
+ var hasOwnProperty = objectProto.hasOwnProperty;
10906
+
10907
+ /**
10908
+ * A specialized version of `baseIsEqual` for arrays and objects which performs
10909
+ * deep comparisons and tracks traversed objects enabling objects with circular
10910
+ * references to be compared.
10911
+ *
10912
+ * @private
10913
+ * @param {Object} object The object to compare.
10914
+ * @param {Object} other The other object to compare.
10915
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
10916
+ * @param {Function} customizer The function to customize comparisons.
10917
+ * @param {Function} equalFunc The function to determine equivalents of values.
10918
+ * @param {Object} [stack] Tracks traversed `object` and `other` objects.
10919
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
10920
+ */
10921
+ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
10922
+ var objIsArr = isArray(object),
10923
+ othIsArr = isArray(other),
10924
+ objTag = objIsArr ? arrayTag : getTag(object),
10925
+ othTag = othIsArr ? arrayTag : getTag(other);
10926
+
10927
+ objTag = objTag == argsTag ? objectTag : objTag;
10928
+ othTag = othTag == argsTag ? objectTag : othTag;
10929
+
10930
+ var objIsObj = objTag == objectTag,
10931
+ othIsObj = othTag == objectTag,
10932
+ isSameTag = objTag == othTag;
10933
+
10934
+ if (isSameTag && isBuffer(object)) {
10935
+ if (!isBuffer(other)) {
10936
+ return false;
10937
+ }
10938
+ objIsArr = true;
10939
+ objIsObj = false;
10940
+ }
10941
+ if (isSameTag && !objIsObj) {
10942
+ stack || (stack = new Stack);
10943
+ return (objIsArr || isTypedArray(object))
10944
+ ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
10945
+ : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
10946
+ }
10947
+ if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
10948
+ var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
10949
+ othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
10950
+
10951
+ if (objIsWrapped || othIsWrapped) {
10952
+ var objUnwrapped = objIsWrapped ? object.value() : object,
10953
+ othUnwrapped = othIsWrapped ? other.value() : other;
10954
+
10955
+ stack || (stack = new Stack);
10956
+ return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
10957
+ }
10958
+ }
10959
+ if (!isSameTag) {
10960
+ return false;
10961
+ }
10962
+ stack || (stack = new Stack);
10963
+ return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
10964
+ }
10965
+
10966
+ module.exports = baseIsEqualDeep;
10967
+
10968
+
10969
+ /***/ }),
10970
+ /* 261 */
10971
+ /***/ (function(module, exports) {
10972
+
10973
+ /**
10974
+ * A specialized version of `_.some` for arrays without support for iteratee
10975
+ * shorthands.
10976
+ *
10977
+ * @private
10978
+ * @param {Array} [array] The array to iterate over.
10979
+ * @param {Function} predicate The function invoked per iteration.
10980
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
10981
+ * else `false`.
10982
+ */
10983
+ function arraySome(array, predicate) {
10984
+ var index = -1,
10985
+ length = array == null ? 0 : array.length;
10986
+
10987
+ while (++index < length) {
10988
+ if (predicate(array[index], index, array)) {
10989
+ return true;
10990
+ }
10991
+ }
10992
+ return false;
10993
+ }
10994
+
10995
+ module.exports = arraySome;
10996
+
10997
+
10998
+ /***/ }),
10999
+ /* 262 */
11000
+ /***/ (function(module, exports, __webpack_require__) {
11001
+
11002
+ var Symbol = __webpack_require__(37),
11003
+ Uint8Array = __webpack_require__(164),
11004
+ eq = __webpack_require__(70),
11005
+ equalArrays = __webpack_require__(140),
11006
+ mapToArray = __webpack_require__(263),
11007
+ setToArray = __webpack_require__(103);
11008
+
11009
+ /** Used to compose bitmasks for value comparisons. */
11010
+ var COMPARE_PARTIAL_FLAG = 1,
11011
+ COMPARE_UNORDERED_FLAG = 2;
11012
+
11013
+ /** `Object#toString` result references. */
11014
+ var boolTag = '[object Boolean]',
11015
+ dateTag = '[object Date]',
11016
+ errorTag = '[object Error]',
11017
+ mapTag = '[object Map]',
11018
+ numberTag = '[object Number]',
11019
+ regexpTag = '[object RegExp]',
11020
+ setTag = '[object Set]',
11021
+ stringTag = '[object String]',
11022
+ symbolTag = '[object Symbol]';
11023
+
11024
+ var arrayBufferTag = '[object ArrayBuffer]',
11025
+ dataViewTag = '[object DataView]';
11026
+
11027
+ /** Used to convert symbols to primitives and strings. */
11028
+ var symbolProto = Symbol ? Symbol.prototype : undefined,
11029
+ symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
11030
+
11031
+ /**
11032
+ * A specialized version of `baseIsEqualDeep` for comparing objects of
11033
+ * the same `toStringTag`.
11034
+ *
11035
+ * **Note:** This function only supports comparing values with tags of
11036
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
11037
+ *
11038
+ * @private
11039
+ * @param {Object} object The object to compare.
11040
+ * @param {Object} other The other object to compare.
11041
+ * @param {string} tag The `toStringTag` of the objects to compare.
11042
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
11043
+ * @param {Function} customizer The function to customize comparisons.
11044
+ * @param {Function} equalFunc The function to determine equivalents of values.
11045
+ * @param {Object} stack Tracks traversed `object` and `other` objects.
11046
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
11047
+ */
11048
+ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
11049
+ switch (tag) {
11050
+ case dataViewTag:
11051
+ if ((object.byteLength != other.byteLength) ||
11052
+ (object.byteOffset != other.byteOffset)) {
11053
+ return false;
11054
+ }
11055
+ object = object.buffer;
11056
+ other = other.buffer;
11057
+
11058
+ case arrayBufferTag:
11059
+ if ((object.byteLength != other.byteLength) ||
11060
+ !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
11061
+ return false;
11062
+ }
11063
+ return true;
11064
+
11065
+ case boolTag:
11066
+ case dateTag:
11067
+ case numberTag:
11068
+ // Coerce booleans to `1` or `0` and dates to milliseconds.
11069
+ // Invalid dates are coerced to `NaN`.
11070
+ return eq(+object, +other);
11071
+
11072
+ case errorTag:
11073
+ return object.name == other.name && object.message == other.message;
11074
+
11075
+ case regexpTag:
11076
+ case stringTag:
11077
+ // Coerce regexes to strings and treat strings, primitives and objects,
11078
+ // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
11079
+ // for more details.
11080
+ return object == (other + '');
11081
+
11082
+ case mapTag:
11083
+ var convert = mapToArray;
11084
+
11085
+ case setTag:
11086
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
11087
+ convert || (convert = setToArray);
11088
+
11089
+ if (object.size != other.size && !isPartial) {
11090
+ return false;
11091
+ }
11092
+ // Assume cyclic values are equal.
11093
+ var stacked = stack.get(object);
11094
+ if (stacked) {
11095
+ return stacked == other;
11096
+ }
11097
+ bitmask |= COMPARE_UNORDERED_FLAG;
11098
+
11099
+ // Recursively compare objects (susceptible to call stack limits).
11100
+ stack.set(object, other);
11101
+ var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
11102
+ stack['delete'](object);
11103
+ return result;
11104
+
11105
+ case symbolTag:
11106
+ if (symbolValueOf) {
11107
+ return symbolValueOf.call(object) == symbolValueOf.call(other);
11108
+ }
11109
+ }
11110
+ return false;
11111
+ }
11112
+
11113
+ module.exports = equalByTag;
11114
+
11115
+
11116
+ /***/ }),
11117
+ /* 263 */
11118
+ /***/ (function(module, exports) {
11119
+
11120
+ /**
11121
+ * Converts `map` to its key-value pairs.
11122
+ *
11123
+ * @private
11124
+ * @param {Object} map The map to convert.
11125
+ * @returns {Array} Returns the key-value pairs.
11126
+ */
11127
+ function mapToArray(map) {
11128
+ var index = -1,
11129
+ result = Array(map.size);
11130
+
11131
+ map.forEach(function(value, key) {
11132
+ result[++index] = [key, value];
11133
+ });
11134
+ return result;
11135
+ }
11136
+
11137
+ module.exports = mapToArray;
11138
+
11139
+
11140
+ /***/ }),
11141
+ /* 264 */
11142
+ /***/ (function(module, exports, __webpack_require__) {
11143
+
11144
+ var getAllKeys = __webpack_require__(162);
11145
+
11146
+ /** Used to compose bitmasks for value comparisons. */
11147
+ var COMPARE_PARTIAL_FLAG = 1;
11148
+
11149
+ /** Used for built-in method references. */
11150
+ var objectProto = Object.prototype;
11151
+
11152
+ /** Used to check objects for own properties. */
11153
+ var hasOwnProperty = objectProto.hasOwnProperty;
11154
+
11155
+ /**
11156
+ * A specialized version of `baseIsEqualDeep` for objects with support for
11157
+ * partial deep comparisons.
11158
+ *
11159
+ * @private
11160
+ * @param {Object} object The object to compare.
11161
+ * @param {Object} other The other object to compare.
11162
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
11163
+ * @param {Function} customizer The function to customize comparisons.
11164
+ * @param {Function} equalFunc The function to determine equivalents of values.
11165
+ * @param {Object} stack Tracks traversed `object` and `other` objects.
11166
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
11167
+ */
11168
+ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
11169
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
11170
+ objProps = getAllKeys(object),
11171
+ objLength = objProps.length,
11172
+ othProps = getAllKeys(other),
11173
+ othLength = othProps.length;
11174
+
11175
+ if (objLength != othLength && !isPartial) {
11176
+ return false;
11177
+ }
11178
+ var index = objLength;
11179
+ while (index--) {
11180
+ var key = objProps[index];
11181
+ if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
11182
+ return false;
11183
+ }
11184
+ }
11185
+ // Assume cyclic values are equal.
11186
+ var stacked = stack.get(object);
11187
+ if (stacked && stack.get(other)) {
11188
+ return stacked == other;
11189
+ }
11190
+ var result = true;
11191
+ stack.set(object, other);
11192
+ stack.set(other, object);
11193
+
11194
+ var skipCtor = isPartial;
11195
+ while (++index < objLength) {
11196
+ key = objProps[index];
11197
+ var objValue = object[key],
11198
+ othValue = other[key];
11199
+
11200
+ if (customizer) {
11201
+ var compared = isPartial
11202
+ ? customizer(othValue, objValue, key, other, object, stack)
11203
+ : customizer(objValue, othValue, key, object, other, stack);
11204
+ }
11205
+ // Recursively compare objects (susceptible to call stack limits).
11206
+ if (!(compared === undefined
11207
+ ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
11208
+ : compared
11209
+ )) {
11210
+ result = false;
11211
+ break;
11212
+ }
11213
+ skipCtor || (skipCtor = key == 'constructor');
11214
+ }
11215
+ if (result && !skipCtor) {
11216
+ var objCtor = object.constructor,
11217
+ othCtor = other.constructor;
11218
+
11219
+ // Non `Object` object instances with different constructors are not equal.
11220
+ if (objCtor != othCtor &&
11221
+ ('constructor' in object && 'constructor' in other) &&
11222
+ !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
11223
+ typeof othCtor == 'function' && othCtor instanceof othCtor)) {
11224
+ result = false;
11225
+ }
11226
+ }
11227
+ stack['delete'](object);
11228
+ stack['delete'](other);
11229
+ return result;
11230
+ }
11231
+
11232
+ module.exports = equalObjects;
11233
+
11234
+
11235
+ /***/ }),
11236
+ /* 265 */
11237
+ /***/ (function(module, exports, __webpack_require__) {
11238
+
11239
+ var isStrictComparable = __webpack_require__(141),
11240
+ keys = __webpack_require__(31);
11241
+
11242
+ /**
11243
+ * Gets the property names, values, and compare flags of `object`.
11244
+ *
11245
+ * @private
11246
+ * @param {Object} object The object to query.
11247
+ * @returns {Array} Returns the match data of `object`.
11248
+ */
11249
+ function getMatchData(object) {
11250
+ var result = keys(object),
11251
+ length = result.length;
11252
+
11253
+ while (length--) {
11254
+ var key = result[length],
11255
+ value = object[key];
11256
+
11257
+ result[length] = [key, value, isStrictComparable(value)];
11258
+ }
11259
+ return result;
11260
+ }
11261
+
11262
+ module.exports = getMatchData;
11263
+
11264
+
11265
+ /***/ }),
11266
+ /* 266 */
11267
+ /***/ (function(module, exports, __webpack_require__) {
11268
+
11269
+ var baseIsEqual = __webpack_require__(139),
11270
+ get = __webpack_require__(44),
11271
+ hasIn = __webpack_require__(269),
11272
+ isKey = __webpack_require__(90),
11273
+ isStrictComparable = __webpack_require__(141),
11274
+ matchesStrictComparable = __webpack_require__(142),
11275
+ toKey = __webpack_require__(47);
11276
+
11277
+ /** Used to compose bitmasks for value comparisons. */
11278
+ var COMPARE_PARTIAL_FLAG = 1,
11279
+ COMPARE_UNORDERED_FLAG = 2;
11280
+
11281
+ /**
11282
+ * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
11283
+ *
11284
+ * @private
11285
+ * @param {string} path The path of the property to get.
11286
+ * @param {*} srcValue The value to match.
11287
+ * @returns {Function} Returns the new spec function.
11288
+ */
11289
+ function baseMatchesProperty(path, srcValue) {
11290
+ if (isKey(path) && isStrictComparable(srcValue)) {
11291
+ return matchesStrictComparable(toKey(path), srcValue);
11292
+ }
11293
+ return function(object) {
11294
+ var objValue = get(object, path);
11295
+ return (objValue === undefined && objValue === srcValue)
11296
+ ? hasIn(object, path)
11297
+ : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
11298
+ };
11299
+ }
11300
+
11301
+ module.exports = baseMatchesProperty;
11302
+
11303
+
11304
+ /***/ }),
11305
+ /* 267 */
11306
+ /***/ (function(module, exports, __webpack_require__) {
11307
+
11308
+ var memoize = __webpack_require__(268);
11309
+
11310
+ /** Used as the maximum memoize cache size. */
11311
+ var MAX_MEMOIZE_SIZE = 500;
11312
+
11313
+ /**
11314
+ * A specialized version of `_.memoize` which clears the memoized function's
11315
+ * cache when it exceeds `MAX_MEMOIZE_SIZE`.
11316
+ *
11317
+ * @private
11318
+ * @param {Function} func The function to have its output memoized.
11319
+ * @returns {Function} Returns the new memoized function.
11320
+ */
11321
+ function memoizeCapped(func) {
11322
+ var result = memoize(func, function(key) {
11323
+ if (cache.size === MAX_MEMOIZE_SIZE) {
11324
+ cache.clear();
11325
+ }
11326
+ return key;
11327
+ });
11328
+
11329
+ var cache = result.cache;
11330
+ return result;
11331
+ }
11332
+
11333
+ module.exports = memoizeCapped;
11334
+
11335
+
11336
+ /***/ }),
11337
+ /* 268 */
11338
+ /***/ (function(module, exports, __webpack_require__) {
11339
+
11340
+ var MapCache = __webpack_require__(83);
11341
+
11342
+ /** Error message constants. */
11343
+ var FUNC_ERROR_TEXT = 'Expected a function';
11344
+
11345
+ /**
11346
+ * Creates a function that memoizes the result of `func`. If `resolver` is
11347
+ * provided, it determines the cache key for storing the result based on the
11348
+ * arguments provided to the memoized function. By default, the first argument
11349
+ * provided to the memoized function is used as the map cache key. The `func`
11350
+ * is invoked with the `this` binding of the memoized function.
11351
+ *
11352
+ * **Note:** The cache is exposed as the `cache` property on the memoized
11353
+ * function. Its creation may be customized by replacing the `_.memoize.Cache`
11354
+ * constructor with one whose instances implement the
11355
+ * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
11356
+ * method interface of `clear`, `delete`, `get`, `has`, and `set`.
11357
+ *
11358
+ * @static
11359
+ * @memberOf _
11360
+ * @since 0.1.0
11361
+ * @category Function
11362
+ * @param {Function} func The function to have its output memoized.
11363
+ * @param {Function} [resolver] The function to resolve the cache key.
11364
+ * @returns {Function} Returns the new memoized function.
11365
+ * @example
11366
+ *
11367
+ * var object = { 'a': 1, 'b': 2 };
11368
+ * var other = { 'c': 3, 'd': 4 };
11369
+ *
11370
+ * var values = _.memoize(_.values);
11371
+ * values(object);
11372
+ * // => [1, 2]
11373
+ *
11374
+ * values(other);
11375
+ * // => [3, 4]
11376
+ *
11377
+ * object.a = 2;
11378
+ * values(object);
11379
+ * // => [1, 2]
11380
+ *
11381
+ * // Modify the result cache.
11382
+ * values.cache.set(object, ['a', 'b']);
11383
+ * values(object);
11384
+ * // => ['a', 'b']
11385
+ *
11386
+ * // Replace `_.memoize.Cache`.
11387
+ * _.memoize.Cache = WeakMap;
11388
+ */
11389
+ function memoize(func, resolver) {
11390
+ if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
11391
+ throw new TypeError(FUNC_ERROR_TEXT);
11392
+ }
11393
+ var memoized = function() {
11394
+ var args = arguments,
11395
+ key = resolver ? resolver.apply(this, args) : args[0],
11396
+ cache = memoized.cache;
11397
+
11398
+ if (cache.has(key)) {
11399
+ return cache.get(key);
11400
+ }
11401
+ var result = func.apply(this, args);
11402
+ memoized.cache = cache.set(key, result) || cache;
11403
+ return result;
11404
+ };
11405
+ memoized.cache = new (memoize.Cache || MapCache);
11406
+ return memoized;
11407
+ }
11408
+
11409
+ // Expose `MapCache`.
11410
+ memoize.Cache = MapCache;
11411
+
11412
+ module.exports = memoize;
11413
+
11414
+
11415
+ /***/ }),
11416
+ /* 269 */
11417
+ /***/ (function(module, exports, __webpack_require__) {
11418
+
11419
+ var baseHasIn = __webpack_require__(270),
11420
+ hasPath = __webpack_require__(271);
11421
+
11422
+ /**
11423
+ * Checks if `path` is a direct or inherited property of `object`.
11424
+ *
11425
+ * @static
11426
+ * @memberOf _
11427
+ * @since 4.0.0
11428
+ * @category Object
11429
+ * @param {Object} object The object to query.
11430
+ * @param {Array|string} path The path to check.
11431
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
11432
+ * @example
11433
+ *
11434
+ * var object = _.create({ 'a': _.create({ 'b': 2 }) });
11435
+ *
11436
+ * _.hasIn(object, 'a');
11437
+ * // => true
11438
+ *
11439
+ * _.hasIn(object, 'a.b');
11440
+ * // => true
11441
+ *
11442
+ * _.hasIn(object, ['a', 'b']);
11443
+ * // => true
11444
+ *
11445
+ * _.hasIn(object, 'b');
11446
+ * // => false
11447
+ */
11448
+ function hasIn(object, path) {
11449
+ return object != null && hasPath(object, path, baseHasIn);
11450
+ }
11451
+
11452
+ module.exports = hasIn;
11453
+
11454
+
11455
+ /***/ }),
11456
+ /* 270 */
11457
+ /***/ (function(module, exports) {
11458
+
11459
+ /**
11460
+ * The base implementation of `_.hasIn` without support for deep paths.
11461
+ *
11462
+ * @private
11463
+ * @param {Object} [object] The object to query.
11464
+ * @param {Array|string} key The key to check.
11465
+ * @returns {boolean} Returns `true` if `key` exists, else `false`.
11466
+ */
11467
+ function baseHasIn(object, key) {
11468
+ return object != null && key in Object(object);
11469
+ }
11470
+
11471
+ module.exports = baseHasIn;
11472
+
11473
+
11474
+ /***/ }),
11475
+ /* 271 */
11476
+ /***/ (function(module, exports, __webpack_require__) {
11477
+
11478
+ var castPath = __webpack_require__(144),
11479
+ isArguments = __webpack_require__(58),
11480
+ isArray = __webpack_require__(6),
11481
+ isIndex = __webpack_require__(74),
11482
+ isLength = __webpack_require__(87),
11483
+ toKey = __webpack_require__(47);
11484
+
11485
+ /**
11486
+ * Checks if `path` exists on `object`.
11487
+ *
11488
+ * @private
11489
+ * @param {Object} object The object to query.
11490
+ * @param {Array|string} path The path to check.
11491
+ * @param {Function} hasFunc The function to check properties.
11492
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
11493
+ */
11494
+ function hasPath(object, path, hasFunc) {
11495
+ path = castPath(path, object);
11496
+
11497
+ var index = -1,
11498
+ length = path.length,
11499
+ result = false;
11500
+
11501
+ while (++index < length) {
11502
+ var key = toKey(path[index]);
11503
+ if (!(result = object != null && hasFunc(object, key))) {
11504
+ break;
11505
+ }
11506
+ object = object[key];
11507
+ }
11508
+ if (result || ++index != length) {
11509
+ return result;
11510
+ }
11511
+ length = object == null ? 0 : object.length;
11512
+ return !!length && isLength(length) && isIndex(key, length) &&
11513
+ (isArray(object) || isArguments(object));
11514
+ }
11515
+
11516
+ module.exports = hasPath;
11517
+
11518
+
11519
+ /***/ }),
11520
+ /* 272 */
11521
+ /***/ (function(module, exports, __webpack_require__) {
11522
+
11523
+ var baseProperty = __webpack_require__(273),
11524
+ basePropertyDeep = __webpack_require__(274),
11525
+ isKey = __webpack_require__(90),
11526
+ toKey = __webpack_require__(47);
11527
+
11528
+ /**
11529
+ * Creates a function that returns the value at `path` of a given object.
11530
+ *
11531
+ * @static
11532
+ * @memberOf _
11533
+ * @since 2.4.0
11534
+ * @category Util
11535
+ * @param {Array|string} path The path of the property to get.
11536
+ * @returns {Function} Returns the new accessor function.
11537
+ * @example
11538
+ *
11539
+ * var objects = [
11540
+ * { 'a': { 'b': 2 } },
11541
+ * { 'a': { 'b': 1 } }
11542
+ * ];
11543
+ *
11544
+ * _.map(objects, _.property('a.b'));
11545
+ * // => [2, 1]
11546
+ *
11547
+ * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
11548
+ * // => [1, 2]
11549
+ */
11550
+ function property(path) {
11551
+ return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
11552
+ }
11553
+
11554
+ module.exports = property;
11555
+
11556
+
11557
+ /***/ }),
11558
+ /* 273 */
11559
+ /***/ (function(module, exports) {
11560
+
11561
+ /**
11562
+ * The base implementation of `_.property` without support for deep paths.
11563
+ *
11564
+ * @private
11565
+ * @param {string} key The key of the property to get.
11566
+ * @returns {Function} Returns the new accessor function.
11567
+ */
11568
+ function baseProperty(key) {
11569
+ return function(object) {
11570
+ return object == null ? undefined : object[key];
11571
+ };
11572
+ }
11573
+
11574
+ module.exports = baseProperty;
11575
+
11576
+
11577
+ /***/ }),
11578
+ /* 274 */
11579
+ /***/ (function(module, exports, __webpack_require__) {
11580
+
11581
+ var baseGet = __webpack_require__(143);
11582
+
11583
+ /**
11584
+ * A specialized version of `baseProperty` which supports deep paths.
11585
+ *
11586
+ * @private
11587
+ * @param {Array|string} path The path of the property to get.
11588
+ * @returns {Function} Returns the new accessor function.
11589
+ */
11590
+ function basePropertyDeep(path) {
11591
+ return function(object) {
11592
+ return baseGet(object, path);
11593
+ };
11594
+ }
11595
+
11596
+ module.exports = basePropertyDeep;
11597
+
11598
+
11599
+ /***/ }),
11600
+ /* 275 */
11601
+ /***/ (function(module, exports, __webpack_require__) {
11602
+
11603
+ var arrayPush = __webpack_require__(96),
11604
+ isFlattenable = __webpack_require__(276);
11605
+
11606
+ /**
11607
+ * The base implementation of `_.flatten` with support for restricting flattening.
11608
+ *
11609
+ * @private
11610
+ * @param {Array} array The array to flatten.
11611
+ * @param {number} depth The maximum recursion depth.
11612
+ * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
11613
+ * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
11614
+ * @param {Array} [result=[]] The initial result value.
11615
+ * @returns {Array} Returns the new flattened array.
11616
+ */
11617
+ function baseFlatten(array, depth, predicate, isStrict, result) {
11618
+ var index = -1,
11619
+ length = array.length;
11620
+
11621
+ predicate || (predicate = isFlattenable);
11622
+ result || (result = []);
11623
+
11624
+ while (++index < length) {
11625
+ var value = array[index];
11626
+ if (depth > 0 && predicate(value)) {
11627
+ if (depth > 1) {
11628
+ // Recursively flatten arrays (susceptible to call stack limits).
11629
+ baseFlatten(value, depth - 1, predicate, isStrict, result);
11630
+ } else {
11631
+ arrayPush(result, value);
11632
+ }
11633
+ } else if (!isStrict) {
11634
+ result[result.length] = value;
11635
+ }
11636
+ }
11637
+ return result;
11638
+ }
11639
+
11640
+ module.exports = baseFlatten;
11641
+
11642
+
11643
+ /***/ }),
11644
+ /* 276 */
11645
+ /***/ (function(module, exports, __webpack_require__) {
11646
+
11647
+ var Symbol = __webpack_require__(37),
11648
+ isArguments = __webpack_require__(58),
11649
+ isArray = __webpack_require__(6);
11650
+
11651
+ /** Built-in value references. */
11652
+ var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
11653
+
11654
+ /**
11655
+ * Checks if `value` is a flattenable `arguments` object or array.
11656
+ *
11657
+ * @private
11658
+ * @param {*} value The value to check.
11659
+ * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
11660
+ */
11661
+ function isFlattenable(value) {
11662
+ return isArray(value) || isArguments(value) ||
11663
+ !!(spreadableSymbol && value && value[spreadableSymbol]);
11664
+ }
11665
+
11666
+ module.exports = isFlattenable;
11667
+
11668
+
11669
+ /***/ }),
11670
+ /* 277 */
11671
+ /***/ (function(module, exports, __webpack_require__) {
11672
+
11673
+ var apply = __webpack_require__(114);
11674
+
11675
+ /* Built-in method references for those with the same name as other `lodash` methods. */
11676
+ var nativeMax = Math.max;
11677
+
11678
+ /**
11679
+ * A specialized version of `baseRest` which transforms the rest array.
11680
+ *
11681
+ * @private
11682
+ * @param {Function} func The function to apply a rest parameter to.
11683
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
11684
+ * @param {Function} transform The rest array transform.
11685
+ * @returns {Function} Returns the new function.
11686
+ */
11687
+ function overRest(func, start, transform) {
11688
+ start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
11689
+ return function() {
11690
+ var args = arguments,
11691
+ index = -1,
11692
+ length = nativeMax(args.length - start, 0),
11693
+ array = Array(length);
11694
+
11695
+ while (++index < length) {
11696
+ array[index] = args[start + index];
11697
+ }
11698
+ index = -1;
11699
+ var otherArgs = Array(start + 1);
11700
+ while (++index < start) {
11701
+ otherArgs[index] = args[index];
11702
+ }
11703
+ otherArgs[start] = transform(array);
11704
+ return apply(func, this, otherArgs);
11705
+ };
11706
+ }
11707
+
11708
+ module.exports = overRest;
11709
+
11710
+
11711
+ /***/ }),
11712
+ /* 278 */
11713
+ /***/ (function(module, exports, __webpack_require__) {
11714
+
11715
+ module.exports = { "default": __webpack_require__(279), __esModule: true };
11716
+
11717
+ /***/ }),
11718
+ /* 279 */
11719
+ /***/ (function(module, exports, __webpack_require__) {
11720
+
11721
+ __webpack_require__(280);
11722
+ module.exports = __webpack_require__(10).Object.assign;
11723
+
11724
+
11725
+ /***/ }),
11726
+ /* 280 */
11727
+ /***/ (function(module, exports, __webpack_require__) {
11728
+
11729
+ // 19.1.3.1 Object.assign(target, source)
11730
+ var $export = __webpack_require__(19);
11731
+
11732
+ $export($export.S + $export.F, 'Object', { assign: __webpack_require__(281) });
11733
+
11734
+
11735
+ /***/ }),
11736
+ /* 281 */
11737
+ /***/ (function(module, exports, __webpack_require__) {
11738
+
11739
+ "use strict";
11740
+
11741
+ // 19.1.2.1 Object.assign(target, source, ...)
11742
+ var DESCRIPTORS = __webpack_require__(20);
11743
+ var getKeys = __webpack_require__(68);
11744
+ var gOPS = __webpack_require__(120);
11745
+ var pIE = __webpack_require__(91);
11746
+ var toObject = __webpack_require__(63);
11747
+ var IObject = __webpack_require__(132);
11748
+ var $assign = Object.assign;
11749
+
11750
+ // should work with symbols and should have deterministic property order (V8 bug)
11751
+ module.exports = !$assign || __webpack_require__(50)(function () {
11752
+ var A = {};
11753
+ var B = {};
11754
+ // eslint-disable-next-line no-undef
11755
+ var S = Symbol();
11756
+ var K = 'abcdefghijklmnopqrst';
11757
+ A[S] = 7;
11758
+ K.split('').forEach(function (k) { B[k] = k; });
11759
+ return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
11760
+ }) ? function assign(target, source) { // eslint-disable-line no-unused-vars
11761
+ var T = toObject(target);
11762
+ var aLen = arguments.length;
11763
+ var index = 1;
11764
+ var getSymbols = gOPS.f;
11765
+ var isEnum = pIE.f;
11766
+ while (aLen > index) {
11767
+ var S = IObject(arguments[index++]);
11768
+ var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
11769
+ var length = keys.length;
11770
+ var j = 0;
11771
+ var key;
11772
+ while (length > j) {
11773
+ key = keys[j++];
11774
+ if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];
11775
+ }
11776
+ } return T;
11777
+ } : $assign;
11778
+
11779
+
11780
+ /***/ }),
11781
+ /* 282 */
11782
+ /***/ (function(module, exports, __webpack_require__) {
11783
+
11784
+ /**
11785
+ * Copyright (c) 2014-present, Facebook, Inc.
11786
+ *
11787
+ * This source code is licensed under the MIT license found in the
11788
+ * LICENSE file in the root directory of this source tree.
11789
+ */
11790
+
11791
+ // This method of obtaining a reference to the global object needs to be
11792
+ // kept identical to the way it is obtained in runtime.js
11793
+ var g = (function() { return this })() || Function("return this")();
11794
+
11795
+ // Use `getOwnPropertyNames` because not all browsers support calling
11796
+ // `hasOwnProperty` on the global `self` object in a worker. See #183.
11797
+ var hadRuntime = g.regeneratorRuntime &&
11798
+ Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
11799
+
11800
+ // Save the old regeneratorRuntime in case it needs to be restored later.
11801
+ var oldRuntime = hadRuntime && g.regeneratorRuntime;
11802
+
11803
+ // Force reevalutation of runtime.js.
11804
+ g.regeneratorRuntime = undefined;
11805
+
11806
+ module.exports = __webpack_require__(283);
11807
+
11808
+ if (hadRuntime) {
11809
+ // Restore the original runtime.
11810
+ g.regeneratorRuntime = oldRuntime;
11811
+ } else {
11812
+ // Remove the global property added by runtime.js.
11813
+ try {
11814
+ delete g.regeneratorRuntime;
11815
+ } catch(e)