The Events Calendar - Version 6.0.2

Version Description

= [6.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 6.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 6.0.2
Comparing to
See all releases

Code changes from version 6.0.1.1 to 6.0.2

Files changed (98) hide show
  1. common/lang/tribe-common-de_DE.mo +0 -0
  2. common/lang/tribe-common.pot +21 -21
  3. common/src/Tribe/App_Shop.php +1 -1
  4. common/src/Tribe/Date_Utils.php +76 -4
  5. common/src/Tribe/Main.php +1 -1
  6. common/src/Tribe/PUE/Checker.php +10 -4
  7. common/src/Tribe/Promoter/Connector.php +2 -2
  8. common/src/Tribe/Repository.php +34 -0
  9. common/src/Tribe/Repository/Decorator.php +9 -0
  10. common/src/Tribe/Repository/Interface.php +18 -0
  11. common/src/Tribe/Settings_Manager.php +2 -12
  12. common/src/Tribe/Utils/Lazy_Events.php +1 -1
  13. common/src/Tribe/Utils/Taxonomy.php +13 -1
  14. common/src/functions/utils.php +1 -0
  15. common/vendor/autoload.php +1 -1
  16. common/vendor/autoload_52.php +1 -1
  17. common/vendor/composer/autoload_classmap.php +3 -0
  18. common/vendor/composer/autoload_real.php +4 -4
  19. common/vendor/composer/autoload_real_52.php +3 -3
  20. common/vendor/composer/autoload_static.php +8 -5
  21. common/vendor/composer/installed.json +21 -9
  22. common/vendor/firebase/php-jwt/src/BeforeValidException.php +1 -1
  23. common/vendor/firebase/php-jwt/src/CachedKeySet.php +229 -0
  24. common/vendor/firebase/php-jwt/src/ExpiredException.php +1 -1
  25. common/vendor/firebase/php-jwt/src/JWK.php +322 -0
  26. common/vendor/firebase/php-jwt/src/JWT.php +387 -139
  27. common/vendor/firebase/php-jwt/src/Key.php +64 -0
  28. common/vendor/firebase/php-jwt/src/SignatureInvalidException.php +1 -1
  29. lang/the-events-calendar-cs_CZ.mo +0 -0
  30. lang/the-events-calendar-de_CH.mo +0 -0
  31. lang/the-events-calendar-de_DE.mo +0 -0
  32. lang/the-events-calendar-es_ES.mo +0 -0
  33. lang/the-events-calendar-fr_FR.mo +0 -0
  34. lang/the-events-calendar-nl_BE.mo +0 -0
  35. lang/the-events-calendar-nl_NL.mo +0 -0
  36. lang/the-events-calendar-sv_SE.mo +0 -0
  37. lang/the-events-calendar.pot +216 -175
  38. readme.txt +38 -4
  39. src/Events/Custom_Tables/V1/Full_Activation_Provider.php +31 -2
  40. src/Events/Custom_Tables/V1/Integrations/Dot_Com/Clear_Event_Cache.php +68 -0
  41. src/Events/Custom_Tables/V1/Integrations/Dot_Com/Provider.php +56 -0
  42. src/Events/Custom_Tables/V1/Integrations/Provider.php +7 -2
  43. src/Events/Custom_Tables/V1/Migration/Process_Worker.php +95 -20
  44. src/Events/Custom_Tables/V1/Migration/Provider.php +52 -2
  45. src/Events/Custom_Tables/V1/Migration/State.php +21 -0
  46. src/Events/Custom_Tables/V1/Models/Builder.php +1 -1
  47. src/Events/Custom_Tables/V1/Schema_Builder/Schema_Builder.php +42 -4
  48. src/Events/Custom_Tables/V1/Updates/Provider.php +11 -3
  49. src/Events/Custom_Tables/V1/WP_Query/Custom_Tables_Query.php +62 -20
  50. src/Events/Custom_Tables/V1/WP_Query/Modifiers/Events_Admin_List_Modifier.php +6 -3
  51. src/Events/Custom_Tables/V1/WP_Query/Modifiers/Events_Not_In_Series_Modifier.php +2 -2
  52. src/Events/Custom_Tables/V1/WP_Query/Modifiers/Events_Only_Modifier.php +12 -3
  53. src/Events/Custom_Tables/V1/WP_Query/Modifiers/Events_Series_Relationship_Modifier.php +2 -2
  54. src/Events/Custom_Tables/V1/WP_Query/Modifiers/Occurrences_Series_Relationship_Modifier.php +2 -2
  55. src/Tribe/Adjacent_Events.php +0 -2
  56. src/Tribe/Aggregator/CLI/Command.php +1 -1
  57. src/Tribe/I18n.php +55 -1
  58. src/Tribe/Integrations/ACF/ACF.php +2 -2
  59. src/Tribe/Integrations/Divi/Service_Provider.php +14 -6
  60. src/Tribe/Integrations/Manager.php +21 -0
  61. src/Tribe/Integrations/Restrict_Content_Pro/Service_Provider.php +148 -0
  62. src/Tribe/Integrations/WPML/Meta.php +5 -4
  63. src/Tribe/Integrations/WPML/WPML.php +1 -1
  64. src/Tribe/Main.php +4 -9
  65. src/Tribe/Models/Post_Types/Event.php +10 -6
  66. src/Tribe/Plugin_Register.php +1 -1
  67. src/Tribe/Query.php +117 -4
  68. src/Tribe/REST/V1/Endpoints/Archive_Event.php +98 -8
  69. src/Tribe/Rewrite.php +1 -1
  70. src/Tribe/Utils/Dates.php +0 -0
  71. src/Tribe/Views/V2/Customizer/Section/Global_Elements.php +1 -1
  72. src/Tribe/Views/V2/Hooks.php +135 -0
  73. src/Tribe/Views/V2/Manager.php +1 -1
  74. src/Tribe/Views/V2/View.php +38 -0
  75. src/Tribe/Views/V2/Views/By_Day_View.php +2 -2
  76. src/Tribe/Views/V2/functions/classes.php +63 -0
  77. src/admin-views/create-organizer-fields.php +1 -1
  78. src/admin-views/organizer-meta-box.php +1 -1
  79. src/deprecated/Traits/Tribe__Events__Main_Deprecated.php +41 -0
  80. src/functions/template-tags/event.php +1 -1
  81. src/functions/template-tags/general.php +43 -1
  82. src/functions/template-tags/loop.php +22 -7
  83. src/functions/template-tags/month.php +5 -5
  84. src/functions/template-tags/venue.php +8 -8
  85. src/resources/css/views-full.min.css +1 -1
  86. src/resources/css/views-print.min.css +1 -1
  87. src/resources/js/customizer-views-v2-live-preview.js +1 -1
  88. src/resources/js/customizer-views-v2-live-preview.min.js +1 -1
  89. src/resources/js/views/manager.js +4 -4
  90. src/views/v2/components/top-bar/today.php +6 -4
  91. src/views/v2/list/nav/today.php +3 -3
  92. src/views/v2/month/calendar-body/day.php +26 -55
  93. src/views/v2/month/mobile-events/nav/today.php +3 -3
  94. the-events-calendar.php +1 -1
  95. vendor/autoload.php +1 -1
  96. vendor/composer/autoload_classmap.php +4 -0
  97. vendor/composer/autoload_real.php +4 -4
  98. vendor/composer/autoload_static.php +8 -4
common/lang/tribe-common-de_DE.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 5.0.0\n"
6
  "Report-Msgid-Bugs-To: http://m.tri.be/191x\n"
7
- "POT-Creation-Date: 2022-08-25 17:54:31+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: 2022-08-25 17:54\n"
12
  "Last-Translator: \n"
13
  "Language-Team: \n"
14
 
@@ -58,7 +58,7 @@ msgctxt "Error status label for system info optin"
58
  msgid "Status:"
59
  msgstr ""
60
 
61
- #. #-#-#-#-# tribe-common.pot (Tribe Common 5.0.0) #-#-#-#-#
62
  #. Author of the plugin/theme
63
  #: src/Tribe/Admin/Help_Page.php:116 src/Tribe/Customizer.php:664
64
  #: src/Tribe/Plugins_API.php:25 src/admin-views/help-calendar.php:97
@@ -2476,55 +2476,55 @@ msgstr ""
2476
  msgid "Sorry, key validation server is not available."
2477
  msgstr ""
2478
 
2479
- #: src/Tribe/PUE/Checker.php:1054
2480
  msgid "Valid Key! Expires on %s"
2481
  msgstr ""
2482
 
2483
- #: src/Tribe/PUE/Checker.php:1059
2484
  msgid "Thanks for setting up a valid key. It will expire on %s"
2485
  msgstr ""
2486
 
2487
- #: src/Tribe/PUE/Checker.php:1088 src/Tribe/PUE/Notices.php:360
2488
  msgid "Renew Your License Now"
2489
  msgstr ""
2490
 
2491
- #: src/Tribe/PUE/Checker.php:1090 src/Tribe/PUE/Notices.php:362
2492
  msgid " (opens in a new window)"
2493
  msgstr ""
2494
 
2495
- #: src/Tribe/PUE/Checker.php:1107
2496
  msgid "Please refresh the page and try your request again."
2497
  msgstr ""
2498
 
2499
- #: src/Tribe/PUE/Checker.php:1127
2500
  msgid ""
2501
  "There is an update for %s. You'll need to %scheck your license%s to have "
2502
  "access to updates, downloads, and support."
2503
  msgstr ""
2504
 
2505
- #: src/Tribe/PUE/Checker.php:1184
2506
  msgid ""
2507
  "There is an update for %s. %sRenew your license%s to get access to bug "
2508
  "fixes, security updates, and new features."
2509
  msgstr ""
2510
 
2511
- #: src/Tribe/PUE/Checker.php:1214
2512
  msgid "Update now to version %s."
2513
  msgstr ""
2514
 
2515
- #: src/Tribe/PUE/Checker.php:1225
2516
  msgid "There is a new version of %1$s available. %2$s"
2517
  msgstr ""
2518
 
2519
- #: src/Tribe/PUE/Checker.php:1806
2520
  msgid "A valid license has been entered by your network administrator."
2521
  msgstr ""
2522
 
2523
- #: src/Tribe/PUE/Checker.php:1807
2524
  msgid "No license entered. Consult your network administrator."
2525
  msgstr ""
2526
 
2527
- #: src/Tribe/PUE/Checker.php:1808
2528
  msgid "Expired license. Consult your network administrator."
2529
  msgstr ""
2530
 
@@ -2943,15 +2943,11 @@ msgstr[1] ""
2943
  msgid "Settings saved."
2944
  msgstr ""
2945
 
2946
- #: src/Tribe/Settings_Manager.php:297
2947
  #: src/admin-views/tribe-options-licenses.php:57
2948
  msgid "Licenses"
2949
  msgstr ""
2950
 
2951
- #: src/Tribe/Settings_Manager.php:327 src/admin-views/help.php:30
2952
- msgid "Help"
2953
- msgstr ""
2954
-
2955
  #: src/Tribe/Settings_Tab.php:222
2956
  msgid "There are no fields setup for this tab yet."
2957
  msgstr ""
@@ -3490,6 +3486,10 @@ msgstr ""
3490
  msgid "(Event Tickets Plus)"
3491
  msgstr ""
3492
 
 
 
 
 
3493
  #: src/admin-views/help.php:31
3494
  msgid ""
3495
  "We're committed to helping make your calendar spectacular and have a wealth "
2
  # This file is distributed under the same license as the Tribe Common package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Tribe Common 5.0.1\n"
6
  "Report-Msgid-Bugs-To: http://m.tri.be/191x\n"
7
+ "POT-Creation-Date: 2022-10-18 16:01:22+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: 2022-10-18 16:01\n"
12
  "Last-Translator: \n"
13
  "Language-Team: \n"
14
 
58
  msgid "Status:"
59
  msgstr ""
60
 
61
+ #. #-#-#-#-# tribe-common.pot (Tribe Common 5.0.1) #-#-#-#-#
62
  #. Author of the plugin/theme
63
  #: src/Tribe/Admin/Help_Page.php:116 src/Tribe/Customizer.php:664
64
  #: src/Tribe/Plugins_API.php:25 src/admin-views/help-calendar.php:97
2476
  msgid "Sorry, key validation server is not available."
2477
  msgstr ""
2478
 
2479
+ #: src/Tribe/PUE/Checker.php:1060
2480
  msgid "Valid Key! Expires on %s"
2481
  msgstr ""
2482
 
2483
+ #: src/Tribe/PUE/Checker.php:1065
2484
  msgid "Thanks for setting up a valid key. It will expire on %s"
2485
  msgstr ""
2486
 
2487
+ #: src/Tribe/PUE/Checker.php:1094 src/Tribe/PUE/Notices.php:360
2488
  msgid "Renew Your License Now"
2489
  msgstr ""
2490
 
2491
+ #: src/Tribe/PUE/Checker.php:1096 src/Tribe/PUE/Notices.php:362
2492
  msgid " (opens in a new window)"
2493
  msgstr ""
2494
 
2495
+ #: src/Tribe/PUE/Checker.php:1113
2496
  msgid "Please refresh the page and try your request again."
2497
  msgstr ""
2498
 
2499
+ #: src/Tribe/PUE/Checker.php:1133
2500
  msgid ""
2501
  "There is an update for %s. You'll need to %scheck your license%s to have "
2502
  "access to updates, downloads, and support."
2503
  msgstr ""
2504
 
2505
+ #: src/Tribe/PUE/Checker.php:1190
2506
  msgid ""
2507
  "There is an update for %s. %sRenew your license%s to get access to bug "
2508
  "fixes, security updates, and new features."
2509
  msgstr ""
2510
 
2511
+ #: src/Tribe/PUE/Checker.php:1220
2512
  msgid "Update now to version %s."
2513
  msgstr ""
2514
 
2515
+ #: src/Tribe/PUE/Checker.php:1231
2516
  msgid "There is a new version of %1$s available. %2$s"
2517
  msgstr ""
2518
 
2519
+ #: src/Tribe/PUE/Checker.php:1812
2520
  msgid "A valid license has been entered by your network administrator."
2521
  msgstr ""
2522
 
2523
+ #: src/Tribe/PUE/Checker.php:1813
2524
  msgid "No license entered. Consult your network administrator."
2525
  msgstr ""
2526
 
2527
+ #: src/Tribe/PUE/Checker.php:1814
2528
  msgid "Expired license. Consult your network administrator."
2529
  msgstr ""
2530
 
2943
  msgid "Settings saved."
2944
  msgstr ""
2945
 
2946
+ #: src/Tribe/Settings_Manager.php:296
2947
  #: src/admin-views/tribe-options-licenses.php:57
2948
  msgid "Licenses"
2949
  msgstr ""
2950
 
 
 
 
 
2951
  #: src/Tribe/Settings_Tab.php:222
2952
  msgid "There are no fields setup for this tab yet."
2953
  msgstr ""
3486
  msgid "(Event Tickets Plus)"
3487
  msgstr ""
3488
 
3489
+ #: src/admin-views/help.php:30
3490
+ msgid "Help"
3491
+ msgstr ""
3492
+
3493
  #: src/admin-views/help.php:31
3494
  msgid ""
3495
  "We're committed to helping make your calendar spectacular and have a wealth "
common/src/Tribe/App_Shop.php CHANGED
@@ -343,7 +343,7 @@ if ( ! class_exists( 'Tribe__App_Shop' ) ) {
343
  'image' => 'images/shop/stellar-iconic-cta.jpg',
344
  'logo' => 'images/shop/stellar-iconic-logo.png',
345
  'title' => __( 'Sales-boosting WooCommerce plugins.', 'tribe-common' ),
346
- 'link' => 'https://iconicwp.com/?utm_source=theeventscalendar&utm_medium=in-app&utm_campaign=cross-brand-add-on-shop',
347
  'linktext' => __( 'Add Commerce Tools', 'tribe-common' ),
348
  'description' => __( 'Easy-to-use WooCommerce plugins work perfectly together, with any theme. Create a fast and profitable eCommerce store without any technical knowledge.
349
  ', 'tribe-common' ),
343
  'image' => 'images/shop/stellar-iconic-cta.jpg',
344
  'logo' => 'images/shop/stellar-iconic-logo.png',
345
  'title' => __( 'Sales-boosting WooCommerce plugins.', 'tribe-common' ),
346
+ 'link' => 'https://evnt.is/iconic',
347
  'linktext' => __( 'Add Commerce Tools', 'tribe-common' ),
348
  'description' => __( 'Easy-to-use WooCommerce plugins work perfectly together, with any theme. Create a fast and profitable eCommerce store without any technical knowledge.
349
  ', 'tribe-common' ),
common/src/Tribe/Date_Utils.php CHANGED
@@ -572,6 +572,78 @@ if ( ! class_exists( 'Tribe__Date_Utils' ) ) {
572
  );
573
  }
574
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
575
  /**
576
  * Given 2 datetime ranges, return whether the 2nd one occurs during the 1st one
577
  * Note: all params should be unix timestamps
@@ -1241,7 +1313,7 @@ if ( ! class_exists( 'Tribe__Date_Utils' ) ) {
1241
  *
1242
  * @since 4.9.5
1243
  *
1244
- * @param string|DateTime|int $datetime A `strtotime` parse-able string, a DateTime object or
1245
  * a timestamp; defaults to `now`.
1246
  * @param string|DateTimeZone|null $timezone A timezone string, UTC offset or DateTimeZone object;
1247
  * defaults to the site timezone; this parameter is ignored
@@ -1302,7 +1374,7 @@ if ( ! class_exists( 'Tribe__Date_Utils' ) ) {
1302
  *
1303
  * @param string $date The date string that should validated.
1304
  *
1305
- * @return bool Whether the date string can be used to build DateTime objects, and is thus parse-able by functions
1306
  * like `strtotime`, or not.
1307
  */
1308
  public static function is_valid_date( $date ) {
@@ -1540,7 +1612,7 @@ if ( ! class_exists( 'Tribe__Date_Utils' ) ) {
1540
  *
1541
  * @since 4.10.2
1542
  *
1543
- * @param string|DateTime|int $datetime A `strtotime` parse-able string, a DateTime object or
1544
  * a timestamp; defaults to `now`.
1545
  * @param string|DateTimeZone|null $timezone A timezone string, UTC offset or DateTimeZone object;
1546
  * defaults to the site timezone; this parameter is ignored
@@ -1588,7 +1660,7 @@ if ( ! class_exists( 'Tribe__Date_Utils' ) ) {
1588
  *
1589
  * @since 4.10.2
1590
  *
1591
- * @param string|DateTime|int $datetime A `strtotime` parse-able string, a DateTime object or
1592
  * a timestamp; defaults to `now`.
1593
  * @param string|DateTimeZone|null $timezone A timezone string, UTC offset or DateTimeZone object;
1594
  * defaults to the site timezone; this parameter is ignored
572
  );
573
  }
574
 
575
+ /**
576
+ * Determine if "now" is between two dates.
577
+ *
578
+ * @since 5.0.2
579
+ *
580
+ * @param string|DateTime|int $start_date A `strtotime` parsable string, a DateTime object or a timestamp.
581
+ * @param string|DateTime|int $end_date A `strtotime` parsable string, a DateTime object or a timestamp.
582
+ * @param string|DateTime|int $now A `strtotime` parsable string, a DateTime object or a timestamp. Defaults to 'now'.
583
+ *
584
+ * @return boolean Whether the current datetime (or passed "now") is between the passed start and end dates.
585
+ */
586
+ public static function is_now( $start_date, $end_date, $now = 'now' ) : bool {
587
+ $now = self::build_date_object( $now );
588
+ $start_date = self::build_date_object( $start_date );
589
+ $end_date = self::build_date_object( $end_date );
590
+
591
+ // If the dates are identical, bail early.
592
+ if ( $start_date === $end_date ) {
593
+ return false;
594
+ }
595
+
596
+ // Handle dates passed out of chronological order.
597
+ [ $start_date, $end_date ] = self::sort( [ $start_date, $end_date ] );
598
+
599
+ // If span starts after now, return false.
600
+ if ( $start_date > $now ) {
601
+ return false;
602
+ }
603
+
604
+ // If span ends on or before now, return false.
605
+ if ( $end_date <= $now ) {
606
+ return false;
607
+ }
608
+
609
+ return true;
610
+ }
611
+
612
+ /**
613
+ * Sort an array of dates.
614
+ *
615
+ * @since 5.0.2
616
+ *
617
+ * @param mixed $dates A single array of dates, or dates passed as individual params.
618
+ * Individual dates can be a `strtotime` parsable string, a DateTime object or a timestamp.
619
+ * @param string $direction 'ASC' or 'DESC' for ascending/descending sorting. Defaults to 'ASC'.
620
+ *
621
+ * @return array<DateTime> A sorted array of DateTime objects.
622
+ */
623
+ public static function sort( array $dates, string $direction = 'ASC' ) :array {
624
+ // If we get passed a single array, break it out of the containing array.
625
+ if ( is_array( $dates[0] ) ) {
626
+ $dates = $dates[0];
627
+ }
628
+
629
+ // Ensure we're always dealing with date objects here.
630
+ $dates = array_map(
631
+ function( $date ) {
632
+ return self::build_date_object( $date );
633
+ },
634
+ $dates
635
+ );
636
+
637
+ // If anything other than 'DESC' gets passed (or nothing) we sort ascending.
638
+ if ( 'DESC' === $direction ) {
639
+ rsort( $dates );
640
+ } else {
641
+ sort( $dates );
642
+ }
643
+
644
+ return $dates;
645
+ }
646
+
647
  /**
648
  * Given 2 datetime ranges, return whether the 2nd one occurs during the 1st one
649
  * Note: all params should be unix timestamps
1313
  *
1314
  * @since 4.9.5
1315
  *
1316
+ * @param string|DateTime|int $datetime A `strtotime` parsable string, a DateTime object or
1317
  * a timestamp; defaults to `now`.
1318
  * @param string|DateTimeZone|null $timezone A timezone string, UTC offset or DateTimeZone object;
1319
  * defaults to the site timezone; this parameter is ignored
1374
  *
1375
  * @param string $date The date string that should validated.
1376
  *
1377
+ * @return bool Whether the date string can be used to build DateTime objects, and is thus parsable by functions
1378
  * like `strtotime`, or not.
1379
  */
1380
  public static function is_valid_date( $date ) {
1612
  *
1613
  * @since 4.10.2
1614
  *
1615
+ * @param string|DateTime|int $datetime A `strtotime` parsable string, a DateTime object or
1616
  * a timestamp; defaults to `now`.
1617
  * @param string|DateTimeZone|null $timezone A timezone string, UTC offset or DateTimeZone object;
1618
  * defaults to the site timezone; this parameter is ignored
1660
  *
1661
  * @since 4.10.2
1662
  *
1663
+ * @param string|DateTime|int $datetime A `strtotime` parsable string, a DateTime object or
1664
  * a timestamp; defaults to `now`.
1665
  * @param string|DateTimeZone|null $timezone A timezone string, UTC offset or DateTimeZone object;
1666
  * defaults to the site timezone; this parameter is ignored
common/src/Tribe/Main.php CHANGED
@@ -21,7 +21,7 @@ class Tribe__Main {
21
  const OPTIONNAME = 'tribe_events_calendar_options';
22
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
23
 
24
- const VERSION = '5.0.1';
25
 
26
  const FEED_URL = 'https://theeventscalendar.com/feed/';
27
 
21
  const OPTIONNAME = 'tribe_events_calendar_options';
22
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
23
 
24
+ const VERSION = '5.0.2';
25
 
26
  const FEED_URL = 'https://theeventscalendar.com/feed/';
27
 
common/src/Tribe/PUE/Checker.php CHANGED
@@ -1049,16 +1049,22 @@ if ( ! class_exists( 'Tribe__PUE__Checker' ) ) {
1049
  }
1050
 
1051
  $current_install_key = $this->get_key( $key_type );
 
1052
 
1053
- if ( $current_install_key && $current_install_key === $query_args['key'] ) {
 
 
 
 
 
1054
  $default_success_msg = esc_html( sprintf( __( 'Valid Key! Expires on %s', 'tribe-common' ), $expiration ) );
1055
  } else {
1056
- // Set the key
1057
- $this->update_key( $query_args['key'], $key_type );
1058
 
1059
  $default_success_msg = esc_html( sprintf( __( 'Thanks for setting up a valid key. It will expire on %s', 'tribe-common' ), $expiration ) );
1060
 
1061
- //Set SysInfo Key on Tec.com After Successful Validation of License
1062
  $optin_key = get_option( 'tribe_systeminfo_optin' );
1063
  if ( $optin_key ) {
1064
  Tribe__Support::send_sysinfo_key( $optin_key, $query_args['domain'], false, true );
1049
  }
1050
 
1051
  $current_install_key = $this->get_key( $key_type );
1052
+ $replacement_key = $query_args['key'];
1053
 
1054
+ if ( ! empty( $plugin_info->replacement_key ) ) {
1055
+ // The PUE service might send over a new key upon validation.
1056
+ $replacement_key = $plugin_info->replacement_key;
1057
+ }
1058
+
1059
+ if ( $current_install_key && $current_install_key === $replacement_key ) {
1060
  $default_success_msg = esc_html( sprintf( __( 'Valid Key! Expires on %s', 'tribe-common' ), $expiration ) );
1061
  } else {
1062
+ // Set the key.
1063
+ $this->update_key( $replacement_key, $key_type );
1064
 
1065
  $default_success_msg = esc_html( sprintf( __( 'Thanks for setting up a valid key. It will expire on %s', 'tribe-common' ), $expiration ) );
1066
 
1067
+ // Set system info key on TEC.com after successful validation of license.
1068
  $optin_key = get_option( 'tribe_systeminfo_optin' );
1069
  if ( $optin_key ) {
1070
  Tribe__Support::send_sysinfo_key( $optin_key, $query_args['domain'], false, true );
common/src/Tribe/Promoter/Connector.php CHANGED
@@ -54,7 +54,7 @@ class Tribe__Promoter__Connector {
54
  'userId' => $user_id,
55
  ];
56
 
57
- $token = \Firebase\JWT\JWT::encode( $payload, $promoter_key );
58
 
59
  $response = $this->make_call( $url, [
60
  'body' => [ 'token' => $token ],
@@ -196,7 +196,7 @@ class Tribe__Promoter__Connector {
196
  'sourceId' => $post_id instanceof WP_Post ? $post_id->ID : $post_id,
197
  ];
198
 
199
- $token = \Firebase\JWT\JWT::encode( $payload, $secret_key );
200
 
201
  $url = $this->base_url() . 'connect/notify';
202
 
54
  'userId' => $user_id,
55
  ];
56
 
57
+ $token = \Firebase\JWT\JWT::encode( $payload, $promoter_key, 'HS256' );
58
 
59
  $response = $this->make_call( $url, [
60
  'body' => [ 'token' => $token ],
196
  'sourceId' => $post_id instanceof WP_Post ? $post_id->ID : $post_id,
197
  ];
198
 
199
+ $token = \Firebase\JWT\JWT::encode( $payload, $secret_key, 'HS256' );
200
 
201
  $url = $this->base_url() . 'connect/notify';
202
 
common/src/Tribe/Repository.php CHANGED
@@ -2429,6 +2429,40 @@ abstract class Tribe__Repository
2429
  return $this;
2430
  }
2431
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2432
  /**
2433
  * {@inheritdoc}
2434
  */
2429
  return $this;
2430
  }
2431
 
2432
+ /**
2433
+ * {@inheritdoc}
2434
+ */
2435
+ public function by_not_related_to( $by_meta_keys, $keys = null, $values = null ) {
2436
+
2437
+ /** @var wpdb $wpdb */
2438
+ global $wpdb;
2439
+
2440
+ $by_meta_keys = $this->prepare_interval( $by_meta_keys );
2441
+
2442
+ $join = '';
2443
+ $and_where = '';
2444
+ if ( ! empty( $keys ) || ! empty( $values ) ) {
2445
+ $join = "\nJOIN {$wpdb->postmeta} pm2 ON pm1.post_id = pm2.post_id\n";
2446
+ }
2447
+ if ( ! empty( $keys ) ) {
2448
+ $keys = $this->prepare_interval( $keys );
2449
+ $and_where .= "\nAND pm2.meta_key IN {$keys}\n";
2450
+ }
2451
+ if ( ! empty( $values ) ) {
2452
+ $values = $this->prepare_interval( $values );
2453
+ $and_where .= "\nAND pm2.meta_value IN {$values}\n";
2454
+ }
2455
+
2456
+ $this->where_clause( "{$wpdb->posts}.ID NOT IN (
2457
+ SELECT pm1.meta_value
2458
+ FROM {$wpdb->postmeta} pm1 {$join}
2459
+ WHERE pm1.meta_key IN {$by_meta_keys} {$and_where}
2460
+ GROUP BY( pm1.meta_value )
2461
+ )" );
2462
+
2463
+ return $this;
2464
+ }
2465
+
2466
  /**
2467
  * {@inheritdoc}
2468
  */
common/src/Tribe/Repository/Decorator.php CHANGED
@@ -354,6 +354,15 @@ abstract class Tribe__Repository__Decorator implements Tribe__Repository__Interf
354
  return $this;
355
  }
356
 
 
 
 
 
 
 
 
 
 
357
  /**
358
  * {@inheritdoc}
359
  */
354
  return $this;
355
  }
356
 
357
+ /**
358
+ * {@inheritdoc}
359
+ */
360
+ public function by_not_related_to( $by_meta_keys, $keys = null, $values = null ) {
361
+ $this->decorated->by_not_related_to( $by_meta_keys, $keys, $values );
362
+
363
+ return $this;
364
+ }
365
+
366
  /**
367
  * {@inheritdoc}
368
  */
common/src/Tribe/Repository/Interface.php CHANGED
@@ -186,6 +186,24 @@ interface Tribe__Repository__Interface
186
  */
187
  public function by_related_to_between( $by_meta_keys, $min, $max, $keys = null, $values = null );
188
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  /**
190
  * Adds an entry to the repository filter schema.
191
  *
186
  */
187
  public function by_related_to_between( $by_meta_keys, $min, $max, $keys = null, $values = null );
188
 
189
+ /**
190
+ * Filters the query to return posts that are not related to posts that have a specific meta value.
191
+ *
192
+ * @since TBD
193
+ *
194
+ * @param string|array $by_meta_keys One or more `meta_keys` relating
195
+ * another post TO this post type.
196
+ *
197
+ * @param string|array $keys One or more meta_keys to check on the post type in relation
198
+ * with the query post type(s); if the `$values` parameter is
199
+ * not provided then this will trigger an EXISTS check.
200
+ * @param string|array $values One or more value the meta_key specified with `$keys` should
201
+ * match.
202
+ *
203
+ * @return $this
204
+ */
205
+ public function by_not_related_to( $by_meta_keys, $keys = null, $values = null );
206
+
207
  /**
208
  * Adds an entry to the repository filter schema.
209
  *
common/src/Tribe/Settings_Manager.php CHANGED
@@ -26,7 +26,6 @@ class Tribe__Settings_Manager {
26
  add_action( '_network_admin_menu', [ $this, 'init_options' ] );
27
  add_action( '_admin_menu', [ $this, 'init_options' ] );
28
 
29
- add_action( 'admin_menu', [ $this, 'add_help_admin_menu_item' ], 50 );
30
  add_action( 'tribe_settings_do_tabs', [ $this, 'do_setting_tabs' ] );
31
  add_action( 'tribe_settings_validate_tab_network', [ $this, 'save_all_tabs_hidden' ] );
32
  add_action( 'updated_option', [ $this, 'update_options_cache' ], 10, 3 );
@@ -315,19 +314,10 @@ class Tribe__Settings_Manager {
315
  /**
316
  * Add help menu item to the admin (unless blocked via network admin settings).
317
  *
318
- * @todo move to an admin class
319
  */
320
  public function add_help_admin_menu_item() {
321
- $hidden_settings_tabs = self::get_network_option( 'hideSettingsTabs', [] );
322
- if ( in_array( 'help', $hidden_settings_tabs ) ) {
323
- return;
324
- }
325
-
326
- $parent = class_exists( 'Tribe__Events__Main' ) ? Tribe__Settings::$parent_page : Tribe__Settings::$parent_slug;
327
- $title = esc_html__( 'Help', 'tribe-common' );
328
- $slug = 'tribe-help';
329
-
330
- add_submenu_page( $parent, $title, $title, 'manage_options', $slug, [ $this, 'do_help_tab' ] );
331
  }
332
 
333
  /**
26
  add_action( '_network_admin_menu', [ $this, 'init_options' ] );
27
  add_action( '_admin_menu', [ $this, 'init_options' ] );
28
 
 
29
  add_action( 'tribe_settings_do_tabs', [ $this, 'do_setting_tabs' ] );
30
  add_action( 'tribe_settings_validate_tab_network', [ $this, 'save_all_tabs_hidden' ] );
31
  add_action( 'updated_option', [ $this, 'update_options_cache' ], 10, 3 );
314
  /**
315
  * Add help menu item to the admin (unless blocked via network admin settings).
316
  *
317
+ * @deprecated 5.0.2
318
  */
319
  public function add_help_admin_menu_item() {
320
+ _deprecated_function( __METHOD__, '5.0.2', 'Now handled by Tribe\Events\Admin\Settings::add_admin_pages()' );
 
 
 
 
 
 
 
 
 
321
  }
322
 
323
  /**
common/src/Tribe/Utils/Lazy_Events.php CHANGED
@@ -160,7 +160,7 @@ trait Lazy_Events {
160
 
161
  $hooked = has_action( $action, $this->lazy_resolve_callback );
162
 
163
- // Let's play it safe and move the resoloution as late as possible.
164
  $new_priority = false !== $hooked ? max( $hooked, $priority ) : $priority;
165
 
166
  if ( is_numeric( $hooked ) && $hooked !== $new_priority ) {
160
 
161
  $hooked = has_action( $action, $this->lazy_resolve_callback );
162
 
163
+ // Let's play it safe and move the resolution as late as possible.
164
  $new_priority = false !== $hooked ? max( $hooked, $priority ) : $priority;
165
 
166
  if ( is_numeric( $hooked ) && $hooked !== $new_priority ) {
common/src/Tribe/Utils/Taxonomy.php CHANGED
@@ -136,10 +136,11 @@ class Taxonomy {
136
  *
137
  * @param array $posts
138
  * @param array $taxonomies
 
139
  *
140
  * @return array<int, array>
141
  */
142
- public static function prime_term_cache( array $posts = [], array $taxonomies = [ 'post_tag', \Tribe__Events__Main::TAXONOMY ], $prime_term_meta = false ) {
143
  $first = reset( $posts );
144
  $is_numeric = ( ! $first instanceof \WP_Post );
145
  if ( $is_numeric ) {
@@ -169,7 +170,18 @@ class Taxonomy {
169
  }
170
 
171
  foreach ( $cache as $id => $object_taxonomies ) {
 
 
 
 
 
172
  foreach ( $object_taxonomies as $taxonomy => $term_ids ) {
 
 
 
 
 
 
173
  wp_cache_add( $id, $term_ids, $taxonomy . '_relationships' );
174
  }
175
  }
136
  *
137
  * @param array $posts
138
  * @param array $taxonomies
139
+ * @param bool $prime_term_meta
140
  *
141
  * @return array<int, array>
142
  */
143
+ public static function prime_term_cache( array $posts = [], array $taxonomies = [ 'post_tag', \Tribe__Events__Main::TAXONOMY ], bool $prime_term_meta = false ): array {
144
  $first = reset( $posts );
145
  $is_numeric = ( ! $first instanceof \WP_Post );
146
  if ( $is_numeric ) {
170
  }
171
 
172
  foreach ( $cache as $id => $object_taxonomies ) {
173
+ // Skip when invalid object id is passed.
174
+ if ( empty( $id ) ) {
175
+ continue;
176
+ }
177
+
178
  foreach ( $object_taxonomies as $taxonomy => $term_ids ) {
179
+ // Skip when invalid taxonomy is passed.
180
+ if ( empty( $taxonomy ) ) {
181
+ continue;
182
+ }
183
+
184
+ // Do not skip when `term_ids` are empty.
185
  wp_cache_add( $id, $term_ids, $taxonomy . '_relationships' );
186
  }
187
  }
common/src/functions/utils.php CHANGED
@@ -260,6 +260,7 @@ if ( ! function_exists( 'tribe_is_truthy' ) ) {
260
  'yes',
261
  'true',
262
  ] );
 
263
  // Makes sure we are dealing with lowercase for testing
264
  if ( is_string( $var ) ) {
265
  $var = strtolower( $var );
260
  'yes',
261
  'true',
262
  ] );
263
+
264
  // Makes sure we are dealing with lowercase for testing
265
  if ( is_string( $var ) ) {
266
  $var = strtolower( $var );
common/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit271b7ccdbb8b6bc93b1a122ef7eb45c8::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit056ca7b243d7bf42befa037b52fc996b::getLoader();
common/vendor/autoload_52.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
- return ComposerAutoloaderInitc4651841e503bf5dcd50f9b85ce84d39::getLoader();
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
+ return ComposerAutoloaderIniteb458fcdd0ecec791f874bb2e9421548::getLoader();
common/vendor/composer/autoload_classmap.php CHANGED
@@ -7,8 +7,11 @@ $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
  'Firebase\\JWT\\BeforeValidException' => $vendorDir . '/firebase/php-jwt/src/BeforeValidException.php',
 
10
  'Firebase\\JWT\\ExpiredException' => $vendorDir . '/firebase/php-jwt/src/ExpiredException.php',
 
11
  'Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php',
 
12
  'Firebase\\JWT\\SignatureInvalidException' => $vendorDir . '/firebase/php-jwt/src/SignatureInvalidException.php',
13
  'Monolog\\ErrorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/ErrorHandler.php',
14
  'Monolog\\Formatter\\ChromePHPFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php',
7
 
8
  return array(
9
  'Firebase\\JWT\\BeforeValidException' => $vendorDir . '/firebase/php-jwt/src/BeforeValidException.php',
10
+ 'Firebase\\JWT\\CachedKeySet' => $vendorDir . '/firebase/php-jwt/src/CachedKeySet.php',
11
  'Firebase\\JWT\\ExpiredException' => $vendorDir . '/firebase/php-jwt/src/ExpiredException.php',
12
+ 'Firebase\\JWT\\JWK' => $vendorDir . '/firebase/php-jwt/src/JWK.php',
13
  'Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php',
14
+ 'Firebase\\JWT\\Key' => $vendorDir . '/firebase/php-jwt/src/Key.php',
15
  'Firebase\\JWT\\SignatureInvalidException' => $vendorDir . '/firebase/php-jwt/src/SignatureInvalidException.php',
16
  'Monolog\\ErrorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/ErrorHandler.php',
17
  'Monolog\\Formatter\\ChromePHPFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php',
common/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit271b7ccdbb8b6bc93b1a122ef7eb45c8
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit271b7ccdbb8b6bc93b1a122ef7eb45c8
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit271b7ccdbb8b6bc93b1a122ef7eb45c8', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit271b7ccdbb8b6bc93b1a122ef7eb45c8', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInit271b7ccdbb8b6bc93b1a122ef7eb45c8::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit056ca7b243d7bf42befa037b52fc996b
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit056ca7b243d7bf42befa037b52fc996b', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit056ca7b243d7bf42befa037b52fc996b', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit056ca7b243d7bf42befa037b52fc996b::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
common/vendor/composer/autoload_real_52.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
- class ComposerAutoloaderInitc4651841e503bf5dcd50f9b85ce84d39 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
@@ -19,9 +19,9 @@ class ComposerAutoloaderInitc4651841e503bf5dcd50f9b85ce84d39 {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitc4651841e503bf5dcd50f9b85ce84d39', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitc4651841e503bf5dcd50f9b85ce84d39', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
+ class ComposerAutoloaderIniteb458fcdd0ecec791f874bb2e9421548 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderIniteb458fcdd0ecec791f874bb2e9421548', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderIniteb458fcdd0ecec791f874bb2e9421548', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
common/vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit271b7ccdbb8b6bc93b1a122ef7eb45c8
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'T' =>
@@ -68,8 +68,11 @@ class ComposerStaticInit271b7ccdbb8b6bc93b1a122ef7eb45c8
68
 
69
  public static $classMap = array (
70
  'Firebase\\JWT\\BeforeValidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/BeforeValidException.php',
 
71
  'Firebase\\JWT\\ExpiredException' => __DIR__ . '/..' . '/firebase/php-jwt/src/ExpiredException.php',
 
72
  'Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php',
 
73
  'Firebase\\JWT\\SignatureInvalidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/SignatureInvalidException.php',
74
  'Monolog\\ErrorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ErrorHandler.php',
75
  'Monolog\\Formatter\\ChromePHPFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php',
@@ -270,10 +273,10 @@ class ComposerStaticInit271b7ccdbb8b6bc93b1a122ef7eb45c8
270
  public static function getInitializer(ClassLoader $loader)
271
  {
272
  return \Closure::bind(function () use ($loader) {
273
- $loader->prefixLengthsPsr4 = ComposerStaticInit271b7ccdbb8b6bc93b1a122ef7eb45c8::$prefixLengthsPsr4;
274
- $loader->prefixDirsPsr4 = ComposerStaticInit271b7ccdbb8b6bc93b1a122ef7eb45c8::$prefixDirsPsr4;
275
- $loader->prefixesPsr0 = ComposerStaticInit271b7ccdbb8b6bc93b1a122ef7eb45c8::$prefixesPsr0;
276
- $loader->classMap = ComposerStaticInit271b7ccdbb8b6bc93b1a122ef7eb45c8::$classMap;
277
 
278
  }, null, ClassLoader::class);
279
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit056ca7b243d7bf42befa037b52fc996b
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'T' =>
68
 
69
  public static $classMap = array (
70
  'Firebase\\JWT\\BeforeValidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/BeforeValidException.php',
71
+ 'Firebase\\JWT\\CachedKeySet' => __DIR__ . '/..' . '/firebase/php-jwt/src/CachedKeySet.php',
72
  'Firebase\\JWT\\ExpiredException' => __DIR__ . '/..' . '/firebase/php-jwt/src/ExpiredException.php',
73
+ 'Firebase\\JWT\\JWK' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWK.php',
74
  'Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php',
75
+ 'Firebase\\JWT\\Key' => __DIR__ . '/..' . '/firebase/php-jwt/src/Key.php',
76
  'Firebase\\JWT\\SignatureInvalidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/SignatureInvalidException.php',
77
  'Monolog\\ErrorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ErrorHandler.php',
78
  'Monolog\\Formatter\\ChromePHPFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php',
273
  public static function getInitializer(ClassLoader $loader)
274
  {
275
  return \Closure::bind(function () use ($loader) {
276
+ $loader->prefixLengthsPsr4 = ComposerStaticInit056ca7b243d7bf42befa037b52fc996b::$prefixLengthsPsr4;
277
+ $loader->prefixDirsPsr4 = ComposerStaticInit056ca7b243d7bf42befa037b52fc996b::$prefixDirsPsr4;
278
+ $loader->prefixesPsr0 = ComposerStaticInit056ca7b243d7bf42befa037b52fc996b::$prefixesPsr0;
279
+ $loader->classMap = ComposerStaticInit056ca7b243d7bf42befa037b52fc996b::$classMap;
280
 
281
  }, null, ClassLoader::class);
282
  }
common/vendor/composer/installed.json CHANGED
@@ -1,26 +1,34 @@
1
  [
2
  {
3
  "name": "firebase/php-jwt",
4
- "version": "v5.0.0",
5
- "version_normalized": "5.0.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/firebase/php-jwt.git",
9
- "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
14
- "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
15
  "shasum": ""
16
  },
17
  "require": {
18
- "php": ">=5.3.0"
19
  },
20
  "require-dev": {
21
- "phpunit/phpunit": " 4.8.35"
 
 
 
 
 
 
 
 
22
  },
23
- "time": "2017-06-27T22:17:23+00:00",
24
  "type": "library",
25
  "installation-source": "dist",
26
  "autoload": {
@@ -45,7 +53,11 @@
45
  }
46
  ],
47
  "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
48
- "homepage": "https://github.com/firebase/php-jwt"
 
 
 
 
49
  },
50
  {
51
  "name": "lucatume/di52",
1
  [
2
  {
3
  "name": "firebase/php-jwt",
4
+ "version": "v6.3.0",
5
+ "version_normalized": "6.3.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/firebase/php-jwt.git",
9
+ "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8",
14
+ "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8",
15
  "shasum": ""
16
  },
17
  "require": {
18
+ "php": "^7.1||^8.0"
19
  },
20
  "require-dev": {
21
+ "guzzlehttp/guzzle": "^6.5||^7.4",
22
+ "phpspec/prophecy-phpunit": "^1.1",
23
+ "phpunit/phpunit": "^7.5||^9.5",
24
+ "psr/cache": "^1.0||^2.0",
25
+ "psr/http-client": "^1.0",
26
+ "psr/http-factory": "^1.0"
27
+ },
28
+ "suggest": {
29
+ "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
30
  },
31
+ "time": "2022-07-15T16:48:45+00:00",
32
  "type": "library",
33
  "installation-source": "dist",
34
  "autoload": {
53
  }
54
  ],
55
  "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
56
+ "homepage": "https://github.com/firebase/php-jwt",
57
+ "keywords": [
58
+ "jwt",
59
+ "php"
60
+ ]
61
  },
62
  {
63
  "name": "lucatume/di52",
common/vendor/firebase/php-jwt/src/BeforeValidException.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
 
2
  namespace Firebase\JWT;
3
 
4
  class BeforeValidException extends \UnexpectedValueException
5
  {
6
-
7
  }
1
  <?php
2
+
3
  namespace Firebase\JWT;
4
 
5
  class BeforeValidException extends \UnexpectedValueException
6
  {
 
7
  }
common/vendor/firebase/php-jwt/src/CachedKeySet.php ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Firebase\JWT;
4
+
5
+ use ArrayAccess;
6
+ use LogicException;
7
+ use OutOfBoundsException;
8
+ use Psr\Cache\CacheItemInterface;
9
+ use Psr\Cache\CacheItemPoolInterface;
10
+ use Psr\Http\Client\ClientInterface;
11
+ use Psr\Http\Message\RequestFactoryInterface;
12
+ use RuntimeException;
13
+
14
+ /**
15
+ * @implements ArrayAccess<string, Key>
16
+ */
17
+ class CachedKeySet implements ArrayAccess
18
+ {
19
+ /**
20
+ * @var string
21
+ */
22
+ private $jwksUri;
23
+ /**
24
+ * @var ClientInterface
25
+ */
26
+ private $httpClient;
27
+ /**
28
+ * @var RequestFactoryInterface
29
+ */
30
+ private $httpFactory;
31
+ /**
32
+ * @var CacheItemPoolInterface
33
+ */
34
+ private $cache;
35
+ /**
36
+ * @var ?int
37
+ */
38
+ private $expiresAfter;
39
+ /**
40
+ * @var ?CacheItemInterface
41
+ */
42
+ private $cacheItem;
43
+ /**
44
+ * @var array<string, Key>
45
+ */
46
+ private $keySet;
47
+ /**
48
+ * @var string
49
+ */
50
+ private $cacheKey;
51
+ /**
52
+ * @var string
53
+ */
54
+ private $cacheKeyPrefix = 'jwks';
55
+ /**
56
+ * @var int
57
+ */
58
+ private $maxKeyLength = 64;
59
+ /**
60
+ * @var bool
61
+ */
62
+ private $rateLimit;
63
+ /**
64
+ * @var string
65
+ */
66
+ private $rateLimitCacheKey;
67
+ /**
68
+ * @var int
69
+ */
70
+ private $maxCallsPerMinute = 10;
71
+ /**
72
+ * @var string|null
73
+ */
74
+ private $defaultAlg;
75
+
76
+ public function __construct(
77
+ string $jwksUri,
78
+ ClientInterface $httpClient,
79
+ RequestFactoryInterface $httpFactory,
80
+ CacheItemPoolInterface $cache,
81
+ int $expiresAfter = null,
82
+ bool $rateLimit = false,
83
+ string $defaultAlg = null
84
+ ) {
85
+ $this->jwksUri = $jwksUri;
86
+ $this->httpClient = $httpClient;
87
+ $this->httpFactory = $httpFactory;
88
+ $this->cache = $cache;
89
+ $this->expiresAfter = $expiresAfter;
90
+ $this->rateLimit = $rateLimit;
91
+ $this->defaultAlg = $defaultAlg;
92
+ $this->setCacheKeys();
93
+ }
94
+
95
+ /**
96
+ * @param string $keyId
97
+ * @return Key
98
+ */
99
+ public function offsetGet($keyId): Key
100
+ {
101
+ if (!$this->keyIdExists($keyId)) {
102
+ throw new OutOfBoundsException('Key ID not found');
103
+ }
104
+ return $this->keySet[$keyId];
105
+ }
106
+
107
+ /**
108
+ * @param string $keyId
109
+ * @return bool
110
+ */
111
+ public function offsetExists($keyId): bool
112
+ {
113
+ return $this->keyIdExists($keyId);
114
+ }
115
+
116
+ /**
117
+ * @param string $offset
118
+ * @param Key $value
119
+ */
120
+ public function offsetSet($offset, $value): void
121
+ {
122
+ throw new LogicException('Method not implemented');
123
+ }
124
+
125
+ /**
126
+ * @param string $offset
127
+ */
128
+ public function offsetUnset($offset): void
129
+ {
130
+ throw new LogicException('Method not implemented');
131
+ }
132
+
133
+ private function keyIdExists(string $keyId): bool
134
+ {
135
+ if (null === $this->keySet) {
136
+ $item = $this->getCacheItem();
137
+ // Try to load keys from cache
138
+ if ($item->isHit()) {
139
+ // item found! Return it
140
+ $jwks = $item->get();
141
+ $this->keySet = JWK::parseKeySet(json_decode($jwks, true), $this->defaultAlg);
142
+ }
143
+ }
144
+
145
+ if (!isset($this->keySet[$keyId])) {
146
+ if ($this->rateLimitExceeded()) {
147
+ return false;
148
+ }
149
+ $request = $this->httpFactory->createRequest('get', $this->jwksUri);
150
+ $jwksResponse = $this->httpClient->sendRequest($request);
151
+ $jwks = (string) $jwksResponse->getBody();
152
+ $this->keySet = JWK::parseKeySet(json_decode($jwks, true), $this->defaultAlg);
153
+
154
+ if (!isset($this->keySet[$keyId])) {
155
+ return false;
156
+ }
157
+
158
+ $item = $this->getCacheItem();
159
+ $item->set($jwks);
160
+ if ($this->expiresAfter) {
161
+ $item->expiresAfter($this->expiresAfter);
162
+ }
163
+ $this->cache->save($item);
164
+ }
165
+
166
+ return true;
167
+ }
168
+
169
+ private function rateLimitExceeded(): bool
170
+ {
171
+ if (!$this->rateLimit) {
172
+ return false;
173
+ }
174
+
175
+ $cacheItem = $this->cache->getItem($this->rateLimitCacheKey);
176
+ if (!$cacheItem->isHit()) {
177
+ $cacheItem->expiresAfter(1); // # of calls are cached each minute
178
+ }
179
+
180
+ $callsPerMinute = (int) $cacheItem->get();
181
+ if (++$callsPerMinute > $this->maxCallsPerMinute) {
182
+ return true;
183
+ }
184
+ $cacheItem->set($callsPerMinute);
185
+ $this->cache->save($cacheItem);
186
+ return false;
187
+ }
188
+
189
+ private function getCacheItem(): CacheItemInterface
190
+ {
191
+ if (\is_null($this->cacheItem)) {
192
+ $this->cacheItem = $this->cache->getItem($this->cacheKey);
193
+ }
194
+
195
+ return $this->cacheItem;
196
+ }
197
+
198
+ private function setCacheKeys(): void
199
+ {
200
+ if (empty($this->jwksUri)) {
201
+ throw new RuntimeException('JWKS URI is empty');
202
+ }
203
+
204
+ // ensure we do not have illegal characters
205
+ $key = preg_replace('|[^a-zA-Z0-9_\.!]|', '', $this->jwksUri);
206
+
207
+ // add prefix
208
+ $key = $this->cacheKeyPrefix . $key;
209
+
210
+ // Hash keys if they exceed $maxKeyLength of 64
211
+ if (\strlen($key) > $this->maxKeyLength) {
212
+ $key = substr(hash('sha256', $key), 0, $this->maxKeyLength);
213
+ }
214
+
215
+ $this->cacheKey = $key;
216
+
217
+ if ($this->rateLimit) {
218
+ // add prefix
219
+ $rateLimitKey = $this->cacheKeyPrefix . 'ratelimit' . $key;
220
+
221
+ // Hash keys if they exceed $maxKeyLength of 64
222
+ if (\strlen($rateLimitKey) > $this->maxKeyLength) {
223
+ $rateLimitKey = substr(hash('sha256', $rateLimitKey), 0, $this->maxKeyLength);
224
+ }
225
+
226
+ $this->rateLimitCacheKey = $rateLimitKey;
227
+ }
228
+ }
229
+ }
common/vendor/firebase/php-jwt/src/ExpiredException.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
 
2
  namespace Firebase\JWT;
3
 
4
  class ExpiredException extends \UnexpectedValueException
5
  {
6
-
7
  }
1
  <?php
2
+
3
  namespace Firebase\JWT;
4
 
5
  class ExpiredException extends \UnexpectedValueException
6
  {
 
7
  }
common/vendor/firebase/php-jwt/src/JWK.php ADDED
@@ -0,0 +1,322 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Firebase\JWT;
4
+
5
+ use DomainException;
6
+ use InvalidArgumentException;
7
+ use UnexpectedValueException;
8
+
9
+ /**
10
+ * JSON Web Key implementation, based on this spec:
11
+ * https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41
12
+ *
13
+ * PHP version 5
14
+ *
15
+ * @category Authentication
16
+ * @package Authentication_JWT
17
+ * @author Bui Sy Nguyen <nguyenbs@gmail.com>
18
+ * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
19
+ * @link https://github.com/firebase/php-jwt
20
+ */
21
+ class JWK
22
+ {
23
+ private const OID = '1.2.840.10045.2.1';
24
+ private const ASN1_OBJECT_IDENTIFIER = 0x06;
25
+ private const ASN1_SEQUENCE = 0x10; // also defined in JWT
26
+ private const ASN1_BIT_STRING = 0x03;
27
+ private const EC_CURVES = [
28
+ 'P-256' => '1.2.840.10045.3.1.7', // Len: 64
29
+ // 'P-384' => '1.3.132.0.34', // Len: 96 (not yet supported)
30
+ // 'P-521' => '1.3.132.0.35', // Len: 132 (not supported)
31
+ ];
32
+
33
+ /**
34
+ * Parse a set of JWK keys
35
+ *
36
+ * @param array<mixed> $jwks The JSON Web Key Set as an associative array
37
+ * @param string $defaultAlg The algorithm for the Key object if "alg" is not set in the
38
+ * JSON Web Key Set
39
+ *
40
+ * @return array<string, Key> An associative array of key IDs (kid) to Key objects
41
+ *
42
+ * @throws InvalidArgumentException Provided JWK Set is empty
43
+ * @throws UnexpectedValueException Provided JWK Set was invalid
44
+ * @throws DomainException OpenSSL failure
45
+ *
46
+ * @uses parseKey
47
+ */
48
+ public static function parseKeySet(array $jwks, string $defaultAlg = null): array
49
+ {
50
+ $keys = [];
51
+
52
+ if (!isset($jwks['keys'])) {
53
+ throw new UnexpectedValueException('"keys" member must exist in the JWK Set');
54
+ }
55
+
56
+ if (empty($jwks['keys'])) {
57
+ throw new InvalidArgumentException('JWK Set did not contain any keys');
58
+ }
59
+
60
+ foreach ($jwks['keys'] as $k => $v) {
61
+ $kid = isset($v['kid']) ? $v['kid'] : $k;
62
+ if ($key = self::parseKey($v, $defaultAlg)) {
63
+ $keys[(string) $kid] = $key;
64
+ }
65
+ }
66
+
67
+ if (0 === \count($keys)) {
68
+ throw new UnexpectedValueException('No supported algorithms found in JWK Set');
69
+ }
70
+
71
+ return $keys;
72
+ }
73
+
74
+ /**
75
+ * Parse a JWK key
76
+ *
77
+ * @param array<mixed> $jwk An individual JWK
78
+ * @param string $defaultAlg The algorithm for the Key object if "alg" is not set in the
79
+ * JSON Web Key Set
80
+ *
81
+ * @return Key The key object for the JWK
82
+ *
83
+ * @throws InvalidArgumentException Provided JWK is empty
84
+ * @throws UnexpectedValueException Provided JWK was invalid
85
+ * @throws DomainException OpenSSL failure
86
+ *
87
+ * @uses createPemFromModulusAndExponent
88
+ */
89
+ public static function parseKey(array $jwk, string $defaultAlg = null): ?Key
90
+ {
91
+ if (empty($jwk)) {
92
+ throw new InvalidArgumentException('JWK must not be empty');
93
+ }
94
+
95
+ if (!isset($jwk['kty'])) {
96
+ throw new UnexpectedValueException('JWK must contain a "kty" parameter');
97
+ }
98
+
99
+ if (!isset($jwk['alg'])) {
100
+ if (\is_null($defaultAlg)) {
101
+ // The "alg" parameter is optional in a KTY, but an algorithm is required
102
+ // for parsing in this library. Use the $defaultAlg parameter when parsing the
103
+ // key set in order to prevent this error.
104
+ // @see https://datatracker.ietf.org/doc/html/rfc7517#section-4.4
105
+ throw new UnexpectedValueException('JWK must contain an "alg" parameter');
106
+ }
107
+ $jwk['alg'] = $defaultAlg;
108
+ }
109
+
110
+ switch ($jwk['kty']) {
111
+ case 'RSA':
112
+ if (!empty($jwk['d'])) {
113
+ throw new UnexpectedValueException('RSA private keys are not supported');
114
+ }
115
+ if (!isset($jwk['n']) || !isset($jwk['e'])) {
116
+ throw new UnexpectedValueException('RSA keys must contain values for both "n" and "e"');
117
+ }
118
+
119
+ $pem = self::createPemFromModulusAndExponent($jwk['n'], $jwk['e']);
120
+ $publicKey = \openssl_pkey_get_public($pem);
121
+ if (false === $publicKey) {
122
+ throw new DomainException(
123
+ 'OpenSSL error: ' . \openssl_error_string()
124
+ );
125
+ }
126
+ return new Key($publicKey, $jwk['alg']);
127
+ case 'EC':
128
+ if (isset($jwk['d'])) {
129
+ // The key is actually a private key
130
+ throw new UnexpectedValueException('Key data must be for a public key');
131
+ }
132
+
133
+ if (empty($jwk['crv'])) {
134
+ throw new UnexpectedValueException('crv not set');
135
+ }
136
+
137
+ if (!isset(self::EC_CURVES[$jwk['crv']])) {
138
+ throw new DomainException('Unrecognised or unsupported EC curve');
139
+ }
140
+
141
+ if (empty($jwk['x']) || empty($jwk['y'])) {
142
+ throw new UnexpectedValueException('x and y not set');
143
+ }
144
+
145
+ $publicKey = self::createPemFromCrvAndXYCoordinates($jwk['crv'], $jwk['x'], $jwk['y']);
146
+ return new Key($publicKey, $jwk['alg']);
147
+ default:
148
+ // Currently only RSA is supported
149
+ break;
150
+ }
151
+
152
+ return null;
153
+ }
154
+
155
+ /**
156
+ * Converts the EC JWK values to pem format.
157
+ *
158
+ * @param string $crv The EC curve (only P-256 is supported)
159
+ * @param string $x The EC x-coordinate
160
+ * @param string $y The EC y-coordinate
161
+ *
162
+ * @return string
163
+ */
164
+ private static function createPemFromCrvAndXYCoordinates(string $crv, string $x, string $y): string
165
+ {
166
+ $pem =
167
+ self::encodeDER(
168
+ self::ASN1_SEQUENCE,
169
+ self::encodeDER(
170
+ self::ASN1_SEQUENCE,
171
+ self::encodeDER(
172
+ self::ASN1_OBJECT_IDENTIFIER,
173
+ self::encodeOID(self::OID)
174
+ )
175
+ . self::encodeDER(
176
+ self::ASN1_OBJECT_IDENTIFIER,
177
+ self::encodeOID(self::EC_CURVES[$crv])
178
+ )
179
+ ) .
180
+ self::encodeDER(
181
+ self::ASN1_BIT_STRING,
182
+ \chr(0x00) . \chr(0x04)
183
+ . JWT::urlsafeB64Decode($x)
184
+ . JWT::urlsafeB64Decode($y)
185
+ )
186
+ );
187
+
188
+ return sprintf(
189
+ "-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n",
190
+ wordwrap(base64_encode($pem), 64, "\n", true)
191
+ );
192
+ }
193
+
194
+ /**
195
+ * Create a public key represented in PEM format from RSA modulus and exponent information
196
+ *
197
+ * @param string $n The RSA modulus encoded in Base64
198
+ * @param string $e The RSA exponent encoded in Base64
199
+ *
200
+ * @return string The RSA public key represented in PEM format
201
+ *
202
+ * @uses encodeLength
203
+ */
204
+ private static function createPemFromModulusAndExponent(
205
+ string $n,
206
+ string $e
207
+ ): string {
208
+ $mod = JWT::urlsafeB64Decode($n);
209
+ $exp = JWT::urlsafeB64Decode($e);
210
+
211
+ $modulus = \pack('Ca*a*', 2, self::encodeLength(\strlen($mod)), $mod);
212
+ $publicExponent = \pack('Ca*a*', 2, self::encodeLength(\strlen($exp)), $exp);
213
+
214
+ $rsaPublicKey = \pack(
215
+ 'Ca*a*a*',
216
+ 48,
217
+ self::encodeLength(\strlen($modulus) + \strlen($publicExponent)),
218
+ $modulus,
219
+ $publicExponent
220
+ );
221
+
222
+ // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption.
223
+ $rsaOID = \pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
224
+ $rsaPublicKey = \chr(0) . $rsaPublicKey;
225
+ $rsaPublicKey = \chr(3) . self::encodeLength(\strlen($rsaPublicKey)) . $rsaPublicKey;
226
+
227
+ $rsaPublicKey = \pack(
228
+ 'Ca*a*',
229
+ 48,
230
+ self::encodeLength(\strlen($rsaOID . $rsaPublicKey)),
231
+ $rsaOID . $rsaPublicKey
232
+ );
233
+
234
+ return "-----BEGIN PUBLIC KEY-----\r\n" .
235
+ \chunk_split(\base64_encode($rsaPublicKey), 64) .
236
+ '-----END PUBLIC KEY-----';
237
+ }
238
+
239
+ /**
240
+ * DER-encode the length
241
+ *
242
+ * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
243
+ * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
244
+ *
245
+ * @param int $length
246
+ * @return string
247
+ */
248
+ private static function encodeLength(int $length): string
249
+ {
250
+ if ($length <= 0x7F) {
251
+ return \chr($length);
252
+ }
253
+
254
+ $temp = \ltrim(\pack('N', $length), \chr(0));
255
+
256
+ return \pack('Ca*', 0x80 | \strlen($temp), $temp);
257
+ }
258
+
259
+ /**
260
+ * Encodes a value into a DER object.
261
+ * Also defined in Firebase\JWT\JWT
262
+ *
263
+ * @param int $type DER tag
264
+ * @param string $value the value to encode
265
+ * @return string the encoded object
266
+ */
267
+ private static function encodeDER(int $type, string $value): string
268
+ {
269
+ $tag_header = 0;
270
+ if ($type === self::ASN1_SEQUENCE) {
271
+ $tag_header |= 0x20;
272
+ }
273
+
274
+ // Type
275
+ $der = \chr($tag_header | $type);
276
+
277
+ // Length
278
+ $der .= \chr(\strlen($value));
279
+
280
+ return $der . $value;
281
+ }
282
+
283
+ /**
284
+ * Encodes a string into a DER-encoded OID.
285
+ *
286
+ * @param string $oid the OID string
287
+ * @return string the binary DER-encoded OID
288
+ */
289
+ private static function encodeOID(string $oid): string
290
+ {
291
+ $octets = explode('.', $oid);
292
+
293
+ // Get the first octet
294
+ $first = (int) array_shift($octets);
295
+ $second = (int) array_shift($octets);
296
+ $oid = \chr($first * 40 + $second);
297
+
298
+ // Iterate over subsequent octets
299
+ foreach ($octets as $octet) {
300
+ if ($octet == 0) {
301
+ $oid .= \chr(0x00);
302
+ continue;
303
+ }
304
+ $bin = '';
305
+
306
+ while ($octet) {
307
+ $bin .= \chr(0x80 | ($octet & 0x7f));
308
+ $octet >>= 7;
309
+ }
310
+ $bin[0] = $bin[0] & \chr(0x7f);
311
+
312
+ // Convert to big endian if necessary
313
+ if (pack('V', 65534) == pack('L', 65534)) {
314
+ $oid .= strrev($bin);
315
+ } else {
316
+ $oid .= $bin;
317
+ }
318
+ }
319
+
320
+ return $oid;
321
+ }
322
+ }
common/vendor/firebase/php-jwt/src/JWT.php CHANGED
@@ -1,10 +1,16 @@
1
  <?php
2
 
3
  namespace Firebase\JWT;
4
- use \DomainException;
5
- use \InvalidArgumentException;
6
- use \UnexpectedValueException;
7
- use \DateTime;
 
 
 
 
 
 
8
 
9
  /**
10
  * JSON Web Token implementation, based on this spec:
@@ -21,42 +27,57 @@ use \DateTime;
21
  */
22
  class JWT
23
  {
 
 
 
24
 
25
  /**
26
  * When checking nbf, iat or expiration times,
27
  * we want to provide some extra leeway time to
28
  * account for clock skew.
 
 
29
  */
30
  public static $leeway = 0;
31
 
32
  /**
33
  * Allow the current timestamp to be specified.
34
  * Useful for fixing a value within unit testing.
35
- *
36
  * Will default to PHP time() value if null.
 
 
37
  */
38
  public static $timestamp = null;
39
 
40
- public static $supported_algs = array(
41
- 'HS256' => array('hash_hmac', 'SHA256'),
42
- 'HS512' => array('hash_hmac', 'SHA512'),
43
- 'HS384' => array('hash_hmac', 'SHA384'),
44
- 'RS256' => array('openssl', 'SHA256'),
45
- 'RS384' => array('openssl', 'SHA384'),
46
- 'RS512' => array('openssl', 'SHA512'),
47
- );
 
 
 
 
 
 
48
 
49
  /**
50
  * Decodes a JWT string into a PHP object.
51
  *
52
- * @param string $jwt The JWT
53
- * @param string|array $key The key, or map of keys.
54
- * If the algorithm used is asymmetric, this is the public key
55
- * @param array $allowed_algs List of supported verification algorithms
56
- * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
 
57
  *
58
- * @return object The JWT's payload as a PHP object
59
  *
 
 
60
  * @throws UnexpectedValueException Provided JWT was invalid
61
  * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed
62
  * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf'
@@ -66,57 +87,64 @@ class JWT
66
  * @uses jsonDecode
67
  * @uses urlsafeB64Decode
68
  */
69
- public static function decode($jwt, $key, array $allowed_algs = array())
70
- {
71
- $timestamp = is_null(static::$timestamp) ? time() : static::$timestamp;
 
 
 
72
 
73
- if (empty($key)) {
74
  throw new InvalidArgumentException('Key may not be empty');
75
  }
76
- $tks = explode('.', $jwt);
77
- if (count($tks) != 3) {
78
  throw new UnexpectedValueException('Wrong number of segments');
79
  }
80
  list($headb64, $bodyb64, $cryptob64) = $tks;
81
- if (null === ($header = static::jsonDecode(static::urlsafeB64Decode($headb64)))) {
 
82
  throw new UnexpectedValueException('Invalid header encoding');
83
  }
84
- if (null === $payload = static::jsonDecode(static::urlsafeB64Decode($bodyb64))) {
 
85
  throw new UnexpectedValueException('Invalid claims encoding');
86
  }
87
- if (false === ($sig = static::urlsafeB64Decode($cryptob64))) {
88
- throw new UnexpectedValueException('Invalid signature encoding');
 
89
  }
 
 
 
 
90
  if (empty($header->alg)) {
91
  throw new UnexpectedValueException('Empty algorithm');
92
  }
93
  if (empty(static::$supported_algs[$header->alg])) {
94
  throw new UnexpectedValueException('Algorithm not supported');
95
  }
96
- if (!in_array($header->alg, $allowed_algs)) {
97
- throw new UnexpectedValueException('Algorithm not allowed');
 
 
 
 
 
98
  }
99
- if (is_array($key) || $key instanceof \ArrayAccess) {
100
- if (isset($header->kid)) {
101
- if (!isset($key[$header->kid])) {
102
- throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key');
103
- }
104
- $key = $key[$header->kid];
105
- } else {
106
- throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
107
- }
108
  }
109
-
110
- // Check the signature
111
- if (!static::verify("$headb64.$bodyb64", $sig, $key, $header->alg)) {
112
  throw new SignatureInvalidException('Signature verification failed');
113
  }
114
 
115
- // Check if the nbf if it is defined. This is the time that the
116
  // token can actually be used. If it's not yet that time, abort.
117
  if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) {
118
  throw new BeforeValidException(
119
- 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->nbf)
120
  );
121
  }
122
 
@@ -125,7 +153,7 @@ class JWT
125
  // correctly used the nbf claim).
126
  if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) {
127
  throw new BeforeValidException(
128
- 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->iat)
129
  );
130
  }
131
 
@@ -140,118 +168,161 @@ class JWT
140
  /**
141
  * Converts and signs a PHP object or array into a JWT string.
142
  *
143
- * @param object|array $payload PHP object or array
144
- * @param string $key The secret key.
145
- * If the algorithm used is asymmetric, this is the private key
146
- * @param string $alg The signing algorithm.
147
- * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
148
- * @param mixed $keyId
149
- * @param array $head An array with header elements to attach
150
  *
151
  * @return string A signed JWT
152
  *
153
  * @uses jsonEncode
154
  * @uses urlsafeB64Encode
155
  */
156
- public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null)
157
- {
158
- $header = array('typ' => 'JWT', 'alg' => $alg);
 
 
 
 
 
159
  if ($keyId !== null) {
160
  $header['kid'] = $keyId;
161
  }
162
- if ( isset($head) && is_array($head) ) {
163
- $header = array_merge($head, $header);
164
  }
165
- $segments = array();
166
- $segments[] = static::urlsafeB64Encode(static::jsonEncode($header));
167
- $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload));
168
- $signing_input = implode('.', $segments);
169
 
170
  $signature = static::sign($signing_input, $key, $alg);
171
  $segments[] = static::urlsafeB64Encode($signature);
172
 
173
- return implode('.', $segments);
174
  }
175
 
176
  /**
177
  * Sign a string with a given key and algorithm.
178
  *
179
- * @param string $msg The message to sign
180
- * @param string|resource $key The secret key
181
- * @param string $alg The signing algorithm.
182
- * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
183
  *
184
  * @return string An encrypted message
185
  *
186
- * @throws DomainException Unsupported algorithm was specified
187
  */
188
- public static function sign($msg, $key, $alg = 'HS256')
189
- {
 
 
 
190
  if (empty(static::$supported_algs[$alg])) {
191
  throw new DomainException('Algorithm not supported');
192
  }
193
  list($function, $algorithm) = static::$supported_algs[$alg];
194
- switch($function) {
195
  case 'hash_hmac':
196
- return hash_hmac($algorithm, $msg, $key, true);
 
 
 
197
  case 'openssl':
198
  $signature = '';
199
- $success = openssl_sign($msg, $signature, $key, $algorithm);
200
  if (!$success) {
201
- throw new DomainException("OpenSSL unable to sign data");
202
- } else {
203
- return $signature;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
  }
205
  }
 
 
206
  }
207
 
208
  /**
209
  * Verify a signature with the message, key and method. Not all methods
210
  * are symmetric, so we must have a separate verify and sign method.
211
  *
212
- * @param string $msg The original message (header and body)
213
- * @param string $signature The original signature
214
- * @param string|resource $key For HS*, a string key works. for RS*, must be a resource of an openssl public key
215
- * @param string $alg The algorithm
216
  *
217
  * @return bool
218
  *
219
- * @throws DomainException Invalid Algorithm or OpenSSL failure
220
  */
221
- private static function verify($msg, $signature, $key, $alg)
222
- {
 
 
 
 
223
  if (empty(static::$supported_algs[$alg])) {
224
  throw new DomainException('Algorithm not supported');
225
  }
226
 
227
  list($function, $algorithm) = static::$supported_algs[$alg];
228
- switch($function) {
229
  case 'openssl':
230
- $success = openssl_verify($msg, $signature, $key, $algorithm);
231
  if ($success === 1) {
232
  return true;
233
- } elseif ($success === 0) {
 
234
  return false;
235
  }
236
  // returns 1 on success, 0 on failure, -1 on error.
237
  throw new DomainException(
238
- 'OpenSSL error: ' . openssl_error_string()
239
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  case 'hash_hmac':
241
  default:
242
- $hash = hash_hmac($algorithm, $msg, $key, true);
243
- if (function_exists('hash_equals')) {
244
- return hash_equals($signature, $hash);
245
- }
246
- $len = min(static::safeStrlen($signature), static::safeStrlen($hash));
247
-
248
- $status = 0;
249
- for ($i = 0; $i < $len; $i++) {
250
- $status |= (ord($signature[$i]) ^ ord($hash[$i]));
251
  }
252
- $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash));
253
-
254
- return ($status === 0);
255
  }
256
  }
257
 
@@ -260,30 +331,16 @@ class JWT
260
  *
261
  * @param string $input JSON string
262
  *
263
- * @return object Object representation of JSON string
264
  *
265
  * @throws DomainException Provided string was invalid JSON
266
  */
267
- public static function jsonDecode($input)
268
  {
269
- if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
270
- /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you
271
- * to specify that large ints (like Steam Transaction IDs) should be treated as
272
- * strings, rather than the PHP default behaviour of converting them to floats.
273
- */
274
- $obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING);
275
- } else {
276
- /** Not all servers will support that, however, so for older versions we must
277
- * manually detect large ints in the JSON string and quote them (thus converting
278
- *them to strings) before decoding, hence the preg_replace() call.
279
- */
280
- $max_int_length = strlen((string) PHP_INT_MAX) - 1;
281
- $json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input);
282
- $obj = json_decode($json_without_bigints);
283
- }
284
 
285
- if (function_exists('json_last_error') && $errno = json_last_error()) {
286
- static::handleJsonError($errno);
287
  } elseif ($obj === null && $input !== 'null') {
288
  throw new DomainException('Null result with non-null input');
289
  }
@@ -291,22 +348,30 @@ class JWT
291
  }
292
 
293
  /**
294
- * Encode a PHP object into a JSON string.
295
  *
296
- * @param object|array $input A PHP object or array
297
  *
298
- * @return string JSON representation of the PHP object or array
299
  *
300
  * @throws DomainException Provided object could not be encoded to valid JSON
301
  */
302
- public static function jsonEncode($input)
303
  {
304
- $json = json_encode($input);
305
- if (function_exists('json_last_error') && $errno = json_last_error()) {
306
- static::handleJsonError($errno);
 
 
 
 
 
307
  } elseif ($json === 'null' && $input !== null) {
308
  throw new DomainException('Null result with non-null input');
309
  }
 
 
 
310
  return $json;
311
  }
312
 
@@ -316,15 +381,17 @@ class JWT
316
  * @param string $input A Base64 encoded string
317
  *
318
  * @return string A decoded string
 
 
319
  */
320
- public static function urlsafeB64Decode($input)
321
  {
322
- $remainder = strlen($input) % 4;
323
  if ($remainder) {
324
  $padlen = 4 - $remainder;
325
- $input .= str_repeat('=', $padlen);
326
  }
327
- return base64_decode(strtr($input, '-_', '+/'));
328
  }
329
 
330
  /**
@@ -334,9 +401,64 @@ class JWT
334
  *
335
  * @return string The base64 encode of what you passed in
336
  */
337
- public static function urlsafeB64Encode($input)
338
  {
339
- return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
340
  }
341
 
342
  /**
@@ -344,17 +466,19 @@ class JWT
344
  *
345
  * @param int $errno An error number from json_last_error()
346
  *
 
 
347
  * @return void
348
  */
349
- private static function handleJsonError($errno)
350
  {
351
- $messages = array(
352
  JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
353
  JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
354
  JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',
355
  JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON',
356
  JSON_ERROR_UTF8 => 'Malformed UTF-8 characters' //PHP >= 5.3.3
357
- );
358
  throw new DomainException(
359
  isset($messages[$errno])
360
  ? $messages[$errno]
@@ -365,15 +489,139 @@ class JWT
365
  /**
366
  * Get the number of bytes in cryptographic strings.
367
  *
368
- * @param string
369
  *
370
  * @return int
371
  */
372
- private static function safeStrlen($str)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
  {
374
- if (function_exists('mb_strlen')) {
375
- return mb_strlen($str, '8bit');
 
376
  }
377
- return strlen($str);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
378
  }
379
  }
1
  <?php
2
 
3
  namespace Firebase\JWT;
4
+
5
+ use ArrayAccess;
6
+ use DateTime;
7
+ use DomainException;
8
+ use Exception;
9
+ use InvalidArgumentException;
10
+ use OpenSSLAsymmetricKey;
11
+ use OpenSSLCertificate;
12
+ use stdClass;
13
+ use UnexpectedValueException;
14
 
15
  /**
16
  * JSON Web Token implementation, based on this spec:
27
  */
28
  class JWT
29
  {
30
+ private const ASN1_INTEGER = 0x02;
31
+ private const ASN1_SEQUENCE = 0x10;
32
+ private const ASN1_BIT_STRING = 0x03;
33
 
34
  /**
35
  * When checking nbf, iat or expiration times,
36
  * we want to provide some extra leeway time to
37
  * account for clock skew.
38
+ *
39
+ * @var int
40
  */
41
  public static $leeway = 0;
42
 
43
  /**
44
  * Allow the current timestamp to be specified.
45
  * Useful for fixing a value within unit testing.
 
46
  * Will default to PHP time() value if null.
47
+ *
48
+ * @var ?int
49
  */
50
  public static $timestamp = null;
51
 
52
+ /**
53
+ * @var array<string, string[]>
54
+ */
55
+ public static $supported_algs = [
56
+ 'ES384' => ['openssl', 'SHA384'],
57
+ 'ES256' => ['openssl', 'SHA256'],
58
+ 'HS256' => ['hash_hmac', 'SHA256'],
59
+ 'HS384' => ['hash_hmac', 'SHA384'],
60
+ 'HS512' => ['hash_hmac', 'SHA512'],
61
+ 'RS256' => ['openssl', 'SHA256'],
62
+ 'RS384' => ['openssl', 'SHA384'],
63
+ 'RS512' => ['openssl', 'SHA512'],
64
+ 'EdDSA' => ['sodium_crypto', 'EdDSA'],
65
+ ];
66
 
67
  /**
68
  * Decodes a JWT string into a PHP object.
69
  *
70
+ * @param string $jwt The JWT
71
+ * @param Key|array<string,Key> $keyOrKeyArray The Key or associative array of key IDs (kid) to Key objects.
72
+ * If the algorithm used is asymmetric, this is the public key
73
+ * Each Key object contains an algorithm and matching key.
74
+ * Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
75
+ * 'HS512', 'RS256', 'RS384', and 'RS512'
76
  *
77
+ * @return stdClass The JWT's payload as a PHP object
78
  *
79
+ * @throws InvalidArgumentException Provided key/key-array was empty
80
+ * @throws DomainException Provided JWT is malformed
81
  * @throws UnexpectedValueException Provided JWT was invalid
82
  * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed
83
  * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf'
87
  * @uses jsonDecode
88
  * @uses urlsafeB64Decode
89
  */
90
+ public static function decode(
91
+ string $jwt,
92
+ $keyOrKeyArray
93
+ ): stdClass {
94
+ // Validate JWT
95
+ $timestamp = \is_null(static::$timestamp) ? \time() : static::$timestamp;
96
 
97
+ if (empty($keyOrKeyArray)) {
98
  throw new InvalidArgumentException('Key may not be empty');
99
  }
100
+ $tks = \explode('.', $jwt);
101
+ if (\count($tks) !== 3) {
102
  throw new UnexpectedValueException('Wrong number of segments');
103
  }
104
  list($headb64, $bodyb64, $cryptob64) = $tks;
105
+ $headerRaw = static::urlsafeB64Decode($headb64);
106
+ if (null === ($header = static::jsonDecode($headerRaw))) {
107
  throw new UnexpectedValueException('Invalid header encoding');
108
  }
109
+ $payloadRaw = static::urlsafeB64Decode($bodyb64);
110
+ if (null === ($payload = static::jsonDecode($payloadRaw))) {
111
  throw new UnexpectedValueException('Invalid claims encoding');
112
  }
113
+ if (\is_array($payload)) {
114
+ // prevent PHP Fatal Error in edge-cases when payload is empty array
115
+ $payload = (object) $payload;
116
  }
117
+ if (!$payload instanceof stdClass) {
118
+ throw new UnexpectedValueException('Payload must be a JSON object');
119
+ }
120
+ $sig = static::urlsafeB64Decode($cryptob64);
121
  if (empty($header->alg)) {
122
  throw new UnexpectedValueException('Empty algorithm');
123
  }
124
  if (empty(static::$supported_algs[$header->alg])) {
125
  throw new UnexpectedValueException('Algorithm not supported');
126
  }
127
+
128
+ $key = self::getKey($keyOrKeyArray, property_exists($header, 'kid') ? $header->kid : null);
129
+
130
+ // Check the algorithm
131
+ if (!self::constantTimeEquals($key->getAlgorithm(), $header->alg)) {
132
+ // See issue #351
133
+ throw new UnexpectedValueException('Incorrect key for this algorithm');
134
  }
135
+ if ($header->alg === 'ES256' || $header->alg === 'ES384') {
136
+ // OpenSSL expects an ASN.1 DER sequence for ES256/ES384 signatures
137
+ $sig = self::signatureToDER($sig);
 
 
 
 
 
 
138
  }
139
+ if (!self::verify("${headb64}.${bodyb64}", $sig, $key->getKeyMaterial(), $header->alg)) {
 
 
140
  throw new SignatureInvalidException('Signature verification failed');
141
  }
142
 
143
+ // Check the nbf if it is defined. This is the time that the
144
  // token can actually be used. If it's not yet that time, abort.
145
  if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) {
146
  throw new BeforeValidException(
147
+ 'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->nbf)
148
  );
149
  }
150
 
153
  // correctly used the nbf claim).
154
  if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) {
155
  throw new BeforeValidException(
156
+ 'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->iat)
157
  );
158
  }
159
 
168
  /**
169
  * Converts and signs a PHP object or array into a JWT string.
170
  *
171
+ * @param array<mixed> $payload PHP array
172
+ * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key.
173
+ * @param string $alg Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
174
+ * 'HS512', 'RS256', 'RS384', and 'RS512'
175
+ * @param string $keyId
176
+ * @param array<string, string> $head An array with header elements to attach
 
177
  *
178
  * @return string A signed JWT
179
  *
180
  * @uses jsonEncode
181
  * @uses urlsafeB64Encode
182
  */
183
+ public static function encode(
184
+ array $payload,
185
+ $key,
186
+ string $alg,
187
+ string $keyId = null,
188
+ array $head = null
189
+ ): string {
190
+ $header = ['typ' => 'JWT', 'alg' => $alg];
191
  if ($keyId !== null) {
192
  $header['kid'] = $keyId;
193
  }
194
+ if (isset($head) && \is_array($head)) {
195
+ $header = \array_merge($head, $header);
196
  }
197
+ $segments = [];
198
+ $segments[] = static::urlsafeB64Encode((string) static::jsonEncode($header));
199
+ $segments[] = static::urlsafeB64Encode((string) static::jsonEncode($payload));
200
+ $signing_input = \implode('.', $segments);
201
 
202
  $signature = static::sign($signing_input, $key, $alg);
203
  $segments[] = static::urlsafeB64Encode($signature);
204
 
205
+ return \implode('.', $segments);
206
  }
207
 
208
  /**
209
  * Sign a string with a given key and algorithm.
210
  *
211
+ * @param string $msg The message to sign
212
+ * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key.
213
+ * @param string $alg Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
214
+ * 'HS512', 'RS256', 'RS384', and 'RS512'
215
  *
216
  * @return string An encrypted message
217
  *
218
+ * @throws DomainException Unsupported algorithm or bad key was specified
219
  */
220
+ public static function sign(
221
+ string $msg,
222
+ $key,
223
+ string $alg
224
+ ): string {
225
  if (empty(static::$supported_algs[$alg])) {
226
  throw new DomainException('Algorithm not supported');
227
  }
228
  list($function, $algorithm) = static::$supported_algs[$alg];
229
+ switch ($function) {
230
  case 'hash_hmac':
231
+ if (!\is_string($key)) {
232
+ throw new InvalidArgumentException('key must be a string when using hmac');
233
+ }
234
+ return \hash_hmac($algorithm, $msg, $key, true);
235
  case 'openssl':
236
  $signature = '';
237
+ $success = \openssl_sign($msg, $signature, $key, $algorithm); // @phpstan-ignore-line
238
  if (!$success) {
239
+ throw new DomainException('OpenSSL unable to sign data');
240
+ }
241
+ if ($alg === 'ES256') {
242
+ $signature = self::signatureFromDER($signature, 256);
243
+ } elseif ($alg === 'ES384') {
244
+ $signature = self::signatureFromDER($signature, 384);
245
+ }
246
+ return $signature;
247
+ case 'sodium_crypto':
248
+ if (!\function_exists('sodium_crypto_sign_detached')) {
249
+ throw new DomainException('libsodium is not available');
250
+ }
251
+ if (!\is_string($key)) {
252
+ throw new InvalidArgumentException('key must be a string when using EdDSA');
253
+ }
254
+ try {
255
+ // The last non-empty line is used as the key.
256
+ $lines = array_filter(explode("\n", $key));
257
+ $key = base64_decode((string) end($lines));
258
+ return sodium_crypto_sign_detached($msg, $key);
259
+ } catch (Exception $e) {
260
+ throw new DomainException($e->getMessage(), 0, $e);
261
  }
262
  }
263
+
264
+ throw new DomainException('Algorithm not supported');
265
  }
266
 
267
  /**
268
  * Verify a signature with the message, key and method. Not all methods
269
  * are symmetric, so we must have a separate verify and sign method.
270
  *
271
+ * @param string $msg The original message (header and body)
272
+ * @param string $signature The original signature
273
+ * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial For HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey
274
+ * @param string $alg The algorithm
275
  *
276
  * @return bool
277
  *
278
+ * @throws DomainException Invalid Algorithm, bad key, or OpenSSL failure
279
  */
280
+ private static function verify(
281
+ string $msg,
282
+ string $signature,
283
+ $keyMaterial,
284
+ string $alg
285
+ ): bool {
286
  if (empty(static::$supported_algs[$alg])) {
287
  throw new DomainException('Algorithm not supported');
288
  }
289
 
290
  list($function, $algorithm) = static::$supported_algs[$alg];
291
+ switch ($function) {
292
  case 'openssl':
293
+ $success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm); // @phpstan-ignore-line
294
  if ($success === 1) {
295
  return true;
296
+ }
297
+ if ($success === 0) {
298
  return false;
299
  }
300
  // returns 1 on success, 0 on failure, -1 on error.
301
  throw new DomainException(
302
+ 'OpenSSL error: ' . \openssl_error_string()
303
  );
304
+ case 'sodium_crypto':
305
+ if (!\function_exists('sodium_crypto_sign_verify_detached')) {
306
+ throw new DomainException('libsodium is not available');
307
+ }
308
+ if (!\is_string($keyMaterial)) {
309
+ throw new InvalidArgumentException('key must be a string when using EdDSA');
310
+ }
311
+ try {
312
+ // The last non-empty line is used as the key.
313
+ $lines = array_filter(explode("\n", $keyMaterial));
314
+ $key = base64_decode((string) end($lines));
315
+ return sodium_crypto_sign_verify_detached($signature, $msg, $key);
316
+ } catch (Exception $e) {
317
+ throw new DomainException($e->getMessage(), 0, $e);
318
+ }
319
  case 'hash_hmac':
320
  default:
321
+ if (!\is_string($keyMaterial)) {
322
+ throw new InvalidArgumentException('key must be a string when using hmac');
 
 
 
 
 
 
 
323
  }
324
+ $hash = \hash_hmac($algorithm, $msg, $keyMaterial, true);
325
+ return self::constantTimeEquals($hash, $signature);
 
326
  }
327
  }
328
 
331
  *
332
  * @param string $input JSON string
333
  *
334
+ * @return mixed The decoded JSON string
335
  *
336
  * @throws DomainException Provided string was invalid JSON
337
  */
338
+ public static function jsonDecode(string $input)
339
  {
340
+ $obj = \json_decode($input, false, 512, JSON_BIGINT_AS_STRING);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
341
 
342
+ if ($errno = \json_last_error()) {
343
+ self::handleJsonError($errno);
344
  } elseif ($obj === null && $input !== 'null') {
345
  throw new DomainException('Null result with non-null input');
346
  }
348
  }
349
 
350
  /**
351
+ * Encode a PHP array into a JSON string.
352
  *
353
+ * @param array<mixed> $input A PHP array
354
  *
355
+ * @return string JSON representation of the PHP array
356
  *
357
  * @throws DomainException Provided object could not be encoded to valid JSON
358
  */
359
+ public static function jsonEncode(array $input): string
360
  {
361
+ if (PHP_VERSION_ID >= 50400) {
362
+ $json = \json_encode($input, \JSON_UNESCAPED_SLASHES);
363
+ } else {
364
+ // PHP 5.3 only
365
+ $json = \json_encode($input);
366
+ }
367
+ if ($errno = \json_last_error()) {
368
+ self::handleJsonError($errno);
369
  } elseif ($json === 'null' && $input !== null) {
370
  throw new DomainException('Null result with non-null input');
371
  }
372
+ if ($json === false) {
373
+ throw new DomainException('Provided object could not be encoded to valid JSON');
374
+ }
375
  return $json;
376
  }
377
 
381
  * @param string $input A Base64 encoded string
382
  *
383
  * @return string A decoded string
384
+ *
385
+ * @throws InvalidArgumentException invalid base64 characters
386
  */
387
+ public static function urlsafeB64Decode(string $input): string
388
  {
389
+ $remainder = \strlen($input) % 4;
390
  if ($remainder) {
391
  $padlen = 4 - $remainder;
392
+ $input .= \str_repeat('=', $padlen);
393
  }
394
+ return \base64_decode(\strtr($input, '-_', '+/'));
395
  }
396
 
397
  /**
401
  *
402
  * @return string The base64 encode of what you passed in
403
  */
404
+ public static function urlsafeB64Encode(string $input): string
405
  {
406
+ return \str_replace('=', '', \strtr(\base64_encode($input), '+/', '-_'));
407
+ }
408
+
409
+
410
+ /**
411
+ * Determine if an algorithm has been provided for each Key
412
+ *
413
+ * @param Key|ArrayAccess<string,Key>|array<string,Key> $keyOrKeyArray
414
+ * @param string|null $kid
415
+ *
416
+ * @throws UnexpectedValueException
417
+ *
418
+ * @return Key
419
+ */
420
+ private static function getKey(
421
+ $keyOrKeyArray,
422
+ ?string $kid
423
+ ): Key {
424
+ if ($keyOrKeyArray instanceof Key) {
425
+ return $keyOrKeyArray;
426
+ }
427
+
428
+ if ($keyOrKeyArray instanceof CachedKeySet) {
429
+ // Skip "isset" check, as this will automatically refresh if not set
430
+ return $keyOrKeyArray[$kid];
431
+ }
432
+
433
+ if (empty($kid)) {
434
+ throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
435
+ }
436
+ if (!isset($keyOrKeyArray[$kid])) {
437
+ throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key');
438
+ }
439
+
440
+ return $keyOrKeyArray[$kid];
441
+ }
442
+
443
+ /**
444
+ * @param string $left The string of known length to compare against
445
+ * @param string $right The user-supplied string
446
+ * @return bool
447
+ */
448
+ public static function constantTimeEquals(string $left, string $right): bool
449
+ {
450
+ if (\function_exists('hash_equals')) {
451
+ return \hash_equals($left, $right);
452
+ }
453
+ $len = \min(self::safeStrlen($left), self::safeStrlen($right));
454
+
455
+ $status = 0;
456
+ for ($i = 0; $i < $len; $i++) {
457
+ $status |= (\ord($left[$i]) ^ \ord($right[$i]));
458
+ }
459
+ $status |= (self::safeStrlen($left) ^ self::safeStrlen($right));
460
+
461
+ return ($status === 0);
462
  }
463
 
464
  /**
466
  *
467
  * @param int $errno An error number from json_last_error()
468
  *
469
+ * @throws DomainException
470
+ *
471
  * @return void
472
  */
473
+ private static function handleJsonError(int $errno): void
474
  {
475
+ $messages = [
476
  JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
477
  JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
478
  JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',
479
  JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON',
480
  JSON_ERROR_UTF8 => 'Malformed UTF-8 characters' //PHP >= 5.3.3
481
+ ];
482
  throw new DomainException(
483
  isset($messages[$errno])
484
  ? $messages[$errno]
489
  /**
490
  * Get the number of bytes in cryptographic strings.
491
  *
492
+ * @param string $str
493
  *
494
  * @return int
495
  */
496
+ private static function safeStrlen(string $str): int
497
+ {
498
+ if (\function_exists('mb_strlen')) {
499
+ return \mb_strlen($str, '8bit');
500
+ }
501
+ return \strlen($str);
502
+ }
503
+
504
+ /**
505
+ * Convert an ECDSA signature to an ASN.1 DER sequence
506
+ *
507
+ * @param string $sig The ECDSA signature to convert
508
+ * @return string The encoded DER object
509
+ */
510
+ private static function signatureToDER(string $sig): string
511
+ {
512
+ // Separate the signature into r-value and s-value
513
+ $length = max(1, (int) (\strlen($sig) / 2));
514
+ list($r, $s) = \str_split($sig, $length);
515
+
516
+ // Trim leading zeros
517
+ $r = \ltrim($r, "\x00");
518
+ $s = \ltrim($s, "\x00");
519
+
520
+ // Convert r-value and s-value from unsigned big-endian integers to
521
+ // signed two's complement
522
+ if (\ord($r[0]) > 0x7f) {
523
+ $r = "\x00" . $r;
524
+ }
525
+ if (\ord($s[0]) > 0x7f) {
526
+ $s = "\x00" . $s;
527
+ }
528
+
529
+ return self::encodeDER(
530
+ self::ASN1_SEQUENCE,
531
+ self::encodeDER(self::ASN1_INTEGER, $r) .
532
+ self::encodeDER(self::ASN1_INTEGER, $s)
533
+ );
534
+ }
535
+
536
+ /**
537
+ * Encodes a value into a DER object.
538
+ *
539
+ * @param int $type DER tag
540
+ * @param string $value the value to encode
541
+ *
542
+ * @return string the encoded object
543
+ */
544
+ private static function encodeDER(int $type, string $value): string
545
  {
546
+ $tag_header = 0;
547
+ if ($type === self::ASN1_SEQUENCE) {
548
+ $tag_header |= 0x20;
549
  }
550
+
551
+ // Type
552
+ $der = \chr($tag_header | $type);
553
+
554
+ // Length
555
+ $der .= \chr(\strlen($value));
556
+
557
+ return $der . $value;
558
+ }
559
+
560
+ /**
561
+ * Encodes signature from a DER object.
562
+ *
563
+ * @param string $der binary signature in DER format
564
+ * @param int $keySize the number of bits in the key
565
+ *
566
+ * @return string the signature
567
+ */
568
+ private static function signatureFromDER(string $der, int $keySize): string
569
+ {
570
+ // OpenSSL returns the ECDSA signatures as a binary ASN.1 DER SEQUENCE
571
+ list($offset, $_) = self::readDER($der);
572
+ list($offset, $r) = self::readDER($der, $offset);
573
+ list($offset, $s) = self::readDER($der, $offset);
574
+
575
+ // Convert r-value and s-value from signed two's compliment to unsigned
576
+ // big-endian integers
577
+ $r = \ltrim($r, "\x00");
578
+ $s = \ltrim($s, "\x00");
579
+
580
+ // Pad out r and s so that they are $keySize bits long
581
+ $r = \str_pad($r, $keySize / 8, "\x00", STR_PAD_LEFT);
582
+ $s = \str_pad($s, $keySize / 8, "\x00", STR_PAD_LEFT);
583
+
584
+ return $r . $s;
585
+ }
586
+
587
+ /**
588
+ * Reads binary DER-encoded data and decodes into a single object
589
+ *
590
+ * @param string $der the binary data in DER format
591
+ * @param int $offset the offset of the data stream containing the object
592
+ * to decode
593
+ *
594
+ * @return array{int, string|null} the new offset and the decoded object
595
+ */
596
+ private static function readDER(string $der, int $offset = 0): array
597
+ {
598
+ $pos = $offset;
599
+ $size = \strlen($der);
600
+ $constructed = (\ord($der[$pos]) >> 5) & 0x01;
601
+ $type = \ord($der[$pos++]) & 0x1f;
602
+
603
+ // Length
604
+ $len = \ord($der[$pos++]);
605
+ if ($len & 0x80) {
606
+ $n = $len & 0x1f;
607
+ $len = 0;
608
+ while ($n-- && $pos < $size) {
609
+ $len = ($len << 8) | \ord($der[$pos++]);
610
+ }
611
+ }
612
+
613
+ // Value
614
+ if ($type === self::ASN1_BIT_STRING) {
615
+ $pos++; // Skip the first contents octet (padding indicator)
616
+ $data = \substr($der, $pos, $len - 1);
617
+ $pos += $len - 1;
618
+ } elseif (!$constructed) {
619
+ $data = \substr($der, $pos, $len);
620
+ $pos += $len;
621
+ } else {
622
+ $data = null;
623
+ }
624
+
625
+ return [$pos, $data];
626
  }
627
  }
common/vendor/firebase/php-jwt/src/Key.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Firebase\JWT;
4
+
5
+ use InvalidArgumentException;
6
+ use OpenSSLAsymmetricKey;
7
+ use OpenSSLCertificate;
8
+ use TypeError;
9
+
10
+ class Key
11
+ {
12
+ /** @var string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate */
13
+ private $keyMaterial;
14
+ /** @var string */
15
+ private $algorithm;
16
+
17
+ /**
18
+ * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial
19
+ * @param string $algorithm
20
+ */
21
+ public function __construct(
22
+ $keyMaterial,
23
+ string $algorithm
24
+ ) {
25
+ if (
26
+ !\is_string($keyMaterial)
27
+ && !$keyMaterial instanceof OpenSSLAsymmetricKey
28
+ && !$keyMaterial instanceof OpenSSLCertificate
29
+ && !\is_resource($keyMaterial)
30
+ ) {
31
+ throw new TypeError('Key material must be a string, resource, or OpenSSLAsymmetricKey');
32
+ }
33
+
34
+ if (empty($keyMaterial)) {
35
+ throw new InvalidArgumentException('Key material must not be empty');
36
+ }
37
+
38
+ if (empty($algorithm)) {
39
+ throw new InvalidArgumentException('Algorithm must not be empty');
40
+ }
41
+
42
+ // TODO: Remove in PHP 8.0 in favor of class constructor property promotion
43
+ $this->keyMaterial = $keyMaterial;
44
+ $this->algorithm = $algorithm;
45
+ }
46
+
47
+ /**
48
+ * Return the algorithm valid for this key
49
+ *
50
+ * @return string
51
+ */
52
+ public function getAlgorithm(): string
53
+ {
54
+ return $this->algorithm;
55
+ }
56
+
57
+ /**
58
+ * @return string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate
59
+ */
60
+ public function getKeyMaterial()
61
+ {
62
+ return $this->keyMaterial;
63
+ }
64
+ }
common/vendor/firebase/php-jwt/src/SignatureInvalidException.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
 
2
  namespace Firebase\JWT;
3
 
4
  class SignatureInvalidException extends \UnexpectedValueException
5
  {
6
-
7
  }
1
  <?php
2
+
3
  namespace Firebase\JWT;
4
 
5
  class SignatureInvalidException extends \UnexpectedValueException
6
  {
 
7
  }
lang/the-events-calendar-cs_CZ.mo CHANGED
Binary file
lang/the-events-calendar-de_CH.mo CHANGED
Binary file
lang/the-events-calendar-de_DE.mo CHANGED
Binary file
lang/the-events-calendar-es_ES.mo CHANGED
Binary file
lang/the-events-calendar-fr_FR.mo CHANGED
Binary file
lang/the-events-calendar-nl_BE.mo CHANGED
Binary file
lang/the-events-calendar-nl_NL.mo CHANGED
Binary file
lang/the-events-calendar-sv_SE.mo CHANGED
Binary file
lang/the-events-calendar.pot CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the The Events Calendar package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: The Events Calendar 6.0.1\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/the-events-"
7
  "calendar\n"
8
- "POT-Creation-Date: 2022-09-14 17:27:00+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "PO-Revision-Date: 2022-09-14 17:27\n"
13
  "Last-Translator: \n"
14
  "Language-Team: \n"
15
 
@@ -477,7 +477,7 @@ msgstr ""
477
  msgid "%s"
478
  msgstr ""
479
 
480
- #: src/Tribe/Admin/Bar/Default_Configurator.php:47 src/Tribe/Main.php:3612
481
  #: src/Tribe/Views/V2/Views/Widgets/Widget_View.php:61
482
  #: src/admin-views/tribe-options-upgrade.php:20
483
  msgid "View Calendar"
@@ -488,7 +488,7 @@ msgid "Add %s"
488
  msgstr ""
489
 
490
  #: src/Tribe/Admin/Bar/Default_Configurator.php:64
491
- #: src/Tribe/Linked_Posts/Chooser_Meta_Box.php:216 src/Tribe/Main.php:2062
492
  #: src/Tribe/Organizer.php:93 src/Tribe/Organizer.php:801
493
  #: src/Tribe/Venue.php:129 src/Tribe/Venue.php:915
494
  msgid "Edit %s"
@@ -501,7 +501,7 @@ msgid "Import"
501
  msgstr ""
502
 
503
  #: src/Tribe/Admin/Bar/Default_Configurator.php:91
504
- #: src/Tribe/Admin/Settings.php:166 src/Tribe/Main.php:3660
505
  msgid "Settings"
506
  msgstr ""
507
 
@@ -642,7 +642,7 @@ msgid ""
642
  "refresh and try again."
643
  msgstr ""
644
 
645
- #: src/Tribe/Admin_List.php:299 src/Tribe/Main.php:2114
646
  msgid "%s Categories"
647
  msgstr ""
648
 
@@ -3124,6 +3124,12 @@ msgstr ""
3124
  msgid "Powered by"
3125
  msgstr ""
3126
 
 
 
 
 
 
 
3127
  #: src/Tribe/Integrations/WPML/Defaults.php:117
3128
  msgid ""
3129
  "The Events Calendar could not write WPML default config file: please create "
@@ -3238,205 +3244,205 @@ msgctxt ""
3238
  msgid "Create or Find %s"
3239
  msgstr ""
3240
 
3241
- #. #-#-#-#-# the-events-calendar.pot (The Events Calendar 6.0.1) #-#-#-#-#
3242
  #. Plugin Name of the plugin/theme
3243
- #. #-#-#-#-# the-events-calendar.pot (The Events Calendar 6.0.1) #-#-#-#-#
3244
  #. Author of the plugin/theme
3245
- #: src/Tribe/Main.php:952 src/Tribe/Main.php:1481 src/Tribe/Privacy.php:29
3246
  #: src/admin-views/admin-welcome-message.php:29
3247
- #: src/functions/template-tags/general.php:1413 the-events-calendar.php:55
3248
  msgid "The Events Calendar"
3249
  msgstr ""
3250
 
3251
- #: src/Tribe/Main.php:959
3252
  msgid "month"
3253
  msgstr ""
3254
 
3255
- #: src/Tribe/Main.php:960
3256
  msgid "list"
3257
  msgstr ""
3258
 
3259
- #: src/Tribe/Main.php:961
3260
  msgid "upcoming"
3261
  msgstr ""
3262
 
3263
- #: src/Tribe/Main.php:962
3264
  msgid "past"
3265
  msgstr ""
3266
 
3267
- #: src/Tribe/Main.php:963
3268
  msgid "day"
3269
  msgstr ""
3270
 
3271
- #: src/Tribe/Main.php:964
3272
  msgid "today"
3273
  msgstr ""
3274
 
3275
- #: src/Tribe/Main.php:965
3276
  msgctxt "featured events slug"
3277
  msgid "featured"
3278
  msgstr ""
3279
 
3280
- #: src/Tribe/Main.php:966
3281
  msgctxt "all events slug"
3282
  msgid "all"
3283
  msgstr ""
3284
 
3285
- #: src/Tribe/Main.php:990
3286
  msgid "Initializing Tribe Events on %s"
3287
  msgstr ""
3288
 
3289
- #: src/Tribe/Main.php:1062 src/Tribe/Main.php:1064
3290
  msgid "Welcome to The Events Calendar!"
3291
  msgstr ""
3292
 
3293
- #: src/Tribe/Main.php:1213
3294
  msgid ""
3295
  "The %3$s \"%1$s\" uses the \"/%2$s\" slug: the Events Calendar plugin will "
3296
  "show its calendar in place of the page."
3297
  msgstr ""
3298
 
3299
- #: src/Tribe/Main.php:1216
3300
  msgid "Ask the site administrator to edit the %s slug"
3301
  msgstr ""
3302
 
3303
- #: src/Tribe/Main.php:1218
3304
  msgid "Edit the %s slug"
3305
  msgstr ""
3306
 
3307
- #: src/Tribe/Main.php:1222
3308
  msgid " ask the site administrator to set a different Events URL slug."
3309
  msgstr ""
3310
 
3311
- #: src/Tribe/Main.php:1226
3312
  msgid "edit Events settings."
3313
  msgstr ""
3314
 
3315
- #: src/Tribe/Main.php:1229
3316
  msgid "%1$s or %2$s"
3317
  msgstr ""
3318
 
3319
- #: src/Tribe/Main.php:1317
3320
  msgid "Upgrade your calendar views"
3321
  msgstr ""
3322
 
3323
- #: src/Tribe/Main.php:1342
3324
  msgid "Upgrade"
3325
  msgstr ""
3326
 
3327
- #: src/Tribe/Main.php:1401
3328
  msgid "New User Primer"
3329
  msgstr ""
3330
 
3331
- #: src/Tribe/Main.php:1403
3332
  msgid ""
3333
  "We are committed to helping make your calendar spectacular and have a wealth "
3334
  "of resources available, including a handy %s to get your calendar up and "
3335
  "running."
3336
  msgstr ""
3337
 
3338
- #: src/Tribe/Main.php:1414
3339
  msgid "Support for The Events Calendar"
3340
  msgstr ""
3341
 
3342
- #: src/Tribe/Main.php:1420
3343
  msgid ""
3344
  "%s: A thorough walkthrough of The Events Calendar and the settings that are "
3345
  "available to you."
3346
  msgstr ""
3347
 
3348
- #: src/Tribe/Main.php:1424
3349
  msgid "Settings overview"
3350
  msgstr ""
3351
 
3352
- #: src/Tribe/Main.php:1428
3353
  msgid ""
3354
  "%s: A complete look at the features you can expect to see right out of the "
3355
  "box as well as how to use them."
3356
  msgstr ""
3357
 
3358
- #: src/Tribe/Main.php:1432
3359
  msgid "Features overview"
3360
  msgstr ""
3361
 
3362
- #: src/Tribe/Main.php:1436
3363
  msgid ""
3364
  "%s: Our most comprehensive outline for customizing the calendar to suit your "
3365
  "needs, including custom layouts and styles."
3366
  msgstr ""
3367
 
3368
- #: src/Tribe/Main.php:1440
3369
  msgid "Themer's Guide"
3370
  msgstr ""
3371
 
3372
- #: src/Tribe/Main.php:1444
3373
  msgid ""
3374
  "%s: An overview of the default templates and styles that are included in the "
3375
  "plugin, as well as how to change them."
3376
  msgstr ""
3377
 
3378
- #: src/Tribe/Main.php:1448
3379
  msgid "Using stylesheets and page templates"
3380
  msgstr ""
3381
 
3382
- #: src/Tribe/Main.php:1452
3383
  msgid ""
3384
  "%s: Do you see an issue with your calendar? Go here first to find where it’s "
3385
  "coming from and how to fix it."
3386
  msgstr ""
3387
 
3388
- #: src/Tribe/Main.php:1456
3389
  msgid "Troubleshooting common problems"
3390
  msgstr ""
3391
 
3392
- #: src/Tribe/Main.php:1460
3393
  msgid ""
3394
  "%s: Code and guides for customizing your calendar in useful and interesting "
3395
  "ways."
3396
  msgstr ""
3397
 
3398
- #: src/Tribe/Main.php:1464
3399
  msgid "Customizing the Events plugins"
3400
  msgstr ""
3401
 
3402
- #: src/Tribe/Main.php:1482
3403
  msgid "Events Tickets"
3404
  msgstr ""
3405
 
3406
- #: src/Tribe/Main.php:1483
3407
  msgid ""
3408
  "If you have tried the above steps and are still having trouble, you can post "
3409
  "a new thread to our WordPress.org forums for %1$s or %2$s. Our support staff "
3410
  "monitors these forums once a week and would be happy to assist you there. "
3411
  msgstr ""
3412
 
3413
- #: src/Tribe/Main.php:1485 src/Tribe/Main.php:1493
3414
  msgid "premium support on our website"
3415
  msgstr ""
3416
 
3417
- #: src/Tribe/Main.php:1486
3418
  msgid ""
3419
  "<strong>Looking for more immediate support?</strong> We offer %s with the "
3420
  "purchase of any of our premium plugins. Pick up a license and you can post "
3421
  "there directly and expect a response within 24-48 hours during weekdays"
3422
  msgstr ""
3423
 
3424
- #: src/Tribe/Main.php:1490
3425
  msgid "open-source forum on WordPress.org"
3426
  msgstr ""
3427
 
3428
- #: src/Tribe/Main.php:1491
3429
  msgid ""
3430
  "If you have tried the above steps and are still having trouble, you can post "
3431
  "a new thread to our %s. Our support staff monitors these forums once a week "
3432
  "and would be happy to assist you there."
3433
  msgstr ""
3434
 
3435
- #: src/Tribe/Main.php:1494
3436
  msgid "Events Calendar PRO"
3437
  msgstr ""
3438
 
3439
- #: src/Tribe/Main.php:1495
3440
  msgid ""
3441
  "<strong>Looking for more immediate support?</strong> We offer %1$s with the "
3442
  "purchase of any of our premium plugins (like %2$s). Pick up a license and "
@@ -3444,110 +3450,110 @@ msgid ""
3444
  "weekdays."
3445
  msgstr ""
3446
 
3447
- #: src/Tribe/Main.php:1499
3448
  msgid "post a thread"
3449
  msgstr ""
3450
 
3451
- #: src/Tribe/Main.php:1500
3452
  msgid ""
3453
  "If you have a valid license for one of our paid plugins, you can %s in our "
3454
  "premium support forums. Our support team monitors the forums and will "
3455
  "respond to your thread within 24-48 hours (during the week)."
3456
  msgstr ""
3457
 
3458
- #: src/Tribe/Main.php:1543 src/functions/template-tags/general.php:127
3459
  msgid "Events"
3460
  msgstr ""
3461
 
3462
- #: src/Tribe/Main.php:1551 src/admin-views/aggregator/tabs/import-form.php:229
3463
  #: src/admin-views/aggregator/tabs/import-form.php:241
3464
  #: src/functions/template-tags/general.php:71
3465
  msgid "Event"
3466
  msgstr ""
3467
 
3468
- #: src/Tribe/Main.php:1722
3469
  msgid ""
3470
  "Sorry, The Events Calendar requires WordPress %s or higher. Please upgrade "
3471
  "your WordPress install."
3472
  msgstr ""
3473
 
3474
- #: src/Tribe/Main.php:1725
3475
  msgid ""
3476
  "Sorry, The Events Calendar requires PHP %s or higher. Talk to your Web host "
3477
  "about moving you to a newer version of PHP."
3478
  msgstr ""
3479
 
3480
- #: src/Tribe/Main.php:1760
3481
  msgid ""
3482
  "To continue using The Events Calendar, please install the latest version of"
3483
  msgstr ""
3484
 
3485
- #: src/Tribe/Main.php:1762 src/Tribe/Main.php:1763
3486
  msgid "Event Tickets"
3487
  msgstr ""
3488
 
3489
- #: src/Tribe/Main.php:1789
3490
  msgid ""
3491
  "It appears as if the tribe-common libraries cannot be found! The directory "
3492
  "should be in the \"common/\" directory in the events calendar plugin."
3493
  msgstr ""
3494
 
3495
- #: src/Tribe/Main.php:2026 src/Tribe/Main.php:2499
3496
  msgid "category"
3497
  msgstr ""
3498
 
3499
- #: src/Tribe/Main.php:2040 src/Tribe/Main.php:2498
3500
  msgid "tag"
3501
  msgstr ""
3502
 
3503
- #: src/Tribe/Main.php:2057 src/Tribe/Organizer.php:91 src/Tribe/Venue.php:127
3504
  msgid "Add New"
3505
  msgstr ""
3506
 
3507
- #: src/Tribe/Main.php:2059 src/Tribe/Main.php:2266 src/Tribe/Main.php:2267
3508
  #: src/Tribe/Organizer.php:92 src/Tribe/Venue.php:128
3509
  msgid "Add New %s"
3510
  msgstr ""
3511
 
3512
- #: src/Tribe/Main.php:2065 src/Tribe/Organizer.php:94 src/Tribe/Venue.php:130
3513
  msgid "New %s"
3514
  msgstr ""
3515
 
3516
- #: src/Tribe/Main.php:2068 src/Tribe/Organizer.php:95 src/Tribe/Venue.php:131
3517
  msgid "View %s"
3518
  msgstr ""
3519
 
3520
- #: src/Tribe/Main.php:2071 src/Tribe/Organizer.php:96 src/Tribe/Venue.php:132
3521
  msgid "Search %s"
3522
  msgstr ""
3523
 
3524
- #: src/Tribe/Main.php:2074 src/Tribe/Organizer.php:97 src/Tribe/Venue.php:133
3525
  msgid "No %s found"
3526
  msgstr ""
3527
 
3528
- #: src/Tribe/Main.php:2077 src/Tribe/Organizer.php:98 src/Tribe/Venue.php:134
3529
  msgid "No %s found in Trash"
3530
  msgstr ""
3531
 
3532
- #: src/Tribe/Main.php:2080 src/Tribe/Main.php:2219 src/Tribe/Main.php:2241
3533
  #: src/Tribe/Organizer.php:99 src/Tribe/Venue.php:135
3534
  msgid "%s published."
3535
  msgstr ""
3536
 
3537
- #: src/Tribe/Main.php:2083 src/Tribe/Organizer.php:100 src/Tribe/Venue.php:136
3538
  msgid "%s published privately."
3539
  msgstr ""
3540
 
3541
- #: src/Tribe/Main.php:2086 src/Tribe/Organizer.php:101 src/Tribe/Venue.php:137
3542
  msgid "%s reverted to draft."
3543
  msgstr ""
3544
 
3545
- #: src/Tribe/Main.php:2089 src/Tribe/Organizer.php:102 src/Tribe/Venue.php:138
3546
  msgid "%s scheduled."
3547
  msgstr ""
3548
 
3549
- #: src/Tribe/Main.php:2092 src/Tribe/Main.php:2175 src/Tribe/Main.php:2211
3550
- #: src/Tribe/Main.php:2214 src/Tribe/Main.php:2233 src/Tribe/Main.php:2236
3551
  #: src/Tribe/Organizer.php:103 src/Tribe/Venue.php:139
3552
  msgid "%s updated."
3553
  msgstr ""
@@ -3555,185 +3561,185 @@ msgstr ""
3555
  #. Translators: %s: Event singular.
3556
  #. Translators: %s: Organizer singular.
3557
  #. Translators: %s: Venue singular.
3558
- #: src/Tribe/Main.php:2096 src/Tribe/Organizer.php:106 src/Tribe/Venue.php:142
3559
  msgid "%s Link"
3560
  msgstr ""
3561
 
3562
  #. Translators: %s: Event singular.
3563
  #. Translators: %s: Organizer singular.
3564
  #. Translators: %s: Venue singular.
3565
- #: src/Tribe/Main.php:2100 src/Tribe/Organizer.php:110 src/Tribe/Venue.php:146
3566
  msgid "A link to a particular %s."
3567
  msgstr ""
3568
 
3569
- #: src/Tribe/Main.php:2117
3570
  msgid "%s Category"
3571
  msgstr ""
3572
 
3573
- #: src/Tribe/Main.php:2120
3574
  msgid "Search %s Categories"
3575
  msgstr ""
3576
 
3577
- #: src/Tribe/Main.php:2123
3578
  msgid "All %s Categories"
3579
  msgstr ""
3580
 
3581
- #: src/Tribe/Main.php:2126
3582
  msgid "Parent %s Category"
3583
  msgstr ""
3584
 
3585
- #: src/Tribe/Main.php:2129
3586
  msgid "Parent %s Category:"
3587
  msgstr ""
3588
 
3589
- #: src/Tribe/Main.php:2132
3590
  msgid "Edit %s Category"
3591
  msgstr ""
3592
 
3593
- #: src/Tribe/Main.php:2135
3594
  msgid "Update %s Category"
3595
  msgstr ""
3596
 
3597
- #: src/Tribe/Main.php:2138
3598
  msgid "Add New %s Category"
3599
  msgstr ""
3600
 
3601
- #: src/Tribe/Main.php:2141
3602
  msgid "New %s Category Name"
3603
  msgstr ""
3604
 
3605
  #. Translators: %s: Event singular.
3606
- #: src/Tribe/Main.php:2145
3607
  msgid "%s Category Link"
3608
  msgstr ""
3609
 
3610
  #. Translators: %s: Event singular.
3611
- #: src/Tribe/Main.php:2149
3612
  msgid "A link to a particular %s category."
3613
  msgstr ""
3614
 
3615
- #: src/Tribe/Main.php:2168
3616
  msgid "%1$s updated. %2$sView %1$s%3$s"
3617
  msgstr ""
3618
 
3619
- #: src/Tribe/Main.php:2173 src/Tribe/Main.php:2212 src/Tribe/Main.php:2234
3620
  msgid "Custom field updated."
3621
  msgstr ""
3622
 
3623
- #: src/Tribe/Main.php:2174 src/Tribe/Main.php:2213 src/Tribe/Main.php:2235
3624
  msgid "Custom field deleted."
3625
  msgstr ""
3626
 
3627
  #. translators: %s: date and time of the revision
3628
- #: src/Tribe/Main.php:2178 src/Tribe/Main.php:2217
3629
  msgid "%1$s restored to revision from %2$s"
3630
  msgstr ""
3631
 
3632
- #: src/Tribe/Main.php:2181
3633
  msgid "%1$s published. %2$sView %3$s"
3634
  msgstr ""
3635
 
3636
- #: src/Tribe/Main.php:2186 src/Tribe/Main.php:2220 src/Tribe/Main.php:2242
3637
  msgid "%s saved."
3638
  msgstr ""
3639
 
3640
- #: src/Tribe/Main.php:2188
3641
  msgid "%1$s submitted. %2$sPreview %3$s"
3642
  msgstr ""
3643
 
3644
- #: src/Tribe/Main.php:2194
3645
  msgid "%1$s scheduled for: %2$s. %3$sPreview %4$s"
3646
  msgstr ""
3647
 
3648
  #. translators: Publish box date format, see http://php.net/date
3649
- #: src/Tribe/Main.php:2197 src/Tribe/Main.php:2226 src/Tribe/Main.php:2248
3650
  msgid "M j, Y @ G:i"
3651
  msgstr ""
3652
 
3653
- #: src/Tribe/Main.php:2202
3654
  msgid "%1$s draft updated. %2$sPreview %3$s"
3655
  msgstr ""
3656
 
3657
- #: src/Tribe/Main.php:2221 src/Tribe/Main.php:2243
3658
  msgid "%s submitted."
3659
  msgstr ""
3660
 
3661
- #: src/Tribe/Main.php:2223 src/Tribe/Main.php:2245
3662
  msgid "%1$s scheduled for: %2$s."
3663
  msgstr ""
3664
 
3665
- #: src/Tribe/Main.php:2228 src/Tribe/Main.php:2251
3666
  msgid "%s draft updated."
3667
  msgstr ""
3668
 
3669
  #. translators: %s: date and time of the revision
3670
- #: src/Tribe/Main.php:2239
3671
  msgid "%s restored to revision from %s"
3672
  msgstr ""
3673
 
3674
- #: src/Tribe/Main.php:2300
3675
  msgid ""
3676
  "Without a defined location your event will not display a %sGoogle Rich "
3677
  "Snippet%s on the search results."
3678
  msgstr ""
3679
 
3680
- #: src/Tribe/Main.php:2500
3681
  msgid "page"
3682
  msgstr ""
3683
 
3684
- #: src/Tribe/Main.php:2501 src/functions/template-tags/general.php:99
3685
  msgid "event"
3686
  msgstr ""
3687
 
3688
- #: src/Tribe/Main.php:2502 src/functions/template-tags/general.php:155
3689
  msgid "events"
3690
  msgstr ""
3691
 
3692
- #: src/Tribe/Main.php:2503
3693
  msgid "all"
3694
  msgstr ""
3695
 
3696
- #: src/Tribe/Main.php:3261 src/Tribe/Main.php:3300
3697
  #: src/functions/template-tags/deprecated.php:22
3698
  #: src/functions/template-tags/deprecated.php:44
3699
  msgid "Date out of range."
3700
  msgstr ""
3701
 
3702
- #: src/Tribe/Main.php:3330
3703
  msgid "%s Options"
3704
  msgstr ""
3705
 
3706
- #: src/Tribe/Main.php:3502
3707
  msgid "Support"
3708
  msgstr ""
3709
 
3710
- #: src/Tribe/Main.php:3505
3711
  msgid "View All Add-Ons"
3712
  msgstr ""
3713
 
3714
- #: src/Tribe/Main.php:3527
3715
  msgid "News from The Events Calendar"
3716
  msgstr ""
3717
 
3718
- #: src/Tribe/Main.php:3554
3719
  msgid "Additional Functionality"
3720
  msgstr ""
3721
 
3722
- #: src/Tribe/Main.php:3559
3723
  msgid ""
3724
  "Looking for additional functionality including recurring events, ticket "
3725
  "sales, publicly submitted events, new views and more?"
3726
  msgstr ""
3727
 
3728
- #: src/Tribe/Main.php:3560
3729
  msgid "Check out the %savailable add-ons%s."
3730
  msgstr ""
3731
 
3732
- #: src/Tribe/Main.php:3661
3733
  msgid "Calendar"
3734
  msgstr ""
3735
 
3736
- #: src/Tribe/Main.php:3698
3737
  msgid "Once Every 30 Mins"
3738
  msgstr ""
3739
 
@@ -4213,7 +4219,7 @@ msgid "Returns all the event categories matching the search criteria"
4213
  msgstr ""
4214
 
4215
  #: src/Tribe/REST/V1/Endpoints/Archive_Category.php:40
4216
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:411
4217
  #: src/Tribe/REST/V1/Endpoints/Archive_Organizer.php:68
4218
  #: src/Tribe/REST/V1/Endpoints/Archive_Tag.php:57
4219
  #: src/Tribe/REST/V1/Endpoints/Archive_Venue.php:65
@@ -4221,14 +4227,14 @@ msgid "One or more of the specified query variables has a bad format"
4221
  msgstr ""
4222
 
4223
  #: src/Tribe/REST/V1/Endpoints/Archive_Category.php:43
4224
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:414
4225
  #: src/Tribe/REST/V1/Endpoints/Archive_Organizer.php:71
4226
  #: src/Tribe/REST/V1/Endpoints/Archive_Venue.php:68
4227
  msgid "The requested page was not found."
4228
  msgstr ""
4229
 
4230
  #: src/Tribe/REST/V1/Endpoints/Archive_Category.php:97
4231
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:435
4232
  #: src/Tribe/REST/V1/Endpoints/Archive_Organizer.php:208
4233
  #: src/Tribe/REST/V1/Endpoints/Archive_Tag.php:114
4234
  #: src/Tribe/REST/V1/Endpoints/Archive_Venue.php:207
@@ -4290,80 +4296,102 @@ msgstr ""
4290
  msgid "Limit result set to terms with a specific slug"
4291
  msgstr ""
4292
 
4293
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:399
4294
  msgid "Returns all the upcoming events matching the search criteria"
4295
  msgstr ""
4296
 
4297
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:443
4298
  msgid "The number of events to return on each page"
4299
  msgstr ""
4300
 
4301
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:450
4302
- msgid "Events should start after the specified date"
 
 
 
 
4303
  msgstr ""
4304
 
4305
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:457
4306
- msgid "Events should start before the specified date"
4307
  msgstr ""
4308
 
4309
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4310
  msgid "Events should contain the specified string in the title or description"
4311
  msgstr ""
4312
 
4313
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:469
4314
  msgid "Events should be assigned one of the specified categories slugs or IDs"
4315
  msgstr ""
4316
 
4317
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:477
4318
  msgid "Events should be assigned one of the specified tags slugs or IDs"
4319
  msgstr ""
4320
 
4321
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:485
4322
  msgid "Events should be assigned one of the specified venue IDs"
4323
  msgstr ""
4324
 
4325
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:493
4326
  msgid "Events should be assigned one of the specified organizer IDs"
4327
  msgstr ""
4328
 
4329
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:501
4330
  msgid "Events should be filtered by their featured status"
4331
  msgstr ""
4332
 
4333
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:508
4334
  #: src/Tribe/REST/V1/Endpoints/Single_Event.php:271
4335
  msgid "The event post status"
4336
  msgstr ""
4337
 
4338
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:513
4339
  msgid ""
4340
  "Requires Events Calendar Pro. Events should be filtered by whether their "
4341
  "venue has geolocation data"
4342
  msgstr ""
4343
 
4344
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:519
4345
  msgid ""
4346
  "Requires Events Calendar Pro. Events should be filtered by their venue "
4347
  "latitude location, must also provide geoloc_lng"
4348
  msgstr ""
4349
 
4350
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:525
4351
  msgid ""
4352
  "Requires Events Calendar Pro. Events should be filtered by their venue "
4353
  "longitude location, must also provide geoloc_lat"
4354
  msgstr ""
4355
 
4356
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:529
4357
  msgid ""
4358
  "Include events with one of the post IDs specified in the array of CSV list, "
4359
  "date filters will be ignored."
4360
  msgstr ""
4361
 
4362
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:539
4363
  msgid "Events should be filtered by their post_parent being the specified one."
4364
  msgstr ""
4365
 
4366
- #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:545
4367
  msgid "Filter events with or without tickets."
4368
  msgstr ""
4369
 
@@ -5440,38 +5468,50 @@ msgstr ""
5440
  msgid "Custom Color"
5441
  msgstr ""
5442
 
5443
- #: src/Tribe/Views/V2/Hooks.php:565
5444
  msgid "We recommend a 16:9 aspect ratio for featured images."
5445
  msgstr ""
5446
 
5447
- #: src/Tribe/Views/V2/Hooks.php:642
5448
  msgid "Recommended for all sites using the updated calendar views."
5449
  msgstr ""
5450
 
5451
- #: src/Tribe/Views/V2/Hooks.php:657
5452
  msgid "The Events Calendar - View V2"
5453
  msgstr ""
5454
 
5455
- #: src/Tribe/Views/V2/Hooks.php:973
5456
  msgctxt "Capitalized label for the event website link."
5457
  msgid "View %s Website"
5458
  msgstr ""
5459
 
5460
- #: src/Tribe/Views/V2/Hooks.php:1001
5461
  msgctxt "Capitalized label for the venue website link."
5462
  msgid "View %s Website"
5463
  msgstr ""
5464
 
5465
- #: src/Tribe/Views/V2/Hooks.php:1029
5466
  msgctxt "Capitalized label for the organizer website link."
5467
  msgid "View %s Website"
5468
  msgstr ""
5469
 
5470
- #: src/Tribe/Views/V2/Hooks.php:1167
 
 
 
 
 
 
 
 
 
 
 
 
5471
  msgid "Enabled"
5472
  msgstr ""
5473
 
5474
- #: src/Tribe/Views/V2/Hooks.php:1167
5475
  #: src/admin-views/tribe-options-general.php:182
5476
  #: src/admin-views/tribe-options-general.php:200
5477
  msgid "Disabled"
@@ -5519,39 +5559,44 @@ msgstr ""
5519
 
5520
  #. translators: %s: events label plural
5521
  #: src/Tribe/Views/V2/Template/Featured_Title.php:41
5522
- #: src/functions/template-tags/loop.php:133
5523
  msgctxt "featured events title"
5524
  msgid "Featured %s"
5525
  msgstr ""
5526
 
5527
  #: src/Tribe/Views/V2/Template/Title.php:123
5528
- #: src/functions/template-tags/loop.php:143
5529
  msgid "Upcoming %s"
5530
  msgstr ""
5531
 
5532
  #: src/Tribe/Views/V2/Template/Title.php:133
5533
- #: src/functions/template-tags/loop.php:160
5534
  msgid "Past %s"
5535
  msgstr ""
5536
 
5537
  #: src/Tribe/Views/V2/Template/Title.php:228
5538
- #: src/functions/template-tags/loop.php:158
5539
  msgid "%1$s for %2$s - %3$s"
5540
  msgstr ""
5541
 
5542
  #: src/Tribe/Views/V2/Template/Title.php:329
5543
- #: src/functions/template-tags/loop.php:165
5544
  msgctxt "month view"
5545
  msgid "%1$s for %2$s"
5546
  msgstr ""
5547
 
5548
  #: src/Tribe/Views/V2/Template/Title.php:356
5549
- #: src/functions/template-tags/loop.php:174
5550
  msgctxt "day_view"
5551
  msgid "%1$s for %2$s"
5552
  msgstr ""
5553
 
5554
- #: src/Tribe/Views/V2/View.php:2057 src/views/v2/day/event/date/featured.php:27
 
 
 
 
 
5555
  #: src/views/v2/day/event/date/featured.php:32
5556
  #: src/views/v2/latest-past/event/date/featured.php:27
5557
  #: src/views/v2/latest-past/event/date/featured.php:32
@@ -8286,30 +8331,36 @@ msgstr ""
8286
  msgid "The function needs to be passed an $event or used in the loop."
8287
  msgstr ""
8288
 
 
 
 
 
 
 
8289
  #. translators: %s is the singular translation of "Event"
8290
- #: src/functions/template-tags/general.php:513
8291
  msgctxt "category list label"
8292
  msgid "%s Category"
8293
  msgid_plural "%s Categories"
8294
  msgstr[0] ""
8295
  msgstr[1] ""
8296
 
8297
- #: src/functions/template-tags/general.php:553
8298
- #: src/functions/template-tags/general.php:635
8299
  msgid "Tags:"
8300
  msgstr ""
8301
 
8302
- #: src/functions/template-tags/general.php:751
8303
  msgid "Loading %s"
8304
  msgstr ""
8305
 
8306
- #: src/functions/template-tags/general.php:1308
8307
  #: src/views/v2/widgets/widget-events-list/event/date.php:26
8308
  msgctxt "All day label for event"
8309
  msgid "All day"
8310
  msgstr ""
8311
 
8312
- #: src/functions/template-tags/general.php:1413
8313
  msgid "Calendar powered by %s"
8314
  msgstr ""
8315
 
@@ -8437,20 +8488,6 @@ msgstr ""
8437
  msgid "Subscribe to calendar"
8438
  msgstr ""
8439
 
8440
- #: src/views/v2/components/top-bar/today.php:21
8441
- #: src/views/v2/components/top-bar/today.php:22
8442
- #: src/views/v2/list/nav/today.php:23 src/views/v2/list/nav/today.php:24
8443
- #: src/views/v2/month/mobile-events/nav/today.php:23
8444
- #: src/views/v2/month/mobile-events/nav/today.php:24
8445
- msgid "Click to select today's date"
8446
- msgstr ""
8447
-
8448
- #: src/views/v2/components/top-bar/today.php:24
8449
- #: src/views/v2/list/nav/today.php:26
8450
- #: src/views/v2/month/mobile-events/nav/today.php:26
8451
- msgid "Today"
8452
- msgstr ""
8453
-
8454
  #: src/views/v2/day/nav/next-disabled.php:19
8455
  #: src/views/v2/day/nav/next-disabled.php:20
8456
  #: src/views/v2/day/nav/next-disabled.php:23 src/views/v2/day/nav/next.php:24
@@ -8578,6 +8615,10 @@ msgstr ""
8578
  msgid "Previous month"
8579
  msgstr ""
8580
 
 
 
 
 
8581
  #. Description of the plugin/theme
8582
  msgid ""
8583
  "The Events Calendar is a carefully crafted, extensible plugin that lets you "
2
  # This file is distributed under the same license as the The Events Calendar package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: The Events Calendar 6.0.2\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/the-events-"
7
  "calendar\n"
8
+ "POT-Creation-Date: 2022-10-18 16:00:32+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "PO-Revision-Date: 2022-10-18 16:00\n"
13
  "Last-Translator: \n"
14
  "Language-Team: \n"
15
 
477
  msgid "%s"
478
  msgstr ""
479
 
480
+ #: src/Tribe/Admin/Bar/Default_Configurator.php:47 src/Tribe/Main.php:3613
481
  #: src/Tribe/Views/V2/Views/Widgets/Widget_View.php:61
482
  #: src/admin-views/tribe-options-upgrade.php:20
483
  msgid "View Calendar"
488
  msgstr ""
489
 
490
  #: src/Tribe/Admin/Bar/Default_Configurator.php:64
491
+ #: src/Tribe/Linked_Posts/Chooser_Meta_Box.php:216 src/Tribe/Main.php:2063
492
  #: src/Tribe/Organizer.php:93 src/Tribe/Organizer.php:801
493
  #: src/Tribe/Venue.php:129 src/Tribe/Venue.php:915
494
  msgid "Edit %s"
501
  msgstr ""
502
 
503
  #: src/Tribe/Admin/Bar/Default_Configurator.php:91
504
+ #: src/Tribe/Admin/Settings.php:166 src/Tribe/Main.php:3661
505
  msgid "Settings"
506
  msgstr ""
507
 
642
  "refresh and try again."
643
  msgstr ""
644
 
645
+ #: src/Tribe/Admin_List.php:299 src/Tribe/Main.php:2115
646
  msgid "%s Categories"
647
  msgstr ""
648
 
3124
  msgid "Powered by"
3125
  msgstr ""
3126
 
3127
+ #: src/Tribe/Integrations/Restrict_Content_Pro/Service_Provider.php:66
3128
+ msgctxt ""
3129
+ "Text label for control to hide restricted events on main calendar views."
3130
+ msgid "Hide restricted events on calendar views."
3131
+ msgstr ""
3132
+
3133
  #: src/Tribe/Integrations/WPML/Defaults.php:117
3134
  msgid ""
3135
  "The Events Calendar could not write WPML default config file: please create "
3244
  msgid "Create or Find %s"
3245
  msgstr ""
3246
 
3247
+ #. #-#-#-#-# the-events-calendar.pot (The Events Calendar 6.0.2) #-#-#-#-#
3248
  #. Plugin Name of the plugin/theme
3249
+ #. #-#-#-#-# the-events-calendar.pot (The Events Calendar 6.0.2) #-#-#-#-#
3250
  #. Author of the plugin/theme
3251
+ #: src/Tribe/Main.php:953 src/Tribe/Main.php:1482 src/Tribe/Privacy.php:29
3252
  #: src/admin-views/admin-welcome-message.php:29
3253
+ #: src/functions/template-tags/general.php:1455 the-events-calendar.php:55
3254
  msgid "The Events Calendar"
3255
  msgstr ""
3256
 
3257
+ #: src/Tribe/Main.php:960
3258
  msgid "month"
3259
  msgstr ""
3260
 
3261
+ #: src/Tribe/Main.php:961
3262
  msgid "list"
3263
  msgstr ""
3264
 
3265
+ #: src/Tribe/Main.php:962
3266
  msgid "upcoming"
3267
  msgstr ""
3268
 
3269
+ #: src/Tribe/Main.php:963
3270
  msgid "past"
3271
  msgstr ""
3272
 
3273
+ #: src/Tribe/Main.php:964
3274
  msgid "day"
3275
  msgstr ""
3276
 
3277
+ #: src/Tribe/Main.php:965
3278
  msgid "today"
3279
  msgstr ""
3280
 
3281
+ #: src/Tribe/Main.php:966
3282
  msgctxt "featured events slug"
3283
  msgid "featured"
3284
  msgstr ""
3285
 
3286
+ #: src/Tribe/Main.php:967
3287
  msgctxt "all events slug"
3288
  msgid "all"
3289
  msgstr ""
3290
 
3291
+ #: src/Tribe/Main.php:991
3292
  msgid "Initializing Tribe Events on %s"
3293
  msgstr ""
3294
 
3295
+ #: src/Tribe/Main.php:1063 src/Tribe/Main.php:1065
3296
  msgid "Welcome to The Events Calendar!"
3297
  msgstr ""
3298
 
3299
+ #: src/Tribe/Main.php:1214
3300
  msgid ""
3301
  "The %3$s \"%1$s\" uses the \"/%2$s\" slug: the Events Calendar plugin will "
3302
  "show its calendar in place of the page."
3303
  msgstr ""
3304
 
3305
+ #: src/Tribe/Main.php:1217
3306
  msgid "Ask the site administrator to edit the %s slug"
3307
  msgstr ""
3308
 
3309
+ #: src/Tribe/Main.php:1219
3310
  msgid "Edit the %s slug"
3311
  msgstr ""
3312
 
3313
+ #: src/Tribe/Main.php:1223
3314
  msgid " ask the site administrator to set a different Events URL slug."
3315
  msgstr ""
3316
 
3317
+ #: src/Tribe/Main.php:1227
3318
  msgid "edit Events settings."
3319
  msgstr ""
3320
 
3321
+ #: src/Tribe/Main.php:1230
3322
  msgid "%1$s or %2$s"
3323
  msgstr ""
3324
 
3325
+ #: src/Tribe/Main.php:1318
3326
  msgid "Upgrade your calendar views"
3327
  msgstr ""
3328
 
3329
+ #: src/Tribe/Main.php:1343
3330
  msgid "Upgrade"
3331
  msgstr ""
3332
 
3333
+ #: src/Tribe/Main.php:1402
3334
  msgid "New User Primer"
3335
  msgstr ""
3336
 
3337
+ #: src/Tribe/Main.php:1404
3338
  msgid ""
3339
  "We are committed to helping make your calendar spectacular and have a wealth "
3340
  "of resources available, including a handy %s to get your calendar up and "
3341
  "running."
3342
  msgstr ""
3343
 
3344
+ #: src/Tribe/Main.php:1415
3345
  msgid "Support for The Events Calendar"
3346
  msgstr ""
3347
 
3348
+ #: src/Tribe/Main.php:1421
3349
  msgid ""
3350
  "%s: A thorough walkthrough of The Events Calendar and the settings that are "
3351
  "available to you."
3352
  msgstr ""
3353
 
3354
+ #: src/Tribe/Main.php:1425
3355
  msgid "Settings overview"
3356
  msgstr ""
3357
 
3358
+ #: src/Tribe/Main.php:1429
3359
  msgid ""
3360
  "%s: A complete look at the features you can expect to see right out of the "
3361
  "box as well as how to use them."
3362
  msgstr ""
3363
 
3364
+ #: src/Tribe/Main.php:1433
3365
  msgid "Features overview"
3366
  msgstr ""
3367
 
3368
+ #: src/Tribe/Main.php:1437
3369
  msgid ""
3370
  "%s: Our most comprehensive outline for customizing the calendar to suit your "
3371
  "needs, including custom layouts and styles."
3372
  msgstr ""
3373
 
3374
+ #: src/Tribe/Main.php:1441
3375
  msgid "Themer's Guide"
3376
  msgstr ""
3377
 
3378
+ #: src/Tribe/Main.php:1445
3379
  msgid ""
3380
  "%s: An overview of the default templates and styles that are included in the "
3381
  "plugin, as well as how to change them."
3382
  msgstr ""
3383
 
3384
+ #: src/Tribe/Main.php:1449
3385
  msgid "Using stylesheets and page templates"
3386
  msgstr ""
3387
 
3388
+ #: src/Tribe/Main.php:1453
3389
  msgid ""
3390
  "%s: Do you see an issue with your calendar? Go here first to find where it’s "
3391
  "coming from and how to fix it."
3392
  msgstr ""
3393
 
3394
+ #: src/Tribe/Main.php:1457
3395
  msgid "Troubleshooting common problems"
3396
  msgstr ""
3397
 
3398
+ #: src/Tribe/Main.php:1461
3399
  msgid ""
3400
  "%s: Code and guides for customizing your calendar in useful and interesting "
3401
  "ways."
3402
  msgstr ""
3403
 
3404
+ #: src/Tribe/Main.php:1465
3405
  msgid "Customizing the Events plugins"
3406
  msgstr ""
3407
 
3408
+ #: src/Tribe/Main.php:1483
3409
  msgid "Events Tickets"
3410
  msgstr ""
3411
 
3412
+ #: src/Tribe/Main.php:1484
3413
  msgid ""
3414
  "If you have tried the above steps and are still having trouble, you can post "
3415
  "a new thread to our WordPress.org forums for %1$s or %2$s. Our support staff "
3416
  "monitors these forums once a week and would be happy to assist you there. "
3417
  msgstr ""
3418
 
3419
+ #: src/Tribe/Main.php:1486 src/Tribe/Main.php:1494
3420
  msgid "premium support on our website"
3421
  msgstr ""
3422
 
3423
+ #: src/Tribe/Main.php:1487
3424
  msgid ""
3425
  "<strong>Looking for more immediate support?</strong> We offer %s with the "
3426
  "purchase of any of our premium plugins. Pick up a license and you can post "
3427
  "there directly and expect a response within 24-48 hours during weekdays"
3428
  msgstr ""
3429
 
3430
+ #: src/Tribe/Main.php:1491
3431
  msgid "open-source forum on WordPress.org"
3432
  msgstr ""
3433
 
3434
+ #: src/Tribe/Main.php:1492
3435
  msgid ""
3436
  "If you have tried the above steps and are still having trouble, you can post "
3437
  "a new thread to our %s. Our support staff monitors these forums once a week "
3438
  "and would be happy to assist you there."
3439
  msgstr ""
3440
 
3441
+ #: src/Tribe/Main.php:1495
3442
  msgid "Events Calendar PRO"
3443
  msgstr ""
3444
 
3445
+ #: src/Tribe/Main.php:1496
3446
  msgid ""
3447
  "<strong>Looking for more immediate support?</strong> We offer %1$s with the "
3448
  "purchase of any of our premium plugins (like %2$s). Pick up a license and "
3450
  "weekdays."
3451
  msgstr ""
3452
 
3453
+ #: src/Tribe/Main.php:1500
3454
  msgid "post a thread"
3455
  msgstr ""
3456
 
3457
+ #: src/Tribe/Main.php:1501
3458
  msgid ""
3459
  "If you have a valid license for one of our paid plugins, you can %s in our "
3460
  "premium support forums. Our support team monitors the forums and will "
3461
  "respond to your thread within 24-48 hours (during the week)."
3462
  msgstr ""
3463
 
3464
+ #: src/Tribe/Main.php:1544 src/functions/template-tags/general.php:127
3465
  msgid "Events"
3466
  msgstr ""
3467
 
3468
+ #: src/Tribe/Main.php:1552 src/admin-views/aggregator/tabs/import-form.php:229
3469
  #: src/admin-views/aggregator/tabs/import-form.php:241
3470
  #: src/functions/template-tags/general.php:71
3471
  msgid "Event"
3472
  msgstr ""
3473
 
3474
+ #: src/Tribe/Main.php:1723
3475
  msgid ""
3476
  "Sorry, The Events Calendar requires WordPress %s or higher. Please upgrade "
3477
  "your WordPress install."
3478
  msgstr ""
3479
 
3480
+ #: src/Tribe/Main.php:1726
3481
  msgid ""
3482
  "Sorry, The Events Calendar requires PHP %s or higher. Talk to your Web host "
3483
  "about moving you to a newer version of PHP."
3484
  msgstr ""
3485
 
3486
+ #: src/Tribe/Main.php:1761
3487
  msgid ""
3488
  "To continue using The Events Calendar, please install the latest version of"
3489
  msgstr ""
3490
 
3491
+ #: src/Tribe/Main.php:1763 src/Tribe/Main.php:1764
3492
  msgid "Event Tickets"
3493
  msgstr ""
3494
 
3495
+ #: src/Tribe/Main.php:1790
3496
  msgid ""
3497
  "It appears as if the tribe-common libraries cannot be found! The directory "
3498
  "should be in the \"common/\" directory in the events calendar plugin."
3499
  msgstr ""
3500
 
3501
+ #: src/Tribe/Main.php:2027 src/Tribe/Main.php:2500
3502
  msgid "category"
3503
  msgstr ""
3504
 
3505
+ #: src/Tribe/Main.php:2041 src/Tribe/Main.php:2499
3506
  msgid "tag"
3507
  msgstr ""
3508
 
3509
+ #: src/Tribe/Main.php:2058 src/Tribe/Organizer.php:91 src/Tribe/Venue.php:127
3510
  msgid "Add New"
3511
  msgstr ""
3512
 
3513
+ #: src/Tribe/Main.php:2060 src/Tribe/Main.php:2267 src/Tribe/Main.php:2268
3514
  #: src/Tribe/Organizer.php:92 src/Tribe/Venue.php:128
3515
  msgid "Add New %s"
3516
  msgstr ""
3517
 
3518
+ #: src/Tribe/Main.php:2066 src/Tribe/Organizer.php:94 src/Tribe/Venue.php:130
3519
  msgid "New %s"
3520
  msgstr ""
3521
 
3522
+ #: src/Tribe/Main.php:2069 src/Tribe/Organizer.php:95 src/Tribe/Venue.php:131
3523
  msgid "View %s"
3524
  msgstr ""
3525
 
3526
+ #: src/Tribe/Main.php:2072 src/Tribe/Organizer.php:96 src/Tribe/Venue.php:132
3527
  msgid "Search %s"
3528
  msgstr ""
3529
 
3530
+ #: src/Tribe/Main.php:2075 src/Tribe/Organizer.php:97 src/Tribe/Venue.php:133
3531
  msgid "No %s found"
3532
  msgstr ""
3533
 
3534
+ #: src/Tribe/Main.php:2078 src/Tribe/Organizer.php:98 src/Tribe/Venue.php:134
3535
  msgid "No %s found in Trash"
3536
  msgstr ""
3537
 
3538
+ #: src/Tribe/Main.php:2081 src/Tribe/Main.php:2220 src/Tribe/Main.php:2242
3539
  #: src/Tribe/Organizer.php:99 src/Tribe/Venue.php:135
3540
  msgid "%s published."
3541
  msgstr ""
3542
 
3543
+ #: src/Tribe/Main.php:2084 src/Tribe/Organizer.php:100 src/Tribe/Venue.php:136
3544
  msgid "%s published privately."
3545
  msgstr ""
3546
 
3547
+ #: src/Tribe/Main.php:2087 src/Tribe/Organizer.php:101 src/Tribe/Venue.php:137
3548
  msgid "%s reverted to draft."
3549
  msgstr ""
3550
 
3551
+ #: src/Tribe/Main.php:2090 src/Tribe/Organizer.php:102 src/Tribe/Venue.php:138
3552
  msgid "%s scheduled."
3553
  msgstr ""
3554
 
3555
+ #: src/Tribe/Main.php:2093 src/Tribe/Main.php:2176 src/Tribe/Main.php:2212
3556
+ #: src/Tribe/Main.php:2215 src/Tribe/Main.php:2234 src/Tribe/Main.php:2237
3557
  #: src/Tribe/Organizer.php:103 src/Tribe/Venue.php:139
3558
  msgid "%s updated."
3559
  msgstr ""
3561
  #. Translators: %s: Event singular.
3562
  #. Translators: %s: Organizer singular.
3563
  #. Translators: %s: Venue singular.
3564
+ #: src/Tribe/Main.php:2097 src/Tribe/Organizer.php:106 src/Tribe/Venue.php:142
3565
  msgid "%s Link"
3566
  msgstr ""
3567
 
3568
  #. Translators: %s: Event singular.
3569
  #. Translators: %s: Organizer singular.
3570
  #. Translators: %s: Venue singular.
3571
+ #: src/Tribe/Main.php:2101 src/Tribe/Organizer.php:110 src/Tribe/Venue.php:146
3572
  msgid "A link to a particular %s."
3573
  msgstr ""
3574
 
3575
+ #: src/Tribe/Main.php:2118
3576
  msgid "%s Category"
3577
  msgstr ""
3578
 
3579
+ #: src/Tribe/Main.php:2121
3580
  msgid "Search %s Categories"
3581
  msgstr ""
3582
 
3583
+ #: src/Tribe/Main.php:2124
3584
  msgid "All %s Categories"
3585
  msgstr ""
3586
 
3587
+ #: src/Tribe/Main.php:2127
3588
  msgid "Parent %s Category"
3589
  msgstr ""
3590
 
3591
+ #: src/Tribe/Main.php:2130
3592
  msgid "Parent %s Category:"
3593
  msgstr ""
3594
 
3595
+ #: src/Tribe/Main.php:2133
3596
  msgid "Edit %s Category"
3597
  msgstr ""
3598
 
3599
+ #: src/Tribe/Main.php:2136
3600
  msgid "Update %s Category"
3601
  msgstr ""
3602
 
3603
+ #: src/Tribe/Main.php:2139
3604
  msgid "Add New %s Category"
3605
  msgstr ""
3606
 
3607
+ #: src/Tribe/Main.php:2142
3608
  msgid "New %s Category Name"
3609
  msgstr ""
3610
 
3611
  #. Translators: %s: Event singular.
3612
+ #: src/Tribe/Main.php:2146
3613
  msgid "%s Category Link"
3614
  msgstr ""
3615
 
3616
  #. Translators: %s: Event singular.
3617
+ #: src/Tribe/Main.php:2150
3618
  msgid "A link to a particular %s category."
3619
  msgstr ""
3620
 
3621
+ #: src/Tribe/Main.php:2169
3622
  msgid "%1$s updated. %2$sView %1$s%3$s"
3623
  msgstr ""
3624
 
3625
+ #: src/Tribe/Main.php:2174 src/Tribe/Main.php:2213 src/Tribe/Main.php:2235
3626
  msgid "Custom field updated."
3627
  msgstr ""
3628
 
3629
+ #: src/Tribe/Main.php:2175 src/Tribe/Main.php:2214 src/Tribe/Main.php:2236
3630
  msgid "Custom field deleted."
3631
  msgstr ""
3632
 
3633
  #. translators: %s: date and time of the revision
3634
+ #: src/Tribe/Main.php:2179 src/Tribe/Main.php:2218
3635
  msgid "%1$s restored to revision from %2$s"
3636
  msgstr ""
3637
 
3638
+ #: src/Tribe/Main.php:2182
3639
  msgid "%1$s published. %2$sView %3$s"
3640
  msgstr ""
3641
 
3642
+ #: src/Tribe/Main.php:2187 src/Tribe/Main.php:2221 src/Tribe/Main.php:2243
3643
  msgid "%s saved."
3644
  msgstr ""
3645
 
3646
+ #: src/Tribe/Main.php:2189
3647
  msgid "%1$s submitted. %2$sPreview %3$s"
3648
  msgstr ""
3649
 
3650
+ #: src/Tribe/Main.php:2195
3651
  msgid "%1$s scheduled for: %2$s. %3$sPreview %4$s"
3652
  msgstr ""
3653
 
3654
  #. translators: Publish box date format, see http://php.net/date
3655
+ #: src/Tribe/Main.php:2198 src/Tribe/Main.php:2227 src/Tribe/Main.php:2249
3656
  msgid "M j, Y @ G:i"
3657
  msgstr ""
3658
 
3659
+ #: src/Tribe/Main.php:2203
3660
  msgid "%1$s draft updated. %2$sPreview %3$s"
3661
  msgstr ""
3662
 
3663
+ #: src/Tribe/Main.php:2222 src/Tribe/Main.php:2244
3664
  msgid "%s submitted."
3665
  msgstr ""
3666
 
3667
+ #: src/Tribe/Main.php:2224 src/Tribe/Main.php:2246
3668
  msgid "%1$s scheduled for: %2$s."
3669
  msgstr ""
3670
 
3671
+ #: src/Tribe/Main.php:2229 src/Tribe/Main.php:2252
3672
  msgid "%s draft updated."
3673
  msgstr ""
3674
 
3675
  #. translators: %s: date and time of the revision
3676
+ #: src/Tribe/Main.php:2240
3677
  msgid "%s restored to revision from %s"
3678
  msgstr ""
3679
 
3680
+ #: src/Tribe/Main.php:2301
3681
  msgid ""
3682
  "Without a defined location your event will not display a %sGoogle Rich "
3683
  "Snippet%s on the search results."
3684
  msgstr ""
3685
 
3686
+ #: src/Tribe/Main.php:2501
3687
  msgid "page"
3688
  msgstr ""
3689
 
3690
+ #: src/Tribe/Main.php:2502 src/functions/template-tags/general.php:99
3691
  msgid "event"
3692
  msgstr ""
3693
 
3694
+ #: src/Tribe/Main.php:2503 src/functions/template-tags/general.php:155
3695
  msgid "events"
3696
  msgstr ""
3697
 
3698
+ #: src/Tribe/Main.php:2504
3699
  msgid "all"
3700
  msgstr ""
3701
 
3702
+ #: src/Tribe/Main.php:3262 src/Tribe/Main.php:3301
3703
  #: src/functions/template-tags/deprecated.php:22
3704
  #: src/functions/template-tags/deprecated.php:44
3705
  msgid "Date out of range."
3706
  msgstr ""
3707
 
3708
+ #: src/Tribe/Main.php:3331
3709
  msgid "%s Options"
3710
  msgstr ""
3711
 
3712
+ #: src/Tribe/Main.php:3503
3713
  msgid "Support"
3714
  msgstr ""
3715
 
3716
+ #: src/Tribe/Main.php:3506
3717
  msgid "View All Add-Ons"
3718
  msgstr ""
3719
 
3720
+ #: src/Tribe/Main.php:3528
3721
  msgid "News from The Events Calendar"
3722
  msgstr ""
3723
 
3724
+ #: src/Tribe/Main.php:3555
3725
  msgid "Additional Functionality"
3726
  msgstr ""
3727
 
3728
+ #: src/Tribe/Main.php:3560
3729
  msgid ""
3730
  "Looking for additional functionality including recurring events, ticket "
3731
  "sales, publicly submitted events, new views and more?"
3732
  msgstr ""
3733
 
3734
+ #: src/Tribe/Main.php:3561
3735
  msgid "Check out the %savailable add-ons%s."
3736
  msgstr ""
3737
 
3738
+ #: src/Tribe/Main.php:3662
3739
  msgid "Calendar"
3740
  msgstr ""
3741
 
3742
+ #: src/Tribe/Main.php:3699
3743
  msgid "Once Every 30 Mins"
3744
  msgstr ""
3745
 
4219
  msgstr ""
4220
 
4221
  #: src/Tribe/REST/V1/Endpoints/Archive_Category.php:40
4222
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:470
4223
  #: src/Tribe/REST/V1/Endpoints/Archive_Organizer.php:68
4224
  #: src/Tribe/REST/V1/Endpoints/Archive_Tag.php:57
4225
  #: src/Tribe/REST/V1/Endpoints/Archive_Venue.php:65
4227
  msgstr ""
4228
 
4229
  #: src/Tribe/REST/V1/Endpoints/Archive_Category.php:43
4230
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:473
4231
  #: src/Tribe/REST/V1/Endpoints/Archive_Organizer.php:71
4232
  #: src/Tribe/REST/V1/Endpoints/Archive_Venue.php:68
4233
  msgid "The requested page was not found."
4234
  msgstr ""
4235
 
4236
  #: src/Tribe/REST/V1/Endpoints/Archive_Category.php:97
4237
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:494
4238
  #: src/Tribe/REST/V1/Endpoints/Archive_Organizer.php:208
4239
  #: src/Tribe/REST/V1/Endpoints/Archive_Tag.php:114
4240
  #: src/Tribe/REST/V1/Endpoints/Archive_Venue.php:207
4296
  msgid "Limit result set to terms with a specific slug"
4297
  msgstr ""
4298
 
4299
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:458
4300
  msgid "Returns all the upcoming events matching the search criteria"
4301
  msgstr ""
4302
 
4303
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:502
4304
  msgid "The number of events to return on each page"
4305
  msgstr ""
4306
 
4307
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:509
4308
+ msgid "Events that start on the specified date"
4309
+ msgstr ""
4310
+
4311
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:516
4312
+ msgid "Events that end on the specified date"
4313
  msgstr ""
4314
 
4315
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:522
4316
+ msgid "Events that start before the specified date"
4317
  msgstr ""
4318
 
4319
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:528
4320
+ msgid "Events that start after the specified date"
4321
+ msgstr ""
4322
+
4323
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:534
4324
+ msgid "Events that end before the specified date"
4325
+ msgstr ""
4326
+
4327
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:540
4328
+ msgid "Events that end after the specified date"
4329
+ msgstr ""
4330
+
4331
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:547
4332
+ msgid ""
4333
+ "Dates set using the start_date/end_date, starts_*/ends_* are set to start at "
4334
+ "the specified times. The default behavior is to include the entire days."
4335
+ msgstr ""
4336
+
4337
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:553
4338
  msgid "Events should contain the specified string in the title or description"
4339
  msgstr ""
4340
 
4341
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:559
4342
  msgid "Events should be assigned one of the specified categories slugs or IDs"
4343
  msgstr ""
4344
 
4345
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:567
4346
  msgid "Events should be assigned one of the specified tags slugs or IDs"
4347
  msgstr ""
4348
 
4349
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:575
4350
  msgid "Events should be assigned one of the specified venue IDs"
4351
  msgstr ""
4352
 
4353
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:583
4354
  msgid "Events should be assigned one of the specified organizer IDs"
4355
  msgstr ""
4356
 
4357
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:591
4358
  msgid "Events should be filtered by their featured status"
4359
  msgstr ""
4360
 
4361
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:598
4362
  #: src/Tribe/REST/V1/Endpoints/Single_Event.php:271
4363
  msgid "The event post status"
4364
  msgstr ""
4365
 
4366
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:603
4367
  msgid ""
4368
  "Requires Events Calendar Pro. Events should be filtered by whether their "
4369
  "venue has geolocation data"
4370
  msgstr ""
4371
 
4372
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:609
4373
  msgid ""
4374
  "Requires Events Calendar Pro. Events should be filtered by their venue "
4375
  "latitude location, must also provide geoloc_lng"
4376
  msgstr ""
4377
 
4378
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:615
4379
  msgid ""
4380
  "Requires Events Calendar Pro. Events should be filtered by their venue "
4381
  "longitude location, must also provide geoloc_lat"
4382
  msgstr ""
4383
 
4384
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:619
4385
  msgid ""
4386
  "Include events with one of the post IDs specified in the array of CSV list, "
4387
  "date filters will be ignored."
4388
  msgstr ""
4389
 
4390
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:629
4391
  msgid "Events should be filtered by their post_parent being the specified one."
4392
  msgstr ""
4393
 
4394
+ #: src/Tribe/REST/V1/Endpoints/Archive_Event.php:635
4395
  msgid "Filter events with or without tickets."
4396
  msgstr ""
4397
 
5468
  msgid "Custom Color"
5469
  msgstr ""
5470
 
5471
+ #: src/Tribe/Views/V2/Hooks.php:568
5472
  msgid "We recommend a 16:9 aspect ratio for featured images."
5473
  msgstr ""
5474
 
5475
+ #: src/Tribe/Views/V2/Hooks.php:645
5476
  msgid "Recommended for all sites using the updated calendar views."
5477
  msgstr ""
5478
 
5479
+ #: src/Tribe/Views/V2/Hooks.php:660
5480
  msgid "The Events Calendar - View V2"
5481
  msgstr ""
5482
 
5483
+ #: src/Tribe/Views/V2/Hooks.php:976
5484
  msgctxt "Capitalized label for the event website link."
5485
  msgid "View %s Website"
5486
  msgstr ""
5487
 
5488
+ #: src/Tribe/Views/V2/Hooks.php:1004
5489
  msgctxt "Capitalized label for the venue website link."
5490
  msgid "View %s Website"
5491
  msgstr ""
5492
 
5493
+ #: src/Tribe/Views/V2/Hooks.php:1032
5494
  msgctxt "Capitalized label for the organizer website link."
5495
  msgid "View %s Website"
5496
  msgstr ""
5497
 
5498
+ #: src/Tribe/Views/V2/Hooks.php:1096
5499
+ msgctxt "The default text label for the \"today\" button on the Month View."
5500
+ msgid "This Month"
5501
+ msgstr ""
5502
+
5503
+ #: src/Tribe/Views/V2/Hooks.php:1116
5504
+ msgctxt ""
5505
+ "The default text for the 'today' button's title and aria-label on the Week "
5506
+ "View."
5507
+ msgid "Click to select the current month"
5508
+ msgstr ""
5509
+
5510
+ #: src/Tribe/Views/V2/Hooks.php:1210
5511
  msgid "Enabled"
5512
  msgstr ""
5513
 
5514
+ #: src/Tribe/Views/V2/Hooks.php:1210
5515
  #: src/admin-views/tribe-options-general.php:182
5516
  #: src/admin-views/tribe-options-general.php:200
5517
  msgid "Disabled"
5559
 
5560
  #. translators: %s: events label plural
5561
  #: src/Tribe/Views/V2/Template/Featured_Title.php:41
5562
+ #: src/functions/template-tags/loop.php:148
5563
  msgctxt "featured events title"
5564
  msgid "Featured %s"
5565
  msgstr ""
5566
 
5567
  #: src/Tribe/Views/V2/Template/Title.php:123
5568
+ #: src/functions/template-tags/loop.php:158
5569
  msgid "Upcoming %s"
5570
  msgstr ""
5571
 
5572
  #: src/Tribe/Views/V2/Template/Title.php:133
5573
+ #: src/functions/template-tags/loop.php:175
5574
  msgid "Past %s"
5575
  msgstr ""
5576
 
5577
  #: src/Tribe/Views/V2/Template/Title.php:228
5578
+ #: src/functions/template-tags/loop.php:173
5579
  msgid "%1$s for %2$s - %3$s"
5580
  msgstr ""
5581
 
5582
  #: src/Tribe/Views/V2/Template/Title.php:329
5583
+ #: src/functions/template-tags/loop.php:180
5584
  msgctxt "month view"
5585
  msgid "%1$s for %2$s"
5586
  msgstr ""
5587
 
5588
  #: src/Tribe/Views/V2/Template/Title.php:356
5589
+ #: src/functions/template-tags/loop.php:189
5590
  msgctxt "day_view"
5591
  msgid "%1$s for %2$s"
5592
  msgstr ""
5593
 
5594
+ #: src/Tribe/Views/V2/View.php:1497
5595
+ msgctxt "The default title text for the today button."
5596
+ msgid "Click to select today's date"
5597
+ msgstr ""
5598
+
5599
+ #: src/Tribe/Views/V2/View.php:2095 src/views/v2/day/event/date/featured.php:27
5600
  #: src/views/v2/day/event/date/featured.php:32
5601
  #: src/views/v2/latest-past/event/date/featured.php:27
5602
  #: src/views/v2/latest-past/event/date/featured.php:32
8331
  msgid "The function needs to be passed an $event or used in the loop."
8332
  msgstr ""
8333
 
8334
+ #: src/functions/template-tags/general.php:170
8335
+ msgctxt ""
8336
+ "The default text label for the \"today\" button on main calendar views."
8337
+ msgid "Today"
8338
+ msgstr ""
8339
+
8340
  #. translators: %s is the singular translation of "Event"
8341
+ #: src/functions/template-tags/general.php:556
8342
  msgctxt "category list label"
8343
  msgid "%s Category"
8344
  msgid_plural "%s Categories"
8345
  msgstr[0] ""
8346
  msgstr[1] ""
8347
 
8348
+ #: src/functions/template-tags/general.php:596
8349
+ #: src/functions/template-tags/general.php:678
8350
  msgid "Tags:"
8351
  msgstr ""
8352
 
8353
+ #: src/functions/template-tags/general.php:794
8354
  msgid "Loading %s"
8355
  msgstr ""
8356
 
8357
+ #: src/functions/template-tags/general.php:1350
8358
  #: src/views/v2/widgets/widget-events-list/event/date.php:26
8359
  msgctxt "All day label for event"
8360
  msgid "All day"
8361
  msgstr ""
8362
 
8363
+ #: src/functions/template-tags/general.php:1455
8364
  msgid "Calendar powered by %s"
8365
  msgstr ""
8366
 
8488
  msgid "Subscribe to calendar"
8489
  msgstr ""
8490
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8491
  #: src/views/v2/day/nav/next-disabled.php:19
8492
  #: src/views/v2/day/nav/next-disabled.php:20
8493
  #: src/views/v2/day/nav/next-disabled.php:23 src/views/v2/day/nav/next.php:24
8615
  msgid "Previous month"
8616
  msgstr ""
8617
 
8618
+ #: tests/_data/classes/Tribe__Events__Aggregator__Record__Manual_Test.php:12
8619
+ msgid "Manual Test"
8620
+ msgstr ""
8621
+
8622
  #. Description of the plugin/theme
8623
  msgid ""
8624
  "The Events Calendar is a carefully crafted, extensible plugin that lets you "
readme.txt CHANGED
@@ -3,9 +3,9 @@
3
  Contributors: theeventscalendar, borkweb, bordoni, brianjessee, aguseo, camwynsp, GeoffBel, jentheo, leahkoerper, lucatume, neillmcshea, vicskf, zbtirrell, juanfra
4
  Tags: events, calendar, event, schedule, organizer
5
  Donate link: https://evnt.is/29
6
- Requires at least: 5.8.4
7
- Stable tag: 6.0.1.1
8
- Tested up to: 6.0.2
9
  Requires PHP: 7.3
10
  License: GPLv2 or later
11
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -229,6 +229,40 @@ Remember to always make a backup of your database and files before updating!
229
 
230
  == Changelog ==
231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
  = [6.0.1.1] 2022-09-29 =
233
 
234
  * Fix - Prevent Google Calendar duplicated Events from Importing with Aggregator. [TEC-4497]
@@ -348,7 +382,7 @@ Remember to always make a backup of your database and files before updating!
348
 
349
  = [5.15.0.1] 2022-05-23 =
350
 
351
- * Fix - Prevent fatal when using Yoast due to missing function `tribe_is_month()` [BTRIA-1243]
352
  * Fix - Check if function exists for `get_current_screen` to avoid a fatal if not.
353
 
354
  = [5.15.0] 2022-05-19 =
3
  Contributors: theeventscalendar, borkweb, bordoni, brianjessee, aguseo, camwynsp, GeoffBel, jentheo, leahkoerper, lucatume, neillmcshea, vicskf, zbtirrell, juanfra
4
  Tags: events, calendar, event, schedule, organizer
5
  Donate link: https://evnt.is/29
6
+ Requires at least: 5.8.5
7
+ Stable tag: 6.0.2
8
+ Tested up to: 6.0.3
9
  Requires PHP: 7.3
10
  License: GPLv2 or later
11
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
229
 
230
  == Changelog ==
231
 
232
+ = [6.0.2] 2022-10-20 =
233
+
234
+ * Feature - Add initial integration with Restrict Content Pro. This hides any events on the calendar views that the user is not allowed to view. [ [TEC-4457]]
235
+ * Feature - Support the `strict_dates` REST API argument in the `/events` endpoint to control the inclusiveness of the date parameters. [TEC-4493]
236
+ * Feature - Support relative date parameters (e.g: `starts_before`, `ends_after` as REST API arguments in the `/events` endpoint to retrieve single day and multi-day events in a single search. [TEC-4493]
237
+ * Fix - Prevent problems with WordPress.com Memcache turning Event Single Pages into 404s after the first visit [TEC-4488]
238
+ * Fix - Add new function to properly escape event titles in URLs so they are better handled by rewrite rules. Props to @shisho585 for the fix! [TEC-4518]
239
+ * Fix - Avoid resetting post data in some Dive theme and plugins. [TEC-4510]
240
+ * Fix - Correct a few misnamed custom prop references. [TEC-4445]
241
+ * Fix - Correct an issue with event venue when saving in our WPML integration. Props to @dgwatkins for the fix! [TEC-4498]
242
+ * Fix - Correctly deprecate the `Tribe__Events__Main::get_closest_event` method. [ECP-1326]
243
+ * Fix - Correctly set `found_posts` and `max_num_pages` when redirecting a query to the custom tables. [TEC-4508]
244
+ * Fix - Do not run wasteful queries on `switch_blog` in multi-site installations. [TEC-4492]
245
+ * Fix - Do not throw errors during migration when notices or errors come from other plugins. [ECP-1318]
246
+ * Fix - Ensure `tribe_is_month` and `tribe_is_by_date` work as expected. [TEC-4509]
247
+ * Fix - Ensure we handle if By_Day_View gets a null $event_obj->dates. Props to @juliangumenita for the fix! [TEC-4509]
248
+ * Fix - Remove strict type hinting from Custom Tables v1 code that would cause fatals in some environments. [ECP-1343]
249
+ * Fix - Resolve problems with tribe_get_full_address() which was not properly returning venue address.
250
+ * Fix - Restore erroneously removed Events query filters that would result in out-of-order results. [TEC-4470]
251
+ * Fix - Revert the code erroneous removed on legacy views removal around the "Show events with the site's other posts" setting.
252
+ * Fix - Prevent a potential fatal when WP-CLI isn't present. [TEC-4470]
253
+ * Tweak - Move Month View day cell class logic to a standalone function with filters. [TEC-4457]
254
+ * Tweak - Add new method: `\Tribe\Events\Views\V2\month_day_classes` [TEC-4457]
255
+ * Tweak - Added filter `tec_events_month_day_classes_comparison_date` to filter the date used for class determination comparisons. [TEC-4457]
256
+ * Tweak - Added filter `tec_events_month_day_classes` to filter the actual class list before it gets passed to the template. [TEC-4457]
257
+ * Tweak - Update the organizer website field to type URL. [TEC-4395]
258
+ * Tweak - Add an event property for if the event is currently happening. [TEC-4454]
259
+ * Tweak - Create a filterable function `tec_events_get_today_button_label()` for the text on the "Today" button on calendar views. [TEC-4458]
260
+ * Tweak - Add a filter for the link title and aria-label so they match the button text more closely. [TEC-4458]
261
+ * Tweak - Added filters: `tec_events_today_button_label` and `tec_events_view_{view_slug}_today_button_label` to filter the output of the `tec_events_get_today_button_label` function
262
+ `tec_events_today_button_title` and `tec_events_{view_slug}_view_today_button_title` to filter the link title and aria-label. [TEC-4458]
263
+ * Tweak - Speed up the Custom Tables v1 migration process if a browser window is open on the migration UI. [TEC-4517]
264
+ * Language - 11 new strings added, 149 updated, 2 fuzzied, and 2 obsoleted.
265
+
266
  = [6.0.1.1] 2022-09-29 =
267
 
268
  * Fix - Prevent Google Calendar duplicated Events from Importing with Aggregator. [TEC-4497]
382
 
383
  = [5.15.0.1] 2022-05-23 =
384
 
385
+ * Fix - Prevent fatal when using Yoast due to missing function `tribe_is_month()` [TEC-4376]
386
  * Fix - Check if function exists for `get_current_screen` to avoid a fatal if not.
387
 
388
  = [5.15.0] 2022-05-19 =
src/Events/Custom_Tables/V1/Full_Activation_Provider.php CHANGED
@@ -111,9 +111,9 @@ class Full_Activation_Provider extends Service_Provider {
111
  $schema_builder->register_custom_tables_names();
112
 
113
  if ( is_multisite() ) {
114
- add_action( 'activate_blog', [ $schema_builder, 'update_blog_tables' ] );
115
  add_action( 'activate_blog', [ $schema_builder, 'register_custom_tables_names' ] );
116
- add_action( 'switch_blog', [ $schema_builder, 'update_blog_tables' ] );
117
  add_action( 'switch_blog', [ $schema_builder, 'register_custom_tables_names' ] );
118
  add_filter( 'wpmu_drop_tables', [ $schema_builder, 'filter_tables_list' ] );
119
  }
@@ -122,4 +122,33 @@ class Full_Activation_Provider extends Service_Provider {
122
  WP_CLI::add_hook( 'after_invoke:site empty', [ $schema_builder, 'empty_custom_tables' ] );
123
  }
124
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  }
111
  $schema_builder->register_custom_tables_names();
112
 
113
  if ( is_multisite() ) {
114
+ add_action( 'activate_blog', [ $this, 'update_blog_tables' ] );
115
  add_action( 'activate_blog', [ $schema_builder, 'register_custom_tables_names' ] );
116
+ add_action( 'switch_blog', [ $this, 'update_blog_tables' ] );
117
  add_action( 'switch_blog', [ $schema_builder, 'register_custom_tables_names' ] );
118
  add_filter( 'wpmu_drop_tables', [ $schema_builder, 'filter_tables_list' ] );
119
  }
122
  WP_CLI::add_hook( 'after_invoke:site empty', [ $schema_builder, 'empty_custom_tables' ] );
123
  }
124
  }
125
+
126
+ /**
127
+ * Updates the custom tables for a blog,
128
+ *
129
+ * @since 6.0.2
130
+ *
131
+ * @param int $blog_id The blog ID to udpate the tables for.
132
+ *
133
+ * @return void Custom tables are updated, if required.
134
+ */
135
+ public function update_blog_tables( $blog_id ): void {
136
+ $blog_id = (int) $blog_id;
137
+
138
+ if ( empty( $blog_id ) ) {
139
+ // Not a valid blog ID.
140
+ return;
141
+ }
142
+
143
+ if ( get_transient( Activation::ACTIVATION_TRANSIENT ) ) {
144
+ // Already activated on this site.
145
+ return;
146
+ }
147
+
148
+ $schema_builder = $this->container->make( Schema_Builder::class );
149
+ $schema_builder->update_blog_tables( $blog_id );
150
+
151
+ // Do not run again on this site for a day.
152
+ set_transient( Activation::ACTIVATION_TRANSIENT, true, DAY_IN_SECONDS );
153
+ }
154
  }
src/Events/Custom_Tables/V1/Integrations/Dot_Com/Clear_Event_Cache.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Provides the integrations required by the plugin to work with other plugins.
4
+ *
5
+ * @since 6.0.2
6
+ *
7
+ * @package TEC\Events\Custom_Tables\V1\Integrations
8
+ */
9
+
10
+ namespace TEC\Events\Custom_Tables\V1\Integrations\Dot_Com;
11
+
12
+ use WP_Query;
13
+ use WP_Post;
14
+
15
+ /**
16
+ * Class Clear_Event_Cache
17
+ *
18
+ * @since 6.0.2
19
+ *
20
+ */
21
+ class Clear_Event_Cache {
22
+
23
+ /**
24
+ * The cache group key for the WP.com event caching.
25
+ *
26
+ * @since 6.0.2
27
+ *
28
+ * @var string
29
+ */
30
+ public static $cache_group_key = 'tec_wpcom_queries';
31
+
32
+ /**
33
+ * Clears the Single Event Post Cache due to how weirdly broken cache ends up for WP.com single event due to occurrences.
34
+ *
35
+ * @since 6.0.2
36
+ *
37
+ * @param array<WP_Post|int>|null $posts The filter input value, it could have already be filtered by other
38
+ * @param WP_Query|null $wp_query A reference to the `WP_Query` instance that is currently running.
39
+ * plugins at this stage.
40
+ *
41
+ * @return null|array<WP_Post|int> The filtered value of the posts, injected before the query actually runs.
42
+ */
43
+ public function filter_posts_pre_query( $posts = null, $wp_query = null ) {
44
+ if ( ! $wp_query instanceof WP_Query ) {
45
+ return $posts;
46
+ }
47
+
48
+ $cache_hash = md5( serialize( $wp_query->query ) );
49
+
50
+ if ( $wp_query->request !== 'SELECT * FROM wp_posts WHERE ID IN(0)' ) {
51
+ if ( ! empty( $posts ) ) {
52
+ wp_cache_add( $cache_hash, $posts, static::$cache_group_key );
53
+ }
54
+ }
55
+
56
+ $posts = wp_cache_get( $cache_hash, static::$cache_group_key );
57
+ if ( empty( $posts ) ) {
58
+ return $posts;
59
+ }
60
+
61
+ $post = reset( $posts );
62
+ if ( $post instanceof WP_Post ) {
63
+ clean_post_cache( $post );
64
+ }
65
+
66
+ return $posts;
67
+ }
68
+ }
src/Events/Custom_Tables/V1/Integrations/Dot_Com/Provider.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace TEC\Events\Custom_Tables\V1\Integrations\Dot_Com;
4
+
5
+ use tad_DI52_ServiceProvider as Service_Provider;
6
+ use WP_Query;
7
+ use WP_Post;
8
+
9
+ /**
10
+ * Class Provider
11
+ *
12
+ * @since 6.0.2
13
+ *
14
+ * @package TEC\Events\Custom_Tables\V1\Integrations\DotCom
15
+ */
16
+ class Provider extends Service_Provider {
17
+
18
+ /**
19
+ * @inheritDoc
20
+ */
21
+ public function register() {
22
+ add_filter( 'tec_events_custom_tables_v1_events_only_modifier_filter_posts_pre_query', [
23
+ $this,
24
+ 'filter_posts_pre_query'
25
+ ], 101, 2 );
26
+ }
27
+
28
+ /**
29
+ * Unhooks all the actions and filters.
30
+ *
31
+ * @since 6.0.2
32
+ */
33
+ protected function unregister(): void {
34
+ remove_filter( 'tec_events_custom_tables_v1_events_only_modifier_filter_posts_pre_query', [
35
+ $this,
36
+ 'filter_posts_pre_query'
37
+ ], 101 );
38
+ }
39
+
40
+ /**
41
+ * Clears the Single Event Post Cache due to how weirdly broken cache ends up for WP.com single event due to
42
+ * occurrences.
43
+ *
44
+ * @since 6.0.2
45
+ *
46
+ * @param array<WP_Post|int>|null $posts The filter input value, it could have already be filtered by other
47
+ * @param WP_Query|null $wp_query A reference to the `WP_Query` instance that is currently running.
48
+ * plugins at this stage.
49
+ *
50
+ * @return null|array<WP_Post|int> The filtered value of the posts, injected before the query actually runs.
51
+ */
52
+ public function filter_posts_pre_query( $posts = null, $wp_query = null ) {
53
+ return $this->container->make( Clear_Event_Cache::class )->filter_posts_pre_query( $posts, $wp_query );
54
+ }
55
+
56
+ }
src/Events/Custom_Tables/V1/Integrations/Provider.php CHANGED
@@ -10,7 +10,7 @@
10
  namespace TEC\Events\Custom_Tables\V1\Integrations;
11
 
12
 
13
- use tad_DI52_ServiceProvider;
14
 
15
  /**
16
  * Class Provider
@@ -19,7 +19,7 @@ use tad_DI52_ServiceProvider;
19
  *
20
  * @package TEC\Events\Custom_Tables\V1\Integrations
21
  */
22
- class Provider extends tad_DI52_ServiceProvider {
23
  /**
24
  * Registers the Service Providers required for the plugin to work with other plugins.
25
  *
@@ -30,5 +30,10 @@ class Provider extends tad_DI52_ServiceProvider {
30
  if ( class_exists( '\\TEC\\Event_Tickets\\Custom_Tables\\V1\\Provider' ) ) {
31
  $this->container->register( \TEC\Tickets\Custom_Tables\V1\Provider::class );
32
  }
 
 
 
 
 
33
  }
34
  }
10
  namespace TEC\Events\Custom_Tables\V1\Integrations;
11
 
12
 
13
+ use tad_DI52_ServiceProvider as Service_Provider;
14
 
15
  /**
16
  * Class Provider
19
  *
20
  * @package TEC\Events\Custom_Tables\V1\Integrations
21
  */
22
+ class Provider extends Service_Provider {
23
  /**
24
  * Registers the Service Providers required for the plugin to work with other plugins.
25
  *
30
  if ( class_exists( '\\TEC\\Event_Tickets\\Custom_Tables\\V1\\Provider' ) ) {
31
  $this->container->register( \TEC\Tickets\Custom_Tables\V1\Provider::class );
32
  }
33
+
34
+ if ( defined( 'WPCOMSH_VERSION' ) ) {
35
+ // WP.com specific integrations.
36
+ $this->container->register( Dot_Com\Provider::class );
37
+ }
38
  }
39
  }
src/Events/Custom_Tables/V1/Migration/Process_Worker.php CHANGED
@@ -8,6 +8,7 @@
8
 
9
  namespace TEC\Events\Custom_Tables\V1\Migration;
10
 
 
11
  use TEC\Events\Custom_Tables\V1\Migration\Reports\Event_Report;
12
  use TEC\Events\Custom_Tables\V1\Migration\Strategies\Single_Event_Migration_Strategy;
13
  use TEC\Events\Custom_Tables\V1\Migration\Strategies\Strategy_Interface;
@@ -100,7 +101,7 @@ class Process_Worker {
100
  */
101
  public function __construct( Events $events, State $state ) {
102
  $this->events = $events;
103
- $this->state = $state;
104
  }
105
 
106
  /**
@@ -110,7 +111,7 @@ class Process_Worker {
110
  */
111
  private function bind_shutdown_handlers() {
112
  // Watch for any errors that may occur and store them in the Event_Report.
113
- set_error_handler( [ $this, 'error_handler' ] );
114
 
115
  // Set this as a fallback: we'll remove it later if everything goes fine.
116
  add_action( 'shutdown', [ $this, 'shutdown_handler' ] );
@@ -401,8 +402,8 @@ class Process_Worker {
401
 
402
  // If error in the migration phase or fail on first error flag, then we need to stop the queue.
403
  $did_migration_error = ( $fail_on_first_error && $this->event_report->error );
404
- $continue_queue = $did_migration_error ? false : true;
405
- $next_post_id = null;
406
 
407
  if ( $continue_queue ) {
408
  // Get next event to process.
@@ -441,7 +442,7 @@ class Process_Worker {
441
  }
442
 
443
  // Do not hold a reference to the Report once the worker is done.
444
- $event_report = $this->event_report;
445
  $this->event_report = null;
446
 
447
  // Log our worker ending
@@ -485,7 +486,7 @@ class Process_Worker {
485
  $meta['started_timestamp'] = time();
486
  }
487
 
488
- $seconds_to_wait = 60 * 5; // 5 minutes
489
  $max_time_reached = ( time() - $meta['started_timestamp'] ) > $seconds_to_wait;
490
 
491
  // Are we still processing some events? If so, recurse and wait to do the undo operation.
@@ -534,8 +535,8 @@ class Process_Worker {
534
  case State::PHASE_CANCEL_IN_PROGRESS:
535
  case State::PHASE_REVERT_IN_PROGRESS:
536
  $is_cancel = $current_phase === State::PHASE_CANCEL_IN_PROGRESS;
537
- $text = tribe( String_Dictionary::class );
538
- $notice = $text->get( $is_cancel ? 'cancel-migration-complete-notice' : 'revert-migration-complete-notice' );
539
 
540
  Tribe__Admin__Notices::instance()->register_transient(
541
  'admin_notice_undo_migration_complete',
@@ -596,8 +597,8 @@ class Process_Worker {
596
  *
597
  * @since 6.0.0
598
  *
599
- * @param int $errno The error code.
600
- * @param string $errstr The error message.
601
  * @param string $errfile The file the error occurred in.
602
  *
603
  * @return bool A value indicating whether the error handler handled the erorr or not..
@@ -605,17 +606,15 @@ class Process_Worker {
605
  * @throws Migration_Exception A reference to an exception wrapping the error.
606
  */
607
  public function error_handler( int $errno, string $errstr, string $errfile ): bool {
608
- if ( $errno === E_WARNING ) {
609
- $check_plugins = [ basename( TRIBE_EVENTS_FILE ) ];
610
 
611
- if ( defined( 'EVENTS_CALENDAR_PRO_FILE' ) ) {
612
- $check_plugins[] = basename( EVENTS_CALENDAR_PRO_FILE );
613
- }
614
 
615
- if ( ! tec_is_file_from_plugins( $errfile, ...$check_plugins ) ) {
616
- // Do not handle Warnings when coming from outside TEC or ECP codebase (e.g. caching plugins).
617
- return false;
618
- }
619
  }
620
 
621
  // Delegate to our try/catch handler.
@@ -663,7 +662,7 @@ class Process_Worker {
663
  'phase' => $state->get_phase(),
664
  ] );
665
 
666
- $phase = $state->get_phase();
667
  $migration_completed = in_array(
668
  $phase, [
669
  State::PHASE_MIGRATION_IN_PROGRESS,
@@ -893,4 +892,80 @@ class Process_Worker {
893
  update_post_meta( $post_id, '_EventStartDateUTC', $event_start_date_utc );
894
  update_post_meta( $post_id, '_EventEndDateUTC', $event_end_date_utc );
895
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
896
  }
8
 
9
  namespace TEC\Events\Custom_Tables\V1\Migration;
10
 
11
+ use ActionScheduler_Store;
12
  use TEC\Events\Custom_Tables\V1\Migration\Reports\Event_Report;
13
  use TEC\Events\Custom_Tables\V1\Migration\Strategies\Single_Event_Migration_Strategy;
14
  use TEC\Events\Custom_Tables\V1\Migration\Strategies\Strategy_Interface;
101
  */
102
  public function __construct( Events $events, State $state ) {
103
  $this->events = $events;
104
+ $this->state = $state;
105
  }
106
 
107
  /**
111
  */
112
  private function bind_shutdown_handlers() {
113
  // Watch for any errors that may occur and store them in the Event_Report.
114
+ set_error_handler( [ $this, 'error_handler' ], E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE );
115
 
116
  // Set this as a fallback: we'll remove it later if everything goes fine.
117
  add_action( 'shutdown', [ $this, 'shutdown_handler' ] );
402
 
403
  // If error in the migration phase or fail on first error flag, then we need to stop the queue.
404
  $did_migration_error = ( $fail_on_first_error && $this->event_report->error );
405
+ $continue_queue = $did_migration_error ? false : true;
406
+ $next_post_id = null;
407
 
408
  if ( $continue_queue ) {
409
  // Get next event to process.
442
  }
443
 
444
  // Do not hold a reference to the Report once the worker is done.
445
+ $event_report = $this->event_report;
446
  $this->event_report = null;
447
 
448
  // Log our worker ending
486
  $meta['started_timestamp'] = time();
487
  }
488
 
489
+ $seconds_to_wait = 60 * 5; // 5 minutes
490
  $max_time_reached = ( time() - $meta['started_timestamp'] ) > $seconds_to_wait;
491
 
492
  // Are we still processing some events? If so, recurse and wait to do the undo operation.
535
  case State::PHASE_CANCEL_IN_PROGRESS:
536
  case State::PHASE_REVERT_IN_PROGRESS:
537
  $is_cancel = $current_phase === State::PHASE_CANCEL_IN_PROGRESS;
538
+ $text = tribe( String_Dictionary::class );
539
+ $notice = $text->get( $is_cancel ? 'cancel-migration-complete-notice' : 'revert-migration-complete-notice' );
540
 
541
  Tribe__Admin__Notices::instance()->register_transient(
542
  'admin_notice_undo_migration_complete',
597
  *
598
  * @since 6.0.0
599
  *
600
+ * @param int $errno The error code.
601
+ * @param string $errstr The error message.
602
  * @param string $errfile The file the error occurred in.
603
  *
604
  * @return bool A value indicating whether the error handler handled the erorr or not..
606
  * @throws Migration_Exception A reference to an exception wrapping the error.
607
  */
608
  public function error_handler( int $errno, string $errstr, string $errfile ): bool {
609
+ $check_plugins = [ basename( TRIBE_EVENTS_FILE ) ];
 
610
 
611
+ if ( defined( 'EVENTS_CALENDAR_PRO_FILE' ) ) {
612
+ $check_plugins[] = basename( EVENTS_CALENDAR_PRO_FILE );
613
+ }
614
 
615
+ if ( ! tec_is_file_from_plugins( $errfile, ...$check_plugins ) ) {
616
+ // Do not handle Warnings when coming from outside TEC or ECP codebase (e.g. caching plugins).
617
+ return false;
 
618
  }
619
 
620
  // Delegate to our try/catch handler.
662
  'phase' => $state->get_phase(),
663
  ] );
664
 
665
+ $phase = $state->get_phase();
666
  $migration_completed = in_array(
667
  $phase, [
668
  State::PHASE_MIGRATION_IN_PROGRESS,
892
  update_post_meta( $post_id, '_EventStartDateUTC', $event_start_date_utc );
893
  update_post_meta( $post_id, '_EventEndDateUTC', $event_end_date_utc );
894
  }
895
+
896
+ /**
897
+ * Migrates up to a number of not yet migrated Events.
898
+ *
899
+ * @since 6.0.2
900
+ *
901
+ * @param int $count The number of Events to migrate, at the most.
902
+ *
903
+ * @return int The number of migrated Events.
904
+ */
905
+ public function migrate_many_events( int $count ): int {
906
+ if ( $count <= 0 ) {
907
+ return 0;
908
+ }
909
+
910
+ $free_ids = $this->events->get_ids_to_process( $count );
911
+ $dry_run = $this->state->is_dry_run();
912
+ $migrated = 0;
913
+
914
+ if ( count( $free_ids ) > 0 ) {
915
+ // We might have less free ids than we want but have some, roll with it.
916
+ foreach ( $free_ids as $post_id ) {
917
+ $report = $this->migrate_event( $post_id, $dry_run );
918
+ $migrated ++;
919
+
920
+ if ( ! ( $report instanceof Event_Report && $report->status === 'success' ) ) {
921
+ // We have an error, stop here.
922
+ break;
923
+ }
924
+ }
925
+
926
+ return $migrated;
927
+ }
928
+
929
+ // We have no free ids, let's see if we can grab some from the Action Scheduler actions.
930
+ $actions = as_get_scheduled_actions( [
931
+ 'hook' => self::ACTION_PROCESS,
932
+ 'status' => ActionScheduler_Store::STATUS_PENDING,
933
+ 'per_page' => $count,
934
+ ] );
935
+
936
+ if ( count( $actions ) === 0 ) {
937
+ // We have no pending actions, we're done.
938
+ return $migrated;
939
+ }
940
+
941
+ /**
942
+ * We don't want to trigger cancellation steps - we are still processing, just taking out of queue.
943
+ */
944
+ remove_action( 'action_scheduler_canceled_action', [ tribe( Provider::class ), 'cancel_async_action' ] );
945
+
946
+ /** @var \ActionScheduler_Action $action */
947
+ foreach ( $actions as $action ) {
948
+ // Unschedule a pending action to migrate the Event now.
949
+ $hook = $action->get_hook();
950
+ $args = $action->get_args();
951
+ $group = $action->get_group();
952
+
953
+ $unscheduled = as_unschedule_action( $hook, $args, $group );
954
+
955
+ if ( empty( $unscheduled ) ) {
956
+ // The action might have been executed in the meantime, skip it.
957
+ continue;
958
+ }
959
+
960
+ $report = $this->migrate_event( ...$args );
961
+ $migrated ++;
962
+
963
+ if ( ! ( $report instanceof Event_Report && $report->status === 'success' ) ) {
964
+ // We have an error, stop here.
965
+ break;
966
+ }
967
+ }
968
+
969
+ return $migrated;
970
+ }
971
  }
src/Events/Custom_Tables/V1/Migration/Provider.php CHANGED
@@ -61,6 +61,8 @@ class Provider extends Service_Provider implements Provider_Contract {
61
  add_action( Process_Worker::ACTION_CHECK_PHASE, [ $this, 'check_migration_phase' ], 10, 2 );
62
 
63
  // Hook on the AJAX actions that will start, report about, and cancel the migration.
 
 
64
  add_action( Ajax::ACTION_REPORT, [ $this, 'send_report' ] );
65
  add_action( Ajax::ACTION_PAGINATE_EVENTS, [ $this, 'paginate_events' ] );
66
  add_action( Ajax::ACTION_START, [ $this, 'start_migration' ] );
@@ -94,7 +96,19 @@ class Provider extends Service_Provider implements Provider_Contract {
94
  * effect of unsetting the hooks set in the `register` method.
95
  */
96
  public function unregister() {
97
- // TODO: Implement unregister() method.
 
 
 
 
 
 
 
 
 
 
 
 
98
  }
99
 
100
  /**
@@ -158,7 +172,11 @@ class Provider extends Service_Provider implements Provider_Contract {
158
  *
159
  * @param array $action_id A list of the action scheduler action IDs.
160
  */
161
- public function cancel_async_actions( array $action_ids ) {
 
 
 
 
162
  $this->container->make( Process::class )->cancel_async_actions( $action_ids );
163
  }
164
 
@@ -318,4 +336,36 @@ class Provider extends Service_Provider implements Provider_Contract {
318
  $action_scheduler_file = TEC::instance()->plugin_path . '/vendor/woocommerce/action-scheduler/action-scheduler.php';
319
  require_once $action_scheduler_file;
320
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
  }
61
  add_action( Process_Worker::ACTION_CHECK_PHASE, [ $this, 'check_migration_phase' ], 10, 2 );
62
 
63
  // Hook on the AJAX actions that will start, report about, and cancel the migration.
64
+ // Before the JSON report is dispatched (and the request exits) migrate some events.
65
+ add_action( Ajax::ACTION_REPORT, [ $this, 'migrate_events_on_js_poll' ], 9 );
66
  add_action( Ajax::ACTION_REPORT, [ $this, 'send_report' ] );
67
  add_action( Ajax::ACTION_PAGINATE_EVENTS, [ $this, 'paginate_events' ] );
68
  add_action( Ajax::ACTION_START, [ $this, 'start_migration' ] );
96
  * effect of unsetting the hooks set in the `register` method.
97
  */
98
  public function unregister() {
99
+ remove_action( Process_Worker::ACTION_PROCESS, [ $this, 'migrate_event' ], );
100
+ remove_action( Process_Worker::ACTION_UNDO, [ $this, 'undo_event_migration' ] );
101
+ remove_action( Process_Worker::ACTION_CHECK_PHASE, [ $this, 'check_migration_phase' ], );
102
+ remove_action( Ajax::ACTION_REPORT, [ $this, 'send_report' ] );
103
+ remove_action( Ajax::ACTION_PAGINATE_EVENTS, [ $this, 'paginate_events' ] );
104
+ remove_action( Ajax::ACTION_START, [ $this, 'start_migration' ] );
105
+ remove_action( Ajax::ACTION_CANCEL, [ $this, 'cancel_migration' ] );
106
+ remove_action( Ajax::ACTION_REVERT, [ $this, 'revert_migration' ] );
107
+ remove_action( 'action_scheduler_bulk_cancel_actions', [ $this, 'cancel_async_actions' ] );
108
+ remove_action( 'action_scheduler_canceled_action', [ $this, 'cancel_async_action' ] );
109
+ remove_action( 'admin_enqueue_scripts', $this->container->callback( Asset_Loader::class, 'enqueue_scripts' ) );
110
+ remove_filter( 'tec_events_upgrade_tab_has_content', [ $this, 'show_upgrade_tab' ] );
111
+ remove_filter( 'tribe_upgrade_fields', [ $this, 'remove_phase_callback' ] );
112
  }
113
 
114
  /**
172
  *
173
  * @param array $action_id A list of the action scheduler action IDs.
174
  */
175
+ public function cancel_async_actions( $action_ids ) {
176
+ if ( ! is_array( $action_ids ) ) {
177
+ return;
178
+ }
179
+
180
  $this->container->make( Process::class )->cancel_async_actions( $action_ids );
181
  }
182
 
336
  $action_scheduler_file = TEC::instance()->plugin_path . '/vendor/woocommerce/action-scheduler/action-scheduler.php';
337
  require_once $action_scheduler_file;
338
  }
339
+
340
+ /**
341
+ * Piggy-back on the Migration UI JS component polling of the backend to migrate some events, if possible.
342
+ *
343
+ * @since 6.0.2
344
+ *
345
+ * @return void Some Events might be migrated.
346
+ */
347
+ public function migrate_events_on_js_poll(): void {
348
+ if ( ! in_array( $this->container->make( State::class )->get_phase(), [
349
+ State::PHASE_MIGRATION_IN_PROGRESS,
350
+ State::PHASE_PREVIEW_IN_PROGRESS
351
+ ] ) ) {
352
+ return;
353
+ }
354
+
355
+ /**
356
+ * Filters how many Events should be migrated in a single AJAX request to the Migration UI backend.
357
+ *
358
+ * @since 6.0.2
359
+ *
360
+ * @param int $count The number of Events to migrate on the migration UI JS component polling; returning
361
+ * `0` will disable the functionality.
362
+ */
363
+ $count = apply_filters( 'tec_events_custom_tables_v1_migration_js_poll_count', 10 );
364
+
365
+ if ( ! $count ) {
366
+ return;
367
+ }
368
+
369
+ $this->container->make( Process_Worker::class )->migrate_many_events( $count );
370
+ }
371
  }
src/Events/Custom_Tables/V1/Migration/State.php CHANGED
@@ -349,4 +349,25 @@ class State {
349
  ] );
350
  update_option( self::STATE_OPTION_KEY, $this->data );
351
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
352
  }
349
  ] );
350
  update_option( self::STATE_OPTION_KEY, $this->data );
351
  }
352
+
353
+ /**
354
+ * Returns whether the current phase is a migration dry-run or not.
355
+ *
356
+ * @since 6.0.2
357
+ *
358
+ * @return bool Whether the current phase is a migration dry-run or not.
359
+ */
360
+ public function is_dry_run(): bool {
361
+ $phase = $this->get_phase();
362
+ switch($phase) {
363
+ case State::PHASE_REVERT_COMPLETE:
364
+ case State::PHASE_CANCEL_COMPLETE:
365
+ case State::PHASE_PREVIEW_PROMPT:
366
+ case State::PHASE_PREVIEW_IN_PROGRESS:
367
+ case State::PHASE_MIGRATION_FAILURE_COMPLETE:
368
+ return true;
369
+ default:
370
+ return false;
371
+ }
372
+ }
373
  }
src/Events/Custom_Tables/V1/Models/Builder.php CHANGED
@@ -1063,7 +1063,7 @@ class Builder {
1063
  * @return $this
1064
  */
1065
  public function order_by( $column = null, $order = 'ASC' ) {
1066
- if ( in_array( $order, [ 'ASC', 'DESC' ], true ) ) {
1067
  $this->order = [
1068
  'column' => null === $column ? $this->model->primary_key_name() : $column,
1069
  'order' => $order,
1063
  * @return $this
1064
  */
1065
  public function order_by( $column = null, $order = 'ASC' ) {
1066
+ if ( in_array( strtoupper( $order ), [ 'ASC', 'DESC' ], true ) ) {
1067
  $this->order = [
1068
  'column' => null === $column ? $this->model->primary_key_name() : $column,
1069
  'order' => $order,
src/Events/Custom_Tables/V1/Schema_Builder/Schema_Builder.php CHANGED
@@ -88,6 +88,14 @@ class Schema_Builder {
88
  * @return array<Table_Schema_Interface>
89
  */
90
  public function get_registered_table_schemas() {
 
 
 
 
 
 
 
 
91
  return apply_filters( 'tec_events_custom_tables_v1_table_schemas', [] );
92
  }
93
 
@@ -99,6 +107,14 @@ class Schema_Builder {
99
  * @return array<Field_Schema_Interface>
100
  */
101
  public function get_registered_field_schemas() {
 
 
 
 
 
 
 
 
102
  return apply_filters( 'tec_events_custom_tables_v1_field_schemas', [] );
103
  }
104
 
@@ -198,10 +214,20 @@ class Schema_Builder {
198
  *
199
  * @since 6.0.0
200
  *
201
- * @return array<mixed> A list of each creation or update result.
 
202
  */
203
- public function update_blog_tables() {
204
- return $this->up( false );
 
 
 
 
 
 
 
 
 
205
  }
206
 
207
  /**
@@ -241,6 +267,16 @@ class Schema_Builder {
241
  $results[ $custom_table::table_name() ] = $field_schema->update();
242
  }
243
 
 
 
 
 
 
 
 
 
 
 
244
  return count( $results ) ? array_merge( ...array_values( $results ) ) : [];
245
  }
246
 
@@ -272,7 +308,9 @@ class Schema_Builder {
272
  $schemas = $this->get_registered_table_schemas();
273
  foreach ( $schemas as $custom_table ) {
274
  /** @var Table_Schema_Interface $custom_table */
275
- WP_CLI::debug( 'Emptying table ' . $custom_table::table_name(), 'TEC' );
 
 
276
  $custom_table->empty_table();
277
  }
278
  }
88
  * @return array<Table_Schema_Interface>
89
  */
90
  public function get_registered_table_schemas() {
91
+ /**
92
+ * Filters the list of table schemas that will be used to build the database tables.
93
+ *
94
+ * @since 6.0.0
95
+ *
96
+ * @param array<Table_Schema_Interface> $table_schemas An array of table schema objects;
97
+ * empty by default.
98
+ */
99
  return apply_filters( 'tec_events_custom_tables_v1_table_schemas', [] );
100
  }
101
 
107
  * @return array<Field_Schema_Interface>
108
  */
109
  public function get_registered_field_schemas() {
110
+ /**
111
+ * Filters the list of field schemas that will be used to build the database tables.
112
+ *
113
+ * @since 6.0.0
114
+ *
115
+ * @param array<Field_Schema_Interface> $field_schemas An array of field schema objects;
116
+ * empty by default.
117
+ */
118
  return apply_filters( 'tec_events_custom_tables_v1_field_schemas', [] );
119
  }
120
 
214
  *
215
  * @since 6.0.0
216
  *
217
+ * @return array<string,mixed> A list of each creation or update result; empty if
218
+ * the blog tables have already been updated in this request.
219
  */
220
+ public function update_blog_tables( int $blog_id ): array {
221
+ if ( tribe_cache()[ 'ct1_schema_builder_update_blog_tables_' . $blog_id ] ) {
222
+ // Already up for this site in this request.
223
+ return [];
224
+ }
225
+
226
+ $result = $this->up( false );
227
+
228
+ tribe_cache()[ 'ct1_schema_builder_update_blog_tables_' . $blog_id ] = true;
229
+
230
+ return $result;
231
  }
232
 
233
  /**
267
  $results[ $custom_table::table_name() ] = $field_schema->update();
268
  }
269
 
270
+ /**
271
+ * Runs after the custom tables have been created or updated by The Events Calendar.
272
+ *
273
+ * @since 6.0.2
274
+ *
275
+ * @param array<string,bool> $results A map from each table name to whether it was created or updated correctly.
276
+ * @param bool $force Whether the tables were forced to be created or updated or not.
277
+ */
278
+ do_action( 'tec_events_custom_tables_v1_schema_builder_after_up', $results, $force );
279
+
280
  return count( $results ) ? array_merge( ...array_values( $results ) ) : [];
281
  }
282
 
308
  $schemas = $this->get_registered_table_schemas();
309
  foreach ( $schemas as $custom_table ) {
310
  /** @var Table_Schema_Interface $custom_table */
311
+ if ( class_exists( 'WP_CLI' ) ) {
312
+ WP_CLI::debug( 'Emptying table ' . $custom_table::table_name(), 'TEC' );
313
+ }
314
  $custom_table->empty_table();
315
  }
316
  }
src/Events/Custom_Tables/V1/Updates/Provider.php CHANGED
@@ -235,7 +235,11 @@ class Provider extends Service_Provider implements Provider_Contract {
235
  * @param WP_REST_Request $request A reference to the REST Request that is being
236
  * processed.
237
  */
238
- public function commit_rest_update( WP_Post $post, WP_REST_Request $request ) {
 
 
 
 
239
  $this->container->make( Controller::class )->commit_post_rest_update( $post, $request );
240
  }
241
 
@@ -273,9 +277,13 @@ class Provider extends Service_Provider implements Provider_Contract {
273
  *
274
  * @since 6.0.0
275
  *
276
- * @param int $post_id The deleted Event post ID.
277
  */
278
- public function delete_custom_tables_data( int $post_id ) {
 
 
 
 
279
  $this->container->make( Controller::class )->delete_custom_tables_data( $post_id );
280
  }
281
 
235
  * @param WP_REST_Request $request A reference to the REST Request that is being
236
  * processed.
237
  */
238
+ public function commit_rest_update( $post, $request ) {
239
+ if ( ! ( $post instanceof WP_Post && $request instanceof WP_REST_Request ) ) {
240
+ return;
241
+ }
242
+
243
  $this->container->make( Controller::class )->commit_post_rest_update( $post, $request );
244
  }
245
 
277
  *
278
  * @since 6.0.0
279
  *
280
+ * @param int $post_id The deleted Event post ID.
281
  */
282
+ public function delete_custom_tables_data( $post_id ) {
283
+ if ( ! is_int( $post_id ) ) {
284
+ return;
285
+ }
286
+
287
  $this->container->make( Controller::class )->delete_custom_tables_data( $post_id );
288
  }
289
 
src/Events/Custom_Tables/V1/WP_Query/Custom_Tables_Query.php CHANGED
@@ -52,8 +52,10 @@ class Custom_Tables_Query extends WP_Query {
52
  // Initialize a new instance of the query.
53
  $ct_query = new self();
54
  $ct_query->init();
55
- $ct_query->query = $ct_query->filter_query_vars( wp_parse_args( (array) $override_args, $wp_query->query ) );
56
- $ct_query->query_vars = $ct_query->query;
 
 
57
 
58
  // Keep a reference to the original `WP_Query` instance.
59
  $ct_query->wp_query = $wp_query;
@@ -127,7 +129,7 @@ class Custom_Tables_Query extends WP_Query {
127
  add_filter( 'posts_fields', [ $this, 'redirect_posts_fields' ], 10, 2 );
128
  // While not ideal, this is the only way to intervene on `GROUP BY` in the `get_posts()` method.
129
  add_filter( 'posts_groupby', [ $this, 'group_posts_by_occurrence_id' ], 10, 2 );
130
- add_filter( 'posts_orderby', [ $this, 'order_by_occurrence_id' ], 10, 2 );
131
  add_filter( 'posts_where', [ $this, 'filter_by_date' ], 10, 2 );
132
  add_filter( 'posts_where', [ $this, 'filter_where' ], 10, 2 );
133
  add_filter( 'posts_join', [ $this, 'join_occurrences_table' ], 10, 2 );
@@ -174,6 +176,7 @@ class Custom_Tables_Query extends WP_Query {
174
  && empty( $this->get( 'no_found_rows', false ) )
175
  ) {
176
  $this->wp_query->found_posts = $this->found_posts;
 
177
  }
178
 
179
  // Set the request SQL that actually ran to allow easier debugging of the query.
@@ -197,7 +200,7 @@ class Custom_Tables_Query extends WP_Query {
197
  *
198
  * @return string The WHERE clause as produced by the `WP_Query` instance, untouched by the method.
199
  */
200
- public function replace_meta_query( $search, WP_Query $wp_query ) {
201
  if ( $wp_query !== $this ) {
202
  // Only target the class own instance.
203
  return $search;
@@ -239,7 +242,7 @@ class Custom_Tables_Query extends WP_Query {
239
  *
240
  * @return string The filtered `SELECT` clause.
241
  */
242
- public function redirect_posts_fields( $request_fields, WP_Query $query = null ) {
243
  if ( $this !== $query ) {
244
  return $request_fields;
245
  }
@@ -270,19 +273,25 @@ class Custom_Tables_Query extends WP_Query {
270
  *
271
  * @return string The updated `GROUP BY` SQL clause.
272
  */
273
- public function group_posts_by_occurrence_id( $groupby, WP_Query $query = null ) {
274
  if ( $this !== $query ) {
275
  return $groupby;
276
  }
277
 
278
  remove_filter( 'posts_groupby', [ $this, 'group_posts_by_occurrence_id' ] );
279
 
280
- return '';
 
 
 
 
281
  }
282
 
283
  /**
284
  * Replace the SQL clause that would order posts by ID to order them by Occurrence ID.
285
  *
 
 
286
  * @since 6.0.0
287
  *
288
  * @param string $order_by The input `ORDER BY` SQL clause, as produced by the
@@ -292,25 +301,54 @@ class Custom_Tables_Query extends WP_Query {
292
  * @return string The filtered `ORDER BY` SQL clause, redirecting `wp_posts.ID` to Occurrence ID,
293
  * if required.
294
  */
295
- public function order_by_occurrence_id( $order_by, WP_Query $query = null ) {
296
  if ( $this !== $query ) {
297
  return $order_by;
298
  }
299
 
300
- remove_filter( 'posts_orderby', [ $this, 'order_by_occurrence_id' ] );
301
 
 
 
302
  $occurrences = Occurrences::table_name( true );
303
- global $wpdb;
304
 
305
- /*
306
- * Replace, implicitly redirecting them, a curated list of order criteria to the Occurrence-table
307
- * based criteria.
308
- *
309
- * @todo is this code eligible for a more general purpose use? Should it be more flexible?
310
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
311
  $order_by = str_replace(
312
- [ $wpdb->posts . '.ID', 'event_date', 'event_duration' ],
313
- [ $occurrences . '.occurrence_id', $occurrences . '.start_date', $occurrences . '.duration' ],
314
  $order_by
315
  );
316
 
@@ -353,7 +391,11 @@ class Custom_Tables_Query extends WP_Query {
353
  *
354
  * @return string The `WHERE` SQL clause, modified to be date-bound, if required.
355
  */
356
- public function filter_where( $where, WP_Query $query ) {
 
 
 
 
357
  /**
358
  * Filters the `WHERE` statement produced by the Custom Tables Query.
359
  *
@@ -378,7 +420,7 @@ class Custom_Tables_Query extends WP_Query {
378
  *
379
  * @return string The `WHERE` SQL clause, modified to be date-bound, if required.
380
  */
381
- public function filter_by_date( $where, WP_Query $query = null ) {
382
  if ( $this !== $query ) {
383
  return $where;
384
  }
52
  // Initialize a new instance of the query.
53
  $ct_query = new self();
54
  $ct_query->init();
55
+ $filtered_query = $ct_query->filter_query_vars( wp_parse_args( (array) $override_args, $wp_query->query ) );
56
+ $ct_query->query = $filtered_query;
57
+ $filtered_query_vars = $ct_query->filter_query_vars( wp_parse_args( (array) $override_args, $wp_query->query_vars ) );
58
+ $ct_query->query_vars = $filtered_query_vars;
59
 
60
  // Keep a reference to the original `WP_Query` instance.
61
  $ct_query->wp_query = $wp_query;
129
  add_filter( 'posts_fields', [ $this, 'redirect_posts_fields' ], 10, 2 );
130
  // While not ideal, this is the only way to intervene on `GROUP BY` in the `get_posts()` method.
131
  add_filter( 'posts_groupby', [ $this, 'group_posts_by_occurrence_id' ], 10, 2 );
132
+ add_filter( 'posts_orderby', [ $this, 'order_by_occurrence_id' ], 100, 2 );
133
  add_filter( 'posts_where', [ $this, 'filter_by_date' ], 10, 2 );
134
  add_filter( 'posts_where', [ $this, 'filter_where' ], 10, 2 );
135
  add_filter( 'posts_join', [ $this, 'join_occurrences_table' ], 10, 2 );
176
  && empty( $this->get( 'no_found_rows', false ) )
177
  ) {
178
  $this->wp_query->found_posts = $this->found_posts;
179
+ $this->wp_query->max_num_pages = $this->max_num_pages;
180
  }
181
 
182
  // Set the request SQL that actually ran to allow easier debugging of the query.
200
  *
201
  * @return string The WHERE clause as produced by the `WP_Query` instance, untouched by the method.
202
  */
203
+ public function replace_meta_query( $search, $wp_query ) {
204
  if ( $wp_query !== $this ) {
205
  // Only target the class own instance.
206
  return $search;
242
  *
243
  * @return string The filtered `SELECT` clause.
244
  */
245
+ public function redirect_posts_fields( $request_fields, $query = null ) {
246
  if ( $this !== $query ) {
247
  return $request_fields;
248
  }
273
  *
274
  * @return string The updated `GROUP BY` SQL clause.
275
  */
276
+ public function group_posts_by_occurrence_id( $groupby, $query = null ) {
277
  if ( $this !== $query ) {
278
  return $groupby;
279
  }
280
 
281
  remove_filter( 'posts_groupby', [ $this, 'group_posts_by_occurrence_id' ] );
282
 
283
+ $occurrences = Occurrences::table_name( true );
284
+ global $wpdb;
285
+
286
+ // Group by the occurrence ID, not the post ID.
287
+ return str_replace( "$wpdb->posts.ID", "$occurrences.occurrence_id", $groupby );
288
  }
289
 
290
  /**
291
  * Replace the SQL clause that would order posts by ID to order them by Occurrence ID.
292
  *
293
+ * The correct ORDER BY clause will be built from the redirection map.
294
+ *
295
  * @since 6.0.0
296
  *
297
  * @param string $order_by The input `ORDER BY` SQL clause, as produced by the
301
  * @return string The filtered `ORDER BY` SQL clause, redirecting `wp_posts.ID` to Occurrence ID,
302
  * if required.
303
  */
304
+ public function order_by_occurrence_id( $order_by, $query = null ) {
305
  if ( $this !== $query ) {
306
  return $order_by;
307
  }
308
 
309
+ remove_filter( 'posts_orderby', [ $this, 'order_by_occurrence_id' ], 100 );
310
 
311
+ $original_order_by = $this->wp_query->query_vars['orderby'] ?? [];
312
+ $normalized_order_by = tribe_normalize_orderby( $original_order_by );
313
  $occurrences = Occurrences::table_name( true );
 
314
 
315
+ if ( ! empty( $normalized_order_by ) ) {
316
+ global $wpdb;
317
+
318
+ // Rebuild the ORDER string based on the custom tables redirection.
319
+ $buffer = [];
320
+ $meta_query_clauses = $this->meta_query->get_clauses();
321
+ foreach ( $normalized_order_by as $original_key => $direction ) {
322
+ if ( $original_key === 'meta_value' ) {
323
+ // Handle queries with on meta value.
324
+ $original_key = array_key_first( $meta_query_clauses );
325
+ }
326
+
327
+ if ( in_array( $original_key, [ 'ID', $wpdb->posts . '.ID' ], true ) ) {
328
+ // If the order is by post ID, order by post ID and occurrence ID.
329
+ $buffer[] = "ID $direction, $occurrences.occurrence_id $direction";
330
+ continue;
331
+ }
332
+
333
+ if ( ! ( is_string( $original_key ) && isset( $meta_query_clauses[ $original_key ] ) ) ) {
334
+ // Not a key we redirect or handle.
335
+ $buffer[] = $original_key . ' ' . $direction;
336
+ continue;
337
+ }
338
+
339
+ $alias = $meta_query_clauses[ $original_key ]['alias'];
340
+ $key = $meta_query_clauses[ $original_key ]['key'];
341
+ $cast = ! empty( $meta_query_clauses[ $original_key ]['cast'] ) ?
342
+ $meta_query_clauses[ $original_key ]['cast'] : 'CHAR';
343
+ $buffer[] = sprintf( "CAST(%s.%s AS %s) %s", $alias, $key, $cast, $direction );
344
+ }
345
+ $order_by = implode( ', ', $buffer );
346
+ }
347
+
348
+ // Handle some curated keys.
349
  $order_by = str_replace(
350
+ [ 'event_date', 'event_date_utc', 'event_duration' ],
351
+ [ $occurrences . '.start_date', $occurrences . '.start_date_utc', $occurrences . '.duration' ],
352
  $order_by
353
  );
354
 
391
  *
392
  * @return string The `WHERE` SQL clause, modified to be date-bound, if required.
393
  */
394
+ public function filter_where( $where, $query ) {
395
+ if ( ! $query instanceof WP_Query ) {
396
+ return $where;
397
+ }
398
+
399
  /**
400
  * Filters the `WHERE` statement produced by the Custom Tables Query.
401
  *
420
  *
421
  * @return string The `WHERE` SQL clause, modified to be date-bound, if required.
422
  */
423
+ public function filter_by_date( $where, $query = null ) {
424
  if ( $this !== $query ) {
425
  return $where;
426
  }
src/Events/Custom_Tables/V1/WP_Query/Modifiers/Events_Admin_List_Modifier.php CHANGED
@@ -41,11 +41,14 @@ class Events_Admin_List_Modifier extends Base_Modifier {
41
  * @since 6.0.0
42
  *
43
  * @param array<string,string> $pieces Query clauses.
44
- * @param WP_Query $query Main query object.
45
  *
46
- * @return array<string,string>
47
  */
48
- public function filter_legacy_child_events( array $pieces, WP_Query $query ) {
 
 
 
 
49
  $pieces['where'] .= ' AND post_parent = 0 ';
50
  $this->unhook();
51
 
41
  * @since 6.0.0
42
  *
43
  * @param array<string,string> $pieces Query clauses.
 
44
  *
45
+ * @return array<string,string> The modified WHERE query clauses.
46
  */
47
+ public function filter_legacy_child_events( $pieces ) {
48
+ if ( ! is_array( $pieces ) ) {
49
+ return $pieces;
50
+ }
51
+
52
  $pieces['where'] .= ' AND post_parent = 0 ';
53
  $this->unhook();
54
 
src/Events/Custom_Tables/V1/WP_Query/Modifiers/Events_Not_In_Series_Modifier.php CHANGED
@@ -68,7 +68,7 @@ class Events_Not_In_Series_Modifier extends Base_Modifier {
68
  *
69
  * @return string
70
  */
71
- public function join_on_series_relationships_table( $join, WP_Query $query ) {
72
  if ( $query !== $this->query ) {
73
  return $join;
74
  }
@@ -95,7 +95,7 @@ class Events_Not_In_Series_Modifier extends Base_Modifier {
95
  *
96
  * @return string
97
  */
98
- public function where_event_is_unrelated_to_series( $where, WP_Query $query ) {
99
  if ( $query !== $this->query ) {
100
  return $where;
101
  }
68
  *
69
  * @return string
70
  */
71
+ public function join_on_series_relationships_table( $join, $query ) {
72
  if ( $query !== $this->query ) {
73
  return $join;
74
  }
95
  *
96
  * @return string
97
  */
98
+ public function where_event_is_unrelated_to_series( $where, $query ) {
99
  if ( $query !== $this->query ) {
100
  return $where;
101
  }
src/Events/Custom_Tables/V1/WP_Query/Modifiers/Events_Only_Modifier.php CHANGED
@@ -58,8 +58,8 @@ class Events_Only_Modifier extends Base_Modifier {
58
  *
59
  * @return null|array<WP_Post|int> The filtered value of the posts, injected before the query actually runs.
60
  */
61
- public function filter_posts_pre_query( $posts = null, WP_Query $wp_query = null ) {
62
- if ( ! $this->is_target_query( $wp_query ) ) {
63
  return $posts;
64
  }
65
 
@@ -90,7 +90,16 @@ class Events_Only_Modifier extends Base_Modifier {
90
 
91
  $this->done();
92
 
93
- return $posts;
 
 
 
 
 
 
 
 
 
94
  }
95
 
96
  /**
58
  *
59
  * @return null|array<WP_Post|int> The filtered value of the posts, injected before the query actually runs.
60
  */
61
+ public function filter_posts_pre_query( $posts = null, $wp_query = null ) {
62
+ if ( ! ( $wp_query instanceof WP_Query && $this->is_target_query( $wp_query ) ) ) {
63
  return $posts;
64
  }
65
 
90
 
91
  $this->done();
92
 
93
+ /**
94
+ * Allow filtering just for when applied the Events Only Modifier.
95
+ *
96
+ * @since 6.0.2
97
+ *
98
+ * @param WP_Query|null $wp_query A reference to the `WP_Query` instance that is currently running.
99
+ * @param array<WP_Post|int>|null $posts The filter input value, it could have already be filtered by other
100
+ * plugins at this stage.
101
+ */
102
+ return apply_filters( 'tec_events_custom_tables_v1_events_only_modifier_filter_posts_pre_query', $posts, $wp_query );
103
  }
104
 
105
  /**
src/Events/Custom_Tables/V1/WP_Query/Modifiers/Events_Series_Relationship_Modifier.php CHANGED
@@ -54,7 +54,7 @@ class Events_Series_Relationship_Modifier extends Base_Modifier {
54
  /**
55
  * {@inheritdoc}
56
  */
57
- public function join_on_series_relationships_table( $join, WP_Query $query ) {
58
  if ( $query !== $this->query ) {
59
  return $join;
60
  }
@@ -79,7 +79,7 @@ class Events_Series_Relationship_Modifier extends Base_Modifier {
79
  /**
80
  * {@inheritdoc}
81
  */
82
- public function where_event_is_related_to_series( $where, WP_Query $query ) {
83
  if ( $query !== $this->query ) {
84
  return $where;
85
  }
54
  /**
55
  * {@inheritdoc}
56
  */
57
+ public function join_on_series_relationships_table( $join, $query ) {
58
  if ( $query !== $this->query ) {
59
  return $join;
60
  }
79
  /**
80
  * {@inheritdoc}
81
  */
82
+ public function where_event_is_related_to_series( $where, $query ) {
83
  if ( $query !== $this->query ) {
84
  return $where;
85
  }
src/Events/Custom_Tables/V1/WP_Query/Modifiers/Occurrences_Series_Relationship_Modifier.php CHANGED
@@ -54,7 +54,7 @@ class Occurrences_Series_Relationship_Modifier extends Base_Modifier {
54
  /**
55
  * {@inheritdoc}
56
  */
57
- public function join_on_series_relationships_table( $join, WP_Query $query ) {
58
  if ( $query !== $this->query ) {
59
  return $join;
60
  }
@@ -77,7 +77,7 @@ class Occurrences_Series_Relationship_Modifier extends Base_Modifier {
77
  /**
78
  * {@inheritdoc}
79
  */
80
- public function where_event_is_related_to_series( $where, WP_Query $query ) {
81
  if ( $query !== $this->query ) {
82
  return $where;
83
  }
54
  /**
55
  * {@inheritdoc}
56
  */
57
+ public function join_on_series_relationships_table( $join, $query ) {
58
  if ( $query !== $this->query ) {
59
  return $join;
60
  }
77
  /**
78
  * {@inheritdoc}
79
  */
80
+ public function where_event_is_related_to_series( $where, $query ) {
81
  if ( $query !== $this->query ) {
82
  return $where;
83
  }
src/Tribe/Adjacent_Events.php CHANGED
@@ -195,8 +195,6 @@ class Tribe__Events__Adjacent_Events {
195
  * @return null|WP_Post
196
  */
197
  public function get_closest_event( $mode = 'next' ) {
198
- global $wpdb;
199
-
200
  $post_obj = get_post( $this->current_event_id );
201
 
202
  if ( 'previous' === $mode ) {
195
  * @return null|WP_Post
196
  */
197
  public function get_closest_event( $mode = 'next' ) {
 
 
198
  $post_obj = get_post( $this->current_event_id );
199
 
200
  if ( 'previous' === $mode ) {
src/Tribe/Aggregator/CLI/Command.php CHANGED
@@ -99,7 +99,7 @@ class Tribe__Events__Aggregator__CLI__Command {
99
  * ---
100
  *
101
  * [--column_map=<column_map>]
102
- * : the column mapping that should be used for CSV imports; required when runnin CSV imports. A comma separated
103
  * list where the order counts.
104
  * For events the available columns are: name, description, excerpt, start_date, start_time, end_date, end_time,
105
  * timezone, all_day, hide, sticky, venue_name, organizer_name, show_map_link, show_map, cost, currency_symbol,
99
  * ---
100
  *
101
  * [--column_map=<column_map>]
102
+ * : the column mapping that should be used for CSV imports; required when running CSV imports. A comma separated
103
  * list where the order counts.
104
  * For events the available columns are: name, description, excerpt, start_date, start_time, end_date, end_time,
105
  * timezone, all_day, hide, sticky, venue_name, organizer_name, show_map_link, show_map, cost, currency_symbol,
src/Tribe/I18n.php CHANGED
@@ -103,7 +103,7 @@ class I18n {
103
  }
104
 
105
  /**
106
- * Get all possible translations for a String based on the given Languages and Domains
107
  *
108
  * WARNING: This function is slow because it deals with files, so don't overuse it!
109
  * Differently from the `get_i18n_strings` method this will not use any domain that's not specified.
@@ -156,6 +156,60 @@ class I18n {
156
  return $strings;
157
  }
158
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
  /**
160
  * Executes a callback ensuring the `current_locale` will be set to the specified language code.
161
  *
103
  }
104
 
105
  /**
106
+ * Get all possible translations for a String based on the given Languages and Domains.
107
  *
108
  * WARNING: This function is slow because it deals with files, so don't overuse it!
109
  * Differently from the `get_i18n_strings` method this will not use any domain that's not specified.
156
  return $strings;
157
  }
158
 
159
+ /**
160
+ * Get all possible translations for a URL String based on the given Languages and Domains.
161
+ *
162
+ * WARNING: This function is slow because it deals with files, so don't overuse it!
163
+ * Differently from the `get_i18n_strings` method this will not use any domain that's not specified.
164
+ *
165
+ * This function is same as above one, but instead of sanitizing with 'sanitize_key()' which removes '%',
166
+ * it uses 'sanitize_title()'.
167
+ *
168
+ * @since 6.0.2
169
+ *
170
+ * @param array<string> $strings An array of strings (required).
171
+ * @param array<string> $languages Which l10n to fetch the string (required).
172
+ * @param array<string> $domains Possible domains to re-load.
173
+ * @param int $flags An integer resulting from the combination of compilation flags;
174
+ * defaults to `static::COMPILE_ALL` to compile all versions of the translations.
175
+ * `static::COMPILE_INPUT` will compile the translation for the string, as input.
176
+ * `static::COMPILE_STRTOLOWER` will compile the translation for the string in its
177
+ * lowercase version.
178
+ * `static::COMPILE_UCFIRST` will compile the translation for the string in its title
179
+ * version.
180
+ *
181
+ * @return array<string,array|string> A multi level array with the possible translations for the given strings.
182
+ */
183
+ public function get_i18n_url_strings_for_domains( $strings, $languages, $domains = [ 'default' ], $flags = 7 ) {
184
+ sort( $languages );
185
+ $strings_buffer = [ $strings ];
186
+
187
+ foreach ( $languages as $language ) {
188
+ // Override the current locale w/ the one we need to compile the translations.
189
+ $language_strings = $this->with_locale(
190
+ $language,
191
+ [ $this, 'compile_translations' ],
192
+ [ $strings, $domains, $flags ]
193
+ );
194
+ $strings_buffer[] = $language_strings;
195
+ }
196
+
197
+ $strings = count( $strings_buffer ) > 1
198
+ ? array_merge_recursive( ... $strings_buffer )
199
+ : reset( $strings_buffer );
200
+
201
+ // Prevent empty strings and duplicates.
202
+ foreach ( $strings as $key => $value ) {
203
+ $strings[ $key ] = array_filter(
204
+ array_unique(
205
+ array_map( 'sanitize_title', (array) $value )
206
+ )
207
+ );
208
+ }
209
+
210
+ return $strings;
211
+ }
212
+
213
  /**
214
  * Executes a callback ensuring the `current_locale` will be set to the specified language code.
215
  *
src/Tribe/Integrations/ACF/ACF.php CHANGED
@@ -26,7 +26,7 @@ class Tribe__Events__Integrations__ACF__ACF {
26
  }
27
 
28
  /**
29
- * Hooks the filters and actions neede for this integration to work.
30
  *
31
  * @since 4.6.3
32
  */
@@ -35,7 +35,7 @@ class Tribe__Events__Integrations__ACF__ACF {
35
  }
36
 
37
  /**
38
- * Load our compatability JS script to supplement the events-admin.js script.
39
  *
40
  * @since 4.6.3
41
  */
26
  }
27
 
28
  /**
29
+ * Hooks the filters and actions needed for this integration to work.
30
  *
31
  * @since 4.6.3
32
  */
35
  }
36
 
37
  /**
38
+ * Load our compatibility JS script to supplement the events-admin.js script.
39
  *
40
  * @since 4.6.3
41
  */
src/Tribe/Integrations/Divi/Service_Provider.php CHANGED
@@ -32,7 +32,6 @@ class Service_Provider extends \tad_DI52_ServiceProvider {
32
  return;
33
  }
34
 
35
- $this->hooks();
36
  }
37
 
38
  /**
@@ -40,10 +39,21 @@ class Service_Provider extends \tad_DI52_ServiceProvider {
40
  *
41
  * @since 6.0.1
42
  */
43
- protected function hooks() {
44
  add_filter( 'tribe_post_id', [ $this, 'filter_tribe_post_id' ] );
45
  }
46
 
 
 
 
 
 
 
 
 
 
 
 
47
  /**
48
  * Get the $event_id using get_queried_object_id() for Divi users who aren't using the Default Events Template.
49
  *
@@ -52,19 +62,17 @@ class Service_Provider extends \tad_DI52_ServiceProvider {
52
  * @param int $event_id The event ID.
53
  */
54
  public function filter_tribe_post_id( $event_id ) {
55
- // try the "normal" way first.
56
  if ( empty( $event_id ) ) {
57
  $event_id = get_the_ID();
58
  }
59
 
60
- // look for a post
61
  if ( ! tribe_is_event( $event_id ) && tribe_get_request_var( 'et_post_id' ) ) {
62
  $event_id = tribe_get_request_var( 'et_post_id' );
63
  }
64
 
65
  if ( ! tribe_is_event( $event_id ) ) {
66
- wp_reset_postdata();
67
-
68
  $event_id = get_queried_object_id();
69
  }
70
 
32
  return;
33
  }
34
 
 
35
  }
36
 
37
  /**
39
  *
40
  * @since 6.0.1
41
  */
42
+ protected function hooks(): void {
43
  add_filter( 'tribe_post_id', [ $this, 'filter_tribe_post_id' ] );
44
  }
45
 
46
+ /**
47
+ * Unregisters the filters and actions required for this integration to work.
48
+ *
49
+ * @since 6.0.2
50
+ *
51
+ * @return void
52
+ */
53
+ public function unregister(): void {
54
+ remove_filter( 'tribe_post_id', [ $this, 'filter_tribe_post_id' ] );
55
+ }
56
+
57
  /**
58
  * Get the $event_id using get_queried_object_id() for Divi users who aren't using the Default Events Template.
59
  *
62
  * @param int $event_id The event ID.
63
  */
64
  public function filter_tribe_post_id( $event_id ) {
65
+ // Try the "normal" way first.
66
  if ( empty( $event_id ) ) {
67
  $event_id = get_the_ID();
68
  }
69
 
70
+ // Look for a post in the query variables.
71
  if ( ! tribe_is_event( $event_id ) && tribe_get_request_var( 'et_post_id' ) ) {
72
  $event_id = tribe_get_request_var( 'et_post_id' );
73
  }
74
 
75
  if ( ! tribe_is_event( $event_id ) ) {
 
 
76
  $event_id = get_queried_object_id();
77
  }
78
 
src/Tribe/Integrations/Manager.php CHANGED
@@ -4,6 +4,7 @@ use Tribe\Events\Integrations\Beaver_Builder;
4
  use Tribe\Events\Integrations\Fusion\Service_Provider as Fusion_Integration;
5
  use Tribe\Events\Integrations\Hello_Elementor\Service_Provider as Hello_Elementor_Integration;
6
  use Tribe\Events\Integrations\WP_Rocket;
 
7
 
8
  /**
9
  * Class Tribe__Events__Integrations__Manager
@@ -43,6 +44,7 @@ class Tribe__Events__Integrations__Manager {
43
  $this->load_wpml_integration();
44
  $this->load_X_theme_integration();
45
  $this->load_wp_rocket_integration();
 
46
  $this->load_beaver_builder_integration();
47
  $this->load_fusion_integration();
48
  $this->load_hello_elementor_integration();
@@ -160,6 +162,25 @@ class Tribe__Events__Integrations__Manager {
160
  return true;
161
  }
162
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  /**
164
  * Loads our beaver builder plugin integration.
165
  *
4
  use Tribe\Events\Integrations\Fusion\Service_Provider as Fusion_Integration;
5
  use Tribe\Events\Integrations\Hello_Elementor\Service_Provider as Hello_Elementor_Integration;
6
  use Tribe\Events\Integrations\WP_Rocket;
7
+ use Tribe\Events\Integrations\Restrict_Content_Pro\Service_Provider as RCP_Integration;
8
 
9
  /**
10
  * Class Tribe__Events__Integrations__Manager
44
  $this->load_wpml_integration();
45
  $this->load_X_theme_integration();
46
  $this->load_wp_rocket_integration();
47
+ $this->load_rcp_integration();
48
  $this->load_beaver_builder_integration();
49
  $this->load_fusion_integration();
50
  $this->load_hello_elementor_integration();
162
  return true;
163
  }
164
 
165
+ /**
166
+ * Loads our Restrict Content Pro integration.
167
+ *
168
+ * @since 6.0.2
169
+ *
170
+ * @return bool
171
+ */
172
+ private function load_rcp_integration() {
173
+ if ( ! function_exists( 'rcp_user_can_access' ) ) {
174
+ return false;
175
+ }
176
+
177
+ tribe_singleton( \Tribe\Events\Integrations\RCP_Integration::class, \Tribe\Events\Integrations\RCP_Integration::class );
178
+
179
+ tribe( RCP_Integration::class )->hook();
180
+
181
+ return true;
182
+ }
183
+
184
  /**
185
  * Loads our beaver builder plugin integration.
186
  *
src/Tribe/Integrations/Restrict_Content_Pro/Service_Provider.php ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Handles compatibility with Restrict Content Pro plugin.
4
+ *
5
+ * @package Tribe\Events\Integrations\Restrict_Content_Pro
6
+ * @since 6.0.2
7
+ */
8
+
9
+ namespace Tribe\Events\Integrations\Restrict_Content_Pro;
10
+
11
+ use Tribe__Events__Main as TEC;
12
+
13
+ /**
14
+ * Integrations with Restrict Content Pro plugin.
15
+ *
16
+ * @package Tribe\Events\Integrations
17
+ *
18
+ * @since 6.0.2
19
+ */
20
+
21
+ class Service_Provider {
22
+
23
+ /**
24
+ * Option slug used for storing the choice to apply post-type restrictions to the calendar views.
25
+ *
26
+ * @since 6.0.2
27
+ *
28
+ * @var string
29
+ */
30
+ protected static $option_slug = 'tec_events_rcp_hide_on_views';
31
+
32
+ /**
33
+ * Hooks all the required methods for Restrict Content Pro usage on our code.
34
+ *
35
+ * @since 6.0.2
36
+ *
37
+ * @return void Action hook with no return.
38
+ */
39
+ public function hook() {
40
+ // Bail when not on V2.
41
+ if ( ! tribe_events_views_v2_is_enabled() ) {
42
+ return;
43
+ }
44
+
45
+ // add actions
46
+ add_action( 'rcp_post_type_restrictions', [ $this, 'add_rcp_post_type_restrictions' ], 10, 2 );
47
+ add_action( 'rcp_save_post_type_restrictions', [ $this, 'rcp_save_post_type_restrictions' ], 20 );
48
+ add_action( 'rcp_action_save_post_type_restrictions', [ $this, 'rcp_save_post_type_restrictions' ], 20 );
49
+
50
+
51
+ // add hooks
52
+ add_filter( 'tribe_template_done', [ $this, 'filter_view_events' ], 20, 3 );
53
+ }
54
+
55
+ /**
56
+ * Adds control for applying post-type restrictions to the calendar views.
57
+ *
58
+ * @since 6.0.2
59
+ */
60
+ public function add_rcp_post_type_restrictions() {
61
+ $option = tribe_get_option( self::$option_slug, false );
62
+ ?>
63
+ <p>
64
+ <label for="<?php echo esc_attr( self::$option_slug ); ?>">
65
+ <input type="checkbox" name="<?php echo esc_attr( self::$option_slug ); ?>" id="<?php echo esc_attr( self::$option_slug ); ?>" value="1" <?php checked( $option, '1' ); ?>>
66
+ &nbsp;<?php echo esc_html_x( "Hide restricted events on calendar views.", 'Text label for control to hide restricted events on main calendar views.', 'the-events-calendar' ); ?>
67
+ </label>
68
+ </p>
69
+ <?php
70
+ }
71
+
72
+ /**
73
+ * Saves the value for applying post-type restrictions to the calendar views.
74
+ *
75
+ * @since 6.0.2
76
+ *
77
+ * @return void
78
+ */
79
+ public function rcp_save_post_type_restrictions() {
80
+ if ( empty( tribe_get_request_var( self::$option_slug ) ) ) {
81
+ tribe_remove_option( self::$option_slug );
82
+ return;
83
+ }
84
+
85
+ tribe_update_option( self::$option_slug, tribe_get_request_var( self::$option_slug ) );
86
+ }
87
+
88
+ /**
89
+ * Filter displayed events based on RCP restrictions.
90
+ *
91
+ * This should effect all calendar views.
92
+ *
93
+ * $done is null by default, if you return _anything_ other than null, the template won't display.
94
+ * There are actually 4 params passed, but the last is $echo - useless for our purposes so we don't include it.
95
+ *
96
+ * @since 6.0.2
97
+ *
98
+ * @param string null Whether to continue displaying the template or not.
99
+ * @param array $name Template name. Unused although it could be used for targeting a specific template.
100
+ * @param array $context Any context data you need to expose to this file.
101
+ *
102
+ * @return null|bool Null to display the event, boolean false to not.
103
+ */
104
+ public function filter_view_events( $done, $name, $context ) {
105
+ // Obey the setting.
106
+ if ( ! tribe_get_option( self::$option_slug, false ) ) {
107
+ return $done;
108
+ }
109
+
110
+ // No event in the context. We're using this to filter out the "larger" view templates, etc
111
+ if ( empty( $context['event'] ) ) {
112
+ return $done;
113
+ }
114
+
115
+ // Avoid issues with single event page. RCP handles that just fine.
116
+ if ( is_single( TEC::POSTTYPE ) ) {
117
+ return $done;
118
+ }
119
+
120
+ // Get the event.
121
+ $event = $context['event'];
122
+
123
+ // Malformed event?
124
+ if ( empty( $event ) || ! $event instanceof \WP_Post ) {
125
+ return $done;
126
+ }
127
+
128
+ // Can current user access the event?
129
+ if ( rcp_user_can_access( get_current_user_id(), $event->ID ) ) {
130
+ return $done;
131
+ }
132
+
133
+ // No? return something other than null - the event won't display.
134
+ return false;
135
+ }
136
+
137
+ /**
138
+ * Get the option slug.
139
+ *
140
+ * @since 6.0.2
141
+ *
142
+ * @return string $option_slug The option slug for this setting.
143
+ */
144
+ public static function get_slug() {
145
+ return self::$option_slug;
146
+ }
147
+
148
+ }
src/Tribe/Integrations/WPML/Meta.php CHANGED
@@ -24,10 +24,11 @@ class Tribe__Events__Integrations__WPML__Meta {
24
  * @param string $value
25
  * @param int $object_id
26
  * @param string $meta_key
 
27
  *
28
  * @return mixed The translated id for _EventOrganizerID & _EventVenueID or false.
29
  */
30
- public function translate_post_id( $value, $object_id, $meta_key ) {
31
  if ( ! empty( $_POST ) ) {
32
  return $value;
33
  }
@@ -49,7 +50,7 @@ class Tribe__Events__Integrations__WPML__Meta {
49
  $value = $this->get_post_meta( $object_id, $meta_key );
50
 
51
  if ( empty( $value ) ) {
52
- return false;
53
  }
54
 
55
  $type = false !== strpos( $meta_key, 'Organizer' )
@@ -67,7 +68,7 @@ class Tribe__Events__Integrations__WPML__Meta {
67
  * @param string $type The type of element the ID belongs to.
68
  * @param bool true If set to true it will always return a value (the original value, if translation is missing)
69
  */
70
- $id = apply_filters( 'wpml_object_id', $id, $type, true );
71
  }
72
  $post_id = $ids;
73
  } else {
@@ -78,7 +79,7 @@ class Tribe__Events__Integrations__WPML__Meta {
78
  * @param string $type The type of element the ID belongs to.
79
  * @param bool true If set to true it will always return a value (the original value, if translation is missing)
80
  */
81
- $post_id = apply_filters( 'wpml_object_id', $post_id, $type, true );
82
  }
83
  }
84
 
24
  * @param string $value
25
  * @param int $object_id
26
  * @param string $meta_key
27
+ * @param bool $single
28
  *
29
  * @return mixed The translated id for _EventOrganizerID & _EventVenueID or false.
30
  */
31
+ public function translate_post_id( $value, $object_id, $meta_key, $single ) {
32
  if ( ! empty( $_POST ) ) {
33
  return $value;
34
  }
50
  $value = $this->get_post_meta( $object_id, $meta_key );
51
 
52
  if ( empty( $value ) ) {
53
+ return $single ? [ $value ] : $value;
54
  }
55
 
56
  $type = false !== strpos( $meta_key, 'Organizer' )
68
  * @param string $type The type of element the ID belongs to.
69
  * @param bool true If set to true it will always return a value (the original value, if translation is missing)
70
  */
71
+ $id = (string) apply_filters( 'wpml_object_id', $id, $type, true );
72
  }
73
  $post_id = $ids;
74
  } else {
79
  * @param string $type The type of element the ID belongs to.
80
  * @param bool true If set to true it will always return a value (the original value, if translation is missing)
81
  */
82
+ $post_id = (string) apply_filters( 'wpml_object_id', $post_id, $type, true );
83
  }
84
  }
85
 
src/Tribe/Integrations/WPML/WPML.php CHANGED
@@ -81,7 +81,7 @@ class Tribe__Events__Integrations__WPML__WPML {
81
  add_filter( 'icl_ls_languages', [ $language_switcher, 'filter_icl_ls_languages' ], 5 );
82
 
83
  $meta = tribe( 'tec.integrations.wpml.meta' );
84
- add_filter( 'get_post_metadata', tribe_callback( $meta, 'translate_post_id' ), 10, 3 );
85
  add_filter( 'pre_get_posts', tribe_callback( $meta, 'include_all_languages' ) );
86
 
87
  // Disable month view caching when WPML is activated for now, until we
81
  add_filter( 'icl_ls_languages', [ $language_switcher, 'filter_icl_ls_languages' ], 5 );
82
 
83
  $meta = tribe( 'tec.integrations.wpml.meta' );
84
+ add_filter( 'get_post_metadata', tribe_callback( $meta, 'translate_post_id' ), 10, 4 );
85
  add_filter( 'pre_get_posts', tribe_callback( $meta, 'include_all_languages' ) );
86
 
87
  // Disable month view caching when WPML is activated for now, until we
src/Tribe/Main.php CHANGED
@@ -19,6 +19,8 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
19
  * This is where all the magic happens, the unicorns run wild and the leprechauns use WordPress to schedule events.
20
  */
21
  class Tribe__Events__Main {
 
 
22
  /**
23
  * This constant is deprecated (as of 4.0) in favor of Tribe__Main::OPTIONNAME
24
  */
@@ -35,7 +37,7 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
35
  const VENUE_POST_TYPE = 'tribe_venue';
36
  const ORGANIZER_POST_TYPE = 'tribe_organizer';
37
 
38
- const VERSION = '6.0.1.1';
39
 
40
  /**
41
  * Min Pro Addon
@@ -72,7 +74,7 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
72
  *
73
  * @since 4.8
74
  */
75
- protected $min_et_version = '5.5.0-dev';
76
 
77
  /**
78
  * Maybe display data wrapper
@@ -601,7 +603,6 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
601
  // Integrations
602
  tribe_singleton( 'tec.integrations.twenty-seventeen', 'Tribe__Events__Integrations__Twenty_Seventeen', [ 'hook' ] );
603
 
604
-
605
  // Linked Posts
606
  tribe_singleton( 'tec.linked-posts', 'Tribe__Events__Linked_Posts' );
607
  tribe_singleton( 'tec.linked-posts.venue', 'Tribe__Events__Venue' );
@@ -4150,11 +4151,5 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
4150
 
4151
  $this->get_autoloader_instance()->register_prefixes( $prefixes );
4152
  }
4153
-
4154
- /************************
4155
- * *
4156
- * Deprecated Methods *
4157
- * *
4158
- ************************/
4159
  }
4160
  }
19
  * This is where all the magic happens, the unicorns run wild and the leprechauns use WordPress to schedule events.
20
  */
21
  class Tribe__Events__Main {
22
+ use Tribe__Events__Main_Deprecated;
23
+
24
  /**
25
  * This constant is deprecated (as of 4.0) in favor of Tribe__Main::OPTIONNAME
26
  */
37
  const VENUE_POST_TYPE = 'tribe_venue';
38
  const ORGANIZER_POST_TYPE = 'tribe_organizer';
39
 
40
+ const VERSION = '6.0.2';
41
 
42
  /**
43
  * Min Pro Addon
74
  *
75
  * @since 4.8
76
  */
77
+ protected $min_et_version = '5.5.2-dev';
78
 
79
  /**
80
  * Maybe display data wrapper
603
  // Integrations
604
  tribe_singleton( 'tec.integrations.twenty-seventeen', 'Tribe__Events__Integrations__Twenty_Seventeen', [ 'hook' ] );
605
 
 
606
  // Linked Posts
607
  tribe_singleton( 'tec.linked-posts', 'Tribe__Events__Linked_Posts' );
608
  tribe_singleton( 'tec.linked-posts.venue', 'Tribe__Events__Venue' );
4151
 
4152
  $this->get_autoloader_instance()->register_prefixes( $prefixes );
4153
  }
 
 
 
 
 
 
4154
  }
4155
  }
src/Tribe/Models/Post_Types/Event.php CHANGED
@@ -14,6 +14,7 @@ use DatePeriod;
14
  use DateTimeZone;
15
  use Tribe\Events\Collections\Lazy_Post_Collection;
16
  use Tribe\Models\Post_Types\Base;
 
17
  use Tribe\Utils\Lazy_Collection;
18
  use Tribe\Utils\Lazy_String;
19
  use Tribe\Utils\Post_Thumbnail;
@@ -193,6 +194,7 @@ class Event extends Base {
193
  'duration' => $duration,
194
  'multiday' => $multiday,
195
  'is_past' => $start_date_object < $now,
 
196
  'all_day' => $all_day,
197
  'starts_this_week' => $starts_this_week,
198
  'ends_this_week' => $ends_this_week,
@@ -202,12 +204,14 @@ class Event extends Base {
202
  'featured' => $featured,
203
  'sticky' => $sticky,
204
  'cost' => tribe_get_cost( $post_id, true ),
205
- 'excerpt' => ( new Lazy_String(
206
- static function () use ( $post_id ) {
207
- return tribe_events_get_the_excerpt( $post_id, wp_kses_allowed_html( 'post' ) );
208
- },
209
- false
210
- ) )->on_resolve( $cache_this ),
 
 
211
  'organizer_names' => ( new Lazy_Collection( $organizer_names_fetch ) )->on_resolve( $cache_this ),
212
  'organizers' => (
213
  new Lazy_Post_Collection(
14
  use DateTimeZone;
15
  use Tribe\Events\Collections\Lazy_Post_Collection;
16
  use Tribe\Models\Post_Types\Base;
17
+ use Tribe\Utils\Lazy_Boolean;
18
  use Tribe\Utils\Lazy_Collection;
19
  use Tribe\Utils\Lazy_String;
20
  use Tribe\Utils\Post_Thumbnail;
194
  'duration' => $duration,
195
  'multiday' => $multiday,
196
  'is_past' => $start_date_object < $now,
197
+ 'is_now' => Dates::is_now( $start_date, $end_date ),
198
  'all_day' => $all_day,
199
  'starts_this_week' => $starts_this_week,
200
  'ends_this_week' => $ends_this_week,
204
  'featured' => $featured,
205
  'sticky' => $sticky,
206
  'cost' => tribe_get_cost( $post_id, true ),
207
+ 'excerpt' => (
208
+ new Lazy_String(
209
+ static function () use ( $post_id ) {
210
+ return tribe_events_get_the_excerpt( $post_id, wp_kses_allowed_html( 'post' ) );
211
+ },
212
+ false
213
+ )
214
+ )->on_resolve( $cache_this ),
215
  'organizer_names' => ( new Lazy_Collection( $organizer_names_fetch ) )->on_resolve( $cache_this ),
216
  'organizers' => (
217
  new Lazy_Post_Collection(
src/Tribe/Plugin_Register.php CHANGED
@@ -11,7 +11,7 @@ class Tribe__Events__Plugin_Register extends Tribe__Abstract_Plugin_Register {
11
  'Tribe__Events__Community__Main' => '4.10.0-dev',
12
  'Tribe__Events__Community__Tickets__Main' => '4.8.0-dev',
13
  // @todo @moraleida update the version below to the actual version of ET that will be released to support RBE
14
- 'Tribe__Tickets__Main' => '5.5.0-dev',
15
  'Tribe__Tickets_Plus__Main' => '5.6.0-dev',
16
  'Tribe__Events__Tickets__Eventbrite__Main' => '4.6.11-dev',
17
  ],
11
  'Tribe__Events__Community__Main' => '4.10.0-dev',
12
  'Tribe__Events__Community__Tickets__Main' => '4.8.0-dev',
13
  // @todo @moraleida update the version below to the actual version of ET that will be released to support RBE
14
+ 'Tribe__Tickets__Main' => '5.5.2-dev',
15
  'Tribe__Tickets_Plus__Main' => '5.6.0-dev',
16
  'Tribe__Events__Tickets__Eventbrite__Main' => '4.6.11-dev',
17
  ],
src/Tribe/Query.php CHANGED
@@ -4,6 +4,8 @@
4
  */
5
 
6
  use Tribe__Utils__Array as Arr;
 
 
7
 
8
  class Tribe__Events__Query {
9
  /**
@@ -32,11 +34,33 @@ class Tribe__Events__Query {
32
  $context = tribe_context();
33
 
34
  // These are only required for Main Query stuff.
35
- if ( ! $context->is( 'is_main_query' ) ) {
36
- return $query;
37
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
- if ( ! $context->is( 'tec_post_type' ) ) {
40
  return $query;
41
  }
42
 
@@ -107,6 +131,18 @@ class Tribe__Events__Query {
107
  $query->is_home = empty( $query->query_vars['is_home'] ) ? false : $query->query_vars['is_home'];
108
  }
109
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  do_action( 'tribe_events_parse_query', $query );
111
  }
112
 
@@ -415,4 +451,81 @@ class Tribe__Events__Query {
415
  public static function default_page_on_front( $value ) {
416
  return tribe( 'tec.front-page-view' )->is_virtual_page_id( $value ) ? 0 : $value;
417
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
418
  }
4
  */
5
 
6
  use Tribe__Utils__Array as Arr;
7
+ use Tribe__Date_Utils as Dates;
8
+ use Tribe__Events__Main as TEC;
9
 
10
  class Tribe__Events__Query {
11
  /**
34
  $context = tribe_context();
35
 
36
  // These are only required for Main Query stuff.
37
+ if ( ! ( $context->is( 'is_main_query' ) && $context->is( 'tec_post_type' ) ) ) {
38
+
39
+ if ( $query->is_home() ) {
40
+ /**
41
+ * The following filter will remove the virtual page from the option page and return a 0 as it's not
42
+ * set when the SQL query is constructed to avoid having a is_page() instead of a is_home().
43
+ */
44
+ add_filter( 'option_page_on_front', [ __CLASS__, 'default_page_on_front' ] );
45
+ // check option for including events in the main wordpress loop, if true, add events post type
46
+ if ( tribe_get_option( 'showEventsInMainLoop', false ) && ! get_query_var( 'tribe_events_front_page' ) ) {
47
+ $query->query_vars['post_type'] = isset( $query->query_vars['post_type'] )
48
+ ? ( array ) $query->query_vars['post_type']
49
+ : [ 'post' ];
50
+
51
+ if ( ! in_array( Tribe__Events__Main::POSTTYPE, $query->query_vars['post_type'], true ) ) {
52
+ $query->query_vars['post_type'][] = Tribe__Events__Main::POSTTYPE;
53
+ }
54
+ $query->tribe_is_multi_posttype = true;
55
+ }
56
+ }
57
+
58
+
59
+ if ( ( (array) $query->get( 'post_type', [] ) ) === [ Tribe__Events__Main::POSTTYPE ] ) {
60
+ // Not the main query in Event context, but it's an event query: check back later.
61
+ add_filter( 'parse_query', [ __CLASS__, 'filter_and_order_by_date' ], 1000 );
62
+ }
63
 
 
64
  return $query;
65
  }
66
 
131
  $query->is_home = empty( $query->query_vars['is_home'] ) ? false : $query->query_vars['is_home'];
132
  }
133
 
134
+ // Hook reasonably late on the action that will fire next to filter and order Events by date, if required.
135
+ add_filter( 'tribe_events_parse_query', [ __CLASS__, 'filter_and_order_by_date' ], 1000 );
136
+
137
+ /**
138
+ * Fires after the query has been parsed by The Events Calendar.
139
+ * If this action fires, then the query is for the Event post type, is the main
140
+ * query, and TEC filters are not suppressed.
141
+ *
142
+ * @since 3.5.1
143
+ *
144
+ * @param WP_Query $query The parsed WP_Query object.
145
+ */
146
  do_action( 'tribe_events_parse_query', $query );
147
  }
148
 
451
  public static function default_page_on_front( $value ) {
452
  return tribe( 'tec.front-page-view' )->is_virtual_page_id( $value ) ? 0 : $value;
453
  }
454
+
455
+ /**
456
+ * Provided a query for Events, the method will set the query variables up to filter
457
+ * and order Events by start and end date.
458
+ *
459
+ * @since 6.0.2
460
+ *
461
+ * @param WP_Query $query The query object to modify.
462
+ *
463
+ * @return void The query object is modified by reference.
464
+ */
465
+ public static function filter_and_order_by_date( $query ) {
466
+ if ( ! $query instanceof WP_Query ) {
467
+ return;
468
+ }
469
+
470
+ if ( (array) $query->get( 'post_type' ) !== [ TEC::POSTTYPE ] ) {
471
+ // Not an Event only query.
472
+ return;
473
+ }
474
+
475
+ if ( $query->get( 'tribe_suppress_query_filters', false ) ) {
476
+ // Filters were suppressed by others, bail.
477
+ return;
478
+ }
479
+
480
+ // If this is a query for a single event, we don't need to order it.
481
+ if ( $query->is_single ) {
482
+ return;
483
+ }
484
+
485
+ // Work done: stop filtering.
486
+ remove_filter( current_action(), [ __CLASS__, 'filter_and_order_by_date' ] );
487
+
488
+ $query_vars = $query->query_vars ?? [];
489
+
490
+ // If a clause on the '_Event(Start|End)Date(UTC)' meta key is present in any query variable, bail.
491
+ if ( ! empty( $query_vars ) && preg_match( '/_Event(Start|End)Date(UTC)?/', serialize( $query_vars ) ) ) {
492
+ return;
493
+ }
494
+
495
+ /**
496
+ * Filters the value that will be used to indicate the current moment in an
497
+ * Event query. The query will return Events ending after the current moment.
498
+ *
499
+ * @since 6.0.2
500
+ *
501
+ * @param string|int|DateTimeInterface $current_moment The current moment, defaults to `now`.
502
+ * @param WP_Query $query The query object being filtered.
503
+ */
504
+ $current_moment = apply_filters( 'tec_events_query_current_moment', 'now', $query );
505
+
506
+ // Only get Events ending after now altering the current meta query.
507
+ $meta_query = $query_vars['meta_query'] ?? [];
508
+ $meta_query['tec_event_start_date'] = [
509
+ 'key' => '_EventStartDate',
510
+ 'compare' => 'EXISTS',
511
+ ];
512
+ $meta_query['tec_event_end_date'] = [
513
+ 'key' => '_EventEndDate',
514
+ 'value' => Dates::immutable( $current_moment )->format( Dates::DBDATETIMEFORMAT ),
515
+ 'compare' => '>=',
516
+ 'type' => 'DATETIME',
517
+ ];
518
+ $query->query_vars['meta_query'] = $meta_query;
519
+
520
+ // Order the resulting events by start date, then post date.
521
+ $orderby = $query_vars['orderby'] ?? '';
522
+ $order = $query_vars['order'] ?? null;
523
+ $query->query_vars['orderby'] = tribe_normalize_orderby( $orderby, $order );
524
+ $query->query_vars['orderby']['tec_event_start_date'] = 'ASC';
525
+ $query->query_vars['orderby']['post_date'] = 'ASC';
526
+
527
+ // Duplicate the values on the `query` property of the query.
528
+ $query->query['meta_query'] = $query->query_vars['meta_query'];
529
+ $query->query['orderby'] = $query->query_vars['orderby'];
530
+ }
531
  }
src/Tribe/REST/V1/Endpoints/Archive_Event.php CHANGED
@@ -24,6 +24,10 @@ class Tribe__Events__REST__V1__Endpoints__Archive_Event
24
  'status' => 'post_status',
25
  'post_parent' => 'post_parent',
26
  'include' => 'post__in',
 
 
 
 
27
  ];
28
 
29
  /**
@@ -55,15 +59,39 @@ class Tribe__Events__REST__V1__Endpoints__Archive_Event
55
  public function get( WP_REST_Request $request ) {
56
  $args = [];
57
  $date_format = Tribe__Date_Utils::DBDATETIMEFORMAT;
 
58
 
59
  $args['paged'] = $request['page'];
60
  $args['posts_per_page'] = $request['per_page'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  $args['start_date'] = isset( $request['start_date'] ) ?
62
  Tribe__Timezones::localize_date( $date_format, $request['start_date'] )
63
  : false;
 
64
  $args['end_date'] = isset( $request['end_date'] ) ?
65
  Tribe__Timezones::localize_date( $date_format, $request['end_date'] )
66
  : false;
 
67
  $args['s'] = $request['search'];
68
 
69
  if ( $post__in = $request['include'] ) {
@@ -73,8 +101,12 @@ class Tribe__Events__REST__V1__Endpoints__Archive_Event
73
 
74
  $args['post_parent'] = $request['post_parent'];
75
 
 
 
 
 
76
  /**
77
- * Allows users to override "inclusive" start and end dates and make the REST API use a
78
  * timezone-adjusted date range.
79
  *
80
  * Example: wp-json/tribe/events/v1/events?start_date=2017-12-21&end_date=2017-12-22
@@ -83,23 +115,39 @@ class Tribe__Events__REST__V1__Endpoints__Archive_Event
83
  * 2017-12-21 00:00:00 and end_date to 2017-12-22 23:59:59. Events within this range will
84
  * be retrieved.
85
  *
86
- * - If you set this filter to false on a site whose timezone is America/New_York, then the
87
  * REST API would set start_date to 2017-12-20 19:00:00 and end_date to
88
  * 2017-12-21 19:00:00. A different range of events to draw from.
89
  *
90
  * @since 4.6.8
91
  *
92
- * @param bool $use_inclusive Defaults to true. Whether to use "inclusive" start and end dates.
93
  */
94
- if ( apply_filters( 'tribe_events_rest_use_inclusive_start_end_dates', true ) ) {
95
 
96
- if ( $args['start_date'] ) {
97
  $args['start_date'] = tribe_beginning_of_day( $request['start_date'] );
98
  }
99
 
100
- if ( $args['end_date'] ) {
101
  $args['end_date'] = tribe_end_of_day( $request['end_date'] );
102
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  }
104
 
105
  $args['meta_query'] = array_filter( [
@@ -136,6 +184,17 @@ class Tribe__Events__REST__V1__Endpoints__Archive_Event
136
 
137
  $args = $this->parse_args( $args, $request->get_default_params() );
138
 
 
 
 
 
 
 
 
 
 
 
 
139
  if ( null === $request['status'] ) {
140
  $cap = get_post_type_object( Tribe__Events__Main::POSTTYPE )->cap->edit_posts;
141
  $args['post_status'] = current_user_can( $cap ) ? 'any' : 'publish';
@@ -447,14 +506,45 @@ class Tribe__Events__REST__V1__Endpoints__Archive_Event
447
  'required' => false,
448
  'validate_callback' => [ $this->validator, 'is_time' ],
449
  'default' => Tribe__Timezones::localize_date( Tribe__Date_Utils::DBDATETIMEFORMAT, 'yesterday 23:59' ),
450
- 'description' => __( 'Events should start after the specified date', 'the-events-calendar' ),
451
  'swagger_type' => 'string',
452
  ],
453
  'end_date' => [
454
  'required' => false,
455
  'validate_callback' => [ $this->validator, 'is_time' ],
456
  'default' => date( Tribe__Date_Utils::DBDATETIMEFORMAT, strtotime( '+24 months' ) ),
457
- 'description' => __( 'Events should start before the specified date', 'the-events-calendar' ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
458
  'swagger_type' => 'string',
459
  ],
460
  'search' => [
24
  'status' => 'post_status',
25
  'post_parent' => 'post_parent',
26
  'include' => 'post__in',
27
+ 'starts_before' => 'starts_before',
28
+ 'starts_after' => 'starts_after',
29
+ 'ends_before' => 'ends_before',
30
+ 'ends_after' => 'ends_after',
31
  ];
32
 
33
  /**
59
  public function get( WP_REST_Request $request ) {
60
  $args = [];
61
  $date_format = Tribe__Date_Utils::DBDATETIMEFORMAT;
62
+ $relative_dates = false;
63
 
64
  $args['paged'] = $request['page'];
65
  $args['posts_per_page'] = $request['per_page'];
66
+
67
+ if ( isset( $request['starts_before'] ) ) {
68
+ $args['starts_before'] = Tribe__Timezones::localize_date( $date_format, $request['starts_before'] );
69
+ $relative_dates = true;
70
+ }
71
+
72
+ if ( isset( $request['starts_after'] ) ) {
73
+ $args['starts_after'] = Tribe__Timezones::localize_date( $date_format, $request['starts_after'] );
74
+ $relative_dates = true;
75
+ }
76
+
77
+ if ( isset( $request['ends_before'] ) ) {
78
+ $args['ends_before'] = Tribe__Timezones::localize_date( $date_format, $request['ends_before'] );
79
+ $relative_dates = true;
80
+ }
81
+
82
+ if ( isset( $request['ends_after'] ) ) {
83
+ $args['ends_after'] = Tribe__Timezones::localize_date( $date_format, $request['ends_after'] );
84
+ $relative_dates = true;
85
+ }
86
+
87
  $args['start_date'] = isset( $request['start_date'] ) ?
88
  Tribe__Timezones::localize_date( $date_format, $request['start_date'] )
89
  : false;
90
+
91
  $args['end_date'] = isset( $request['end_date'] ) ?
92
  Tribe__Timezones::localize_date( $date_format, $request['end_date'] )
93
  : false;
94
+
95
  $args['s'] = $request['search'];
96
 
97
  if ( $post__in = $request['include'] ) {
101
 
102
  $args['post_parent'] = $request['post_parent'];
103
 
104
+
105
+ // Allow REST API users to define the default behavior of the inclusive date parameters.
106
+ $use_inclusive_start_end_dates = isset( $request['strict_dates'] ) ? ! filter_var( $request['strict_dates'], FILTER_VALIDATE_BOOLEAN ) : true;
107
+
108
  /**
109
+ * Allows users to override the default "inclusive" start and end dates and make the REST API use a
110
  * timezone-adjusted date range.
111
  *
112
  * Example: wp-json/tribe/events/v1/events?start_date=2017-12-21&end_date=2017-12-22
115
  * 2017-12-21 00:00:00 and end_date to 2017-12-22 23:59:59. Events within this range will
116
  * be retrieved.
117
  *
118
+ * - If you set this filter to true on a site whose timezone is America/New_York, then the
119
  * REST API would set start_date to 2017-12-20 19:00:00 and end_date to
120
  * 2017-12-21 19:00:00. A different range of events to draw from.
121
  *
122
  * @since 4.6.8
123
  *
124
+ * @param bool $use_inclusive Defaults to false (inclusive, not strict). Whether to use "inclusive" start and end dates.
125
  */
126
+ if ( apply_filters( 'tribe_events_rest_use_inclusive_start_end_dates', $use_inclusive_start_end_dates ) ) {
127
 
128
+ if ( ! empty( $args['start_date'] ) ) {
129
  $args['start_date'] = tribe_beginning_of_day( $request['start_date'] );
130
  }
131
 
132
+ if ( ! empty( $args['end_date'] ) ) {
133
  $args['end_date'] = tribe_end_of_day( $request['end_date'] );
134
  }
135
+
136
+ if ( ! empty( $args['ends_after'] ) ) {
137
+ $args['ends_after'] = tribe_end_of_day( $request['ends_after'] );
138
+ }
139
+
140
+ if ( ! empty( $args['ends_before'] ) ) {
141
+ $args['ends_before'] = tribe_end_of_day( $request['ends_before'] );
142
+ }
143
+
144
+ if ( ! empty( $args['starts_before'] ) ) {
145
+ $args['starts_before'] = tribe_end_of_day( $request['starts_before'] );
146
+ }
147
+
148
+ if ( ! empty( $args['starts_after'] ) ) {
149
+ $args['starts_after'] = tribe_end_of_day( $request['starts_after'] );
150
+ }
151
  }
152
 
153
  $args['meta_query'] = array_filter( [
184
 
185
  $args = $this->parse_args( $args, $request->get_default_params() );
186
 
187
+ if ( $relative_dates ) {
188
+ $query_params = $request->get_query_params();
189
+ if ( ! isset( $query_params['start_date'] ) ) {
190
+ unset( $args['start_date'] );
191
+ }
192
+
193
+ if ( ! isset( $query_params['end_date'] ) ) {
194
+ unset( $args['end_date'] );
195
+ }
196
+ }
197
+
198
  if ( null === $request['status'] ) {
199
  $cap = get_post_type_object( Tribe__Events__Main::POSTTYPE )->cap->edit_posts;
200
  $args['post_status'] = current_user_can( $cap ) ? 'any' : 'publish';
506
  'required' => false,
507
  'validate_callback' => [ $this->validator, 'is_time' ],
508
  'default' => Tribe__Timezones::localize_date( Tribe__Date_Utils::DBDATETIMEFORMAT, 'yesterday 23:59' ),
509
+ 'description' => __( 'Events that start on the specified date', 'the-events-calendar' ),
510
  'swagger_type' => 'string',
511
  ],
512
  'end_date' => [
513
  'required' => false,
514
  'validate_callback' => [ $this->validator, 'is_time' ],
515
  'default' => date( Tribe__Date_Utils::DBDATETIMEFORMAT, strtotime( '+24 months' ) ),
516
+ 'description' => __( 'Events that end on the specified date', 'the-events-calendar' ),
517
+ 'swagger_type' => 'string',
518
+ ],
519
+ 'starts_before' => [
520
+ 'required' => false,
521
+ 'validate_callback' => [ $this->validator, 'is_time' ],
522
+ 'description' => __( 'Events that start before the specified date', 'the-events-calendar' ),
523
+ 'swagger_type' => 'string',
524
+ ],
525
+ 'starts_after' => [
526
+ 'required' => false,
527
+ 'validate_callback' => [ $this->validator, 'is_time' ],
528
+ 'description' => __( 'Events that start after the specified date', 'the-events-calendar' ),
529
+ 'swagger_type' => 'string',
530
+ ],
531
+ 'ends_before' => [
532
+ 'required' => false,
533
+ 'validate_callback' => [ $this->validator, 'is_time' ],
534
+ 'description' => __( 'Events that end before the specified date', 'the-events-calendar' ),
535
+ 'swagger_type' => 'string',
536
+ ],
537
+ 'ends_after' => [
538
+ 'required' => false,
539
+ 'validate_callback' => [ $this->validator, 'is_time' ],
540
+ 'description' => __( 'Events that end after the specified date', 'the-events-calendar' ),
541
+ 'swagger_type' => 'string',
542
+ ],
543
+ 'strict_dates' => [
544
+ 'required' => false,
545
+ 'validate_callback' => [ $this->validator, 'is_string' ],
546
+ 'default' => 'false',
547
+ 'description' => __( 'Dates set using the start_date/end_date, starts_*/ends_* are set to start at the specified times. The default behavior is to include the entire days.', 'the-events-calendar' ),
548
  'swagger_type' => 'string',
549
  ],
550
  'search' => [
src/Tribe/Rewrite.php CHANGED
@@ -742,7 +742,7 @@ class Tribe__Events__Rewrite extends Tribe__Rewrite {
742
 
743
  $flags = I18n::COMPILE_STRTOLOWER;
744
  $localized_bases = tribe( 'tec.i18n' )
745
- ->get_i18n_strings_for_domains( $bases, [ $locale ], $domains, $flags );
746
 
747
  $return = array_filter(
748
  array_map(
742
 
743
  $flags = I18n::COMPILE_STRTOLOWER;
744
  $localized_bases = tribe( 'tec.i18n' )
745
+ ->get_i18n_url_strings_for_domains( $bases, [ $locale ], $domains, $flags );
746
 
747
  $return = array_filter(
748
  array_map(
src/Tribe/Utils/Dates.php ADDED
File without changes
src/Tribe/Views/V2/Customizer/Section/Global_Elements.php CHANGED
@@ -441,7 +441,7 @@ final class Global_Elements extends \Tribe__Customizer__Section {
441
  if ( $this->should_include_setting_css( 'event_date_time_color' ) ) {
442
  $date_color = $this->get_option( 'event_date_time_color' );
443
  $new_styles[] = "--tec-color-text-event-date: {$date_color};";
444
- $new_styles[] = "--tec-color-text-event-date-secondary: {$date_color};";
445
  }
446
 
447
  // Link color overrides.
441
  if ( $this->should_include_setting_css( 'event_date_time_color' ) ) {
442
  $date_color = $this->get_option( 'event_date_time_color' );
443
  $new_styles[] = "--tec-color-text-event-date: {$date_color};";
444
+ $new_styles[] = "--tec-color-text-secondary-event-date: {$date_color};";
445
  }
446
 
447
  // Link color overrides.
src/Tribe/Views/V2/Hooks.php CHANGED
@@ -174,6 +174,9 @@ class Hooks extends \tad_DI52_ServiceProvider {
174
  add_filter( 'tec_events_query_default_view', [ $this, 'filter_tec_events_query_default_view' ] );
175
 
176
  add_filter( 'tribe_events_views_v2_rest_params', [ $this, 'filter_url_date_conflicts'], 12, 2 );
 
 
 
177
  }
178
 
179
  /**
@@ -1079,6 +1082,46 @@ class Hooks extends \tad_DI52_ServiceProvider {
1079
  return $this->container->make( iCalendar\Request::class )->get_event_ids();
1080
  }
1081
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1082
  /* DEPRECATED */
1083
 
1084
  /**
@@ -1189,4 +1232,96 @@ class Hooks extends \tad_DI52_ServiceProvider {
1189
 
1190
  return $params;
1191
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1192
  }
174
  add_filter( 'tec_events_query_default_view', [ $this, 'filter_tec_events_query_default_view' ] );
175
 
176
  add_filter( 'tribe_events_views_v2_rest_params', [ $this, 'filter_url_date_conflicts'], 12, 2 );
177
+
178
+ add_filter( 'tec_events_view_month_today_button_label', [ $this, 'filter_view_month_today_button_label' ], 10, 2 );
179
+ add_filter( 'tec_events_view_month_today_button_title', [ $this, 'filter_view_month_today_button_title' ], 10, 2 );
180
  }
181
 
182
  /**
1082
  return $this->container->make( iCalendar\Request::class )->get_event_ids();
1083
  }
1084
 
1085
+ /**
1086
+ * Filters the Today button label to change the text to something appropriate for Week View.
1087
+ *
1088
+ * @since 6.0.2
1089
+ *
1090
+ * @param string $today The string used for the "Today" button on calendar views.
1091
+ * @param \Tribe\Events\Views\V2\View_Interface $view The View currently rendering.
1092
+ *
1093
+ * @return string $today
1094
+ */
1095
+ public function filter_view_month_today_button_label( $today, $view ) {
1096
+ $today = esc_html_x(
1097
+ 'This Month',
1098
+ 'The default text label for the "today" button on the Month View.',
1099
+ 'the-events-calendar'
1100
+ );
1101
+
1102
+ return $today;
1103
+ }
1104
+
1105
+ /**
1106
+ * Filters the Today button title and aria-label to change the text to something appropriate for Month View.
1107
+ *
1108
+ * @since 6.0.2
1109
+ *
1110
+ * @param string $label The title string.
1111
+ * @param \Tribe\Events\Views\V2\View_Interface $view The View currently rendering.
1112
+ *
1113
+ * @return string $label
1114
+ */
1115
+ public function filter_view_month_today_button_title( $label, $view ) {
1116
+ $label = esc_html_x(
1117
+ 'Click to select the current month',
1118
+ "The default text for the 'today' button's title and aria-label on the Week View.",
1119
+ 'the-events-calendar'
1120
+ );
1121
+
1122
+ return $label;
1123
+ }
1124
+
1125
  /* DEPRECATED */
1126
 
1127
  /**
1232
 
1233
  return $params;
1234
  }
1235
+
1236
+ /**
1237
+ * Unregisters all the filters and action handled by the class.
1238
+ *
1239
+ * @since 6.0.2
1240
+ *
1241
+ * @return void Filters and actions will be unregistered.
1242
+ */
1243
+ public function unregister(): void {
1244
+ remove_filter( 'tec_system_information', [ $this, 'filter_system_information' ] );
1245
+ remove_filter( 'wp_redirect', [ $this, 'filter_redirect_canonical' ] );
1246
+ remove_filter( 'redirect_canonical', [ $this, 'filter_redirect_canonical' ] );
1247
+ remove_filter( 'template_include', [ $this, 'filter_template_include' ], 50 );
1248
+ remove_filter( 'embed_template', [ $this, 'filter_template_include' ], 50 );
1249
+ remove_filter( 'posts_pre_query', [ $this, 'filter_posts_pre_query' ], 20 );
1250
+ remove_filter( 'body_class', [ $this, 'filter_body_classes' ] );
1251
+ remove_filter( 'tribe_body_class_should_add_to_queue', [ $this, 'body_class_should_add_to_queue' ] );
1252
+ remove_filter( 'tribe_body_classes_should_add', [ $this, 'body_classes_should_add' ] );
1253
+ remove_filter( 'query_vars', [ $this, 'filter_query_vars' ], 15 );
1254
+ remove_filter( 'tribe_rewrite_canonical_query_args', [ $this, 'filter_map_canonical_query_args' ], 15 );
1255
+ remove_filter( 'admin_post_thumbnail_html', [ $this, 'filter_admin_post_thumbnail_html' ] );
1256
+ remove_filter( 'excerpt_length', [ $this, 'filter_excerpt_length' ] );
1257
+ remove_filter( 'tribe_events_views_v2_after_make_view', [ $this, 'action_include_filters_excerpt' ] );
1258
+ remove_filter( 'rest_authentication_errors', [ Rest_Endpoint::class, 'did_rest_authentication_errors' ], 150 );
1259
+ remove_filter( 'tribe_support_registered_template_systems', [ $this, 'filter_register_template_updates' ] );
1260
+ remove_filter( 'tribe_events_event_repository_map', [ $this, 'add_period_repository' ] );
1261
+ remove_filter( 'tribe_general_settings_tab_fields', [ $this, 'filter_general_settings_tab_live_update' ], 20 );
1262
+ remove_filter( 'tribe_events_rewrite_i18n_slugs_raw', [ $this, 'filter_rewrite_i18n_slugs_raw' ], 50 );
1263
+ remove_filter( 'tribe_get_event_after', [ $this, 'filter_events_properties' ] );
1264
+ remove_filter( 'tribe_template_file', [ $this, 'filter_template_file' ] );
1265
+ remove_filter( 'tribe_get_option', [ $this, 'filter_get_stylesheet_option' ] );
1266
+ remove_filter( 'option_liveFiltersUpdate', [ $this, 'filter_live_filters_option_value' ] );
1267
+ remove_filter( 'tribe_get_option', [ $this, 'filter_live_filters_option_value' ] );
1268
+ remove_filter( 'tribe_field_value', [ $this, 'filter_live_filters_option_value' ] );
1269
+ remove_filter( 'tribe_get_option', [ $this, 'filter_date_escaping' ] );
1270
+ remove_filter( 'tribe_events_filter_views_v2_wp_title_plural_events_label', [
1271
+ $this,
1272
+ 'filter_wp_title_plural_events_label'
1273
+ ] );
1274
+ remove_filter( 'wp_title', [ $this, 'filter_wp_title' ] );
1275
+ remove_filter( 'document_title_parts', [ $this, 'filter_document_title_parts' ] );
1276
+ remove_filter( 'pre_get_document_title', [ $this, 'pre_get_document_title' ], 20 );
1277
+ remove_filter( 'get_post_time', [ 'Tribe__Events__Templates', 'event_date_to_pubDate' ] );
1278
+ remove_filter( 'tribe_events_views_v2_view_data', [ View_Utils::class, 'clean_data' ] );
1279
+ remove_filter( 'tribe_customizer_print_styles_action', [ $this, 'print_inline_styles_in_footer' ] );
1280
+ remove_filter( 'tribe_customizer_global_elements_css_template', [
1281
+ $this,
1282
+ 'filter_global_elements_css_template'
1283
+ ] );
1284
+ remove_filter( 'tribe_customizer_single_event_css_template', [
1285
+ $this,
1286
+ 'filter_single_event_css_template'
1287
+ ] );
1288
+ remove_filter( 'tribe_get_event_website_link_label', [
1289
+ $this,
1290
+ 'filter_single_event_details_event_website_label'
1291
+ ] );
1292
+ remove_filter( 'tribe_get_venue_website_link_label', [
1293
+ $this,
1294
+ 'filter_single_event_details_venue_website_label'
1295
+ ] );
1296
+ remove_filter( 'tribe_events_get_venue_website_title', '__return_empty_string' );
1297
+ remove_filter( 'tribe_get_organizer_website_link_label', [
1298
+ $this,
1299
+ 'filter_single_event_details_organizer_website_label'
1300
+ ] );
1301
+ remove_filter( 'tribe_events_get_organizer_website_title', '__return_empty_string' );
1302
+ remove_filter( 'tribe_ical_template_event_ids', [ $this, 'inject_ical_event_ids' ] );
1303
+ remove_filter( 'tec_events_query_default_view', [ $this, 'filter_tec_events_query_default_view' ] );
1304
+ remove_filter( 'tribe_events_views_v2_rest_params', [ $this, 'filter_url_date_conflicts' ], 12 );
1305
+
1306
+ remove_action( 'rest_api_init', [ $this, 'register_rest_endpoints' ] );
1307
+ remove_action( 'tribe_common_loaded', [ $this, 'on_tribe_common_loaded' ], 1 );
1308
+ remove_action( 'parse_query', [ $this, 'add_body_classes' ], 55 );
1309
+ remove_action( 'wp_head', [ $this, 'on_wp_head' ], 1000 );
1310
+ remove_action( 'tribe_events_pre_rewrite', [ $this, 'on_tribe_events_pre_rewrite' ] );
1311
+ remove_action( 'wp_enqueue_scripts', [ $this, 'action_disable_assets_v1' ], 0 );
1312
+ remove_action( 'tribe_events_pro_shortcode_tribe_events_after_assets', [
1313
+ $this,
1314
+ 'action_disable_shortcode_assets_v1'
1315
+ ] );
1316
+ remove_action( 'updated_option', [ $this, 'action_save_wplang' ], 10, 3 );
1317
+ remove_action( 'the_post', [ $this, 'manage_sensitive_info' ] );
1318
+ remove_action( 'get_header', [ $this, 'print_single_json_ld' ] );
1319
+ remove_action( 'tribe_template_after_include:events/v2/components/after', [
1320
+ $this,
1321
+ 'action_add_promo_banner'
1322
+ ], 10, 3 );
1323
+ remove_action( 'tribe_events_parse_query', [ $this, 'parse_query' ] );
1324
+ remove_action( 'template_redirect', [ $this, 'action_initialize_legacy_views' ] );
1325
+ remove_action( 'admin_enqueue_scripts', [ $this, 'enqueue_customizer_in_block_editor' ] );
1326
+ }
1327
  }
src/Tribe/Views/V2/Manager.php CHANGED
@@ -149,7 +149,7 @@ class Manager {
149
  $view_slug = $this->get_default_view_option();
150
  $view_class = Arr::get( $registered_views, $view_slug, reset( $registered_views ) );
151
 
152
- // Class for the view doesnt exist we bail with false.
153
  if ( ! class_exists( $view_class ) ) {
154
  return false;
155
  }
149
  $view_slug = $this->get_default_view_option();
150
  $view_class = Arr::get( $registered_views, $view_slug, reset( $registered_views ) );
151
 
152
+ // Class for the view doesn't exist we bail with false.
153
  if ( ! class_exists( $view_class ) ) {
154
  return false;
155
  }
src/Tribe/Views/V2/View.php CHANGED
@@ -1493,6 +1493,42 @@ class View implements View_Interface {
1493
 
1494
  $today_url = $this->get_today_url( true );
1495
  $today = $this->context->get( 'today', 'today' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1496
 
1497
  $event_date = $this->context->get( 'event_date', false );
1498
 
@@ -1535,6 +1571,8 @@ class View implements View_Interface {
1535
  'rest_nonce' => $rest_nonce,
1536
  'should_manage_url' => $this->should_manage_url,
1537
  'today_url' => $today_url,
 
 
1538
  'prev_label' => $this->get_link_label( $this->prev_url( false ) ),
1539
  'next_label' => $this->get_link_label( $this->next_url( false ) ),
1540
  'date_formats' => (object) [
1493
 
1494
  $today_url = $this->get_today_url( true );
1495
  $today = $this->context->get( 'today', 'today' );
1496
+ // The "Today" button title and aria-label text.
1497
+ $today_title = _x(
1498
+ 'Click to select today\'s date',
1499
+ 'The default title text for the today button.',
1500
+ 'the-events-calendar'
1501
+ );
1502
+
1503
+ /**
1504
+ * Allows filtering of the "Today" button title and aria-label.
1505
+ *
1506
+ * @since 6.0.2
1507
+ *
1508
+ * @param string $today_title The title string.
1509
+ * @param \Tribe\Events\Views\V2\View_Interface $view The View currently rendering.
1510
+ */
1511
+ $today_title = apply_filters(
1512
+ 'tec_events_today_button_title',
1513
+ $today_title,
1514
+ $this
1515
+ );
1516
+
1517
+ /**
1518
+ * Allows filtering of the "Today" button title and aria-label.
1519
+ *
1520
+ * @since 6.0.2
1521
+ *
1522
+ * @param string $today_title The title string.
1523
+ * @param \Tribe\Events\Views\V2\View_Interface $view The View currently rendering.
1524
+ */
1525
+ $today_title = apply_filters(
1526
+ 'tec_events_view_' . $this->slug . '_today_button_title',
1527
+ $today_title,
1528
+ $this
1529
+ );
1530
+
1531
+ $today_label = tec_events_get_today_button_label( $this );
1532
 
1533
  $event_date = $this->context->get( 'event_date', false );
1534
 
1571
  'rest_nonce' => $rest_nonce,
1572
  'should_manage_url' => $this->should_manage_url,
1573
  'today_url' => $today_url,
1574
+ 'today_title' => $today_title,
1575
+ 'today_label' => $today_label,
1576
  'prev_label' => $this->get_link_label( $this->prev_url( false ) ),
1577
  'next_label' => $this->get_link_label( $this->next_url( false ) ),
1578
  'date_formats' => (object) [
src/Tribe/Views/V2/Views/By_Day_View.php CHANGED
@@ -604,8 +604,8 @@ abstract class By_Day_View extends View {
604
  $cache_key = $event . '_' . $week_start . '_week';
605
  $happens_this_week = true;
606
  $event_obj = tribe_get_event( $event );
607
- $event_start = $event_obj->dates->start_display->format( Dates::DBDATEFORMAT );
608
- $event_end = $event_obj->dates->end_display->format( Dates::DBDATEFORMAT );
609
  $starts_this_week = $occurrences['first'][ $event ] >= $week_start && $event_start >= $week_start;
610
  $ends_this_week = $occurrences['last'][ $event ] <= $week_end && $event_end <= $week_end;
611
  $displays_on[ $event ] = [];
604
  $cache_key = $event . '_' . $week_start . '_week';
605
  $happens_this_week = true;
606
  $event_obj = tribe_get_event( $event );
607
+ $event_start = ! empty( $event_obj->dates->start_display ) ? $event_obj->dates->start_display->format( Dates::DBDATEFORMAT ) : '';
608
+ $event_end = ! empty( $event_obj->dates->end_display ) ? $event_obj->dates->end_display->format( Dates::DBDATEFORMAT ) : '';
609
  $starts_this_week = $occurrences['first'][ $event ] >= $week_start && $event_start >= $week_start;
610
  $ends_this_week = $occurrences['last'][ $event ] <= $week_end && $event_end <= $week_end;
611
  $displays_on[ $event ] = [];
src/Tribe/Views/V2/functions/classes.php CHANGED
@@ -6,6 +6,8 @@
6
  */
7
  namespace Tribe\Events\Views\V2;
8
 
 
 
9
  // Don't load directly!
10
  if ( ! defined( 'ABSPATH' ) ) {
11
  die( '-1' );
@@ -94,3 +96,64 @@ function month_multiday_classes( $event, $day_date, $is_start_of_week, $today_da
94
  */
95
  return apply_filters( 'tribe_events_views_v2_month_multiday_classes', $classes, $event, $day_date, $is_start_of_week, $today_date );
96
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  */
7
  namespace Tribe\Events\Views\V2;
8
 
9
+ use Tribe__Date_Utils as Dates;
10
+
11
  // Don't load directly!
12
  if ( ! defined( 'ABSPATH' ) ) {
13
  die( '-1' );
96
  */
97
  return apply_filters( 'tribe_events_views_v2_month_multiday_classes', $classes, $event, $day_date, $is_start_of_week, $today_date );
98
  }
99
+
100
+ /**
101
+ * Used in the Month View days loop.
102
+ * Outputs classes for each day "cell".
103
+ *
104
+ * @since 6.0.2
105
+ *
106
+ * @param array<mixed> $day The current day data.
107
+ * @param string $day_date The current day date, in the `Y-m-d` format.
108
+ * @param \DateTime $request_date The request date for the view.
109
+ * @param string $today_date Today's date in the `Y-m-d` format.
110
+ *
111
+ * @return array<string,bool> $day_classes The classes to add to the day "cell".
112
+ */
113
+ function month_day_classes( array $day, string $day_date, \DateTime $request_date, string $today_date ) {
114
+ // If for some reason we don't have a request date, use today's date.
115
+ $comparison_date = ! empty( $request_date ) ? $request_date->format( 'Y-m-d' ) : $today_date;
116
+
117
+ /**
118
+ * Allows filtering the date used for comparison when generating the Month View day cell classes.
119
+ *
120
+ * @since 6.0.2
121
+ *
122
+ * @param string $comparison_date The date used for comparisons.
123
+ * @param DateTime $request_date The request date for the view.
124
+ * @param string $day_date The current day date, in the `Y-m-d` format.
125
+ * @param array<mixed> $day The current day data.
126
+ */
127
+ $comparison_date = apply_filters( 'tec_events_month_day_classes_comparison_date', $comparison_date, $request_date, $day_date, $day );
128
+
129
+ // Convert it to a date object.
130
+ $comparison_date = Dates::immutable( $comparison_date );
131
+
132
+ // Classes in array are applied if the value is truthy, not applied if the value is falsy.
133
+ $day_classes = [
134
+ 'tribe-events-calendar-month__day' => true,
135
+ // Add a class for the current day.
136
+ 'tribe-events-calendar-month__day--current' => $comparison_date->format( 'Y-m-d' ) === $day_date,
137
+ // Add a class for the past days (includes days in the requested month).
138
+ 'tribe-events-calendar-month__day--past' => $comparison_date->format( 'Y-m-d' ) > $day_date,
139
+ // Not the requested month.
140
+ 'tribe-events-calendar-month__day--other-month' => $day[ 'month_number' ] !== $comparison_date->format( 'm' ),
141
+ // Past month.
142
+ 'tribe-events-calendar-month__day--past-month' => $day[ 'month_number' ] < $comparison_date->format( 'm' ),
143
+ // Future month.
144
+ 'tribe-events-calendar-month__day--next-month' => $day[ 'month_number' ] > $comparison_date->format( 'm' ),
145
+ ];
146
+
147
+ /**
148
+ * Allows filtering the final list of classes for each Month View day cell.
149
+ *
150
+ * @since 6.0.2
151
+ *
152
+ * @param array<string,bool> $day_classes The classes to add to the day "cell".
153
+ * @param string $comparison_date The date that was used for comparisons.
154
+ * @param array<mixed> $day The current day data.
155
+ *
156
+ * @return array<string> $day_classes The final list of classes to add to the day "cell".
157
+ */
158
+ return (array) apply_filters( 'tec_events_month_day_classes', $day_classes, $comparison_date, $day );
159
+ }
src/admin-views/create-organizer-fields.php CHANGED
@@ -7,7 +7,7 @@
7
  <tr class="linked-post organizer tribe-linked-type-organizer-website">
8
  <td><label for="organizer-website"><?php esc_html_e( 'Website:', 'the-events-calendar' ); ?></label></td>
9
  <td>
10
- <input id="organizer-website" type='text' name='organizer[Website][]' class='organizer-website' size='25' value='' />
11
  </td>
12
  </tr>
13
  <tr class="linked-post organizer tribe-linked-type-organizer-email">
7
  <tr class="linked-post organizer tribe-linked-type-organizer-website">
8
  <td><label for="organizer-website"><?php esc_html_e( 'Website:', 'the-events-calendar' ); ?></label></td>
9
  <td>
10
+ <input id="organizer-website" type='url' name='organizer[Website][]' class='organizer-website' size='25' value='' />
11
  </td>
12
  </tr>
13
  <tr class="linked-post organizer tribe-linked-type-organizer-email">
src/admin-views/organizer-meta-box.php CHANGED
@@ -36,7 +36,7 @@ do_action( 'tribe_events_organizer_before_metabox', $post );
36
  <tr class="organizer tribe-linked-type-organizer-website">
37
  <td><?php esc_html_e( 'Website:', 'the-events-calendar' ); ?></td>
38
  <td>
39
- <input tabindex="<?php tribe_events_tab_index(); ?>" type='text' id='OrganizerWebsite' name='organizer[Website]' size='25' value='<?php echo isset( $_OrganizerWebsite ) ? esc_attr( $_OrganizerWebsite ) : ''; ?>' />
40
  </td>
41
  </tr>
42
  <tr class="organizer tribe-linked-type-organizer-email">
36
  <tr class="organizer tribe-linked-type-organizer-website">
37
  <td><?php esc_html_e( 'Website:', 'the-events-calendar' ); ?></td>
38
  <td>
39
+ <input tabindex="<?php tribe_events_tab_index(); ?>" type='url' id='OrganizerWebsite' name='organizer[Website]' size='25' value='<?php echo isset( $_OrganizerWebsite ) ? esc_attr( $_OrganizerWebsite ) : ''; ?>' />
40
  </td>
41
  </tr>
42
  <tr class="organizer tribe-linked-type-organizer-email">
src/deprecated/Traits/Tribe__Events__Main_Deprecated.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Handles the `Tribe__Events__Main` class deprecated methods.
4
+ *
5
+ * This trait will only make sense in the context of the `Tribe__Events__Main` class
6
+ * and it should not be used elsewhere.
7
+ *
8
+ * @since 6.0.2
9
+ */
10
+
11
+ /**
12
+ * Trait Tribe__Events__Main_Deprecated.
13
+ *
14
+ * @since 6.0.2
15
+ */
16
+ trait Tribe__Events__Main_Deprecated {
17
+ /**
18
+ * Get the prev/next post for a given event. Ordered by start date instead of ID.
19
+ *
20
+ * @deprecated 6.0.0 Use Tribe__Events__Adjacent_Events::get_closest_event instead.
21
+ *
22
+ * @param WP_Post $post The post/event.
23
+ * @param string $mode Either 'next' or 'previous'.
24
+ *
25
+ * @return null|WP_Post Either the closest Event post, or `null` if not found.
26
+ */
27
+ public function get_closest_event( $post, $mode = 'next' ) {
28
+ _deprecated_function(
29
+ 'Tribe__Events__Main::get_closest_event',
30
+ '6.0.0',
31
+ 'Tribe__Events__Adjacent_Events::get_closest_event'
32
+ );
33
+
34
+ /** @var Tribe__Events__Adjacent_Events $adjacent_events */
35
+ $adjacent_events = tribe( 'tec.adjacent-events' );
36
+ $post_id = $post instanceof WP_Post ? $post->ID : $post;
37
+ $adjacent_events->set_current_event_id( $post_id );
38
+
39
+ return $adjacent_events->get_closest_event( $mode );
40
+ }
41
+ }
src/functions/template-tags/event.php CHANGED
@@ -175,7 +175,7 @@ if ( ! function_exists( 'tribe_get_event' ) ) {
175
  */
176
  $post = apply_filters( 'tribe_get_event', $post, $output, $filter );
177
 
178
- // Dont try to reset cache when forcing.
179
  if ( ! $force ) {
180
  $cache->set( $cache_key, $post, WEEK_IN_SECONDS, Tribe__Cache_Listener::TRIGGER_SAVE_POST );
181
  }
175
  */
176
  $post = apply_filters( 'tribe_get_event', $post, $output, $filter );
177
 
178
+ // Don't try to reset cache when forcing.
179
  if ( ! $force ) {
180
  $cache->set( $cache_key, $post, WEEK_IN_SECONDS, Tribe__Cache_Listener::TRIGGER_SAVE_POST );
181
  }
src/functions/template-tags/general.php CHANGED
@@ -156,6 +156,49 @@ function tribe_get_event_label_plural_lowercase() {
156
  );
157
  }
158
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
  /**
160
  * Includes a template part, similar to the WP get template part, but looks
161
  * in the correct directories for Tribe Events templates
@@ -843,7 +886,6 @@ function tribe_events_event_classes( $event = 0, $echo = true ) {
843
  }
844
  }
845
 
846
-
847
  /**
848
  * Prints out data attributes used in the template header tags
849
  *
156
  );
157
  }
158
 
159
+ /**
160
+ * Get the filtered text label for the "Today" button on calendar views.
161
+ *
162
+ * @since 6.0.2
163
+ *
164
+ * @param \Tribe\Events\Views\V2\View_Interface $view The View currently rendering.
165
+ * Hint: In templates, you can call $this->get_view() to get the view.
166
+ *
167
+ * @return string The label for the "Today" button.
168
+ */
169
+ function tec_events_get_today_button_label( $view = null ) {
170
+ $today = esc_html_x(
171
+ 'Today',
172
+ 'The default text label for the "today" button on main calendar views.',
173
+ 'the-events-calendar'
174
+ );
175
+
176
+ /**
177
+ * Allows filtering of all labels for the today button at one time.
178
+ *
179
+ * @since 6.0.2
180
+ *
181
+ * @param string $today The string used for the "Today" button on calendar views.
182
+ * @param \Tribe\Events\Views\V2\View_Interface $view The View currently rendering.
183
+ */
184
+ $today = apply_filters( 'tec_events_today_button_label', $today, $view );
185
+
186
+ // If we don't have the view - send it off!
187
+ if ( empty( $view ) ) {
188
+ return $today;
189
+ }
190
+
191
+ /**
192
+ * Allows filtering a view-specific label for the today button.
193
+ *
194
+ * @since 6.0.2
195
+ *
196
+ * @param string $today The string used for the "Today" button on calendar views.
197
+ * @param \Tribe\Events\Views\V2\View_Interface $view The View currently rendering.
198
+ */
199
+ return apply_filters( 'tec_events_view_' . $view->get_slug() .'_today_button_label', $today, $view );
200
+ }
201
+
202
  /**
203
  * Includes a template part, similar to the WP get template part, but looks
204
  * in the correct directories for Tribe Events templates
886
  }
887
  }
888
 
 
889
  /**
890
  * Prints out data attributes used in the template header tags
891
  *
src/functions/template-tags/loop.php CHANGED
@@ -5,6 +5,9 @@
5
  * Display functions (template-tags) for use in WordPress templates.
6
  */
7
 
 
 
 
8
  /**
9
  * Past Loop View Test
10
  *
@@ -77,20 +80,32 @@ function tribe_is_showing_all() : bool {
77
  /**
78
  * Date View Test
79
  *
80
- * Check if current display is "bydate"
81
  *
82
  * @return bool
83
  */
84
  function tribe_is_by_date() {
85
- $tribe_ecp = Tribe__Events__Main::instance();
86
- $tribe_is_by_date = ( $tribe_ecp->displaying == 'bydate' ) ? true : false;
 
 
 
 
 
 
 
 
 
 
87
 
88
  /**
89
- * Allows for customization of the result of whether or not a "bydate" view is being viewed.
 
90
  *
91
- * @param bool $tribe_is_by_date Whether a "bydate" calendar view is currently being displayed.
 
92
  */
93
- return apply_filters( 'tribe_is_by_date', $tribe_is_by_date );
94
  }
95
 
96
  /**
@@ -451,4 +466,4 @@ function tribe_right_navigation_classes() {
451
  **/
452
  function tribe_is_view( $view = false ) {
453
  return $view === Tribe__Events__Main::instance()->displaying;
454
- }
5
  * Display functions (template-tags) for use in WordPress templates.
6
  */
7
 
8
+ use Tribe\Events\Views\V2\Views\Day_View;
9
+ use Tribe\Events\Views\V2\Views\Month_View;
10
+
11
  /**
12
  * Past Loop View Test
13
  *
80
  /**
81
  * Date View Test
82
  *
83
+ * Check if current display is a date-based View.
84
  *
85
  * @return bool
86
  */
87
  function tribe_is_by_date() {
88
+ $by_date_views = [
89
+ tribe( Month_View::class )->get_slug(),
90
+ tribe( Day_View::class )->get_slug(),
91
+ ];
92
+
93
+ $context = tribe_context();
94
+ $context_view = $context->get( 'view' );
95
+
96
+ $tribe_is_by_date = in_array(
97
+ $context_view,
98
+ $by_date_views
99
+ );
100
 
101
  /**
102
+ * Allows for customization of the result of whether or not a "by date" view is being viewed.
103
+ * Events PRO hooks in here to indicate that Week View is a by-date-view at 10.
104
  *
105
+ * @param bool $tribe_is_by_date Whether a "by date" calendar view is currently being displayed.
106
+ * @param Tribe__Context The global context object.
107
  */
108
+ return (bool) apply_filters( 'tribe_is_by_date', (bool) $tribe_is_by_date, $context );
109
  }
110
 
111
  /**
466
  **/
467
  function tribe_is_view( $view = false ) {
468
  return $view === Tribe__Events__Main::instance()->displaying;
469
+ }
src/functions/template-tags/month.php CHANGED
@@ -14,8 +14,8 @@
14
  * @return bool
15
  */
16
  function tribe_is_month() {
17
- $tribe_ecp = Tribe__Events__Main::instance();
18
- $is_month = ( 'month' === $tribe_ecp->displaying ) ? true : false;
19
 
20
  /**
21
  * Allows filtering of the tribe_is_month boolean value.
@@ -23,9 +23,9 @@ function tribe_is_month() {
23
  * @since 4.6.15 Added inline documentation for this filter.
24
  *
25
  * @param boolean $is_month Whether you're on the main Month View or not
26
- * @param Tribe__Events__Main $tribe_ecp The current Tribe__Events__Main instance.
27
  */
28
- return apply_filters( 'tribe_is_month', $is_month, $tribe_ecp );
29
  }
30
 
31
  /**
@@ -159,4 +159,4 @@ function tribe_get_current_month_text() {
159
  function tribe_get_next_month_text() {
160
 
161
  return apply_filters( 'tribe_get_next_month_text', null );
162
- }
14
  * @return bool
15
  */
16
  function tribe_is_month() {
17
+ $context = tribe_context();
18
+ $is_month = ( 'month' === $context->get( 'view', 'default' ) );
19
 
20
  /**
21
  * Allows filtering of the tribe_is_month boolean value.
23
  * @since 4.6.15 Added inline documentation for this filter.
24
  *
25
  * @param boolean $is_month Whether you're on the main Month View or not
26
+ * @param Tribe__Context The global context object.
27
  */
28
+ return apply_filters( 'tribe_is_month', $is_month, $context );
29
  }
30
 
31
  /**
159
  function tribe_get_next_month_text() {
160
 
161
  return apply_filters( 'tribe_get_next_month_text', null );
162
+ }
src/functions/template-tags/venue.php CHANGED
@@ -304,19 +304,19 @@ function tribe_get_country( $postId = null ) {
304
  * @param bool $includeVenueName To include the venue name or not.
305
  * @return string Formatted event address.
306
  */
307
- function tribe_get_full_address( $post_id = null, $includeVenueName = false ) {
308
- $venue_id = tribe_get_venue_id( $post_id );
309
- $tec = Tribe__Events__Main::instance();
310
 
311
  global $post;
312
  if ( ! is_null( $post_id ) ) {
313
  $tmp_post = $post;
314
  $post = get_post( $post_id );
315
  }
 
316
  ob_start();
317
  tribe_get_template_part( 'modules/address' );
318
- $address = ob_get_contents();
319
- ob_end_clean();
320
  if ( ! empty( $tmp_post ) ) {
321
  $post = $tmp_post;
322
  }
@@ -328,10 +328,10 @@ function tribe_get_full_address( $post_id = null, $includeVenueName = false ) {
328
  * @since 4.5.11 Added docblock; also added $venue_id and $includeVenueName to filter.
329
  *
330
  * @param string $address The formatted event address
331
- * @param int $venue_id The venue ID.
332
- * @param bool $includeVenueName To include the venue name or not.
333
  */
334
- return apply_filters( 'tribe_get_full_address', $address, $venue_id, $includeVenueName );
335
  }
336
 
337
  /**
304
  * @param bool $includeVenueName To include the venue name or not.
305
  * @return string Formatted event address.
306
  */
307
+ function tribe_get_full_address( $event_id = null, $includeVenueName = false ) {
308
+ $post_id = tribe_get_venue_id( $event_id );
 
309
 
310
  global $post;
311
  if ( ! is_null( $post_id ) ) {
312
  $tmp_post = $post;
313
  $post = get_post( $post_id );
314
  }
315
+
316
  ob_start();
317
  tribe_get_template_part( 'modules/address' );
318
+ $address = ob_get_clean();
319
+
320
  if ( ! empty( $tmp_post ) ) {
321
  $post = $tmp_post;
322
  }
328
  * @since 4.5.11 Added docblock; also added $venue_id and $includeVenueName to filter.
329
  *
330
  * @param string $address The formatted event address
331
+ * @param int $post_id The venue ID.
332
+ * @param bool $includeVenueName To include the venue name or not.
333
  */
334
+ return apply_filters( 'tribe_get_full_address', $address, $post_id, $includeVenueName );
335
  }
336
 
337
  /**
src/resources/css/views-full.min.css CHANGED
@@ -1 +1 @@
1
- :root{--tec-color-text-events-title-day:var(--tec-color-text-events-title);--tec-color-text-events-title-latest-past:var(--tec-color-text-events-title);--tec-color-text-event-title-list:var(--tec-color-text-events-title);--tec-color-text-events-title-month-multiday:var(--tec-color-text-events-title);--tec-color-text-events-title-widget-list:var(--tec-color-text-events-title);--tec-color-text-event-date-secondary-month:var(--tec-color-text-event-date-secondary);--tec-color-text-event-date-secondary-month-mobile:var(--tec-color-text-event-date-secondary-month);--tec-color-text-day-of-week-month:var(--tec-color-text-secondary);--tec-color-day-marker-month:var(--tec-color-text-primary);--tec-color-day-marker-month-hover:var(--tec-color-text-primary-hover);--tec-color-day-marker-month-active:var(--tec-color-text-primary-active);--tec-color-day-marker-current-month:var(--tec-color-day-marker-month);--tec-color-day-marker-current-month-hover:var(--tec-color-day-marker-month-hover);--tec-color-day-marker-current-month-active:var(--tec-color-day-marker-month-active);--tec-color-day-marker-past-month:var(--tec-color-text-primary);--tec-color-day-marker-past-month-hover:var(--tec-color-day-marker-past-month);--tec-color-day-marker-past-month-active:var(--tec-color-day-marker-past-month);--tec-color-text-day-of-week-week:var(--tec-color-text-secondary);--tec-border-radius-month-multiday:9.5px;--tec-color-border-secondary-month-grid:var(--tec-color-border-secondary);--tec-color-border-active-month-grid-hover:var(--tec-color-border-active);--tec-color-background-month-grid:transparent;--tec-color-background-tooltip:var(--tec-color-background);--tec-color-text-events-bar-input:var(--tec-color-text-primary);--tec-color-text-events-bar-input-placeholder:var(--tec-color-text-secondary);--tec-opacity-events-bar-input-placeholder:var(--tec-opacity-default);--tec-color-border-events-bar:var(--tec-color-border-secondary);--tec-color-background-events-bar:var(--tec-color-background);--tec-color-background-view-selector:var(--tec-color-background-events-bar);--tec-color-background-view-selector-tabs:var(--tec-color-background-view-selector);--tec-color-background-view-selector-list-item-hover:var(--tec-color-background-secondary);--tec-color-background-subscribe-list-item-hover:var(--tec-color-background-secondary);--tec-color-text-view-selector-list-item:var(--tec-color-text-primary);--tec-color-text-view-selector-list-item-hover:var(--tec-color-accent-secondary-hover);--tec-color-background-search-container:var(--tec-color-background-events-bar);--tec-color-text-events-bar-submit-button:var(--tec-color-background);--tec-color-text-events-bar-submit-button-active:var(--tec-color-text-events-bar-submit-button);--tec-color-text-events-bar-submit-button-hover:var(--tec-color-text-events-bar-submit-button);--tec-color-background-events-bar-submit-button:var(--tec-color-button-primary);--tec-color-background-events-bar-submit-button-hover:var(--tec-color-button-primary-hover);--tec-color-background-events-bar-submit-button-active:var(--tec-color-button-primary-active);--tec-color-icon-events-bar:var(--tec-color-icon-primary);--tec-color-icon-events-bar-active:var(--tec-color-icon-active);--tec-color-icon-events-bar-hover:var(--tec-color-icon-hover)}.tribe-events-view{background-color:var(--tec-color-background-events)}.tribe-events .tribe-events-c-breadcrumbs__list{font-family:var(--tec-font-family-base);font-size:24px;line-height:var(--tec-line-height-1)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-breadcrumbs__list{font-size:42px;line-height:var(--tec-line-height-0)}.tribe-events .tribe-events-c-breadcrumbs__list-item-link{color:var(--tec-color-text-secondary);transition:var(--tec-transition-color)}.tribe-events .tribe-events-c-breadcrumbs__list-item-link:visited{color:var(--tec-color-text-secondary)}.tribe-events .tribe-events-c-breadcrumbs__list-item-link:focus,.tribe-events .tribe-events-c-breadcrumbs__list-item-link:hover{color:var(--tec-color-text-primary)}.tribe-events .tribe-events-c-breadcrumbs__list-item-icon-svg path{fill:var(--tec-color-icon-primary)}.tribe-events .datepicker{background-color:var(--tec-color-background);border:1px solid var(--tec-color-border-default);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-tooltip)}.tribe-events .datepicker:after,.tribe-events .datepicker:before{content:none}.tribe-events .datepicker .datepicker-switch:active,.tribe-events .datepicker .datepicker-switch:focus,.tribe-events .datepicker .datepicker-switch:hover,.tribe-events .datepicker .next:active,.tribe-events .datepicker .next:focus,.tribe-events .datepicker .next:hover,.tribe-events .datepicker .prev:active,.tribe-events .datepicker .prev:focus,.tribe-events .datepicker .prev:hover{background-color:var(--tec-color-background)}.tribe-events .datepicker .datepicker-switch{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-3);line-height:var(--tec-line-height-3);font-weight:var(--tec-font-weight-regular)}.tribe-events .datepicker .datepicker-switch:focus,.tribe-events .datepicker .datepicker-switch:hover{color:var(--tec-color-accent-secondary-hover)}.tribe-events .datepicker .datepicker-switch:active{color:var(--tec-color-accent-secondary-active)}.tribe-events .datepicker .next:active .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .next:focus .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .next:hover .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .prev:active .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .prev:focus .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .prev:hover .tribe-events-c-top-bar__datepicker-nav-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-events .datepicker .next .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .prev .tribe-events-c-top-bar__datepicker-nav-icon-svg path{fill:var(--tec-color-icon-secondary)}.tribe-events .datepicker .dow{font-size:var(--tec-font-size-0);line-height:var(--tec-line-height-2)}.tribe-events .datepicker .day,.tribe-events .datepicker .dow{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-weight:var(--tec-font-weight-regular)}.tribe-events .datepicker .day{font-size:var(--tec-font-size-3);line-height:var(--tec-line-height-3)}.tribe-events .datepicker .month,.tribe-events .datepicker .year{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-1);line-height:var(--tec-line-height-0);font-weight:var(--tec-font-weight-regular)}.tribe-events .datepicker .past{color:var(--tec-color-text-primary-light)}.tribe-events .datepicker .day,.tribe-events .datepicker .month,.tribe-events .datepicker .year{border-radius:var(--tec-border-radius-default)}.tribe-events .datepicker .day.focused,.tribe-events .datepicker .day:focus,.tribe-events .datepicker .day:hover,.tribe-events .datepicker .month.focused,.tribe-events .datepicker .month:focus,.tribe-events .datepicker .month:hover,.tribe-events .datepicker .year.focused,.tribe-events .datepicker .year:focus,.tribe-events .datepicker .year:hover{background:var(--tec-color-background-secondary-datepicker)}.tribe-events .datepicker .day.current,.tribe-events .datepicker .day.current.focused,.tribe-events .datepicker .day.current:focus,.tribe-events .datepicker .day.current:hover,.tribe-events .datepicker .month.current,.tribe-events .datepicker .month.current.focused,.tribe-events .datepicker .month.current:focus,.tribe-events .datepicker .month.current:hover,.tribe-events .datepicker .year.current,.tribe-events .datepicker .year.current.focused,.tribe-events .datepicker .year.current:focus,.tribe-events .datepicker .year.current:hover{background:var(--tec-color-accent-primary-background-datepicker)}.tribe-events .datepicker .day.active,.tribe-events .datepicker .day.active.focused,.tribe-events .datepicker .day.active:focus,.tribe-events .datepicker .day.active:hover,.tribe-events .datepicker .month.active,.tribe-events .datepicker .month.active.focused,.tribe-events .datepicker .month.active:focus,.tribe-events .datepicker .month.active:hover,.tribe-events .datepicker .year.active,.tribe-events .datepicker .year.active.focused,.tribe-events .datepicker .year.active:focus,.tribe-events .datepicker .year.active:hover{background:var(--tec-color-accent-primary);color:var(--tec-color-background);text-shadow:none}.admin-bar .tribe-events .datepicker{margin-top:var(--tec-spacer-1)}.admin-bar .tribe-events.tribe-common--breakpoint-medium .datepicker{margin-top:var(--tec-spacer-3)}.tribe-theme-enfold .tribe-events .datepicker{border:1px solid var(--tec-color-border-default);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-tooltip)}.tribe-theme-enfold .tribe-events .datepicker table,.tribe-theme-enfold .tribe-events .datepicker td,.tribe-theme-enfold .tribe-events .datepicker th,.tribe-theme-enfold .tribe-events .datepicker tr{background:transparent}.tribe-theme-enfold .tribe-events .datepicker .datepicker-switch{color:var(--tec-color-text-primary)!important}.tribe-theme-enfold .tribe-events .datepicker .datepicker-switch:focus,.tribe-theme-enfold .tribe-events .datepicker .datepicker-switch:hover{color:var(--tec-color-accent-secondary-hover)!important}.tribe-theme-enfold .tribe-events .datepicker .datepicker-switch:active{color:var(--tec-color-accent-secondary-active)!important}.tribe-theme-enfold .tribe-events .datepicker .day{background-color:var(--tec-color-background)}.tribe-theme-enfold .tribe-events .datepicker .day.new,.tribe-theme-enfold .tribe-events .datepicker .day.old{opacity:1}.tribe-theme-enfold .tribe-events .datepicker .day,.tribe-theme-enfold .tribe-events .datepicker .month,.tribe-theme-enfold .tribe-events .datepicker .year{background-color:var(--tec-color-background);color:var(--tec-color-text-primary)}.tribe-theme-enfold .tribe-events .datepicker .day.focused,.tribe-theme-enfold .tribe-events .datepicker .day:focus,.tribe-theme-enfold .tribe-events .datepicker .day:hover,.tribe-theme-enfold .tribe-events .datepicker .month.focused,.tribe-theme-enfold .tribe-events .datepicker .month:focus,.tribe-theme-enfold .tribe-events .datepicker .month:hover,.tribe-theme-enfold .tribe-events .datepicker .year.focused,.tribe-theme-enfold .tribe-events .datepicker .year:focus,.tribe-theme-enfold .tribe-events .datepicker .year:hover{background:var(--tec-color-background-secondary-datepicker)}.tribe-theme-enfold .tribe-events .datepicker .day.past,.tribe-theme-enfold .tribe-events .datepicker .month.past,.tribe-theme-enfold .tribe-events .datepicker .year.past{color:var(--tec-color-text-primary-light)}.tribe-theme-enfold .tribe-events .datepicker .day.current,.tribe-theme-enfold .tribe-events .datepicker .day.current.focused,.tribe-theme-enfold .tribe-events .datepicker .day.current:focus,.tribe-theme-enfold .tribe-events .datepicker .day.current:hover,.tribe-theme-enfold .tribe-events .datepicker .month.current,.tribe-theme-enfold .tribe-events .datepicker .month.current.focused,.tribe-theme-enfold .tribe-events .datepicker .month.current:focus,.tribe-theme-enfold .tribe-events .datepicker .month.current:hover,.tribe-theme-enfold .tribe-events .datepicker .year.current,.tribe-theme-enfold .tribe-events .datepicker .year.current.focused,.tribe-theme-enfold .tribe-events .datepicker .year.current:focus,.tribe-theme-enfold .tribe-events .datepicker .year.current:hover{background:var(--tec-color-accent-primary-background-datepicker)}.tribe-theme-enfold .tribe-events .datepicker .day.active,.tribe-theme-enfold .tribe-events .datepicker .day.active.focused,.tribe-theme-enfold .tribe-events .datepicker .day.active:focus,.tribe-theme-enfold .tribe-events .datepicker .day.active:hover,.tribe-theme-enfold .tribe-events .datepicker .month.active,.tribe-theme-enfold .tribe-events .datepicker .month.active.focused,.tribe-theme-enfold .tribe-events .datepicker .month.active:focus,.tribe-theme-enfold .tribe-events .datepicker .month.active:hover,.tribe-theme-enfold .tribe-events .datepicker .year.active,.tribe-theme-enfold .tribe-events .datepicker .year.active.focused,.tribe-theme-enfold .tribe-events .datepicker .year.active:focus,.tribe-theme-enfold .tribe-events .datepicker .year.active:hover{background:var(--tec-color-accent-primary);color:var(--tec-color-background)}.tribe-theme-avada .tribe-events .datepicker{border:1px solid var(--tec-color-border-default);border-radius:var(--tec-border-radius-default)}.tribe-theme-avada .tribe-events .datepicker tbody td{border:0}.tribe-theme-avada .tribe-events .datepicker .datepicker-switch,.tribe-theme-avada .tribe-events .datepicker .datepicker-switch:hover,.tribe-theme-avada .tribe-events .datepicker .next,.tribe-theme-avada .tribe-events .datepicker .next:hover,.tribe-theme-avada .tribe-events .datepicker .prev,.tribe-theme-avada .tribe-events .datepicker .prev:hover{background-color:var(--tec-color-background)}.tribe-theme-avada .tribe-events .datepicker .day.new,.tribe-theme-avada .tribe-events .datepicker .day.old{background-color:transparent!important;color:var(--tec-color-text-primary)!important}.tribe-theme-avada .tribe-events .datepicker .day.new.focused,.tribe-theme-avada .tribe-events .datepicker .day.new:focus,.tribe-theme-avada .tribe-events .datepicker .day.new:hover,.tribe-theme-avada .tribe-events .datepicker .day.old.focused,.tribe-theme-avada .tribe-events .datepicker .day.old:focus,.tribe-theme-avada .tribe-events .datepicker .day.old:hover{background:var(--tec-color-background-secondary-datepicker)!important}.tribe-theme-avada .tribe-events .datepicker .day,.tribe-theme-avada .tribe-events .datepicker .month{background-color:transparent;color:var(--tec-color-text-primary)}.tribe-theme-avada .tribe-events .datepicker .day.focused,.tribe-theme-avada .tribe-events .datepicker .day:focus,.tribe-theme-avada .tribe-events .datepicker .day:hover,.tribe-theme-avada .tribe-events .datepicker .month.focused,.tribe-theme-avada .tribe-events .datepicker .month:focus,.tribe-theme-avada .tribe-events .datepicker .month:hover{background:var(--tec-color-background-secondary-datepicker)}.tribe-theme-avada .tribe-events .datepicker .day.past,.tribe-theme-avada .tribe-events .datepicker .month.past{color:var(--tec-color-text-primary-light)!important}.tribe-theme-avada .tribe-events .datepicker .day.current,.tribe-theme-avada .tribe-events .datepicker .day.current.focused,.tribe-theme-avada .tribe-events .datepicker .day.current:focus,.tribe-theme-avada .tribe-events .datepicker .day.current:hover,.tribe-theme-avada .tribe-events .datepicker .month.current,.tribe-theme-avada .tribe-events .datepicker .month.current.focused,.tribe-theme-avada .tribe-events .datepicker .month.current:focus,.tribe-theme-avada .tribe-events .datepicker .month.current:hover{background:var(--tec-color-accent-primary-background-datepicker)}.tribe-theme-avada .tribe-events .datepicker .day.active,.tribe-theme-avada .tribe-events .datepicker .day.active.focused,.tribe-theme-avada .tribe-events .datepicker .day.active:focus,.tribe-theme-avada .tribe-events .datepicker .day.active:hover,.tribe-theme-avada .tribe-events .datepicker .month.active,.tribe-theme-avada .tribe-events .datepicker .month.active.focused,.tribe-theme-avada .tribe-events .datepicker .month.active:focus,.tribe-theme-avada .tribe-events .datepicker .month.active:hover{background:var(--tec-color-accent-primary)!important;color:var(--tec-color-background)!important}.tribe-events .tribe-events-c-day-marker:after{background-color:var(--tec-color-border-default);content:"";display:block;flex:auto;height:1px;margin-left:20px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-header--has-event-search .tribe-events-c-events-bar{background-color:var(--tec-color-background-events-bar)}.tribe-events .tribe-events-c-events-bar .tribe-common-form-control-text__input{background-color:transparent;color:var(--tec-color-text-events-bar-input)}.tribe-events .tribe-events-c-events-bar .tribe-common-form-control-text__input::placeholder{color:var(--tec-color-text-events-bar-input-placeholder);opacity:var(--tec-opacity-events-bar-input-placeholder)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-events-bar--border{border:1px solid var(--tec-color-border-events-bar)}.tribe-events .tribe-events-c-events-bar__search-container{background-color:var(--tec-color-background-events-bar)}.tribe-events .tribe-events-c-events-bar__search-button{display:flex}.tribe-events .tribe-events-c-events-bar__search-button:focus,.tribe-events .tribe-events-c-events-bar__search-button:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-events-bar__search-button:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-c-events-bar__search-button:before{background-color:var(--tec-color-icon-events-bar-hover);content:"";display:none;height:2px;pointer-events:none;position:absolute;top:100%;transform:translateY(var(--tec-spacer-0));width:calc(100% - var(--tec-spacer-0)*2)}.tribe-events .tribe-events-c-events-bar__search-button--active:before{display:block}.tribe-events .tribe-events-c-events-bar__search-button-icon-svg path{fill:var(--tec-color-icon-events-bar-active)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-events-bar__search-button,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-events-bar__search-button:focus,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-events-bar__search-button:hover{background-color:transparent}.single-tribe_events .tribe-events-c-ical__link,.single-tribe_events .tribe-events-c-ical__link:visited,.tribe-events .tribe-events-c-ical__link,.tribe-events .tribe-events-c-ical__link:visited{align-items:center;background-color:var(--tec-color-background);border:1px solid var(--tec-color-accent-primary);border-radius:var(--tec-border-radius-default);color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.single-tribe_events .tribe-events-c-ical__link:active,.single-tribe_events .tribe-events-c-ical__link:focus,.single-tribe_events .tribe-events-c-ical__link:focus-within,.single-tribe_events .tribe-events-c-ical__link:hover,.tribe-events .tribe-events-c-ical__link:active,.tribe-events .tribe-events-c-ical__link:focus,.tribe-events .tribe-events-c-ical__link:focus-within,.tribe-events .tribe-events-c-ical__link:hover{background-color:var(--tec-color-accent-primary);color:var(--tec-color-background)}.single-tribe_events .tribe-events-c-ical__link:active .tribe-events-c-ical__link-icon-svg path,.single-tribe_events .tribe-events-c-ical__link:focus-within .tribe-events-c-ical__link-icon-svg path,.single-tribe_events .tribe-events-c-ical__link:focus .tribe-events-c-ical__link-icon-svg path,.single-tribe_events .tribe-events-c-ical__link:hover .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link:active .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link:focus-within .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link:focus .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link:hover .tribe-events-c-ical__link-icon-svg path{stroke:var(--tec-color-background)}.single-tribe_events .tribe-events-c-ical__link-icon-svg,.tribe-events .tribe-events-c-ical__link-icon-svg{display:block;flex:none;margin-right:var(--tec-spacer-1);width:10px}.single-tribe_events .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link-icon-svg path{stroke:currentColor}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button.tribe-events-c-subscribe-dropdown__button--active,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:focus,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:focus-within,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:hover,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button.tribe-events-c-subscribe-dropdown__button--active,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:focus,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:focus-within,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:hover{background-color:var(--tec-color-accent-primary);color:var(--tec-color-background)}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-text,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-text{cursor:pointer}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon{color:currentColor;stroke:currentColor}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon path,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon path{fill:currentColor}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list{background-color:var(--tec-color-background);border:1px solid var(--tec-color-border-secondary);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-default)}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif)}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:active,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:focus,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:focus-within,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:hover,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:active,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:focus,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:focus-within,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:hover{background-color:var(--tec-color-background-subscribe-list-item-hover)}.tribe-theme-twentyseventeen .single-tribe_events .tribe-events-c-ical__link:active,.tribe-theme-twentyseventeen .single-tribe_events .tribe-events-c-ical__link:focus,.tribe-theme-twentyseventeen .single-tribe_events .tribe-events-c-ical__link:hover,.tribe-theme-twentyseventeen .tribe-events .tribe-events-c-ical__link:active,.tribe-theme-twentyseventeen .tribe-events .tribe-events-c-ical__link:focus,.tribe-theme-twentyseventeen .tribe-events .tribe-events-c-ical__link:hover{color:var(--tec-color-background)}.tribe-theme-twentytwentyone .single-tribe_events .tribe-events-c-ical__link:focus:not(.wp-block-button__link):not(.wp-block-file__button),.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-ical__link:focus:not(.wp-block-button__link):not(.wp-block-file__button){background-color:var(--tec-color-accent-primary);color:var(--tec-color-background)}.tribe-theme-twentytwentyone .single-tribe_events .tribe-events-c-subscribe-dropdown__list-item a:focus,.tribe-theme-twentytwentyone .single-tribe_events .tribe-events-c-subscribe-dropdown__list-item a:focus-within,.tribe-theme-twentytwentyone .single-tribe_events .tribe-events-c-subscribe-dropdown__list-item a:hover,.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-subscribe-dropdown__list-item a:focus,.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-subscribe-dropdown__list-item a:focus-within,.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-subscribe-dropdown__list-item a:hover{background-color:transparent!important}.single-tribe_events .tribe-events-c-ical,.tribe-block__events-link .tribe-events-c-ical{text-align:left}.single-tribe_events .tribe-events-c-ical__link,.tribe-block__events-link .tribe-events-c-ical__link{color:var(--tec-color-accent-primary);font-size:var(--tec-font-size-2);margin:0 0 var(--tec-spacer-3);width:220px}.single-tribe_events .tribe-events .tribe-events-c-subscribe-dropdown__container,.tribe-block__events-link .tribe-events .tribe-events-c-subscribe-dropdown__container{width:200px}.single-tribe_events .tribe-events .tribe-events-c-subscribe-dropdown,.tribe-block__events-link .tribe-events .tribe-events-c-subscribe-dropdown{position:relative}.single-tribe_events .tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__content,.tribe-block__events-link .tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__content{position:absolute;top:42px;width:100%;z-index:var(--tec-z-index-dropdown)}.single-tribe_events .tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon,.tribe-block__events-link .tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon{margin-left:var(--tec-spacer-2)}.single-tribe_events .tribe-events-c-subscribe-dropdown__button,.tribe-block__events-link .tribe-events-c-subscribe-dropdown__button{padding:var(--tec-spacer-1) var(--tec-spacer-2);width:200px}.single-tribe_events .tribe-events-c-subscribe-dropdown__export-icon,.tribe-block__events-link .tribe-events-c-subscribe-dropdown__export-icon{color:currentColor;display:inline-block;height:16px;margin-right:var(--tec-spacer-1);margin-top:-3px;stroke:currentColor;vertical-align:middle;width:21px}#tribe-events-content .tribe-block__events-link .tribe-events-c-ical__link{color:var(--tec-color-accent-primary)}#tribe-events-content .tribe-block__events-link .tribe-events-c-ical__link:hover{color:#fff}.tribe-events .tribe-events-c-messages__message{background-color:var(--tec-color-background-messages);border-radius:var(--tec-border-radius-default)}.tribe-events .tribe-events-c-messages__message--notice .tribe-events-c-messages__message-icon-svg{display:inline-block;margin-right:var(--tec-spacer-2)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-messages__message-list{text-align:center}.tribe-events .tribe-events-c-messages__message-list-item-link{color:var(--tec-color-link-accent);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-c-nav{border-top:1px solid var(--tec-color-border-default)}.tribe-events .tribe-events-c-nav__list{list-style:none}.tribe-events .tribe-events-c-nav__next-label-plural,.tribe-events .tribe-events-c-nav__prev-label-plural{white-space:pre}.tribe-events .tribe-events-c-nav__today:focus,.tribe-events .tribe-events-c-nav__today:hover{color:var(--tec-color-accent-secondary-hover)}.tribe-events .tribe-events-c-nav__today:active{color:var(--tec-color-text-primary)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__next,.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__prev{color:var(--tec-color-text-secondary)}.tribe-events .tribe-events-c-nav__next:focus,.tribe-events .tribe-events-c-nav__next:hover,.tribe-events .tribe-events-c-nav__prev:focus,.tribe-events .tribe-events-c-nav__prev:hover{color:var(--tec-color-accent-secondary-hover)}.tribe-events .tribe-events-c-nav__next:active,.tribe-events .tribe-events-c-nav__prev:active{color:var(--tec-color-text-primary)}.tribe-events .tribe-events-c-nav__next:disabled,.tribe-events .tribe-events-c-nav__prev:disabled{background-color:transparent;color:var(--tec-color-text-disabled)}.tribe-events .tribe-events-c-nav__prev:focus .tribe-events-c-nav__prev-icon-svg,.tribe-events .tribe-events-c-nav__prev:hover .tribe-events-c-nav__prev-icon-svg{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-nav__prev:focus .tribe-events-c-nav__prev-icon-svg path,.tribe-events .tribe-events-c-nav__prev:hover .tribe-events-c-nav__prev-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-events .tribe-events-c-nav__prev:active:before{opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-c-nav__prev:disabled .tribe-events-c-nav__prev-icon-svg path{fill:var(--tec-color-icon-disabled)}.tribe-events .tribe-events-c-nav__prev-icon-svg{display:block;margin-right:8px;width:7px}.tribe-events .tribe-events-c-nav__prev-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__prev-icon-svg{margin-right:15px;width:9px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__prev-icon-svg path{fill:var(--tec-color-icon-primary)}.tribe-events .tribe-events-c-nav__next:focus .tribe-events-c-nav__next-icon-svg,.tribe-events .tribe-events-c-nav__next:hover .tribe-events-c-nav__next-icon-svg{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-nav__next:focus .tribe-events-c-nav__next-icon-svg path,.tribe-events .tribe-events-c-nav__next:hover .tribe-events-c-nav__next-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-events .tribe-events-c-nav__next:active:after{opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-c-nav__next:disabled .tribe-events-c-nav__next-icon-svg path{fill:var(--tec-color-icon-disabled)}.tribe-events .tribe-events-c-nav__next-icon-svg{display:block;margin-left:8px;width:7px}.tribe-events .tribe-events-c-nav__next-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__next-icon-svg{margin-left:15px;width:9px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__next-icon-svg path{fill:var(--tec-color-icon-primary)}.tribe-events .tribe-events-c-small-cta__stock{color:var(--tec-color-text-secondary)}.tribe-events .tribe-events-c-search__input-control{position:relative}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-search__input-control{border-right:1px solid var(--tec-color-border-events-bar)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-search__input-control:last-child{border-right:0}.tribe-events .tribe-events-c-search__input-control-icon-svg{color:var(--tec-color-icon-events-bar);display:block;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-search__input-control-icon-svg{left:16px;right:auto}.tribe-events .tribe-events-c-search__input-control--keyword-focus .tribe-events-c-search__input~.tribe-events-c-search__input-control-icon-svg path,.tribe-events .tribe-events-c-search__input-control--keyword .tribe-events-c-search__input:focus~.tribe-events-c-search__input-control-icon-svg path,.tribe-events .tribe-events-c-search__input-control--location-focus .tribe-events-c-search__input~.tribe-events-c-search__input-control-icon-svg path,.tribe-events .tribe-events-c-search__input-control--location .tribe-events-c-search__input:focus~.tribe-events-c-search__input-control-icon-svg path,.tribe-events .tribe-events-c-search__input-control-icon-svg path{fill:currentColor}.tribe-events .tribe-events-c-search__button{background-color:var(--tec-color-background-events-bar-submit-button);color:var(--tec-color-text-events-bar-submit-button)}.tribe-events .tribe-events-c-search__button:focus,.tribe-events .tribe-events-c-search__button:hover{background-color:var(--tec-color-background-events-bar-submit-button-hover);color:var(--tec-color-text-events-bar-submit-button-hover)}.tribe-events .tribe-events-c-search__button:active{background-color:var(--tec-color-background-events-bar-submit-button-active);color:var(--tec-color-text-events-bar-submit-button-active)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__input{background-color:var(--tec-background-color)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__button{background-color:var(--tec-color-background-events-bar-submit-button);color:var(--tec-color-text-events-bar-submit-button)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__button:focus,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__button:hover{background-color:var(--tec-color-background-events-bar-submit-button-hover);color:var(--tec-color-text-events-bar-submit-button-hover)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__button:active{background-color:var(--tec-color-background-events-bar-submit-button-active);color:var(--tec-color-text-events-bar-submit-button-active)}.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__input{background-color:var(--tec-background-color)}.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__button{background-color:var(--tec-color-background-events-bar-submit-button);color:var(--tec-color-text-events-bar-submit-button)}.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__button:focus,.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__button:hover{background-color:var(--tec-color-background-events-bar-submit-button-hover);color:var(--tec-color-text-events-bar-submit-button-hover)}.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__button:active{background-color:var(--tec-color-background-events-bar-submit-button-active);color:var(--tec-color-text-events-bar-submit-button-active)}.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-search__button:not(:hover):not(:active){background-color:var(--tec-color-background-events-bar-submit-button);color:var(--tec-color-text-events-bar-submit-button)}.tooltipster-base.tribe-events-tooltip-theme{background-color:var(--tec-color-background-tooltip);border:1px solid var(--tec-color-border-default);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-tooltip)}.tooltipster-base.tribe-events-tooltip-theme .tooltipster-box{background-color:transparent;border:0;border-radius:0;box-shadow:none}.tooltipster-base.tribe-events-tooltip-theme .tooltipster-box .tooltipster-content{color:var(--tec-color-text-primary);overflow:inherit}.tooltipster-base.tribe-events-tooltip-theme--hover{background-color:var(--tec-color-background-tooltip)}.tribe-events .tribe-events-c-top-bar__datepicker-button{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-c-top-bar__datepicker-button:focus,.tribe-events .tribe-events-c-top-bar__datepicker-button:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-top-bar__datepicker-button:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-c-top-bar__datepicker-button-icon-svg{display:block;height:6px;margin-left:var(--tec-spacer-1);width:9px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-top-bar__datepicker-button-icon-svg{height:8px;width:11px}.tribe-events .tribe-events-c-top-bar__datepicker-button--open .tribe-events-c-top-bar__datepicker-button-icon-svg{transform:rotate(180deg)}.tribe-theme-genesis .tribe-events .tribe-events-c-top-bar__nav-link:disabled,.tribe-theme-genesis .tribe-events .tribe-events-c-top-bar__nav-link:focus,.tribe-theme-genesis .tribe-events .tribe-events-c-top-bar__nav-link:hover,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-top-bar__datepicker-button,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-top-bar__nav-link{background-color:transparent}.tribe-theme-twentytwentyone .tribe-events button.tribe-events-c-top-bar__datepicker-button:focus{outline-offset:0}.tribe-theme-twentytwentyone .tribe-events a.tribe-events-c-top-bar__nav-link--next.tribe-events-c-top-bar__nav-link:focus,.tribe-theme-twentytwentyone .tribe-events a.tribe-events-c-top-bar__nav-link--prev.tribe-events-c-top-bar__nav-link:focus{background:transparent}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button:before{content:none}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button-icon-caret-svg{color:var(--tec-color-icon-events-bar);display:block;flex:none;height:6px;margin-left:var(--tec-spacer-1);width:10px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button-icon-caret-svg path{fill:currentColor}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button--active .tribe-events-c-view-selector__button-icon-caret-svg{transform:rotate(180deg)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button-text{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-2);line-height:var(--tec-line-height-3);font-weight:var(--tec-font-weight-regular);font-weight:var(--tec-font-weight-bold);color:var(--tec-color-text-view-selector-list-item)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__content{box-shadow:var(--tec-box-shadow-default)}.tribe-events .tribe-events-c-view-selector--tabs .tribe-events-c-view-selector__content{background-color:var(--tec-color-background-view-selector)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--tabs .tribe-events-c-view-selector__content{border:0;border-radius:0;box-shadow:none}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--tabs .tribe-events-c-view-selector__list-item--active .tribe-events-c-view-selector__list-item-link:after{background-color:var(--tec-color-accent-secondary);bottom:-1px;content:"";display:block;height:2px;position:absolute;width:100%}.tribe-events .tribe-events-c-view-selector__button{text-align:left}.tribe-events .tribe-events-c-view-selector__button:focus,.tribe-events .tribe-events-c-view-selector__button:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-view-selector__button:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-c-view-selector__button:before{background-color:var(--tec-color-accent-primary);content:"";display:none;height:2px;pointer-events:none;position:absolute;top:100%;transform:translateY(var(--tec-spacer-0));width:calc(100% - var(--tec-spacer-0)*2)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector__button:before{transform:none;width:calc(100% - var(--tec-spacer-1)*2)}.tribe-events .tribe-events-c-view-selector__button--active:before{display:block}.tribe-events .tribe-events-c-view-selector__content{background-color:var(--tec-color-background-view-selector);border:1px solid var(--tec-color-border-secondary);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-tooltip)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector__list-item:focus,.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector__list-item:focus-within,.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector__list-item:hover{background-color:var(--tec-color-background-view-selector-list-item-hover)}.tribe-events .tribe-events-c-view-selector__list-item-text{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-2);line-height:var(--tec-line-height-3);font-weight:var(--tec-font-weight-regular);color:var(--tec-color-text-view-selector-list-item)}.tribe-events .tribe-events-c-view-selector__list-item--active .tribe-events-c-view-selector__list-item-text{font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-c-view-selector__list-item-link{border-radius:var(--tec-border-radius-default);color:var(--tec-color-text-view-selector-list-item)}.tribe-events .tribe-events-c-view-selector__list-item-link:focus .tribe-events-c-view-selector__list-item-icon,.tribe-events .tribe-events-c-view-selector__list-item-link:hover .tribe-events-c-view-selector__list-item-icon{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-view-selector__list-item-link:focus .tribe-events-c-view-selector__list-item-text,.tribe-events .tribe-events-c-view-selector__list-item-link:hover .tribe-events-c-view-selector__list-item-text{color:var(--tec-color-text-view-selector-list-item-hover)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-view-selector__button,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-view-selector__button:focus,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-view-selector__button:hover{background-color:transparent}.tribe-events .tribe-events-calendar-list__event-row--featured .tribe-events-calendar-list__event-date-tag-datetime:after{background-color:var(--tec-color-accent-primary);border-radius:var(--tec-border-radius-default);content:"";height:100%;position:absolute;right:calc(100% - 3px);width:3px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-list__event-row--featured .tribe-events-calendar-list__event-date-tag-datetime:after{right:-1px;width:4px}.tribe-events .tribe-events-calendar-list__event-venue{font-style:normal}.tribe-events .tribe-events-calendar-list__event-date-tag-weekday{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-0);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-2);color:var(--tec-color-text-secondary);text-transform:uppercase}.tribe-events .tribe-events-calendar-list__event-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-list__event-featured-image-link:focus,.tribe-events .tribe-events-calendar-list__event-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-list__event-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-calendar-list__event-title{color:var(--tec-color-text-event-title-list)}.tribe-events .tribe-events-calendar-list__event-datetime{color:var(--tec-color-text-event-date)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-list__event-datetime-featured-text{color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-list__month-separator:after{background-color:var(--tec-color-border-default);content:"";display:block;flex:auto;height:1px;margin-left:20px}.tribe-events .tribe-events-calendar-list-nav{border-top:1px solid var(--tec-color-border-default)}.tribe-events .tribe-events-calendar-month__body{background-color:var(--tec-color-background-month-grid)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__calendar-event{opacity:.64}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__calendar-event-datetime{color:var(--tec-color-text-event-date);opacity:.94}.tribe-events .tribe-events-calendar-month__calendar-event-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-month__calendar-event-featured-image-link:focus,.tribe-events .tribe-events-calendar-month__calendar-event-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-month__calendar-event-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-calendar-month__calendar-event-datetime{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-0);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-2);color:var(--tec-color-text-event-date-secondary)}.tribe-events .tribe-events-calendar-month__calendar-event--featured:before{background-color:var(--tec-color-accent-primary);content:"";height:100%;left:7px;position:absolute;width:2px}.tribe-events .tribe-events-calendar-month__calendar-event--featured:last-child:before{height:calc(100% - var(--tec-spacer-3))}.tribe-events .tribe-events-calendar-month__calendar-event-title-link,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month__calendar-event-title-link:active,.tribe-events .tribe-events-calendar-month__calendar-event-title-link:focus,.tribe-events .tribe-events-calendar-month__calendar-event-title-link:hover,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link:active,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link:focus,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link:hover{border-color:currentColor;color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month__calendar-event-title-link:visited,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link:visited{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-featured-image-link:focus,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-datetime{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-0);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-2);color:var(--tec-color-text-event-date)}.tribe-events .tribe-events-calendar-month__header-column{text-transform:uppercase}.tribe-events .tribe-events-calendar-month__header-column-title{color:var(--tec-color-text-day-of-week-month);text-align:center}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-month__header-column-title{text-align:left}.tribe-events .tribe-events-calendar-month__day{border-radius:var(--tec-border-radius-default)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-month__day{border-radius:0}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-month__day:after{background-color:transparent;bottom:0;content:"";display:block;height:2px;left:-1px;position:absolute;transition:var(--tec-transition-background-color);width:calc(100% + 2px)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-month__day:hover:after{background-color:var(--tec-color-border-active-month-grid-hover)}.tribe-events .tribe-events-calendar-month__day-date-link{color:var(--tec-color-day-marker-month);transition:var(--tec-transition-color)}.tribe-events .tribe-events-calendar-month__day-date-link:focus,.tribe-events .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-day-marker-month-hover)}.tribe-events .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-day-marker-month-active)}.tribe-events .tribe-events-calendar-month__day-date-daynum{color:var(--tec-color-day-marker-month)}.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date,.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link{color:var(--tec-color-day-marker-current-month);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:focus,.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-day-marker-month-current-hover)}.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-day-marker-month-current-active)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date{color:var(--tec-color-day-marker-past-month);opacity:.6}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link{color:var(--tec-color-day-marker-past-month)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link:focus,.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-day-marker-month-past-hover)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-day-marker-month-past-active)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link .tribe-events-calendar-month__day-date-daynum{color:inherit}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__mobile-events-icon--event{background-color:var(--tec-color-icon-active);opacity:.6}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__mobile-events-icon--featured{opacity:.6}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__mobile-events-icon--featured .tribe-events-calendar-month__mobile-events-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-events .tribe-events-calendar-month__day-cell--mobile:focus,.tribe-events .tribe-events-calendar-month__day-cell--mobile:hover{background-color:var(--tec-color-background-secondary)}.tribe-events .tribe-events-calendar-month__day-cell--selected,.tribe-events .tribe-events-calendar-month__day-cell--selected:focus,.tribe-events .tribe-events-calendar-month__day-cell--selected:hover{background-color:var(--tec-color-accent-primary)}.tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__day-date{color:var(--tec-color-background);opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__mobile-events-icon--event{background-color:var(--tec-color-background);opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__mobile-events-icon--featured{opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__mobile-events-icon--featured .tribe-events-calendar-month__mobile-events-icon-svg path{fill:var(--tec-color-background)}.tribe-events .tribe-events-calendar-month__mobile-events-icon--event{background-color:var(--tec-color-accent-primary)}.tribe-events .tribe-events-calendar-month__mobile-events-icon--featured .tribe-events-calendar-month__mobile-events-icon-svg path{fill:currentColor}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:focus,.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-accent-primary-hover)}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-accent-primary-active)}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-cell--selected:focus,.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-cell--selected:hover{background-color:var(--tec-color-accent-primary)}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-date-link:focus,.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-accent-secondary-hover)}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-accent-secondary-active)}.tribe-theme-twentytwenty .tribe-events .tribe-events-calendar-month__day-cell--selected{background-color:var(--tec-color-accent-primary)}.tribe-theme-avada #main .tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__day-date{color:var(--tec-color-background-events)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event+.tribe-events-calendar-month-mobile-events__mobile-event{border-top:1px solid var(--tec-color-border-default)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-datetime{color:var(--tec-color-text-event-date-secondary-month-mobile)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-datetime-featured-text{color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-datetime-recurring-link:focus .tribe-events-calendar-month-mobile-events__mobile-event-datetime-recurring-icon-svg path,.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-datetime-recurring-link:hover .tribe-events-calendar-month-mobile-events__mobile-event-datetime-recurring-icon-svg path{fill:currentColor;stroke:currentColor}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link:active,.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link:focus,.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link:hover{border-color:currentColor;color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link:visited{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month__more-events{border-top:1px solid var(--tec-color-border-secondary)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__more-events-link{opacity:.5}.tribe-events .tribe-events-calendar-month__multiday-event--start .tribe-events-calendar-month__multiday-event-bar{border-bottom-left-radius:9.5px;border-top-left-radius:9.5px}.tribe-events .tribe-events-calendar-month__multiday-event--end .tribe-events-calendar-month__multiday-event-bar{border-bottom-right-radius:9.5px;border-top-right-radius:9.5px}.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner{background-color:var(--tec-color-background-primary-multiday);transition:var(--tec-transition-background-color)}.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner--focus,.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner--hover,.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner:focus,.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner:hover{background-color:var(--tec-color-background-primary-multiday-hover)}.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner{background-color:var(--tec-color-background-secondary-multiday)}.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner--focus,.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner--hover,.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner:focus,.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner:hover{background-color:var(--tec-color-background-secondary-multiday-hover)}.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-featured-icon,.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-title{opacity:.64}.tribe-events .tribe-events-calendar-month__multiday-event-bar-title{color:var(--tec-color-text-events-title-month-multiday);font-weight:var(--tec-font-weight-regular);text-overflow:ellipsis}.tribe-theme-avada #main .tribe-events .tribe-events-calendar-month__multiday-event-bar-title{font-weight:var(--tec-font-weight-regular)}.tribe-events .tribe-events-calendar-day__event-title{color:var(--tec-color-text-events-title-day)}.tribe-events .tribe-events-calendar-day__event-title-link{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-day__event-title-link:active,.tribe-events .tribe-events-calendar-day__event-title-link:focus,.tribe-events .tribe-events-calendar-day__event-title-link:hover{border-color:currentColor;color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-day__event-title-link:visited{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-day__event-datetime{color:var(--tec-color-text-event-date)}.tribe-events .tribe-events-calendar-day__event--featured{position:relative}.tribe-events .tribe-events-calendar-day__event--featured:after{background-color:var(--tec-color-accent-primary);content:"";height:100%;left:var(--tec-grid-gutter-small-half);position:absolute;width:3px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-day__event--featured:after{left:calc(var(--tec-grid-width-1-of-9) - var(--tec-grid-gutter-half));width:4px}.tribe-events .tribe-events-calendar-day__event-venue{font-style:normal}.tribe-events .tribe-events-calendar-day__event-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-day__event-featured-image-link:focus,.tribe-events .tribe-events-calendar-day__event-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-day__event-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-day__event-datetime-featured-text{color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-day-nav{border-top:1px solid var(--tec-color-border-default)}.tribe-events .tribe-events-calendar-day__time-separator:after,.tribe-events .tribe-events-calendar-day__type-separator:after{background-color:var(--tec-color-border-default);content:"";display:block;flex:auto;height:1px;margin-left:20px}.tribe-events .tribe-events-calendar-latest-past__event-row--featured .tribe-events-calendar-latest-past__event-date-tag-datetime:after{background-color:var(--tec-color-accent-primary);content:"";height:100%;position:absolute;right:calc(100% - 3px);width:3px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-latest-past__event-row--featured .tribe-events-calendar-latest-past__event-date-tag-datetime:after{right:-1px;width:4px}.tribe-events .tribe-events-calendar-latest-past__event-venue{font-style:normal}.tribe-events .tribe-events-calendar-latest-past__event-date-tag-month,.tribe-events .tribe-events-calendar-latest-past__event-date-tag-year{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-0);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-2)}.tribe-events .tribe-events-calendar-latest-past__event-date-tag-month{color:var(--tec-color-text-secondary);text-transform:uppercase}.tribe-events .tribe-events-calendar-latest-past__event-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-latest-past__event-featured-image-link:focus,.tribe-events .tribe-events-calendar-latest-past__event-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-latest-past__event-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-calendar-latest-past__event-datetime{color:var(--tec-color-text-event-date)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-latest-past__event-datetime-featured-text{color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-latest-past__event-title{color:var(--tec-color-text-events-title-latest-past)}.tribe-events .tribe-events-calendar-latest-past__event-title-link{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-latest-past__event-title-link:active,.tribe-events .tribe-events-calendar-latest-past__event-title-link:focus,.tribe-events .tribe-events-calendar-latest-past__event-title-link:hover{border-color:currentColor;color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-latest-past__event-title-link:visited{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-status-label__text{color:var(--tec-color-icon-error)}.tribe-events-single .tribe-events-status-single__header{color:var(--tec-color-icon-error);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-0)}.tribe-events-single .tribe-events-status-single__header--bold{font-weight:var(--tec-font-weight-bold)}.tribe-events-single .tribe-events-status-single__header--alert-icon:before{background-image:url(../images/alert.svg);background-repeat:no-repeat;background-size:var(--tec-spacer-3);content:"";display:inline-block;height:var(--tec-spacer-3);margin-right:var(--tec-spacer-1);min-width:var(--tec-spacer-3)}.tribe-events-single .tribe-events-status-single{border:1px solid var(--tec-color-border-active);border-left-color:var(--tec-color-icon-error);border-left-width:var(--tec-spacer-0);font-size:var(--tec-font-size-2)}.tribe-events-single .tribe-events-status-single__description{color:var(--tec-color-text-primary)}
1
+ :root{--tec-color-text-events-title-day:var(--tec-color-text-events-title);--tec-color-text-events-title-latest-past:var(--tec-color-text-events-title);--tec-color-text-event-title-list:var(--tec-color-text-events-title);--tec-color-text-events-title-month-multiday:var(--tec-color-text-events-title);--tec-color-text-events-title-widget-list:var(--tec-color-text-events-title);--tec-color-text-secondary-event-date-month:var(--tec-color-text-secondary-event-date);--tec-color-text-secondary-event-date-month-mobile:var(--tec-color-text-secondary-event-date-month);--tec-color-text-day-of-week-month:var(--tec-color-text-secondary);--tec-color-day-marker-month:var(--tec-color-text-primary);--tec-color-day-marker-month-hover:var(--tec-color-text-primary-hover);--tec-color-day-marker-month-active:var(--tec-color-text-primary-active);--tec-color-day-marker-current-month:var(--tec-color-day-marker-month);--tec-color-day-marker-current-month-hover:var(--tec-color-day-marker-month-hover);--tec-color-day-marker-current-month-active:var(--tec-color-day-marker-month-active);--tec-color-day-marker-past-month:var(--tec-color-text-primary);--tec-color-day-marker-past-month-hover:var(--tec-color-day-marker-past-month);--tec-color-day-marker-past-month-active:var(--tec-color-day-marker-past-month);--tec-color-text-day-of-week-week:var(--tec-color-text-secondary);--tec-border-radius-month-multiday:9.5px;--tec-color-border-secondary-month-grid:var(--tec-color-border-secondary);--tec-color-border-active-month-grid-hover:var(--tec-color-border-active);--tec-color-background-month-grid:transparent;--tec-color-background-tooltip:var(--tec-color-background);--tec-color-text-events-bar-input:var(--tec-color-text-primary);--tec-color-text-events-bar-input-placeholder:var(--tec-color-text-secondary);--tec-opacity-events-bar-input-placeholder:var(--tec-opacity-default);--tec-color-border-events-bar:var(--tec-color-border-secondary);--tec-color-background-events-bar:var(--tec-color-background);--tec-color-background-view-selector:var(--tec-color-background-events-bar);--tec-color-background-view-selector-tabs:var(--tec-color-background-view-selector);--tec-color-background-view-selector-list-item-hover:var(--tec-color-background-secondary);--tec-color-background-subscribe-list-item-hover:var(--tec-color-background-secondary);--tec-color-text-view-selector-list-item:var(--tec-color-text-primary);--tec-color-text-view-selector-list-item-hover:var(--tec-color-accent-secondary-hover);--tec-color-background-search-container:var(--tec-color-background-events-bar);--tec-color-text-events-bar-submit-button:var(--tec-color-background);--tec-color-text-events-bar-submit-button-active:var(--tec-color-text-events-bar-submit-button);--tec-color-text-events-bar-submit-button-hover:var(--tec-color-text-events-bar-submit-button);--tec-color-background-events-bar-submit-button:var(--tec-color-button-primary);--tec-color-background-events-bar-submit-button-hover:var(--tec-color-button-primary-hover);--tec-color-background-events-bar-submit-button-active:var(--tec-color-button-primary-active);--tec-color-icon-events-bar:var(--tec-color-icon-primary);--tec-color-icon-events-bar-active:var(--tec-color-icon-active);--tec-color-icon-events-bar-hover:var(--tec-color-icon-hover)}.tribe-events-view{background-color:var(--tec-color-background-events)}.tribe-events .tribe-events-c-breadcrumbs__list{font-family:var(--tec-font-family-base);font-size:24px;line-height:var(--tec-line-height-1)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-breadcrumbs__list{font-size:42px;line-height:var(--tec-line-height-0)}.tribe-events .tribe-events-c-breadcrumbs__list-item-link{color:var(--tec-color-text-secondary);transition:var(--tec-transition-color)}.tribe-events .tribe-events-c-breadcrumbs__list-item-link:visited{color:var(--tec-color-text-secondary)}.tribe-events .tribe-events-c-breadcrumbs__list-item-link:focus,.tribe-events .tribe-events-c-breadcrumbs__list-item-link:hover{color:var(--tec-color-text-primary)}.tribe-events .tribe-events-c-breadcrumbs__list-item-icon-svg path{fill:var(--tec-color-icon-primary)}.tribe-events .datepicker{background-color:var(--tec-color-background);border:1px solid var(--tec-color-border-default);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-tooltip)}.tribe-events .datepicker:after,.tribe-events .datepicker:before{content:none}.tribe-events .datepicker .datepicker-switch:active,.tribe-events .datepicker .datepicker-switch:focus,.tribe-events .datepicker .datepicker-switch:hover,.tribe-events .datepicker .next:active,.tribe-events .datepicker .next:focus,.tribe-events .datepicker .next:hover,.tribe-events .datepicker .prev:active,.tribe-events .datepicker .prev:focus,.tribe-events .datepicker .prev:hover{background-color:var(--tec-color-background)}.tribe-events .datepicker .datepicker-switch{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-3);line-height:var(--tec-line-height-3);font-weight:var(--tec-font-weight-regular)}.tribe-events .datepicker .datepicker-switch:focus,.tribe-events .datepicker .datepicker-switch:hover{color:var(--tec-color-accent-secondary-hover)}.tribe-events .datepicker .datepicker-switch:active{color:var(--tec-color-accent-secondary-active)}.tribe-events .datepicker .next:active .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .next:focus .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .next:hover .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .prev:active .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .prev:focus .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .prev:hover .tribe-events-c-top-bar__datepicker-nav-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-events .datepicker .next .tribe-events-c-top-bar__datepicker-nav-icon-svg path,.tribe-events .datepicker .prev .tribe-events-c-top-bar__datepicker-nav-icon-svg path{fill:var(--tec-color-icon-secondary)}.tribe-events .datepicker .dow{font-size:var(--tec-font-size-0);line-height:var(--tec-line-height-2)}.tribe-events .datepicker .day,.tribe-events .datepicker .dow{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-weight:var(--tec-font-weight-regular)}.tribe-events .datepicker .day{font-size:var(--tec-font-size-3);line-height:var(--tec-line-height-3)}.tribe-events .datepicker .month,.tribe-events .datepicker .year{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-1);line-height:var(--tec-line-height-0);font-weight:var(--tec-font-weight-regular)}.tribe-events .datepicker .past{color:var(--tec-color-text-primary-light)}.tribe-events .datepicker .day,.tribe-events .datepicker .month,.tribe-events .datepicker .year{border-radius:var(--tec-border-radius-default)}.tribe-events .datepicker .day.focused,.tribe-events .datepicker .day:focus,.tribe-events .datepicker .day:hover,.tribe-events .datepicker .month.focused,.tribe-events .datepicker .month:focus,.tribe-events .datepicker .month:hover,.tribe-events .datepicker .year.focused,.tribe-events .datepicker .year:focus,.tribe-events .datepicker .year:hover{background:var(--tec-color-background-secondary-datepicker)}.tribe-events .datepicker .day.current,.tribe-events .datepicker .day.current.focused,.tribe-events .datepicker .day.current:focus,.tribe-events .datepicker .day.current:hover,.tribe-events .datepicker .month.current,.tribe-events .datepicker .month.current.focused,.tribe-events .datepicker .month.current:focus,.tribe-events .datepicker .month.current:hover,.tribe-events .datepicker .year.current,.tribe-events .datepicker .year.current.focused,.tribe-events .datepicker .year.current:focus,.tribe-events .datepicker .year.current:hover{background:var(--tec-color-accent-primary-background-datepicker)}.tribe-events .datepicker .day.active,.tribe-events .datepicker .day.active.focused,.tribe-events .datepicker .day.active:focus,.tribe-events .datepicker .day.active:hover,.tribe-events .datepicker .month.active,.tribe-events .datepicker .month.active.focused,.tribe-events .datepicker .month.active:focus,.tribe-events .datepicker .month.active:hover,.tribe-events .datepicker .year.active,.tribe-events .datepicker .year.active.focused,.tribe-events .datepicker .year.active:focus,.tribe-events .datepicker .year.active:hover{background:var(--tec-color-accent-primary);color:var(--tec-color-background);text-shadow:none}.admin-bar .tribe-events .datepicker{margin-top:var(--tec-spacer-1)}.admin-bar .tribe-events.tribe-common--breakpoint-medium .datepicker{margin-top:var(--tec-spacer-3)}.tribe-theme-enfold .tribe-events .datepicker{border:1px solid var(--tec-color-border-default);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-tooltip)}.tribe-theme-enfold .tribe-events .datepicker table,.tribe-theme-enfold .tribe-events .datepicker td,.tribe-theme-enfold .tribe-events .datepicker th,.tribe-theme-enfold .tribe-events .datepicker tr{background:transparent}.tribe-theme-enfold .tribe-events .datepicker .datepicker-switch{color:var(--tec-color-text-primary)!important}.tribe-theme-enfold .tribe-events .datepicker .datepicker-switch:focus,.tribe-theme-enfold .tribe-events .datepicker .datepicker-switch:hover{color:var(--tec-color-accent-secondary-hover)!important}.tribe-theme-enfold .tribe-events .datepicker .datepicker-switch:active{color:var(--tec-color-accent-secondary-active)!important}.tribe-theme-enfold .tribe-events .datepicker .day{background-color:var(--tec-color-background)}.tribe-theme-enfold .tribe-events .datepicker .day.new,.tribe-theme-enfold .tribe-events .datepicker .day.old{opacity:1}.tribe-theme-enfold .tribe-events .datepicker .day,.tribe-theme-enfold .tribe-events .datepicker .month,.tribe-theme-enfold .tribe-events .datepicker .year{background-color:var(--tec-color-background);color:var(--tec-color-text-primary)}.tribe-theme-enfold .tribe-events .datepicker .day.focused,.tribe-theme-enfold .tribe-events .datepicker .day:focus,.tribe-theme-enfold .tribe-events .datepicker .day:hover,.tribe-theme-enfold .tribe-events .datepicker .month.focused,.tribe-theme-enfold .tribe-events .datepicker .month:focus,.tribe-theme-enfold .tribe-events .datepicker .month:hover,.tribe-theme-enfold .tribe-events .datepicker .year.focused,.tribe-theme-enfold .tribe-events .datepicker .year:focus,.tribe-theme-enfold .tribe-events .datepicker .year:hover{background:var(--tec-color-background-secondary-datepicker)}.tribe-theme-enfold .tribe-events .datepicker .day.past,.tribe-theme-enfold .tribe-events .datepicker .month.past,.tribe-theme-enfold .tribe-events .datepicker .year.past{color:var(--tec-color-text-primary-light)}.tribe-theme-enfold .tribe-events .datepicker .day.current,.tribe-theme-enfold .tribe-events .datepicker .day.current.focused,.tribe-theme-enfold .tribe-events .datepicker .day.current:focus,.tribe-theme-enfold .tribe-events .datepicker .day.current:hover,.tribe-theme-enfold .tribe-events .datepicker .month.current,.tribe-theme-enfold .tribe-events .datepicker .month.current.focused,.tribe-theme-enfold .tribe-events .datepicker .month.current:focus,.tribe-theme-enfold .tribe-events .datepicker .month.current:hover,.tribe-theme-enfold .tribe-events .datepicker .year.current,.tribe-theme-enfold .tribe-events .datepicker .year.current.focused,.tribe-theme-enfold .tribe-events .datepicker .year.current:focus,.tribe-theme-enfold .tribe-events .datepicker .year.current:hover{background:var(--tec-color-accent-primary-background-datepicker)}.tribe-theme-enfold .tribe-events .datepicker .day.active,.tribe-theme-enfold .tribe-events .datepicker .day.active.focused,.tribe-theme-enfold .tribe-events .datepicker .day.active:focus,.tribe-theme-enfold .tribe-events .datepicker .day.active:hover,.tribe-theme-enfold .tribe-events .datepicker .month.active,.tribe-theme-enfold .tribe-events .datepicker .month.active.focused,.tribe-theme-enfold .tribe-events .datepicker .month.active:focus,.tribe-theme-enfold .tribe-events .datepicker .month.active:hover,.tribe-theme-enfold .tribe-events .datepicker .year.active,.tribe-theme-enfold .tribe-events .datepicker .year.active.focused,.tribe-theme-enfold .tribe-events .datepicker .year.active:focus,.tribe-theme-enfold .tribe-events .datepicker .year.active:hover{background:var(--tec-color-accent-primary);color:var(--tec-color-background)}.tribe-theme-avada .tribe-events .datepicker{border:1px solid var(--tec-color-border-default);border-radius:var(--tec-border-radius-default)}.tribe-theme-avada .tribe-events .datepicker tbody td{border:0}.tribe-theme-avada .tribe-events .datepicker .datepicker-switch,.tribe-theme-avada .tribe-events .datepicker .datepicker-switch:hover,.tribe-theme-avada .tribe-events .datepicker .next,.tribe-theme-avada .tribe-events .datepicker .next:hover,.tribe-theme-avada .tribe-events .datepicker .prev,.tribe-theme-avada .tribe-events .datepicker .prev:hover{background-color:var(--tec-color-background)}.tribe-theme-avada .tribe-events .datepicker .day.new,.tribe-theme-avada .tribe-events .datepicker .day.old{background-color:transparent!important;color:var(--tec-color-text-primary)!important}.tribe-theme-avada .tribe-events .datepicker .day.new.focused,.tribe-theme-avada .tribe-events .datepicker .day.new:focus,.tribe-theme-avada .tribe-events .datepicker .day.new:hover,.tribe-theme-avada .tribe-events .datepicker .day.old.focused,.tribe-theme-avada .tribe-events .datepicker .day.old:focus,.tribe-theme-avada .tribe-events .datepicker .day.old:hover{background:var(--tec-color-background-secondary-datepicker)!important}.tribe-theme-avada .tribe-events .datepicker .day,.tribe-theme-avada .tribe-events .datepicker .month{background-color:transparent;color:var(--tec-color-text-primary)}.tribe-theme-avada .tribe-events .datepicker .day.focused,.tribe-theme-avada .tribe-events .datepicker .day:focus,.tribe-theme-avada .tribe-events .datepicker .day:hover,.tribe-theme-avada .tribe-events .datepicker .month.focused,.tribe-theme-avada .tribe-events .datepicker .month:focus,.tribe-theme-avada .tribe-events .datepicker .month:hover{background:var(--tec-color-background-secondary-datepicker)}.tribe-theme-avada .tribe-events .datepicker .day.past,.tribe-theme-avada .tribe-events .datepicker .month.past{color:var(--tec-color-text-primary-light)!important}.tribe-theme-avada .tribe-events .datepicker .day.current,.tribe-theme-avada .tribe-events .datepicker .day.current.focused,.tribe-theme-avada .tribe-events .datepicker .day.current:focus,.tribe-theme-avada .tribe-events .datepicker .day.current:hover,.tribe-theme-avada .tribe-events .datepicker .month.current,.tribe-theme-avada .tribe-events .datepicker .month.current.focused,.tribe-theme-avada .tribe-events .datepicker .month.current:focus,.tribe-theme-avada .tribe-events .datepicker .month.current:hover{background:var(--tec-color-accent-primary-background-datepicker)}.tribe-theme-avada .tribe-events .datepicker .day.active,.tribe-theme-avada .tribe-events .datepicker .day.active.focused,.tribe-theme-avada .tribe-events .datepicker .day.active:focus,.tribe-theme-avada .tribe-events .datepicker .day.active:hover,.tribe-theme-avada .tribe-events .datepicker .month.active,.tribe-theme-avada .tribe-events .datepicker .month.active.focused,.tribe-theme-avada .tribe-events .datepicker .month.active:focus,.tribe-theme-avada .tribe-events .datepicker .month.active:hover{background:var(--tec-color-accent-primary)!important;color:var(--tec-color-background)!important}.tribe-events .tribe-events-c-day-marker:after{background-color:var(--tec-color-border-default);content:"";display:block;flex:auto;height:1px;margin-left:20px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-header--has-event-search .tribe-events-c-events-bar{background-color:var(--tec-color-background-events-bar)}.tribe-events .tribe-events-c-events-bar .tribe-common-form-control-text__input{background-color:transparent;color:var(--tec-color-text-events-bar-input)}.tribe-events .tribe-events-c-events-bar .tribe-common-form-control-text__input::placeholder{color:var(--tec-color-text-events-bar-input-placeholder);opacity:var(--tec-opacity-events-bar-input-placeholder)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-events-bar--border{border:1px solid var(--tec-color-border-events-bar)}.tribe-events .tribe-events-c-events-bar__search-container{background-color:var(--tec-color-background-events-bar)}.tribe-events .tribe-events-c-events-bar__search-button{display:flex}.tribe-events .tribe-events-c-events-bar__search-button:focus,.tribe-events .tribe-events-c-events-bar__search-button:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-events-bar__search-button:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-c-events-bar__search-button:before{background-color:var(--tec-color-icon-events-bar-hover);content:"";display:none;height:2px;pointer-events:none;position:absolute;top:100%;transform:translateY(var(--tec-spacer-0));width:calc(100% - var(--tec-spacer-0)*2)}.tribe-events .tribe-events-c-events-bar__search-button--active:before{display:block}.tribe-events .tribe-events-c-events-bar__search-button-icon-svg path{fill:var(--tec-color-icon-events-bar-active)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-events-bar__search-button,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-events-bar__search-button:focus,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-events-bar__search-button:hover{background-color:transparent}.single-tribe_events .tribe-events-c-ical__link,.single-tribe_events .tribe-events-c-ical__link:visited,.tribe-events .tribe-events-c-ical__link,.tribe-events .tribe-events-c-ical__link:visited{align-items:center;background-color:var(--tec-color-background);border:1px solid var(--tec-color-accent-primary);border-radius:var(--tec-border-radius-default);color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.single-tribe_events .tribe-events-c-ical__link:active,.single-tribe_events .tribe-events-c-ical__link:focus,.single-tribe_events .tribe-events-c-ical__link:focus-within,.single-tribe_events .tribe-events-c-ical__link:hover,.tribe-events .tribe-events-c-ical__link:active,.tribe-events .tribe-events-c-ical__link:focus,.tribe-events .tribe-events-c-ical__link:focus-within,.tribe-events .tribe-events-c-ical__link:hover{background-color:var(--tec-color-accent-primary);color:var(--tec-color-background)}.single-tribe_events .tribe-events-c-ical__link:active .tribe-events-c-ical__link-icon-svg path,.single-tribe_events .tribe-events-c-ical__link:focus-within .tribe-events-c-ical__link-icon-svg path,.single-tribe_events .tribe-events-c-ical__link:focus .tribe-events-c-ical__link-icon-svg path,.single-tribe_events .tribe-events-c-ical__link:hover .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link:active .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link:focus-within .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link:focus .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link:hover .tribe-events-c-ical__link-icon-svg path{stroke:var(--tec-color-background)}.single-tribe_events .tribe-events-c-ical__link-icon-svg,.tribe-events .tribe-events-c-ical__link-icon-svg{display:block;flex:none;margin-right:var(--tec-spacer-1);width:10px}.single-tribe_events .tribe-events-c-ical__link-icon-svg path,.tribe-events .tribe-events-c-ical__link-icon-svg path{stroke:currentColor}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button.tribe-events-c-subscribe-dropdown__button--active,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:focus,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:focus-within,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:hover,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button.tribe-events-c-subscribe-dropdown__button--active,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:focus,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:focus-within,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button:hover{background-color:var(--tec-color-accent-primary);color:var(--tec-color-background)}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-text,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-text{cursor:pointer}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon{color:currentColor;stroke:currentColor}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon path,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon path{fill:currentColor}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list{background-color:var(--tec-color-background);border:1px solid var(--tec-color-border-secondary);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-default)}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif)}.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:active,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:focus,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:focus-within,.single-tribe_events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:hover,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:active,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:focus,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:focus-within,.tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__list-item:hover{background-color:var(--tec-color-background-subscribe-list-item-hover)}.tribe-theme-twentyseventeen .single-tribe_events .tribe-events-c-ical__link:active,.tribe-theme-twentyseventeen .single-tribe_events .tribe-events-c-ical__link:focus,.tribe-theme-twentyseventeen .single-tribe_events .tribe-events-c-ical__link:hover,.tribe-theme-twentyseventeen .tribe-events .tribe-events-c-ical__link:active,.tribe-theme-twentyseventeen .tribe-events .tribe-events-c-ical__link:focus,.tribe-theme-twentyseventeen .tribe-events .tribe-events-c-ical__link:hover{color:var(--tec-color-background)}.tribe-theme-twentytwentyone .single-tribe_events .tribe-events-c-ical__link:focus:not(.wp-block-button__link):not(.wp-block-file__button),.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-ical__link:focus:not(.wp-block-button__link):not(.wp-block-file__button){background-color:var(--tec-color-accent-primary);color:var(--tec-color-background)}.tribe-theme-twentytwentyone .single-tribe_events .tribe-events-c-subscribe-dropdown__list-item a:focus,.tribe-theme-twentytwentyone .single-tribe_events .tribe-events-c-subscribe-dropdown__list-item a:focus-within,.tribe-theme-twentytwentyone .single-tribe_events .tribe-events-c-subscribe-dropdown__list-item a:hover,.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-subscribe-dropdown__list-item a:focus,.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-subscribe-dropdown__list-item a:focus-within,.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-subscribe-dropdown__list-item a:hover{background-color:transparent!important}.single-tribe_events .tribe-events-c-ical,.tribe-block__events-link .tribe-events-c-ical{text-align:left}.single-tribe_events .tribe-events-c-ical__link,.tribe-block__events-link .tribe-events-c-ical__link{color:var(--tec-color-accent-primary);font-size:var(--tec-font-size-2);margin:0 0 var(--tec-spacer-3);width:220px}.single-tribe_events .tribe-events .tribe-events-c-subscribe-dropdown__container,.tribe-block__events-link .tribe-events .tribe-events-c-subscribe-dropdown__container{width:200px}.single-tribe_events .tribe-events .tribe-events-c-subscribe-dropdown,.tribe-block__events-link .tribe-events .tribe-events-c-subscribe-dropdown{position:relative}.single-tribe_events .tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__content,.tribe-block__events-link .tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__content{position:absolute;top:42px;width:100%;z-index:var(--tec-z-index-dropdown)}.single-tribe_events .tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon,.tribe-block__events-link .tribe-events .tribe-events-c-subscribe-dropdown .tribe-events-c-subscribe-dropdown__button-icon{margin-left:var(--tec-spacer-2)}.single-tribe_events .tribe-events-c-subscribe-dropdown__button,.tribe-block__events-link .tribe-events-c-subscribe-dropdown__button{padding:var(--tec-spacer-1) var(--tec-spacer-2);width:200px}.single-tribe_events .tribe-events-c-subscribe-dropdown__export-icon,.tribe-block__events-link .tribe-events-c-subscribe-dropdown__export-icon{color:currentColor;display:inline-block;height:16px;margin-right:var(--tec-spacer-1);margin-top:-3px;stroke:currentColor;vertical-align:middle;width:21px}#tribe-events-content .tribe-block__events-link .tribe-events-c-ical__link{color:var(--tec-color-accent-primary)}#tribe-events-content .tribe-block__events-link .tribe-events-c-ical__link:hover{color:#fff}.tribe-events .tribe-events-c-messages__message{background-color:var(--tec-color-background-messages);border-radius:var(--tec-border-radius-default)}.tribe-events .tribe-events-c-messages__message--notice .tribe-events-c-messages__message-icon-svg{display:inline-block;margin-right:var(--tec-spacer-2)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-messages__message-list{text-align:center}.tribe-events .tribe-events-c-messages__message-list-item-link{color:var(--tec-color-link-accent);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-c-nav{border-top:1px solid var(--tec-color-border-default)}.tribe-events .tribe-events-c-nav__list{list-style:none}.tribe-events .tribe-events-c-nav__next-label-plural,.tribe-events .tribe-events-c-nav__prev-label-plural{white-space:pre}.tribe-events .tribe-events-c-nav__today:focus,.tribe-events .tribe-events-c-nav__today:hover{color:var(--tec-color-accent-secondary-hover)}.tribe-events .tribe-events-c-nav__today:active{color:var(--tec-color-text-primary)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__next,.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__prev{color:var(--tec-color-text-secondary)}.tribe-events .tribe-events-c-nav__next:focus,.tribe-events .tribe-events-c-nav__next:hover,.tribe-events .tribe-events-c-nav__prev:focus,.tribe-events .tribe-events-c-nav__prev:hover{color:var(--tec-color-accent-secondary-hover)}.tribe-events .tribe-events-c-nav__next:active,.tribe-events .tribe-events-c-nav__prev:active{color:var(--tec-color-text-primary)}.tribe-events .tribe-events-c-nav__next:disabled,.tribe-events .tribe-events-c-nav__prev:disabled{background-color:transparent;color:var(--tec-color-text-disabled)}.tribe-events .tribe-events-c-nav__prev:focus .tribe-events-c-nav__prev-icon-svg,.tribe-events .tribe-events-c-nav__prev:hover .tribe-events-c-nav__prev-icon-svg{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-nav__prev:focus .tribe-events-c-nav__prev-icon-svg path,.tribe-events .tribe-events-c-nav__prev:hover .tribe-events-c-nav__prev-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-events .tribe-events-c-nav__prev:active:before{opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-c-nav__prev:disabled .tribe-events-c-nav__prev-icon-svg path{fill:var(--tec-color-icon-disabled)}.tribe-events .tribe-events-c-nav__prev-icon-svg{display:block;margin-right:8px;width:7px}.tribe-events .tribe-events-c-nav__prev-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__prev-icon-svg{margin-right:15px;width:9px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__prev-icon-svg path{fill:var(--tec-color-icon-primary)}.tribe-events .tribe-events-c-nav__next:focus .tribe-events-c-nav__next-icon-svg,.tribe-events .tribe-events-c-nav__next:hover .tribe-events-c-nav__next-icon-svg{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-nav__next:focus .tribe-events-c-nav__next-icon-svg path,.tribe-events .tribe-events-c-nav__next:hover .tribe-events-c-nav__next-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-events .tribe-events-c-nav__next:active:after{opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-c-nav__next:disabled .tribe-events-c-nav__next-icon-svg path{fill:var(--tec-color-icon-disabled)}.tribe-events .tribe-events-c-nav__next-icon-svg{display:block;margin-left:8px;width:7px}.tribe-events .tribe-events-c-nav__next-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__next-icon-svg{margin-left:15px;width:9px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-nav__next-icon-svg path{fill:var(--tec-color-icon-primary)}.tribe-events .tribe-events-c-small-cta__stock{color:var(--tec-color-text-secondary)}.tribe-events .tribe-events-c-search__input-control{position:relative}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-search__input-control{border-right:1px solid var(--tec-color-border-events-bar)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-search__input-control:last-child{border-right:0}.tribe-events .tribe-events-c-search__input-control-icon-svg{color:var(--tec-color-icon-events-bar);display:block;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-search__input-control-icon-svg{left:16px;right:auto}.tribe-events .tribe-events-c-search__input-control--keyword-focus .tribe-events-c-search__input~.tribe-events-c-search__input-control-icon-svg path,.tribe-events .tribe-events-c-search__input-control--keyword .tribe-events-c-search__input:focus~.tribe-events-c-search__input-control-icon-svg path,.tribe-events .tribe-events-c-search__input-control--location-focus .tribe-events-c-search__input~.tribe-events-c-search__input-control-icon-svg path,.tribe-events .tribe-events-c-search__input-control--location .tribe-events-c-search__input:focus~.tribe-events-c-search__input-control-icon-svg path,.tribe-events .tribe-events-c-search__input-control-icon-svg path{fill:currentColor}.tribe-events .tribe-events-c-search__button{background-color:var(--tec-color-background-events-bar-submit-button);color:var(--tec-color-text-events-bar-submit-button)}.tribe-events .tribe-events-c-search__button:focus,.tribe-events .tribe-events-c-search__button:hover{background-color:var(--tec-color-background-events-bar-submit-button-hover);color:var(--tec-color-text-events-bar-submit-button-hover)}.tribe-events .tribe-events-c-search__button:active{background-color:var(--tec-color-background-events-bar-submit-button-active);color:var(--tec-color-text-events-bar-submit-button-active)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__input{background-color:var(--tec-background-color)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__button{background-color:var(--tec-color-background-events-bar-submit-button);color:var(--tec-color-text-events-bar-submit-button)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__button:focus,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__button:hover{background-color:var(--tec-color-background-events-bar-submit-button-hover);color:var(--tec-color-text-events-bar-submit-button-hover)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-search__button:active{background-color:var(--tec-color-background-events-bar-submit-button-active);color:var(--tec-color-text-events-bar-submit-button-active)}.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__input{background-color:var(--tec-background-color)}.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__button{background-color:var(--tec-color-background-events-bar-submit-button);color:var(--tec-color-text-events-bar-submit-button)}.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__button:focus,.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__button:hover{background-color:var(--tec-color-background-events-bar-submit-button-hover);color:var(--tec-color-text-events-bar-submit-button-hover)}.tribe-theme-twentytwenty .tribe-events .tribe-events-c-search__button:active{background-color:var(--tec-color-background-events-bar-submit-button-active);color:var(--tec-color-text-events-bar-submit-button-active)}.tribe-theme-twentytwentyone .tribe-events .tribe-events-c-search__button:not(:hover):not(:active){background-color:var(--tec-color-background-events-bar-submit-button);color:var(--tec-color-text-events-bar-submit-button)}.tooltipster-base.tribe-events-tooltip-theme{background-color:var(--tec-color-background-tooltip);border:1px solid var(--tec-color-border-default);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-tooltip)}.tooltipster-base.tribe-events-tooltip-theme .tooltipster-box{background-color:transparent;border:0;border-radius:0;box-shadow:none}.tooltipster-base.tribe-events-tooltip-theme .tooltipster-box .tooltipster-content{color:var(--tec-color-text-primary);overflow:inherit}.tooltipster-base.tribe-events-tooltip-theme--hover{background-color:var(--tec-color-background-tooltip)}.tribe-events .tribe-events-c-top-bar__datepicker-button{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-c-top-bar__datepicker-button:focus,.tribe-events .tribe-events-c-top-bar__datepicker-button:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-top-bar__datepicker-button:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-c-top-bar__datepicker-button-icon-svg{display:block;height:6px;margin-left:var(--tec-spacer-1);width:9px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-top-bar__datepicker-button-icon-svg{height:8px;width:11px}.tribe-events .tribe-events-c-top-bar__datepicker-button--open .tribe-events-c-top-bar__datepicker-button-icon-svg{transform:rotate(180deg)}.tribe-theme-genesis .tribe-events .tribe-events-c-top-bar__nav-link:disabled,.tribe-theme-genesis .tribe-events .tribe-events-c-top-bar__nav-link:focus,.tribe-theme-genesis .tribe-events .tribe-events-c-top-bar__nav-link:hover,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-top-bar__datepicker-button,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-top-bar__nav-link{background-color:transparent}.tribe-theme-twentytwentyone .tribe-events button.tribe-events-c-top-bar__datepicker-button:focus{outline-offset:0}.tribe-theme-twentytwentyone .tribe-events a.tribe-events-c-top-bar__nav-link--next.tribe-events-c-top-bar__nav-link:focus,.tribe-theme-twentytwentyone .tribe-events a.tribe-events-c-top-bar__nav-link--prev.tribe-events-c-top-bar__nav-link:focus{background:transparent}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button:before{content:none}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button-icon-caret-svg{color:var(--tec-color-icon-events-bar);display:block;flex:none;height:6px;margin-left:var(--tec-spacer-1);width:10px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button-icon-caret-svg path{fill:currentColor}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button--active .tribe-events-c-view-selector__button-icon-caret-svg{transform:rotate(180deg)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__button-text{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-2);line-height:var(--tec-line-height-3);font-weight:var(--tec-font-weight-regular);font-weight:var(--tec-font-weight-bold);color:var(--tec-color-text-view-selector-list-item)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--labels .tribe-events-c-view-selector__content{box-shadow:var(--tec-box-shadow-default)}.tribe-events .tribe-events-c-view-selector--tabs .tribe-events-c-view-selector__content{background-color:var(--tec-color-background-view-selector)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--tabs .tribe-events-c-view-selector__content{border:0;border-radius:0;box-shadow:none}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector--tabs .tribe-events-c-view-selector__list-item--active .tribe-events-c-view-selector__list-item-link:after{background-color:var(--tec-color-accent-secondary);bottom:-1px;content:"";display:block;height:2px;position:absolute;width:100%}.tribe-events .tribe-events-c-view-selector__button{text-align:left}.tribe-events .tribe-events-c-view-selector__button:focus,.tribe-events .tribe-events-c-view-selector__button:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-view-selector__button:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-c-view-selector__button:before{background-color:var(--tec-color-accent-primary);content:"";display:none;height:2px;pointer-events:none;position:absolute;top:100%;transform:translateY(var(--tec-spacer-0));width:calc(100% - var(--tec-spacer-0)*2)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector__button:before{transform:none;width:calc(100% - var(--tec-spacer-1)*2)}.tribe-events .tribe-events-c-view-selector__button--active:before{display:block}.tribe-events .tribe-events-c-view-selector__content{background-color:var(--tec-color-background-view-selector);border:1px solid var(--tec-color-border-secondary);border-radius:var(--tec-border-radius-default);box-shadow:var(--tec-box-shadow-tooltip)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector__list-item:focus,.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector__list-item:focus-within,.tribe-common--breakpoint-medium.tribe-events .tribe-events-c-view-selector__list-item:hover{background-color:var(--tec-color-background-view-selector-list-item-hover)}.tribe-events .tribe-events-c-view-selector__list-item-text{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-2);line-height:var(--tec-line-height-3);font-weight:var(--tec-font-weight-regular);color:var(--tec-color-text-view-selector-list-item)}.tribe-events .tribe-events-c-view-selector__list-item--active .tribe-events-c-view-selector__list-item-text{font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-c-view-selector__list-item-link{border-radius:var(--tec-border-radius-default);color:var(--tec-color-text-view-selector-list-item)}.tribe-events .tribe-events-c-view-selector__list-item-link:focus .tribe-events-c-view-selector__list-item-icon,.tribe-events .tribe-events-c-view-selector__list-item-link:hover .tribe-events-c-view-selector__list-item-icon{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-c-view-selector__list-item-link:focus .tribe-events-c-view-selector__list-item-text,.tribe-events .tribe-events-c-view-selector__list-item-link:hover .tribe-events-c-view-selector__list-item-text{color:var(--tec-color-text-view-selector-list-item-hover)}.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-view-selector__button,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-view-selector__button:focus,.tribe-theme-twentyseventeen.colors-dark .tribe-events .tribe-events-c-view-selector__button:hover{background-color:transparent}.tribe-events .tribe-events-calendar-list__event-row--featured .tribe-events-calendar-list__event-date-tag-datetime:after{background-color:var(--tec-color-accent-primary);border-radius:var(--tec-border-radius-default);content:"";height:100%;position:absolute;right:calc(100% - 3px);width:3px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-list__event-row--featured .tribe-events-calendar-list__event-date-tag-datetime:after{right:-1px;width:4px}.tribe-events .tribe-events-calendar-list__event-venue{font-style:normal}.tribe-events .tribe-events-calendar-list__event-date-tag-weekday{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-0);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-2);color:var(--tec-color-text-secondary);text-transform:uppercase}.tribe-events .tribe-events-calendar-list__event-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-list__event-featured-image-link:focus,.tribe-events .tribe-events-calendar-list__event-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-list__event-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-calendar-list__event-title{color:var(--tec-color-text-event-title-list)}.tribe-events .tribe-events-calendar-list__event-datetime{color:var(--tec-color-text-event-date)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-list__event-datetime-featured-text{color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-list__month-separator:after{background-color:var(--tec-color-border-default);content:"";display:block;flex:auto;height:1px;margin-left:20px}.tribe-events .tribe-events-calendar-list-nav{border-top:1px solid var(--tec-color-border-default)}.tribe-events .tribe-events-calendar-month__body{background-color:var(--tec-color-background-month-grid)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__calendar-event{opacity:.64}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__calendar-event-datetime{color:var(--tec-color-text-event-date);opacity:.94}.tribe-events .tribe-events-calendar-month__calendar-event-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-month__calendar-event-featured-image-link:focus,.tribe-events .tribe-events-calendar-month__calendar-event-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-month__calendar-event-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-calendar-month__calendar-event-datetime{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-0);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-2);color:var(--tec-color-text-secondary-event-date)}.tribe-events .tribe-events-calendar-month__calendar-event--featured:before{background-color:var(--tec-color-accent-primary);content:"";height:100%;left:7px;position:absolute;width:2px}.tribe-events .tribe-events-calendar-month__calendar-event--featured:last-child:before{height:calc(100% - var(--tec-spacer-3))}.tribe-events .tribe-events-calendar-month__calendar-event-title-link,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month__calendar-event-title-link:active,.tribe-events .tribe-events-calendar-month__calendar-event-title-link:focus,.tribe-events .tribe-events-calendar-month__calendar-event-title-link:hover,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link:active,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link:focus,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link:hover{border-color:currentColor;color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month__calendar-event-title-link:visited,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-title-link:visited{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-featured-image-link:focus,.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-calendar-month__calendar-event-tooltip-datetime{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-0);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-2);color:var(--tec-color-text-event-date)}.tribe-events .tribe-events-calendar-month__header-column{text-transform:uppercase}.tribe-events .tribe-events-calendar-month__header-column-title{color:var(--tec-color-text-day-of-week-month);text-align:center}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-month__header-column-title{text-align:left}.tribe-events .tribe-events-calendar-month__day{border-radius:var(--tec-border-radius-default)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-month__day{border-radius:0}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-month__day:after{background-color:transparent;bottom:0;content:"";display:block;height:2px;left:-1px;position:absolute;transition:var(--tec-transition-background-color);width:calc(100% + 2px)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-month__day:hover:after{background-color:var(--tec-color-border-active-month-grid-hover)}.tribe-events .tribe-events-calendar-month__day-date-link{color:var(--tec-color-day-marker-month);transition:var(--tec-transition-color)}.tribe-events .tribe-events-calendar-month__day-date-link:focus,.tribe-events .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-day-marker-month-hover)}.tribe-events .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-day-marker-month-active)}.tribe-events .tribe-events-calendar-month__day-date-daynum{color:var(--tec-color-day-marker-month)}.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date,.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link{color:var(--tec-color-day-marker-current-month);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:focus,.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-day-marker-month-current-hover)}.tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-day-marker-month-current-active)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date{color:var(--tec-color-day-marker-past-month);opacity:.6}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link{color:var(--tec-color-day-marker-past-month)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link:focus,.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-day-marker-month-past-hover)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-day-marker-month-past-active)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__day-date-link .tribe-events-calendar-month__day-date-daynum{color:inherit}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__mobile-events-icon--event{background-color:var(--tec-color-icon-active);opacity:.6}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__mobile-events-icon--featured{opacity:.6}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__mobile-events-icon--featured .tribe-events-calendar-month__mobile-events-icon-svg path{fill:var(--tec-color-icon-active)}.tribe-events .tribe-events-calendar-month__day-cell--mobile:focus,.tribe-events .tribe-events-calendar-month__day-cell--mobile:hover{background-color:var(--tec-color-background-secondary)}.tribe-events .tribe-events-calendar-month__day-cell--selected,.tribe-events .tribe-events-calendar-month__day-cell--selected:focus,.tribe-events .tribe-events-calendar-month__day-cell--selected:hover{background-color:var(--tec-color-accent-primary)}.tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__day-date{color:var(--tec-color-background);opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__mobile-events-icon--event{background-color:var(--tec-color-background);opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__mobile-events-icon--featured{opacity:var(--tec-opacity-default)}.tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__mobile-events-icon--featured .tribe-events-calendar-month__mobile-events-icon-svg path{fill:var(--tec-color-background)}.tribe-events .tribe-events-calendar-month__mobile-events-icon--event{background-color:var(--tec-color-accent-primary)}.tribe-events .tribe-events-calendar-month__mobile-events-icon--featured .tribe-events-calendar-month__mobile-events-icon-svg path{fill:currentColor}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:focus,.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-accent-primary-hover)}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day--current .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-accent-primary-active)}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-cell--selected:focus,.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-cell--selected:hover{background-color:var(--tec-color-accent-primary)}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-date-link:focus,.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-date-link:hover{color:var(--tec-color-accent-secondary-hover)}.tribe-theme-twentyseventeen .tribe-events .tribe-events-calendar-month__day-date-link:active{color:var(--tec-color-accent-secondary-active)}.tribe-theme-twentytwenty .tribe-events .tribe-events-calendar-month__day-cell--selected{background-color:var(--tec-color-accent-primary)}.tribe-theme-avada #main .tribe-events .tribe-events-calendar-month__day-cell--selected .tribe-events-calendar-month__day-date{color:var(--tec-color-background-events)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event+.tribe-events-calendar-month-mobile-events__mobile-event{border-top:1px solid var(--tec-color-border-default)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-datetime{color:var(--tec-color-text-secondary-event-date-month-mobile)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-datetime-featured-text{color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-datetime-recurring-link:focus .tribe-events-calendar-month-mobile-events__mobile-event-datetime-recurring-icon-svg path,.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-datetime-recurring-link:hover .tribe-events-calendar-month-mobile-events__mobile-event-datetime-recurring-icon-svg path{fill:currentColor;stroke:currentColor}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link:active,.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link:focus,.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link:hover{border-color:currentColor;color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month-mobile-events__mobile-event-title-link:visited{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-month__more-events{border-top:1px solid var(--tec-color-border-secondary)}.tribe-events .tribe-events-calendar-month__day--past .tribe-events-calendar-month__more-events-link{opacity:.5}.tribe-events .tribe-events-calendar-month__multiday-event--start .tribe-events-calendar-month__multiday-event-bar{border-bottom-left-radius:9.5px;border-top-left-radius:9.5px}.tribe-events .tribe-events-calendar-month__multiday-event--end .tribe-events-calendar-month__multiday-event-bar{border-bottom-right-radius:9.5px;border-top-right-radius:9.5px}.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner{background-color:var(--tec-color-background-primary-multiday);transition:var(--tec-transition-background-color)}.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner--focus,.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner--hover,.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner:focus,.tribe-events .tribe-events-calendar-month__multiday-event-bar-inner:hover{background-color:var(--tec-color-background-primary-multiday-hover)}.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner{background-color:var(--tec-color-background-secondary-multiday)}.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner--focus,.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner--hover,.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner:focus,.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-inner:hover{background-color:var(--tec-color-background-secondary-multiday-hover)}.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-featured-icon,.tribe-events .tribe-events-calendar-month__multiday-event--past .tribe-events-calendar-month__multiday-event-bar-title{opacity:.64}.tribe-events .tribe-events-calendar-month__multiday-event-bar-title{color:var(--tec-color-text-events-title-month-multiday);font-weight:var(--tec-font-weight-regular);text-overflow:ellipsis}.tribe-theme-avada #main .tribe-events .tribe-events-calendar-month__multiday-event-bar-title{font-weight:var(--tec-font-weight-regular)}.tribe-events .tribe-events-calendar-day__event-title{color:var(--tec-color-text-events-title-day)}.tribe-events .tribe-events-calendar-day__event-title-link{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-day__event-title-link:active,.tribe-events .tribe-events-calendar-day__event-title-link:focus,.tribe-events .tribe-events-calendar-day__event-title-link:hover{border-color:currentColor;color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-day__event-title-link:visited{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-day__event-datetime{color:var(--tec-color-text-event-date)}.tribe-events .tribe-events-calendar-day__event--featured{position:relative}.tribe-events .tribe-events-calendar-day__event--featured:after{background-color:var(--tec-color-accent-primary);content:"";height:100%;left:var(--tec-grid-gutter-small-half);position:absolute;width:3px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-day__event--featured:after{left:calc(var(--tec-grid-width-1-of-9) - var(--tec-grid-gutter-half));width:4px}.tribe-events .tribe-events-calendar-day__event-venue{font-style:normal}.tribe-events .tribe-events-calendar-day__event-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-day__event-featured-image-link:focus,.tribe-events .tribe-events-calendar-day__event-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-day__event-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-day__event-datetime-featured-text{color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-day-nav{border-top:1px solid var(--tec-color-border-default)}.tribe-events .tribe-events-calendar-day__time-separator:after,.tribe-events .tribe-events-calendar-day__type-separator:after{background-color:var(--tec-color-border-default);content:"";display:block;flex:auto;height:1px;margin-left:20px}.tribe-events .tribe-events-calendar-latest-past__event-row--featured .tribe-events-calendar-latest-past__event-date-tag-datetime:after{background-color:var(--tec-color-accent-primary);content:"";height:100%;position:absolute;right:calc(100% - 3px);width:3px}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-latest-past__event-row--featured .tribe-events-calendar-latest-past__event-date-tag-datetime:after{right:-1px;width:4px}.tribe-events .tribe-events-calendar-latest-past__event-venue{font-style:normal}.tribe-events .tribe-events-calendar-latest-past__event-date-tag-month,.tribe-events .tribe-events-calendar-latest-past__event-date-tag-year{color:var(--tec-color-text-primary);font-family:var(--tec-font-family-sans-serif);font-size:var(--tec-font-size-0);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-2)}.tribe-events .tribe-events-calendar-latest-past__event-date-tag-month{color:var(--tec-color-text-secondary);text-transform:uppercase}.tribe-events .tribe-events-calendar-latest-past__event-featured-image-link{transition:var(--tec-transition-opacity)}.tribe-events .tribe-events-calendar-latest-past__event-featured-image-link:focus,.tribe-events .tribe-events-calendar-latest-past__event-featured-image-link:hover{opacity:var(--tec-opacity-icon-hover)}.tribe-events .tribe-events-calendar-latest-past__event-featured-image-link:active{opacity:var(--tec-opacity-icon-active)}.tribe-events .tribe-events-calendar-latest-past__event-datetime{color:var(--tec-color-text-event-date)}.tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-latest-past__event-datetime-featured-text{color:var(--tec-color-accent-primary);font-weight:var(--tec-font-weight-bold)}.tribe-events .tribe-events-calendar-latest-past__event-title{color:var(--tec-color-text-events-title-latest-past)}.tribe-events .tribe-events-calendar-latest-past__event-title-link{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-latest-past__event-title-link:active,.tribe-events .tribe-events-calendar-latest-past__event-title-link:focus,.tribe-events .tribe-events-calendar-latest-past__event-title-link:hover{border-color:currentColor;color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-calendar-latest-past__event-title-link:visited{color:var(--tec-color-text-events-title)}.tribe-events .tribe-events-status-label__text{color:var(--tec-color-icon-error)}.tribe-events-single .tribe-events-status-single__header{color:var(--tec-color-icon-error);font-weight:var(--tec-font-weight-regular);line-height:var(--tec-line-height-0)}.tribe-events-single .tribe-events-status-single__header--bold{font-weight:var(--tec-font-weight-bold)}.tribe-events-single .tribe-events-status-single__header--alert-icon:before{background-image:url(../images/alert.svg);background-repeat:no-repeat;background-size:var(--tec-spacer-3);content:"";display:inline-block;height:var(--tec-spacer-3);margin-right:var(--tec-spacer-1);min-width:var(--tec-spacer-3)}.tribe-events-single .tribe-events-status-single{border:1px solid var(--tec-color-border-active);border-left-color:var(--tec-color-icon-error);border-left-width:var(--tec-spacer-0);font-size:var(--tec-font-size-2)}.tribe-events-single .tribe-events-status-single__description{color:var(--tec-color-text-primary)}
src/resources/css/views-print.min.css CHANGED
@@ -1 +1 @@
1
- .single-tribe_events.tribe-common--breakpoint-medium .tribe-events-back,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-events-bar,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-nav,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__datepicker-button-icon-svg,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__nav,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__today-button,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-nav-pagination,.single-tribe_events .tribe-events-back,.single-tribe_events .tribe-events-c-events-bar,.single-tribe_events .tribe-events-c-nav,.single-tribe_events .tribe-events-c-top-bar__datepicker-button-icon-svg,.single-tribe_events .tribe-events-c-top-bar__nav,.single-tribe_events .tribe-events-c-top-bar__today-button,.single-tribe_events .tribe-events-nav-pagination,.tribe-events.tribe-common--breakpoint-medium .tribe-events-back,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-events-bar,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-nav,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__datepicker-button-icon-svg,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__nav,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__today-button,.tribe-events.tribe-common--breakpoint-medium .tribe-events-nav-pagination,.tribe-events .tribe-events-back,.tribe-events .tribe-events-c-events-bar,.tribe-events .tribe-events-c-nav,.tribe-events .tribe-events-c-top-bar__datepicker-button-icon-svg,.tribe-events .tribe-events-c-top-bar__nav,.tribe-events .tribe-events-c-top-bar__today-button,.tribe-events .tribe-events-nav-pagination{display:none!important}.single-tribe_events.tribe-common--breakpoint-medium a[href^=http],.single-tribe_events a[href^=http],.tribe-events.tribe-common--breakpoint-medium a[href^=http],.tribe-events a[href^=http]{text-decoration:none!important}.single-tribe_events.tribe-common--breakpoint-medium a[href^=http]:after,.single-tribe_events a[href^=http]:after,.tribe-events.tribe-common--breakpoint-medium a[href^=http]:after,.tribe-events a[href^=http]:after{content:none!important}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-subscribe-dropdown__container,.single-tribe_events .tribe-events-c-subscribe-dropdown__container,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-subscribe-dropdown__container,.tribe-events .tribe-events-c-subscribe-dropdown__container{display:none!important}.single-tribe_events.tribe-common--breakpoint-medium.tribe-common .tribe-common-h--alt.tribe-events-c-top-bar__datepicker-button,.single-tribe_events.tribe-common .tribe-common-h--alt.tribe-events-c-top-bar__datepicker-button,.tribe-events.tribe-common--breakpoint-medium.tribe-common .tribe-common-h--alt.tribe-events-c-top-bar__datepicker-button,.tribe-events.tribe-common .tribe-common-h--alt.tribe-events-c-top-bar__datepicker-button{--tec-font-weight-regular:var(--tec-font-weight-bold)}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-calendar-month__header-column-title,.single-tribe_events .tribe-events-calendar-month__header-column-title,.tribe-events.tribe-common--breakpoint-medium .tribe-events-calendar-month__header-column-title,.tribe-events .tribe-events-calendar-month__header-column-title{--tec-color-text-day-of-week-month:var(--tec-color-text-primary)}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-calendar-month__calendar-event-datetime,.single-tribe_events .tribe-events-calendar-month__calendar-event-datetime,.tribe-events.tribe-common--breakpoint-medium .tribe-events-calendar-month__calendar-event-datetime,.tribe-events .tribe-events-calendar-month__calendar-event-datetime{--tec-color-text-event-date-secondary:#727272}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-calendar-month__calendar-event-title-link,.single-tribe_events .tribe-events-calendar-month__calendar-event-title-link,.tribe-events.tribe-common--breakpoint-medium .tribe-events-calendar-month__calendar-event-title-link,.tribe-events .tribe-events-calendar-month__calendar-event-title-link{font-weight:var(--tec-font-weight-regular)}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-promo.tribe-common-b1.tribe-events-c-promo,.single-tribe_events .tribe-events-promo.tribe-common-b1.tribe-events-c-promo,.tribe-events.tribe-common--breakpoint-medium .tribe-events-promo.tribe-common-b1.tribe-events-c-promo,.tribe-events .tribe-events-promo.tribe-common-b1.tribe-events-c-promo{--tec-color-text-primary:#727272;--tec-font-size-3:var(--tec-font-size-1)}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-promo.tribe-common-b1.tribe-events-c-promo .tribe-common-anchor-thin,.single-tribe_events .tribe-events-promo.tribe-common-b1.tribe-events-c-promo .tribe-common-anchor-thin,.tribe-events.tribe-common--breakpoint-medium .tribe-events-promo.tribe-common-b1.tribe-events-c-promo .tribe-common-anchor-thin,.tribe-events .tribe-events-promo.tribe-common-b1.tribe-events-c-promo .tribe-common-anchor-thin{--tec-color-text-primary:#141827;font-weight:var(--tec-font-weight-regular)}
1
+ .single-tribe_events.tribe-common--breakpoint-medium .tribe-events-back,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-events-bar,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-nav,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__datepicker-button-icon-svg,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__nav,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__today-button,.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-nav-pagination,.single-tribe_events .tribe-events-back,.single-tribe_events .tribe-events-c-events-bar,.single-tribe_events .tribe-events-c-nav,.single-tribe_events .tribe-events-c-top-bar__datepicker-button-icon-svg,.single-tribe_events .tribe-events-c-top-bar__nav,.single-tribe_events .tribe-events-c-top-bar__today-button,.single-tribe_events .tribe-events-nav-pagination,.tribe-events.tribe-common--breakpoint-medium .tribe-events-back,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-events-bar,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-nav,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__datepicker-button-icon-svg,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__nav,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-top-bar__today-button,.tribe-events.tribe-common--breakpoint-medium .tribe-events-nav-pagination,.tribe-events .tribe-events-back,.tribe-events .tribe-events-c-events-bar,.tribe-events .tribe-events-c-nav,.tribe-events .tribe-events-c-top-bar__datepicker-button-icon-svg,.tribe-events .tribe-events-c-top-bar__nav,.tribe-events .tribe-events-c-top-bar__today-button,.tribe-events .tribe-events-nav-pagination{display:none!important}.single-tribe_events.tribe-common--breakpoint-medium a[href^=http],.single-tribe_events a[href^=http],.tribe-events.tribe-common--breakpoint-medium a[href^=http],.tribe-events a[href^=http]{text-decoration:none!important}.single-tribe_events.tribe-common--breakpoint-medium a[href^=http]:after,.single-tribe_events a[href^=http]:after,.tribe-events.tribe-common--breakpoint-medium a[href^=http]:after,.tribe-events a[href^=http]:after{content:none!important}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-c-subscribe-dropdown__container,.single-tribe_events .tribe-events-c-subscribe-dropdown__container,.tribe-events.tribe-common--breakpoint-medium .tribe-events-c-subscribe-dropdown__container,.tribe-events .tribe-events-c-subscribe-dropdown__container{display:none!important}.single-tribe_events.tribe-common--breakpoint-medium.tribe-common .tribe-common-h--alt.tribe-events-c-top-bar__datepicker-button,.single-tribe_events.tribe-common .tribe-common-h--alt.tribe-events-c-top-bar__datepicker-button,.tribe-events.tribe-common--breakpoint-medium.tribe-common .tribe-common-h--alt.tribe-events-c-top-bar__datepicker-button,.tribe-events.tribe-common .tribe-common-h--alt.tribe-events-c-top-bar__datepicker-button{--tec-font-weight-regular:var(--tec-font-weight-bold)}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-calendar-month__header-column-title,.single-tribe_events .tribe-events-calendar-month__header-column-title,.tribe-events.tribe-common--breakpoint-medium .tribe-events-calendar-month__header-column-title,.tribe-events .tribe-events-calendar-month__header-column-title{--tec-color-text-day-of-week-month:var(--tec-color-text-primary)}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-calendar-month__calendar-event-datetime,.single-tribe_events .tribe-events-calendar-month__calendar-event-datetime,.tribe-events.tribe-common--breakpoint-medium .tribe-events-calendar-month__calendar-event-datetime,.tribe-events .tribe-events-calendar-month__calendar-event-datetime{--tec-color-text-secondary-event-date:#727272}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-calendar-month__calendar-event-title-link,.single-tribe_events .tribe-events-calendar-month__calendar-event-title-link,.tribe-events.tribe-common--breakpoint-medium .tribe-events-calendar-month__calendar-event-title-link,.tribe-events .tribe-events-calendar-month__calendar-event-title-link{font-weight:var(--tec-font-weight-regular)}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-promo.tribe-common-b1.tribe-events-c-promo,.single-tribe_events .tribe-events-promo.tribe-common-b1.tribe-events-c-promo,.tribe-events.tribe-common--breakpoint-medium .tribe-events-promo.tribe-common-b1.tribe-events-c-promo,.tribe-events .tribe-events-promo.tribe-common-b1.tribe-events-c-promo{--tec-color-text-primary:#727272;--tec-font-size-3:var(--tec-font-size-1)}.single-tribe_events.tribe-common--breakpoint-medium .tribe-events-promo.tribe-common-b1.tribe-events-c-promo .tribe-common-anchor-thin,.single-tribe_events .tribe-events-promo.tribe-common-b1.tribe-events-c-promo .tribe-common-anchor-thin,.tribe-events.tribe-common--breakpoint-medium .tribe-events-promo.tribe-common-b1.tribe-events-c-promo .tribe-common-anchor-thin,.tribe-events .tribe-events-promo.tribe-common-b1.tribe-events-c-promo .tribe-common-anchor-thin{--tec-color-text-primary:#141827;font-weight:var(--tec-font-weight-regular)}
src/resources/js/customizer-views-v2-live-preview.js CHANGED
@@ -83,7 +83,7 @@ var tribe_events_customizer_live_preview_js_config =
83
  ],
84
  globalEventDateColor: [
85
  '--tec-color-text-event-date',
86
- '--tec-color-text-event-date-secondary',
87
  ],
88
  globalBackgroundColor: '--tec-color-background-events',
89
  globalAccentColor: [
83
  ],
84
  globalEventDateColor: [
85
  '--tec-color-text-event-date',
86
+ '--tec-color-text-secondary-event-date',
87
  ],
88
  globalBackgroundColor: '--tec-color-background-events',
89
  globalAccentColor: [
src/resources/js/customizer-views-v2-live-preview.min.js CHANGED
@@ -1 +1 @@
1
- var tribe_events_customizer_live_preview_js_config=tribe_events_customizer_live_preview_js_config||{};!function(o,t,e){e.selectors={globalFontFamily:"tribe_customizer[global_elements][font_family]",globalFontSizeBase:"tribe_customizer[global_elements][font_size_base]",globalEventTitleColor:"tribe_customizer[global_elements][event_title_color]",globalEventDateColor:"tribe_customizer[global_elements][event_date_time_color]",globalBackgroundColor:"tribe_customizer[global_elements][background_color]",globalBackgroundColorChoice:"tribe_customizer[global_elements][background_color_choice]",globalAccentColor:"tribe_customizer[global_elements][accent_color]",globalLinkColor:"tribe_customizer[global_elements][link_color]",eventsBarTextColor:"tribe_customizer[tec_events_bar][events_bar_text_color]",eventsBarButtonTextColor:"tribe_customizer[tec_events_bar][find_events_button_text_color]",eventsBarIconColorChoice:"tribe_customizer[tec_events_bar][events_bar_icon_color_choice]",eventsBarIconColor:"tribe_customizer[tec_events_bar][events_bar_icon_color]",eventsBarButtonColorChoice:"tribe_customizer[tec_events_bar][find_events_button_color_choice]",eventsBarButtonColor:"tribe_customizer[tec_events_bar][find_events_button_color]",eventsBarBackgroundColorChoice:"tribe_customizer[tec_events_bar][events_bar_background_color_choice]",eventsBarBackgroundColor:"tribe_customizer[tec_events_bar][events_bar_background_color]",eventsBarBorderColorChoice:"tribe_customizer[tec_events_bar][events_bar_border_color_choice]",eventsBarBorderColor:"tribe_customizer[tec_events_bar][events_bar_border_color]",eventsBarViewSelectorBackgroundColorChoice:"tribe_customizer[tec_events_bar][view_selector_background_color_choice]",eventsBarViewSelectorBackgroundColor:"tribe_customizer[tec_events_bar][view_selector_background_color]",monthDaysOfWeekColor:"tribe_customizer[month_view][days_of_week_color]",monthDateMarkerColor:"tribe_customizer[month_view][date_marker_color]",monthMultidayEventBarChoice:"tribe_customizer[month_view][multiday_event_bar_color_choice]",monthMultidayEventBarColor:"tribe_customizer[month_view][multiday_event_bar_color]",monthGridLinesColor:"tribe_customizer[month_view][grid_lines_color]",monthGridHoverColor:"tribe_customizer[month_view][grid_hover_color]",monthGridBackgroundColorChoice:"tribe_customizer[month_view][grid_background_color_choice]",monthGridBackgroundColor:"tribe_customizer[month_view][grid_background_color]",monthTooltipBackgroundColor:"tribe_customizer[month_view][tooltip_background_color]",singleEventTitleColorChoice:"tribe_customizer[single_event][post_title_color_choice]",singleEventTitleColor:"tribe_customizer[single_event][post_title_color]"},e.customProps={globalFontFamily:["--tec-font-family-sans-serif","--tec-font-family-base"],globalFontSizeBase:["--tec-font-size-0","--tec-font-size-1","--tec-font-size-2","--tec-font-size-3","--tec-font-size-4","--tec-font-size-5","--tec-font-size-6","--tec-font-size-7","--tec-font-size-8","--tec-font-size-9","--tec-font-size-10"],globalFontSizeKeys:[11,12,14,16,18,20,22,24,28,32,42],globalEventTitleColor:["--tec-color-text-events-title"],globalEventDateColor:["--tec-color-text-event-date","--tec-color-text-event-date-secondary"],globalBackgroundColor:"--tec-color-background-events",globalAccentColor:["--tec-color-accent-primary","--tec-color-accent-primary-hover","--tec-color-accent-primary-multiday","--tec-color-accent-primary-multiday-hover","--tec-color-accent-primary-active","--tec-color-accent-primary-background","--tec-color-background-secondary-datepicker","--tec-color-accent-primary-background-datepicker","--tec-color-button-primary","--tec-color-button-primary-hover","--tec-color-button-primary-active","--tec-color-button-primary-background","--tec-color-day-marker-current-month","--tec-color-day-marker-current-month-hover","--tec-color-day-marker-current-month-active"],globalLinkColor:["--tec-color-link-primary","--tec-color-link-accent","--tec-color-link-accent-hover"],eventsBarTextColor:["--tec-color-text-events-bar-input","--tec-color-text-events-bar-input-placeholder","--tec-color-text-view-selector-list-item","--tec-color-text-view-selector-list-item-hover"],eventsBarButtonTextColor:["--tec-color-text-events-bar-submit-button","--tec-color-text-events-bar-submit-button-active","--tec-color-text-events-bar-submit-button-hover"],eventsBarIconColor:["--tec-color-icon-events-bar","--tec-color-icon-events-bar-hover","--tec-color-icon-events-bar-active"],eventsBarButtonColor:["--tec-color-background-events-bar-submit-button","--tec-color-background-events-bar-submit-button-hover","--tec-color-background-events-bar-submit-button-active"],eventsBarBackgroundColor:["--tec-color-background-events-bar","--tec-color-background-events-bar-tabs"],eventsBarBackgroundColorOpacity:"--tec-opacity-events-bar-input-placeholder",eventsBarBorderColor:"--tec-color-border-events-bar",eventsBarViewSelectorBackgroundColor:"--tec-color-background-view-selector",monthDaysOfWeekColor:"--tec-color-text-day-of-week-month",monthDateMarkerColor:["--tec-color-day-marker-month","--tec-color-day-marker-past-month"],monthMultidayEventBarColor:["--tec-color-background-primary-multiday","--tec-color-background-primary-multiday-hover","--tec-color-background-primary-multiday-active","--tec-color-background-secondary-multiday","--tec-color-background-secondary-multiday-hover"],monthGridLinesColor:"--tec-color-border-secondary-month-grid",monthGridHoverColor:"--tec-color-border-active-month-grid-hover",monthGridBackgroundColor:"--tec-color-background-month-grid",monthTooltipBackgroundColor:"--tec-color-background-tooltip",singleEventTitleColor:["--tec-color-text-event-title"]},e.root=document.querySelectorAll(tribe_events_customizer_live_preview_js_config.selector),t(e.selectors.globalFontFamily,function(o){o.bind(function(o){const t="theme"===o?"inherit":tribe_events_customizer_live_preview_js_config.default_font;e.customProps.globalFontFamily.forEach(function(o){document.documentElement.style.setProperty(o,t)})})}),t(e.selectors.globalFontSizeBase,function(o){o.bind(function(o){const t=parseInt(o)/16;e.root.forEach(function(o){e.customProps.globalFontSizeBase.forEach(function(r,c){const n=t*parseInt(e.customProps.globalFontSizeKeys[c]);o.style.setProperty(r,n.toFixed(3)+"px")})})})}),t(e.selectors.globalEventTitleColor,function(o){o.bind(function(o){e.root.forEach(function(r){e.customProps.globalEventTitleColor.forEach(function(t){r.style.setProperty(t,o)}),"default"===t(e.selectors.singleEventTitleColorChoice).get()&&e.customProps.singleEventTitleColor.forEach(function(t){r.style.setProperty(t,o)})})})}),t(e.selectors.globalEventDateColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.globalEventDateColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.globalBackgroundColorChoice,function(o){o.bind(function(o){const r="transparent"!==o?t(e.selectors.globalBackgroundColor).get():o;e.root.forEach(function(c){if(c.style.setProperty(e.customProps.globalBackgroundColor,r),"global_background"===t(e.selectors.eventsBarBackgroundColorChoice).get()){let n="transparent"===o?"var(--tec-color-background)":r;e.customProps.eventsBarBackgroundColor.forEach(function(o){c.style.setProperty(o,n)}),"default"===t(e.selectors.eventsBarViewSelectorBackgroundColorChoice).get()&&c.style.setProperty(e.customProps.eventsBarViewSelectorBackgroundColor,n)}})})}),t(e.selectors.globalBackgroundColor,function(o){o.bind(function(o){e.root.forEach(function(r){if(r.style.setProperty(e.customProps.globalBackgroundColor,o),"global_background"===t(e.selectors.eventsBarBackgroundColorChoice).get()){e.customProps.eventsBarBackgroundColor.forEach(function(t){r.style.setProperty(t,o)})}})})}),t(e.selectors.globalAccentColor,function(o){o.bind(function(o){const r=o,c=e.customProps.globalAccentColor;e.root.forEach(function(o){if(c.forEach(function(t){o.style.setProperty(t,r)}),"default"===t(e.selectors.eventsBarButtonColorChoice).get()){e.customProps.eventsBarButtonColor.forEach(function(t){o.style.setProperty(t,r)})}if("accent"===t(e.selectors.eventsBarIconColorChoice).get()){e.customProps.eventsBarIconColor.forEach(function(t){o.style.setProperty(t,r)})}const n=t(e.selectors.monthMultidayEventBarChoice).get(),l=e.hexToRGBString(r);"default"===n&&(o.style.setProperty("--tec-color-background-primary-multiday","rgba("+l+", 0.24)"),o.style.setProperty("--tec-color-background-primary-multiday-hover","rgba("+l+", 0.34)"),o.style.setProperty("--tec-color-background-primary-multiday-active","rgba("+l+", 0.34)"),o.style.setProperty("--tec-color-background-secondary-multiday","rgba("+l+", 0.24)"),o.style.setProperty("--tec-color-background-secondary-multiday-hover","rgba("+l+", 0.34)"))})})}),t(e.selectors.globalLinkColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.globalLinkColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarTextColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarTextColor.forEach(function(e){t.style.setProperty(e,o)}),t.style.setProperty("--tec-opacity-events-bar-input-placeholder","0.6")})})}),t(e.selectors.eventsBarButtonTextColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarButtonTextColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarIconColorChoice,function(o){o.bind(function(o){let r="var(--tec-color-icon-primary)";"custom"===o?r=t(e.selectors.eventsBarIconColor).get():"accent"===o&&(r=t(e.selectors.globalAccentColor).get()),e.root.forEach(function(o){e.customProps.eventsBarIconColor.forEach(function(t){o.style.setProperty(t,r)})})})}),t(e.selectors.eventsBarIconColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarIconColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarButtonColorChoice,function(o){o.bind(function(o){const r="custom"===o?t(e.selectors.eventsBarButtonColor).get():t(e.selectors.globalAccentColor).get();e.root.forEach(function(o){e.customProps.eventsBarButtonColor.forEach(function(t){o.style.setProperty(t,r)})})})}),t(e.selectors.eventsBarButtonColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarButtonColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarBackgroundColorChoice,function(o){o.bind(function(o){let r="#fff";if("custom"===o)r=t(e.selectors.eventsBarBackgroundColor).get();else if("global_background"===o){"transparent"!==t(e.selectors.globalBackgroundColorChoice).get()&&(r=t(e.selectors.globalBackgroundColor).get())}e.root.forEach(function(o){e.customProps.eventsBarBackgroundColor.forEach(function(t){o.style.setProperty(t,r)})})})}),t(e.selectors.eventsBarBackgroundColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarBackgroundColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarViewSelectorBackgroundColorChoice,function(o){o.bind(function(o){let r=t(e.selectors.eventsBarBackgroundColor).get();"custom"===o&&(r=t(e.selectors.eventsBarViewSelectorBackgroundColor).get()),e.root.forEach(function(o){o.style.setProperty(e.customProps.eventsBarViewSelectorBackgroundColor,r)})})}),t(e.selectors.eventsBarViewSelectorBackgroundColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.eventsBarViewSelectorBackgroundColor,o)})})}),t(e.selectors.eventsBarBorderColorChoice,function(o){o.bind(function(o){const r="custom"===o?t(e.selectors.eventsBarBorderColor).get():"var(--tec-color-border-secondary)";e.root.forEach(function(o){o.style.setProperty(e.customProps.eventsBarBorderColor,r)})})}),t(e.selectors.eventsBarBorderColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.eventsBarBorderColor,o)})})}),t(e.selectors.monthDaysOfWeekColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.monthDaysOfWeekColor,o)})})}),t(e.selectors.monthDateMarkerColor,function(o){o.bind(function(o){const t=e.customProps.monthDateMarkerColor;e.root.forEach(function(e){t.forEach(function(t){e.style.setProperty(t,o)})})})}),t(e.selectors.monthMultidayEventBarChoice,function(o){o.bind(function(o){const r="custom"!==o?t(e.selectors.globalAccentColor).get():t(e.selectors.monthMultidayEventBarColor).get(),c=e.hexToRGBString(r);e.root.forEach(function(o){o.style.setProperty("--tec-color-background-primary-multiday","rgba("+c+", 0.24)"),o.style.setProperty("--tec-color-background-primary-multiday-hover","rgba("+c+", 0.34)"),o.style.setProperty("--tec-color-background-primary-multiday-active","rgba("+c+", 0.34)"),o.style.setProperty("--tec-color-background-secondary-multiday","rgba("+c+", 0.24)"),o.style.setProperty("--tec-color-background-secondary-multiday-hover","rgba("+c+", 0.34 )")})})}),t(e.selectors.monthMultidayEventBarColor,function(o){o.bind(function(o){const t=e.hexToRGBString(o);e.root.forEach(function(o){o.style.setProperty("--tec-color-background-primary-multiday","rgba("+t+", 0.24)"),o.style.setProperty("--tec-color-background-primary-multiday-hover","rgba("+t+", 0.34)"),o.style.setProperty("--tec-color-background-primary-multiday-active","rgba("+t+", 0.34)"),o.style.setProperty("--tec-color-background-secondary-multiday","rgba("+t+", 0.24)"),o.style.setProperty("--tec-color-background-secondary-multiday-hover","rgba("+t+", 0.34 )")})})}),t(e.selectors.monthGridLinesColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.monthGridLinesColor,o)})})}),t(e.selectors.monthGridHoverColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.monthGridHoverColor,o)})})}),t(e.selectors.monthGridBackgroundColorChoice,function(o){o.bind(function(o){const r="custom"===o?t(e.selectors.monthGridBackgroundColor).get():"transparent",c="custom"===o?"#fff":t(e.selectors.globalBackgroundColor).get();e.root.forEach(function(o){o.style.setProperty(e.customProps.monthGridBackgroundColor,r)}),document.documentElement.style.setProperty(e.customProps.monthTooltipBackgroundColor,c)})}),t(e.selectors.monthGridBackgroundColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.monthGridBackgroundColor,o)})})}),t(e.selectors.monthTooltipBackgroundColor,function(o){o.bind(function(o){let r="#fff",c=t(e.selectors.monthGridBackgroundColorChoice).get(),n=t(e.selectors.globalBackgroundColorChoice).get();"event"===o&&"transparent"===c&&"transparent"!==n&&(r=t(e.selectors.globalBackgroundColor).get()),document.documentElement.style.setProperty(e.customProps.monthTooltipBackgroundColor,r)})}),t(e.selectors.singleEventTitleColorChoice,function(o){o.bind(function(o){const r="custom"===o?t(e.selectors.singleEventTitleColor).get():t(e.selectors.globalEventTitleColor).get();e.root.forEach(function(o){o.style.setProperty(e.customProps.singleEventTitleColor,r)})})}),t(e.selectors.singleEventTitleColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.singleEventTitleColor,o)})})}),e.hexToRGB=function(o){return{r:(o=parseInt(o.indexOf("#")>-1?o.substring(1):o,16))>>16,g:(65280&o)>>8,b:255&o}},e.hexToRGBString=function(o){var t=e.hexToRGB(o);return t.r+", "+t.g+", "+t.b}}(jQuery,wp.customize,tribe_events_customizer_live_preview_js_config);
1
+ var tribe_events_customizer_live_preview_js_config=tribe_events_customizer_live_preview_js_config||{};!function(o,t,e){e.selectors={globalFontFamily:"tribe_customizer[global_elements][font_family]",globalFontSizeBase:"tribe_customizer[global_elements][font_size_base]",globalEventTitleColor:"tribe_customizer[global_elements][event_title_color]",globalEventDateColor:"tribe_customizer[global_elements][event_date_time_color]",globalBackgroundColor:"tribe_customizer[global_elements][background_color]",globalBackgroundColorChoice:"tribe_customizer[global_elements][background_color_choice]",globalAccentColor:"tribe_customizer[global_elements][accent_color]",globalLinkColor:"tribe_customizer[global_elements][link_color]",eventsBarTextColor:"tribe_customizer[tec_events_bar][events_bar_text_color]",eventsBarButtonTextColor:"tribe_customizer[tec_events_bar][find_events_button_text_color]",eventsBarIconColorChoice:"tribe_customizer[tec_events_bar][events_bar_icon_color_choice]",eventsBarIconColor:"tribe_customizer[tec_events_bar][events_bar_icon_color]",eventsBarButtonColorChoice:"tribe_customizer[tec_events_bar][find_events_button_color_choice]",eventsBarButtonColor:"tribe_customizer[tec_events_bar][find_events_button_color]",eventsBarBackgroundColorChoice:"tribe_customizer[tec_events_bar][events_bar_background_color_choice]",eventsBarBackgroundColor:"tribe_customizer[tec_events_bar][events_bar_background_color]",eventsBarBorderColorChoice:"tribe_customizer[tec_events_bar][events_bar_border_color_choice]",eventsBarBorderColor:"tribe_customizer[tec_events_bar][events_bar_border_color]",eventsBarViewSelectorBackgroundColorChoice:"tribe_customizer[tec_events_bar][view_selector_background_color_choice]",eventsBarViewSelectorBackgroundColor:"tribe_customizer[tec_events_bar][view_selector_background_color]",monthDaysOfWeekColor:"tribe_customizer[month_view][days_of_week_color]",monthDateMarkerColor:"tribe_customizer[month_view][date_marker_color]",monthMultidayEventBarChoice:"tribe_customizer[month_view][multiday_event_bar_color_choice]",monthMultidayEventBarColor:"tribe_customizer[month_view][multiday_event_bar_color]",monthGridLinesColor:"tribe_customizer[month_view][grid_lines_color]",monthGridHoverColor:"tribe_customizer[month_view][grid_hover_color]",monthGridBackgroundColorChoice:"tribe_customizer[month_view][grid_background_color_choice]",monthGridBackgroundColor:"tribe_customizer[month_view][grid_background_color]",monthTooltipBackgroundColor:"tribe_customizer[month_view][tooltip_background_color]",singleEventTitleColorChoice:"tribe_customizer[single_event][post_title_color_choice]",singleEventTitleColor:"tribe_customizer[single_event][post_title_color]"},e.customProps={globalFontFamily:["--tec-font-family-sans-serif","--tec-font-family-base"],globalFontSizeBase:["--tec-font-size-0","--tec-font-size-1","--tec-font-size-2","--tec-font-size-3","--tec-font-size-4","--tec-font-size-5","--tec-font-size-6","--tec-font-size-7","--tec-font-size-8","--tec-font-size-9","--tec-font-size-10"],globalFontSizeKeys:[11,12,14,16,18,20,22,24,28,32,42],globalEventTitleColor:["--tec-color-text-events-title"],globalEventDateColor:["--tec-color-text-event-date","--tec-color-text-secondary-event-date"],globalBackgroundColor:"--tec-color-background-events",globalAccentColor:["--tec-color-accent-primary","--tec-color-accent-primary-hover","--tec-color-accent-primary-multiday","--tec-color-accent-primary-multiday-hover","--tec-color-accent-primary-active","--tec-color-accent-primary-background","--tec-color-background-secondary-datepicker","--tec-color-accent-primary-background-datepicker","--tec-color-button-primary","--tec-color-button-primary-hover","--tec-color-button-primary-active","--tec-color-button-primary-background","--tec-color-day-marker-current-month","--tec-color-day-marker-current-month-hover","--tec-color-day-marker-current-month-active"],globalLinkColor:["--tec-color-link-primary","--tec-color-link-accent","--tec-color-link-accent-hover"],eventsBarTextColor:["--tec-color-text-events-bar-input","--tec-color-text-events-bar-input-placeholder","--tec-color-text-view-selector-list-item","--tec-color-text-view-selector-list-item-hover"],eventsBarButtonTextColor:["--tec-color-text-events-bar-submit-button","--tec-color-text-events-bar-submit-button-active","--tec-color-text-events-bar-submit-button-hover"],eventsBarIconColor:["--tec-color-icon-events-bar","--tec-color-icon-events-bar-hover","--tec-color-icon-events-bar-active"],eventsBarButtonColor:["--tec-color-background-events-bar-submit-button","--tec-color-background-events-bar-submit-button-hover","--tec-color-background-events-bar-submit-button-active"],eventsBarBackgroundColor:["--tec-color-background-events-bar","--tec-color-background-events-bar-tabs"],eventsBarBackgroundColorOpacity:"--tec-opacity-events-bar-input-placeholder",eventsBarBorderColor:"--tec-color-border-events-bar",eventsBarViewSelectorBackgroundColor:"--tec-color-background-view-selector",monthDaysOfWeekColor:"--tec-color-text-day-of-week-month",monthDateMarkerColor:["--tec-color-day-marker-month","--tec-color-day-marker-past-month"],monthMultidayEventBarColor:["--tec-color-background-primary-multiday","--tec-color-background-primary-multiday-hover","--tec-color-background-primary-multiday-active","--tec-color-background-secondary-multiday","--tec-color-background-secondary-multiday-hover"],monthGridLinesColor:"--tec-color-border-secondary-month-grid",monthGridHoverColor:"--tec-color-border-active-month-grid-hover",monthGridBackgroundColor:"--tec-color-background-month-grid",monthTooltipBackgroundColor:"--tec-color-background-tooltip",singleEventTitleColor:["--tec-color-text-event-title"]},e.root=document.querySelectorAll(tribe_events_customizer_live_preview_js_config.selector),t(e.selectors.globalFontFamily,function(o){o.bind(function(o){const t="theme"===o?"inherit":tribe_events_customizer_live_preview_js_config.default_font;e.customProps.globalFontFamily.forEach(function(o){document.documentElement.style.setProperty(o,t)})})}),t(e.selectors.globalFontSizeBase,function(o){o.bind(function(o){const t=parseInt(o)/16;e.root.forEach(function(o){e.customProps.globalFontSizeBase.forEach(function(r,c){const n=t*parseInt(e.customProps.globalFontSizeKeys[c]);o.style.setProperty(r,n.toFixed(3)+"px")})})})}),t(e.selectors.globalEventTitleColor,function(o){o.bind(function(o){e.root.forEach(function(r){e.customProps.globalEventTitleColor.forEach(function(t){r.style.setProperty(t,o)}),"default"===t(e.selectors.singleEventTitleColorChoice).get()&&e.customProps.singleEventTitleColor.forEach(function(t){r.style.setProperty(t,o)})})})}),t(e.selectors.globalEventDateColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.globalEventDateColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.globalBackgroundColorChoice,function(o){o.bind(function(o){const r="transparent"!==o?t(e.selectors.globalBackgroundColor).get():o;e.root.forEach(function(c){if(c.style.setProperty(e.customProps.globalBackgroundColor,r),"global_background"===t(e.selectors.eventsBarBackgroundColorChoice).get()){let n="transparent"===o?"var(--tec-color-background)":r;e.customProps.eventsBarBackgroundColor.forEach(function(o){c.style.setProperty(o,n)}),"default"===t(e.selectors.eventsBarViewSelectorBackgroundColorChoice).get()&&c.style.setProperty(e.customProps.eventsBarViewSelectorBackgroundColor,n)}})})}),t(e.selectors.globalBackgroundColor,function(o){o.bind(function(o){e.root.forEach(function(r){if(r.style.setProperty(e.customProps.globalBackgroundColor,o),"global_background"===t(e.selectors.eventsBarBackgroundColorChoice).get()){e.customProps.eventsBarBackgroundColor.forEach(function(t){r.style.setProperty(t,o)})}})})}),t(e.selectors.globalAccentColor,function(o){o.bind(function(o){const r=o,c=e.customProps.globalAccentColor;e.root.forEach(function(o){if(c.forEach(function(t){o.style.setProperty(t,r)}),"default"===t(e.selectors.eventsBarButtonColorChoice).get()){e.customProps.eventsBarButtonColor.forEach(function(t){o.style.setProperty(t,r)})}if("accent"===t(e.selectors.eventsBarIconColorChoice).get()){e.customProps.eventsBarIconColor.forEach(function(t){o.style.setProperty(t,r)})}const n=t(e.selectors.monthMultidayEventBarChoice).get(),l=e.hexToRGBString(r);"default"===n&&(o.style.setProperty("--tec-color-background-primary-multiday","rgba("+l+", 0.24)"),o.style.setProperty("--tec-color-background-primary-multiday-hover","rgba("+l+", 0.34)"),o.style.setProperty("--tec-color-background-primary-multiday-active","rgba("+l+", 0.34)"),o.style.setProperty("--tec-color-background-secondary-multiday","rgba("+l+", 0.24)"),o.style.setProperty("--tec-color-background-secondary-multiday-hover","rgba("+l+", 0.34)"))})})}),t(e.selectors.globalLinkColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.globalLinkColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarTextColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarTextColor.forEach(function(e){t.style.setProperty(e,o)}),t.style.setProperty("--tec-opacity-events-bar-input-placeholder","0.6")})})}),t(e.selectors.eventsBarButtonTextColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarButtonTextColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarIconColorChoice,function(o){o.bind(function(o){let r="var(--tec-color-icon-primary)";"custom"===o?r=t(e.selectors.eventsBarIconColor).get():"accent"===o&&(r=t(e.selectors.globalAccentColor).get()),e.root.forEach(function(o){e.customProps.eventsBarIconColor.forEach(function(t){o.style.setProperty(t,r)})})})}),t(e.selectors.eventsBarIconColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarIconColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarButtonColorChoice,function(o){o.bind(function(o){const r="custom"===o?t(e.selectors.eventsBarButtonColor).get():t(e.selectors.globalAccentColor).get();e.root.forEach(function(o){e.customProps.eventsBarButtonColor.forEach(function(t){o.style.setProperty(t,r)})})})}),t(e.selectors.eventsBarButtonColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarButtonColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarBackgroundColorChoice,function(o){o.bind(function(o){let r="#fff";if("custom"===o)r=t(e.selectors.eventsBarBackgroundColor).get();else if("global_background"===o){"transparent"!==t(e.selectors.globalBackgroundColorChoice).get()&&(r=t(e.selectors.globalBackgroundColor).get())}e.root.forEach(function(o){e.customProps.eventsBarBackgroundColor.forEach(function(t){o.style.setProperty(t,r)})})})}),t(e.selectors.eventsBarBackgroundColor,function(o){o.bind(function(o){e.root.forEach(function(t){e.customProps.eventsBarBackgroundColor.forEach(function(e){t.style.setProperty(e,o)})})})}),t(e.selectors.eventsBarViewSelectorBackgroundColorChoice,function(o){o.bind(function(o){let r=t(e.selectors.eventsBarBackgroundColor).get();"custom"===o&&(r=t(e.selectors.eventsBarViewSelectorBackgroundColor).get()),e.root.forEach(function(o){o.style.setProperty(e.customProps.eventsBarViewSelectorBackgroundColor,r)})})}),t(e.selectors.eventsBarViewSelectorBackgroundColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.eventsBarViewSelectorBackgroundColor,o)})})}),t(e.selectors.eventsBarBorderColorChoice,function(o){o.bind(function(o){const r="custom"===o?t(e.selectors.eventsBarBorderColor).get():"var(--tec-color-border-secondary)";e.root.forEach(function(o){o.style.setProperty(e.customProps.eventsBarBorderColor,r)})})}),t(e.selectors.eventsBarBorderColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.eventsBarBorderColor,o)})})}),t(e.selectors.monthDaysOfWeekColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.monthDaysOfWeekColor,o)})})}),t(e.selectors.monthDateMarkerColor,function(o){o.bind(function(o){const t=e.customProps.monthDateMarkerColor;e.root.forEach(function(e){t.forEach(function(t){e.style.setProperty(t,o)})})})}),t(e.selectors.monthMultidayEventBarChoice,function(o){o.bind(function(o){const r="custom"!==o?t(e.selectors.globalAccentColor).get():t(e.selectors.monthMultidayEventBarColor).get(),c=e.hexToRGBString(r);e.root.forEach(function(o){o.style.setProperty("--tec-color-background-primary-multiday","rgba("+c+", 0.24)"),o.style.setProperty("--tec-color-background-primary-multiday-hover","rgba("+c+", 0.34)"),o.style.setProperty("--tec-color-background-primary-multiday-active","rgba("+c+", 0.34)"),o.style.setProperty("--tec-color-background-secondary-multiday","rgba("+c+", 0.24)"),o.style.setProperty("--tec-color-background-secondary-multiday-hover","rgba("+c+", 0.34 )")})})}),t(e.selectors.monthMultidayEventBarColor,function(o){o.bind(function(o){const t=e.hexToRGBString(o);e.root.forEach(function(o){o.style.setProperty("--tec-color-background-primary-multiday","rgba("+t+", 0.24)"),o.style.setProperty("--tec-color-background-primary-multiday-hover","rgba("+t+", 0.34)"),o.style.setProperty("--tec-color-background-primary-multiday-active","rgba("+t+", 0.34)"),o.style.setProperty("--tec-color-background-secondary-multiday","rgba("+t+", 0.24)"),o.style.setProperty("--tec-color-background-secondary-multiday-hover","rgba("+t+", 0.34 )")})})}),t(e.selectors.monthGridLinesColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.monthGridLinesColor,o)})})}),t(e.selectors.monthGridHoverColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.monthGridHoverColor,o)})})}),t(e.selectors.monthGridBackgroundColorChoice,function(o){o.bind(function(o){const r="custom"===o?t(e.selectors.monthGridBackgroundColor).get():"transparent",c="custom"===o?"#fff":t(e.selectors.globalBackgroundColor).get();e.root.forEach(function(o){o.style.setProperty(e.customProps.monthGridBackgroundColor,r)}),document.documentElement.style.setProperty(e.customProps.monthTooltipBackgroundColor,c)})}),t(e.selectors.monthGridBackgroundColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.monthGridBackgroundColor,o)})})}),t(e.selectors.monthTooltipBackgroundColor,function(o){o.bind(function(o){let r="#fff",c=t(e.selectors.monthGridBackgroundColorChoice).get(),n=t(e.selectors.globalBackgroundColorChoice).get();"event"===o&&"transparent"===c&&"transparent"!==n&&(r=t(e.selectors.globalBackgroundColor).get()),document.documentElement.style.setProperty(e.customProps.monthTooltipBackgroundColor,r)})}),t(e.selectors.singleEventTitleColorChoice,function(o){o.bind(function(o){const r="custom"===o?t(e.selectors.singleEventTitleColor).get():t(e.selectors.globalEventTitleColor).get();e.root.forEach(function(o){o.style.setProperty(e.customProps.singleEventTitleColor,r)})})}),t(e.selectors.singleEventTitleColor,function(o){o.bind(function(o){e.root.forEach(function(t){t.style.setProperty(e.customProps.singleEventTitleColor,o)})})}),e.hexToRGB=function(o){return{r:(o=parseInt(o.indexOf("#")>-1?o.substring(1):o,16))>>16,g:(65280&o)>>8,b:255&o}},e.hexToRGBString=function(o){var t=e.hexToRGB(o);return t.r+", "+t.g+", "+t.b}}(jQuery,wp.customize,tribe_events_customizer_live_preview_js_config);
src/resources/js/views/manager.js CHANGED
@@ -608,8 +608,8 @@ tribe.events.views.manager = {};
608
  document.dispatchEvent(
609
  new CustomEvent(
610
  'containerReplaceBefore.tribeEvents',
611
- { detail: $container },
612
- ),
613
  );
614
 
615
  // Replace the current container with the new Data.
@@ -623,8 +623,8 @@ tribe.events.views.manager = {};
623
  document.dispatchEvent(
624
  new CustomEvent(
625
  'containerReplaceAfter.tribeEvents',
626
- { detail: $container },
627
- ),
628
  );
629
 
630
  // Update the global set of containers with all of the manager object.
608
  document.dispatchEvent(
609
  new CustomEvent(
610
  'containerReplaceBefore.tribeEvents',
611
+ { detail: $container }
612
+ )
613
  );
614
 
615
  // Replace the current container with the new Data.
623
  document.dispatchEvent(
624
  new CustomEvent(
625
  'containerReplaceAfter.tribeEvents',
626
+ { detail: $container }
627
+ )
628
  );
629
 
630
  // Update the global set of containers with all of the manager object.
src/views/v2/components/top-bar/today.php CHANGED
@@ -9,7 +9,9 @@
9
  *
10
  * @link http://evnt.is/1aiy
11
  *
12
- * @var string $today_url The URL to the today page.
 
 
13
  *
14
  * @version 5.2.0
15
  */
@@ -18,8 +20,8 @@
18
  href="<?php echo esc_url( $today_url ); ?>"
19
  class="tribe-common-c-btn-border-small tribe-events-c-top-bar__today-button tribe-common-a11y-hidden"
20
  data-js="tribe-events-view-link"
21
- aria-label="<?php esc_attr_e( 'Click to select today\'s date', 'the-events-calendar' ); ?>"
22
- title="<?php esc_attr_e( 'Click to select today\'s date', 'the-events-calendar' ); ?>"
23
  >
24
- <?php esc_html_e( 'Today', 'the-events-calendar' ); ?>
25
  </a>
9
  *
10
  * @link http://evnt.is/1aiy
11
  *
12
+ * @var string $today_url The URL to the today page.
13
+ * @var string $today_title The string used for the title and aria-label of the button.
14
+ * @var string $today_label The string used for the visible button text.
15
  *
16
  * @version 5.2.0
17
  */
20
  href="<?php echo esc_url( $today_url ); ?>"
21
  class="tribe-common-c-btn-border-small tribe-events-c-top-bar__today-button tribe-common-a11y-hidden"
22
  data-js="tribe-events-view-link"
23
+ aria-label="<?php echo esc_attr( $today_title ); ?>"
24
+ title="<?php echo esc_attr( $today_title ); ?>"
25
  >
26
+ <?php echo esc_html( $today_label ); ?>
27
  </a>
src/views/v2/list/nav/today.php CHANGED
@@ -20,9 +20,9 @@
20
  href="<?php echo esc_url( $today_url ); ?>"
21
  class="tribe-events-c-nav__today tribe-common-b2"
22
  data-js="tribe-events-view-link"
23
- aria-label="<?php esc_attr_e( 'Click to select today\'s date', 'the-events-calendar' ); ?>"
24
- title="<?php esc_attr_e( 'Click to select today\'s date', 'the-events-calendar' ); ?>"
25
  >
26
- <?php esc_html_e( 'Today', 'the-events-calendar' ); ?>
27
  </a>
28
  </li>
20
  href="<?php echo esc_url( $today_url ); ?>"
21
  class="tribe-events-c-nav__today tribe-common-b2"
22
  data-js="tribe-events-view-link"
23
+ aria-label="<?php echo esc_attr( $today_title ); ?>"
24
+ title="<?php echo esc_attr( $today_title ); ?>"
25
  >
26
+ <?php echo esc_html( $today_label ); ?>
27
  </a>
28
  </li>
src/views/v2/month/calendar-body/day.php CHANGED
@@ -14,65 +14,36 @@
14
  * @since 5.9.0 Divided the day template into two sub-templates, for date and cell, since it allows for better customization.
15
  * @since 5.3.0 Introduced.
16
  *
17
- * @var string $today_date Today's date in the `Y-m-d` format.
18
- * @var string $day_date The current day date, in the `Y-m-d` format.
19
- * @var array $day The current day data.{
20
- * @type string $date The day date, in the `Y-m-d` format.
21
- * @type bool $is_start_of_week Whether the current day is the first day of the week or not.
22
- * @type string $year_number The day year number, e.g. `2019`.
23
- * @type string $month_number The day year number, e.g. `6` for June.
24
- * @type string $day_number The day number in the month with leading 0, e.g. `11` for June 11th.
25
- * @type string $day_url The day url, e.g. `http://yoursite.com/events/2019-06-11/`.
26
- * @type int $found_events The total number of events in the day including the ones not fetched due to the per
27
- * page limit, including the multi-day ones.
28
- * @type int $more_events The number of events not showing in the day.
29
- * @type array $events The non multi-day events on this day. The format of each event is the one returned by
30
- * the `tribe_get_event` function. Does not include the below events.
31
- * @type array $featured_events The featured events on this day. The format of each event is the one returned
32
- * by the `tribe_get_event` function.
33
- * @type array $multiday_events The stack of multi-day events on this day. The stack is a mix of event post
34
- * objects, the format is the one returned from the `tribe_get_event` function, and
35
- * spacers. Spacers are falsy values indicating an empty space in the multi-day stack for
36
- * the day
 
37
  * }
38
  */
39
- $day_classes = [ 'tribe-events-calendar-month__day' ];
40
- $day_id = 'tribe-events-calendar-day-' . $day_date;
41
-
42
- if ( $today_date === $day_date ) {
43
- $day_classes[] = 'tribe-events-calendar-month__day--current';
44
- }
45
-
46
- if ( $today_date > $day_date ) {
47
- $day_classes[] = 'tribe-events-calendar-month__day--past';
48
- }
49
-
50
- /**
51
- * Add a unique CSS class to past month dates.
52
- *
53
- * @since 5.16.2
54
- */
55
- if ( $day[ 'month_number' ] < date( 'm', strtotime( $today_date ) ) ) {
56
- $day_classes[] = 'tribe-events-calendar-month__day--past-month';
57
  }
58
 
59
- /**
60
- * Add a unique CSS class to future month dates.
61
- *
62
- * @since 5.16.2
63
- */
64
- if ( $day[ 'month_number' ] > date( 'm', strtotime( $today_date ) ) ) {
65
- $day_classes[] = 'tribe-events-calendar-month__day--next-month';
66
- }
67
-
68
- /**
69
- * Add a unique CSS class to any date that is not in the current month.
70
- *
71
- * @since 5.16.3
72
- */
73
- if ( $day[ 'month_number' ] !== date( 'm', strtotime( $today_date ) ) ) {
74
- $day_classes[] = 'tribe-events-calendar-month__day--other-month';
75
- }
76
  ?>
77
 
78
  <div
14
  * @since 5.9.0 Divided the day template into two sub-templates, for date and cell, since it allows for better customization.
15
  * @since 5.3.0 Introduced.
16
  *
17
+ * @var string $today_date Today's date in the `Y-m-d` format.
18
+ * @var string $day_date The current day date, in the `Y-m-d` format.
19
+ * @var DateTime $request_date The request date for the view.
20
+ * @var array<mixed> $day The current day data. {
21
+ * @type string $date The day date, in the `Y-m-d` format.
22
+ * @type bool $is_start_of_week Whether the current day is the first day of the week or not.
23
+ * @type string $year_number The day year number, e.g. `2019`.
24
+ * @type string $month_number The day year number, e.g. `6` for June.
25
+ * @type string $day_number The day number in the month with leading 0, e.g. `11` for June 11th.
26
+ * @type string $day_url The day url, e.g. `http://yoursite.com/events/2019-06-11/`.
27
+ * @type int $found_events The total number of events in the day including the ones not fetched due to
28
+ * the per page limit, including the multi-day ones.
29
+ * @type int $more_events The number of events not showing in the day.
30
+ * @type array $events The non multi-day events on this day. The format of each event is the one
31
+ * returned by the `tribe_get_event` function. Does not include the below events.
32
+ * @type array $featured_events The featured events on this day. The format of each event is the one returned
33
+ * by the `tribe_get_event` function.
34
+ * @type array $multiday_events The stack of multi-day events on this day. The stack is a mix of event post
35
+ * objects, the format is the one returned from the `tribe_get_event` function,
36
+ * and spacers. Spacers are falsy values indicating an empty space in the
37
+ * multi-day stack for the day
38
  * }
39
  */
40
+ // Some static implementations might not have a $request_date - use $today_date.
41
+ if ( empty( $request_date ) ) {
42
+ $request_date = Tribe__Date_Utils::build_date_object( $today_date );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  }
44
 
45
+ $day_classes = \Tribe\Events\Views\V2\month_day_classes( $day, $day_date, $request_date, $today_date );
46
+ $day_id = 'tribe-events-calendar-day-' . $day_date;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  ?>
48
 
49
  <div
src/views/v2/month/mobile-events/nav/today.php CHANGED
@@ -20,9 +20,9 @@
20
  href="<?php echo esc_url( $today_url ); ?>"
21
  class="tribe-events-c-nav__today tribe-common-b2"
22
  data-js="tribe-events-view-link"
23
- aria-label="<?php esc_attr_e( 'Click to select today\'s date', 'the-events-calendar' ); ?>"
24
- title="<?php esc_attr_e( 'Click to select today\'s date', 'the-events-calendar' ); ?>"
25
  >
26
- <?php esc_html_e( 'Today', 'the-events-calendar' ); ?>
27
  </a>
28
  </li>
20
  href="<?php echo esc_url( $today_url ); ?>"
21
  class="tribe-events-c-nav__today tribe-common-b2"
22
  data-js="tribe-events-view-link"
23
+ aria-label="<?php echo esc_attr( $today_title ); ?>"
24
+ title="<?php echo esc_attr( $today_title ); ?>"
25
  >
26
+ <?php echo esc_html( $today_label ); ?>
27
  </a>
28
  </li>
the-events-calendar.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Plugin Name: The Events Calendar
4
  * Description: The Events Calendar is a carefully crafted, extensible plugin that lets you easily share your events. Beautiful. Solid. Awesome.
5
- * Version: 6.0.1.1
6
  * Author: The Events Calendar
7
  * Author URI: https://evnt.is/1x
8
  * Text Domain: the-events-calendar
2
  /**
3
  * Plugin Name: The Events Calendar
4
  * Description: The Events Calendar is a carefully crafted, extensible plugin that lets you easily share your events. Beautiful. Solid. Awesome.
5
+ * Version: 6.0.2
6
  * Author: The Events Calendar
7
  * Author URI: https://evnt.is/1x
8
  * Text Domain: the-events-calendar
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInite38f58c5c9438fbc88080ad240dfe756::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit6552effd43c97709ba80e8d54b06b08f::getLoader();
vendor/composer/autoload_classmap.php CHANGED
@@ -14,6 +14,8 @@ return array(
14
  'TEC\\Events\\Custom_Tables\\V1\\Feedback\\Google_Form_Feedback' => $baseDir . '/src/Events/Custom_Tables/V1/Feedback/Google_Form_Feedback.php',
15
  'TEC\\Events\\Custom_Tables\\V1\\Feedback\\Provider' => $baseDir . '/src/Events/Custom_Tables/V1/Feedback/Provider.php',
16
  'TEC\\Events\\Custom_Tables\\V1\\Full_Activation_Provider' => $baseDir . '/src/Events/Custom_Tables/V1/Full_Activation_Provider.php',
 
 
17
  'TEC\\Events\\Custom_Tables\\V1\\Integrations\\Provider' => $baseDir . '/src/Events/Custom_Tables/V1/Integrations/Provider.php',
18
  'TEC\\Events\\Custom_Tables\\V1\\Migration\\Admin\\Phase_View_Renderer' => $baseDir . '/src/Events/Custom_Tables/V1/Migration/Admin/Phase_View_Renderer.php',
19
  'TEC\\Events\\Custom_Tables\\V1\\Migration\\Admin\\Progress_Modal' => $baseDir . '/src/Events/Custom_Tables/V1/Migration/Admin/Progress_Modal.php',
@@ -161,6 +163,7 @@ return array(
161
  'Tribe\\Events\\Integrations\\Fusion\\Widget_Shortcode' => $baseDir . '/src/Tribe/Integrations/Fusion/Widget_Shortcode.php',
162
  'Tribe\\Events\\Integrations\\Hello_Elementor\\Service_Provider' => $baseDir . '/src/Tribe/Integrations/Hello_Elementor/Service_Provider.php',
163
  'Tribe\\Events\\Integrations\\Hello_Elementor\\Templates' => $baseDir . '/src/Tribe/Integrations/Hello_Elementor/Templates.php',
 
164
  'Tribe\\Events\\Integrations\\WPML\\Views\\V2\\Filters' => $baseDir . '/src/Tribe/Integrations/WPML/Views/V2/Filters.php',
165
  'Tribe\\Events\\Integrations\\WP_Rocket' => $baseDir . '/src/Tribe/Integrations/WP_Rocket.php',
166
  'Tribe\\Events\\Models\\Post_Types\\Event' => $baseDir . '/src/Tribe/Models/Post_Types/Event.php',
@@ -247,4 +250,5 @@ return array(
247
  'Tribe\\Events\\Views\\V2\\iCalendar\\Template' => $baseDir . '/src/Tribe/Views/V2/iCalendar/Template.php',
248
  'Tribe\\Events\\Views\\V2\\iCalendar\\Traits\\Outlook_Methods' => $baseDir . '/src/Tribe/Views/V2/iCalendar/Traits/Outlook_Methods.php',
249
  'Tribe\\Events\\Views\\V2\\iCalendar\\iCalendar_Handler' => $baseDir . '/src/Tribe/Views/V2/iCalendar/iCalendar_Handler.php',
 
250
  );
14
  'TEC\\Events\\Custom_Tables\\V1\\Feedback\\Google_Form_Feedback' => $baseDir . '/src/Events/Custom_Tables/V1/Feedback/Google_Form_Feedback.php',
15
  'TEC\\Events\\Custom_Tables\\V1\\Feedback\\Provider' => $baseDir . '/src/Events/Custom_Tables/V1/Feedback/Provider.php',
16
  'TEC\\Events\\Custom_Tables\\V1\\Full_Activation_Provider' => $baseDir . '/src/Events/Custom_Tables/V1/Full_Activation_Provider.php',
17
+ 'TEC\\Events\\Custom_Tables\\V1\\Integrations\\Dot_Com\\Clear_Event_Cache' => $baseDir . '/src/Events/Custom_Tables/V1/Integrations/Dot_Com/Clear_Event_Cache.php',
18
+ 'TEC\\Events\\Custom_Tables\\V1\\Integrations\\Dot_Com\\Provider' => $baseDir . '/src/Events/Custom_Tables/V1/Integrations/Dot_Com/Provider.php',
19
  'TEC\\Events\\Custom_Tables\\V1\\Integrations\\Provider' => $baseDir . '/src/Events/Custom_Tables/V1/Integrations/Provider.php',
20
  'TEC\\Events\\Custom_Tables\\V1\\Migration\\Admin\\Phase_View_Renderer' => $baseDir . '/src/Events/Custom_Tables/V1/Migration/Admin/Phase_View_Renderer.php',
21
  'TEC\\Events\\Custom_Tables\\V1\\Migration\\Admin\\Progress_Modal' => $baseDir . '/src/Events/Custom_Tables/V1/Migration/Admin/Progress_Modal.php',
163
  'Tribe\\Events\\Integrations\\Fusion\\Widget_Shortcode' => $baseDir . '/src/Tribe/Integrations/Fusion/Widget_Shortcode.php',
164
  'Tribe\\Events\\Integrations\\Hello_Elementor\\Service_Provider' => $baseDir . '/src/Tribe/Integrations/Hello_Elementor/Service_Provider.php',
165
  'Tribe\\Events\\Integrations\\Hello_Elementor\\Templates' => $baseDir . '/src/Tribe/Integrations/Hello_Elementor/Templates.php',
166
+ 'Tribe\\Events\\Integrations\\Restrict_Content_Pro\\Service_Provider' => $baseDir . '/src/Tribe/Integrations/Restrict_Content_Pro/Service_Provider.php',
167
  'Tribe\\Events\\Integrations\\WPML\\Views\\V2\\Filters' => $baseDir . '/src/Tribe/Integrations/WPML/Views/V2/Filters.php',
168
  'Tribe\\Events\\Integrations\\WP_Rocket' => $baseDir . '/src/Tribe/Integrations/WP_Rocket.php',
169
  'Tribe\\Events\\Models\\Post_Types\\Event' => $baseDir . '/src/Tribe/Models/Post_Types/Event.php',
250
  'Tribe\\Events\\Views\\V2\\iCalendar\\Template' => $baseDir . '/src/Tribe/Views/V2/iCalendar/Template.php',
251
  'Tribe\\Events\\Views\\V2\\iCalendar\\Traits\\Outlook_Methods' => $baseDir . '/src/Tribe/Views/V2/iCalendar/Traits/Outlook_Methods.php',
252
  'Tribe\\Events\\Views\\V2\\iCalendar\\iCalendar_Handler' => $baseDir . '/src/Tribe/Views/V2/iCalendar/iCalendar_Handler.php',
253
+ 'Tribe__Events__Main_Deprecated' => $baseDir . '/src/deprecated/Traits/Tribe__Events__Main_Deprecated.php',
254
  );
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInite38f58c5c9438fbc88080ad240dfe756
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInite38f58c5c9438fbc88080ad240dfe756
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInite38f58c5c9438fbc88080ad240dfe756', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInite38f58c5c9438fbc88080ad240dfe756', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInite38f58c5c9438fbc88080ad240dfe756::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit6552effd43c97709ba80e8d54b06b08f
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit6552effd43c97709ba80e8d54b06b08f', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit6552effd43c97709ba80e8d54b06b08f', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit6552effd43c97709ba80e8d54b06b08f::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInite38f58c5c9438fbc88080ad240dfe756
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'T' =>
@@ -34,6 +34,8 @@ class ComposerStaticInite38f58c5c9438fbc88080ad240dfe756
34
  'TEC\\Events\\Custom_Tables\\V1\\Feedback\\Google_Form_Feedback' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Feedback/Google_Form_Feedback.php',
35
  'TEC\\Events\\Custom_Tables\\V1\\Feedback\\Provider' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Feedback/Provider.php',
36
  'TEC\\Events\\Custom_Tables\\V1\\Full_Activation_Provider' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Full_Activation_Provider.php',
 
 
37
  'TEC\\Events\\Custom_Tables\\V1\\Integrations\\Provider' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Integrations/Provider.php',
38
  'TEC\\Events\\Custom_Tables\\V1\\Migration\\Admin\\Phase_View_Renderer' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Migration/Admin/Phase_View_Renderer.php',
39
  'TEC\\Events\\Custom_Tables\\V1\\Migration\\Admin\\Progress_Modal' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Migration/Admin/Progress_Modal.php',
@@ -181,6 +183,7 @@ class ComposerStaticInite38f58c5c9438fbc88080ad240dfe756
181
  'Tribe\\Events\\Integrations\\Fusion\\Widget_Shortcode' => __DIR__ . '/../..' . '/src/Tribe/Integrations/Fusion/Widget_Shortcode.php',
182
  'Tribe\\Events\\Integrations\\Hello_Elementor\\Service_Provider' => __DIR__ . '/../..' . '/src/Tribe/Integrations/Hello_Elementor/Service_Provider.php',
183
  'Tribe\\Events\\Integrations\\Hello_Elementor\\Templates' => __DIR__ . '/../..' . '/src/Tribe/Integrations/Hello_Elementor/Templates.php',
 
184
  'Tribe\\Events\\Integrations\\WPML\\Views\\V2\\Filters' => __DIR__ . '/../..' . '/src/Tribe/Integrations/WPML/Views/V2/Filters.php',
185
  'Tribe\\Events\\Integrations\\WP_Rocket' => __DIR__ . '/../..' . '/src/Tribe/Integrations/WP_Rocket.php',
186
  'Tribe\\Events\\Models\\Post_Types\\Event' => __DIR__ . '/../..' . '/src/Tribe/Models/Post_Types/Event.php',
@@ -267,14 +270,15 @@ class ComposerStaticInite38f58c5c9438fbc88080ad240dfe756
267
  'Tribe\\Events\\Views\\V2\\iCalendar\\Template' => __DIR__ . '/../..' . '/src/Tribe/Views/V2/iCalendar/Template.php',
268
  'Tribe\\Events\\Views\\V2\\iCalendar\\Traits\\Outlook_Methods' => __DIR__ . '/../..' . '/src/Tribe/Views/V2/iCalendar/Traits/Outlook_Methods.php',
269
  'Tribe\\Events\\Views\\V2\\iCalendar\\iCalendar_Handler' => __DIR__ . '/../..' . '/src/Tribe/Views/V2/iCalendar/iCalendar_Handler.php',
 
270
  );
271
 
272
  public static function getInitializer(ClassLoader $loader)
273
  {
274
  return \Closure::bind(function () use ($loader) {
275
- $loader->prefixLengthsPsr4 = ComposerStaticInite38f58c5c9438fbc88080ad240dfe756::$prefixLengthsPsr4;
276
- $loader->prefixDirsPsr4 = ComposerStaticInite38f58c5c9438fbc88080ad240dfe756::$prefixDirsPsr4;
277
- $loader->classMap = ComposerStaticInite38f58c5c9438fbc88080ad240dfe756::$classMap;
278
 
279
  }, null, ClassLoader::class);
280
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit6552effd43c97709ba80e8d54b06b08f
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'T' =>
34
  'TEC\\Events\\Custom_Tables\\V1\\Feedback\\Google_Form_Feedback' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Feedback/Google_Form_Feedback.php',
35
  'TEC\\Events\\Custom_Tables\\V1\\Feedback\\Provider' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Feedback/Provider.php',
36
  'TEC\\Events\\Custom_Tables\\V1\\Full_Activation_Provider' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Full_Activation_Provider.php',
37
+ 'TEC\\Events\\Custom_Tables\\V1\\Integrations\\Dot_Com\\Clear_Event_Cache' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Integrations/Dot_Com/Clear_Event_Cache.php',
38
+ 'TEC\\Events\\Custom_Tables\\V1\\Integrations\\Dot_Com\\Provider' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Integrations/Dot_Com/Provider.php',
39
  'TEC\\Events\\Custom_Tables\\V1\\Integrations\\Provider' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Integrations/Provider.php',
40
  'TEC\\Events\\Custom_Tables\\V1\\Migration\\Admin\\Phase_View_Renderer' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Migration/Admin/Phase_View_Renderer.php',
41
  'TEC\\Events\\Custom_Tables\\V1\\Migration\\Admin\\Progress_Modal' => __DIR__ . '/../..' . '/src/Events/Custom_Tables/V1/Migration/Admin/Progress_Modal.php',
183
  'Tribe\\Events\\Integrations\\Fusion\\Widget_Shortcode' => __DIR__ . '/../..' . '/src/Tribe/Integrations/Fusion/Widget_Shortcode.php',
184
  'Tribe\\Events\\Integrations\\Hello_Elementor\\Service_Provider' => __DIR__ . '/../..' . '/src/Tribe/Integrations/Hello_Elementor/Service_Provider.php',
185
  'Tribe\\Events\\Integrations\\Hello_Elementor\\Templates' => __DIR__ . '/../..' . '/src/Tribe/Integrations/Hello_Elementor/Templates.php',
186
+ 'Tribe\\Events\\Integrations\\Restrict_Content_Pro\\Service_Provider' => __DIR__ . '/../..' . '/src/Tribe/Integrations/Restrict_Content_Pro/Service_Provider.php',
187
  'Tribe\\Events\\Integrations\\WPML\\Views\\V2\\Filters' => __DIR__ . '/../..' . '/src/Tribe/Integrations/WPML/Views/V2/Filters.php',
188
  'Tribe\\Events\\Integrations\\WP_Rocket' => __DIR__ . '/../..' . '/src/Tribe/Integrations/WP_Rocket.php',
189
  'Tribe\\Events\\Models\\Post_Types\\Event' => __DIR__ . '/../..' . '/src/Tribe/Models/Post_Types/Event.php',
270
  'Tribe\\Events\\Views\\V2\\iCalendar\\Template' => __DIR__ . '/../..' . '/src/Tribe/Views/V2/iCalendar/Template.php',
271
  'Tribe\\Events\\Views\\V2\\iCalendar\\Traits\\Outlook_Methods' => __DIR__ . '/../..' . '/src/Tribe/Views/V2/iCalendar/Traits/Outlook_Methods.php',
272
  'Tribe\\Events\\Views\\V2\\iCalendar\\iCalendar_Handler' => __DIR__ . '/../..' . '/src/Tribe/Views/V2/iCalendar/iCalendar_Handler.php',
273
+ 'Tribe__Events__Main_Deprecated' => __DIR__ . '/../..' . '/src/deprecated/Traits/Tribe__Events__Main_Deprecated.php',
274
  );
275
 
276
  public static function getInitializer(ClassLoader $loader)
277
  {
278
  return \Closure::bind(function () use ($loader) {
279
+ $loader->prefixLengthsPsr4 = ComposerStaticInit6552effd43c97709ba80e8d54b06b08f::$prefixLengthsPsr4;
280
+ $loader->prefixDirsPsr4 = ComposerStaticInit6552effd43c97709ba80e8d54b06b08f::$prefixDirsPsr4;
281
+ $loader->classMap = ComposerStaticInit6552effd43c97709ba80e8d54b06b08f::$classMap;
282
 
283
  }, null, ClassLoader::class);
284
  }