diff --git a/.gitignore b/.gitignore index e985853..4b879ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ .vercel +node_modules +.DS_Store +.env* +# Local Netlify folder +.netlify \ No newline at end of file diff --git a/apps/jekyll/_posts/2024-01-27-hard-dance-nyc-presents-d-sturb-geo-2024.md b/apps/jekyll/_posts/2024-01-27-hard-dance-nyc-presents-d-sturb-geo-2024.md index 8be4313..f97d6ec 100644 --- a/apps/jekyll/_posts/2024-01-27-hard-dance-nyc-presents-d-sturb-geo-2024.md +++ b/apps/jekyll/_posts/2024-01-27-hard-dance-nyc-presents-d-sturb-geo-2024.md @@ -5,6 +5,7 @@ title: "Hard Dance NYC presents: D-sturb & GEO" date: 2023/12/11 datestart: 2024/01/27 location: 23 Meadow Street, Brooklyn, NY, United States +coordinates: 40.71098,-73.936304 hosts: - Hard Dance NYC tickets: https://link.dice.fm/nX9LtjYkmGb diff --git a/apps/jekyll/_posts/2024-06-26-8th-annual-qsa-pre-defqon-meetup-2024.md b/apps/jekyll/_posts/2024-06-26-8th-annual-qsa-pre-defqon-meetup-2024.md index 06a3c15..65586c7 100644 --- a/apps/jekyll/_posts/2024-06-26-8th-annual-qsa-pre-defqon-meetup-2024.md +++ b/apps/jekyll/_posts/2024-06-26-8th-annual-qsa-pre-defqon-meetup-2024.md @@ -6,6 +6,7 @@ date: 2024/06/11 datestart: 2024/06/26 locationTitle: Bar Twenty Two location: Leidseplein 22 Amsterdam, Netherlands +country: NL facebook: https://www.facebook.com/events/3943761422519278/ image: /assets/img/events/8th-annual-qsa-pre-defqon-meetup-2024.jpg --- diff --git a/apps/jekyll/_posts/2024-07-26-open-beatz-festival-2024.md b/apps/jekyll/_posts/2024-07-26-open-beatz-festival-2024.md index 9032ff0..ff5b7c5 100644 --- a/apps/jekyll/_posts/2024-07-26-open-beatz-festival-2024.md +++ b/apps/jekyll/_posts/2024-07-26-open-beatz-festival-2024.md @@ -6,6 +6,7 @@ date: 2024/06/13 datestart: 2024/07/26 locationTitle: location: Puschendorfer Str. 2, 91074 Herzogenaurach, Germany +coordinates: 49.539294,10.835542 hosts: - Open Beatz Festival tickets: https://shop.ticketpay.de/5JKLQ7IT diff --git a/apps/jekyll/_posts/2024-07-26-wolf-boat-2024.md b/apps/jekyll/_posts/2024-07-26-wolf-boat-2024.md index 1ea568d..e294abe 100644 --- a/apps/jekyll/_posts/2024-07-26-wolf-boat-2024.md +++ b/apps/jekyll/_posts/2024-07-26-wolf-boat-2024.md @@ -5,6 +5,7 @@ title: "Wolf Boat 2024" date: 2024/06/19 datestart: 2024/07/26 location: Prague, Czech Republic +coordinates: 50.075538,14.437801 hosts: - X-Massacre Festival tickets: https://xmassacre.cz/tickets/ diff --git a/apps/jekyll/_posts/2024-07-27-bkjn-events-presents-major-conspiracy-2024.md b/apps/jekyll/_posts/2024-07-27-bkjn-events-presents-major-conspiracy-2024.md index d4c2b8b..3232dec 100644 --- a/apps/jekyll/_posts/2024-07-27-bkjn-events-presents-major-conspiracy-2024.md +++ b/apps/jekyll/_posts/2024-07-27-bkjn-events-presents-major-conspiracy-2024.md @@ -6,6 +6,7 @@ date: 2024/06/14 datestart: 2024/07/27 locationTitle: Poppodium 013 location: Veemarktstraat 38C, 5038 CV Tilburg, Netherlands +coordinates: 51.558364,5.09244 hosts: - BKJN Events - Major Conspiracy diff --git a/apps/jekyll/_posts/2024-07-27-complex-festival-2024.md b/apps/jekyll/_posts/2024-07-27-complex-festival-2024.md index c4b361c..0529954 100644 --- a/apps/jekyll/_posts/2024-07-27-complex-festival-2024.md +++ b/apps/jekyll/_posts/2024-07-27-complex-festival-2024.md @@ -7,6 +7,7 @@ datestart: 2024/07/27 dateend: 2024/07/28 locationTitle: Complex Festival location: Vattenfall InCharge, Marathonweg, 6225 Maastricht, Netherlands +coordinates: 50.860937,5.719702 hosts: - Complex Maastricht - Doomslayer diff --git a/apps/jekyll/_posts/2024-07-27-emotions-festival-2024.md b/apps/jekyll/_posts/2024-07-27-emotions-festival-2024.md index d90e4ee..f0ea2e2 100644 --- a/apps/jekyll/_posts/2024-07-27-emotions-festival-2024.md +++ b/apps/jekyll/_posts/2024-07-27-emotions-festival-2024.md @@ -5,6 +5,7 @@ title: "Emotions Festival 2024" date: 2024/06/19 datestart: 2024/07/27 location: Str. Montichiari, 18, 25016 Villaggio Belvedere BS, Italy +coordinates: 45.400202,10.317932 hosts: - Florida - INSOUND diff --git a/apps/jekyll/_posts/2024-07-27-hard-dance-nyc-presents-neek-2024.md b/apps/jekyll/_posts/2024-07-27-hard-dance-nyc-presents-neek-2024.md index 70f834b..4decd5a 100644 --- a/apps/jekyll/_posts/2024-07-27-hard-dance-nyc-presents-neek-2024.md +++ b/apps/jekyll/_posts/2024-07-27-hard-dance-nyc-presents-neek-2024.md @@ -6,6 +6,7 @@ date: 2024/06/19 datestart: 2024/07/27 locationTitle: The Brooklyn Monarch location: 23 Meadow Street, Brooklyn, NY, United States +coordinates: 40.71098,-73.936304 hosts: - Hard Dance NYC tickets: https://dice.fm/partner/dice/event/8eeen5-neek-27th-jul-the-wood-shop-new-york-city-tickets diff --git a/apps/jekyll/_posts/2024-09-04-delta-festival-2024.md b/apps/jekyll/_posts/2024-09-04-delta-festival-2024.md index f5626c0..7fe8a0e 100644 --- a/apps/jekyll/_posts/2024-09-04-delta-festival-2024.md +++ b/apps/jekyll/_posts/2024-09-04-delta-festival-2024.md @@ -7,6 +7,7 @@ datestart: 2024/09/04 dateend: 2024/09/08 locationTitle: Marseille location: 6 Rue des Fabres, 13001 Marseille, France +coordinates: 43.296977947924404,5.3768721982767795 hosts: - DELTA Festival tickets: https://www.delta-festival.com/ diff --git a/apps/jekyll/_posts/2024-09-07-dedikted-the-desolated-world-2024.md b/apps/jekyll/_posts/2024-09-07-dedikted-the-desolated-world-2024.md index ba77450..42dc9a9 100644 --- a/apps/jekyll/_posts/2024-09-07-dedikted-the-desolated-world-2024.md +++ b/apps/jekyll/_posts/2024-09-07-dedikted-the-desolated-world-2024.md @@ -6,6 +6,7 @@ date: 2024/06/14 datestart: 2024/09/07 locationTitle: Centro De Espectáculos El Jefe location: Avenida Ferronales Poniente 8, Cuautitlán, Mexico +coordinates: 19.6718805055188,-99.18346280224713 hosts: - DediKted facebook: https://www.facebook.com/events/2192371224463964/ diff --git a/apps/jekyll/_posts/2024-09-07-hakkuh-voor-kids-2024.md b/apps/jekyll/_posts/2024-09-07-hakkuh-voor-kids-2024.md index fde40af..23766ff 100644 --- a/apps/jekyll/_posts/2024-09-07-hakkuh-voor-kids-2024.md +++ b/apps/jekyll/_posts/2024-09-07-hakkuh-voor-kids-2024.md @@ -6,6 +6,7 @@ date: 2024/06/20 datestart: 2024/09/07 locationTitle: N201 Aalsmeer location: Zwarteweg 90, 1431 VM Aalsmeer, Netherlands +coordinates: 52.25952300859112,4.767717569723956 hosts: - EARLY GABBERS Events tickets: https://eg-hardcoreunitedevents.avayo.nl/transactions/new/92869-hakkuh-4-kids diff --git a/apps/jekyll/_posts/2024-09-07-pokke-herrie-2024.md b/apps/jekyll/_posts/2024-09-07-pokke-herrie-2024.md index 5a2d8cc..4ca3f56 100644 --- a/apps/jekyll/_posts/2024-09-07-pokke-herrie-2024.md +++ b/apps/jekyll/_posts/2024-09-07-pokke-herrie-2024.md @@ -5,6 +5,7 @@ title: "Pokke Herrie 2024" date: 2024/03/03 datestart: 2024/09/07 location: Im Lipperfeld 23, 46047 Oberhausen, Germany +coordinates: 51.48353912827464,6.868494598534175 hosts: - A.L.E.X. Events tickets: https://www.pokke-herrie.com/tickets/ diff --git a/apps/jekyll/_posts/2024-09-07-sunglow-2024.md b/apps/jekyll/_posts/2024-09-07-sunglow-2024.md index f0df2c9..98fbde3 100644 --- a/apps/jekyll/_posts/2024-09-07-sunglow-2024.md +++ b/apps/jekyll/_posts/2024-09-07-sunglow-2024.md @@ -6,6 +6,7 @@ date: 2024/06/20 datestart: 2024/09/07 locationTitle: Recreatieoord Binnenmaas location: Vrouwe Huisjesweg 1, 3271 LX Mijnsheerenland, Netherlands +coordinates: 51.80331329340056,4.520984847401734 hosts: - Sunglow Festival tickets: https://www.sunglow-festival.nl/tickets diff --git a/apps/jekyll/_posts/2024-09-07-the-hardest-presents-the-ultimate-battles-2024.md b/apps/jekyll/_posts/2024-09-07-the-hardest-presents-the-ultimate-battles-2024.md index 74aa023..b6576af 100644 --- a/apps/jekyll/_posts/2024-09-07-the-hardest-presents-the-ultimate-battles-2024.md +++ b/apps/jekyll/_posts/2024-09-07-the-hardest-presents-the-ultimate-battles-2024.md @@ -5,6 +5,7 @@ title: "The Hardest presents: The Ultimate Battles" date: 2024/02/07 datestart: 2024/09/07 location: Ruiterskwartier 41, Leeuwarden, Netherlands +coordinates: 53.200412493369065,5.790314898592245 hosts: - The Hardest tickets: https://prereg.eventix.tech/3Uwpa diff --git a/apps/jekyll/_posts/2024-09-14-dream-village-2024.md b/apps/jekyll/_posts/2024-09-14-dream-village-2024.md index 39b80e3..23ed922 100644 --- a/apps/jekyll/_posts/2024-09-14-dream-village-2024.md +++ b/apps/jekyll/_posts/2024-09-14-dream-village-2024.md @@ -6,6 +6,7 @@ date: 2024/06/20 datestart: 2024/09/14 locationTitle: Lage Aard, Bavel, Netherlands location: Lage Aard 7-1, 4854 NM Bavel, Netherlands +coordinates: 51.557230,4.857670 hosts: - Dream Village tickets: http://dreamvillage.nl/tickets/ diff --git a/apps/jekyll/_posts/2024-09-14-supremacy-2024.md b/apps/jekyll/_posts/2024-09-14-supremacy-2024.md index 0f98e3f..ed0bd36 100644 --- a/apps/jekyll/_posts/2024-09-14-supremacy-2024.md +++ b/apps/jekyll/_posts/2024-09-14-supremacy-2024.md @@ -5,6 +5,7 @@ title: "Supremacy 2024" date: 2024/01/15 datestart: 2024/09/14 location: Batavierenweg 25, 6841 HN Arnhem, Netherlands +coordinates: 51.96315306874222,5.89177354087768 hosts: - Art of Dance tickets: https://www.supremacy.nl diff --git a/apps/jekyll/_posts/2024-09-20-august-hall-presents-da-tweekaz-2024.md b/apps/jekyll/_posts/2024-09-20-august-hall-presents-da-tweekaz-2024.md index f1d7331..6477670 100644 --- a/apps/jekyll/_posts/2024-09-20-august-hall-presents-da-tweekaz-2024.md +++ b/apps/jekyll/_posts/2024-09-20-august-hall-presents-da-tweekaz-2024.md @@ -6,6 +6,7 @@ date: 2024/06/19 datestart: 2024/09/20 locationTitle: August Hall location: 420 Mason St, San Francisco, CA 94102, United States +coordinates: 37.78761716619953,-122.4098188442038 hosts: - August Hall tickets: https://www.ticketweb.com/event/da-tweekaz-august-hall-tickets/13693033 diff --git a/apps/jekyll/_posts/2024-09-20-hardstylemania-presents-ran-d-imperatorz-unicorn-on-ketamine-2024.md b/apps/jekyll/_posts/2024-09-20-hardstylemania-presents-ran-d-imperatorz-unicorn-on-ketamine-2024.md index ad3046d..00ec6a6 100644 --- a/apps/jekyll/_posts/2024-09-20-hardstylemania-presents-ran-d-imperatorz-unicorn-on-ketamine-2024.md +++ b/apps/jekyll/_posts/2024-09-20-hardstylemania-presents-ran-d-imperatorz-unicorn-on-ketamine-2024.md @@ -5,6 +5,7 @@ title: "HARDSTYLEMANIA presents: Ran-D, Imperatorz, & Unicorn on Ketamine" date: 2024/06/19 datestart: 2024/09/20 location: Zur Fuchsfarm 1, 29227 Celle, Germany +coordinates: 52.59194773070381,10.062733969735207 hosts: - Inkognito Celle tickets: https://www.inkognito-celle.de/events/fr-26-04-hardstylemania-pres-ran-d-imperatorz-unicorn-on-ketamine-26-04-2024-1 diff --git a/apps/jekyll/_posts/2024-09-20-infamous-armada-2024.md b/apps/jekyll/_posts/2024-09-20-infamous-armada-2024.md index 5191ade..7c72894 100644 --- a/apps/jekyll/_posts/2024-09-20-infamous-armada-2024.md +++ b/apps/jekyll/_posts/2024-09-20-infamous-armada-2024.md @@ -6,7 +6,8 @@ date: 2024/06/20 datestart: 2024/09/20 dateend: 2024/09/22 locationTitle: Chateau de Bogard -location: Air Nature Ballon, 22120 Quessoy, France +location: Bogard, 22120 Quessoy, France +coordinates: 48.40584458285166,-2.6377447457479866 hosts: - Infamous Armada - Collectif Interface diff --git a/apps/jekyll/_posts/2024-09-21-captain-hardstyle-2024.md b/apps/jekyll/_posts/2024-09-21-captain-hardstyle-2024.md index aa70d1d..bd54382 100644 --- a/apps/jekyll/_posts/2024-09-21-captain-hardstyle-2024.md +++ b/apps/jekyll/_posts/2024-09-21-captain-hardstyle-2024.md @@ -5,6 +5,7 @@ title: "Captain Hardstyle 2024" date: 2023/09/26 datestart: 2024/09/21 location: Romanshorn, 8590, Switzerland +coordinates: 47.56505367263866,9.379656103859782 hosts: - Project Hardstyle CH tickets: https://eventfrog.ch/de/p/party/electro/captain-hardstyle-2024-bodensee-ch-euregia-faehre-7112766737628517634.html diff --git a/apps/jekyll/_posts/2024-09-21-insomnia-part-iv-2024.md b/apps/jekyll/_posts/2024-09-21-insomnia-part-iv-2024.md index 9b7ab47..63f3108 100644 --- a/apps/jekyll/_posts/2024-09-21-insomnia-part-iv-2024.md +++ b/apps/jekyll/_posts/2024-09-21-insomnia-part-iv-2024.md @@ -6,6 +6,7 @@ date: 2024/06/20 datestart: 2024/09/21 locationTitle: Poppodium MAX location: Olympiaweg 2A, Alphen aan den Rijn, Netherlands +coordinates: 52.12948293047245,4.674716498555862 hosts: - Team Gabber Events tickets: https://shops.link2ticket.nl/12Jvf7 diff --git a/apps/jekyll/_posts/2024-09-21-titanium-festival-2024.md b/apps/jekyll/_posts/2024-09-21-titanium-festival-2024.md index c28bbdf..0538244 100644 --- a/apps/jekyll/_posts/2024-09-21-titanium-festival-2024.md +++ b/apps/jekyll/_posts/2024-09-21-titanium-festival-2024.md @@ -5,6 +5,7 @@ title: "Titanium Festival 2024" date: 2023/09/01 datestart: 2024/09/21 location: Middelwaard 2, 4133 LB Vianen, Netherlands +coordinates: 51.994773608441214,5.077145769715049 hosts: - BKJN Events tickets: https://lp.form-seetickets.com/bs/YnVfdGl0YW5pdW0=/Titanium-2024-pre-registration diff --git a/apps/jekyll/_posts/2024-09-28-energy-festival-2024.md b/apps/jekyll/_posts/2024-09-28-energy-festival-2024.md index de99172..92a0c56 100644 --- a/apps/jekyll/_posts/2024-09-28-energy-festival-2024.md +++ b/apps/jekyll/_posts/2024-09-28-energy-festival-2024.md @@ -6,6 +6,7 @@ date: 2024/06/20 datestart: 2024/09/28 locationTitle: Lotto Mons Expo location: Av. Thomas Edison 2, 7000 Mons, Belgium +coordinates: 50.4583207971608,3.9375748696638366 hosts: - Energy Festival tickets: https://shop.paylogic.com/a84ddf959f52497a9211138a0241744e/ diff --git a/apps/jekyll/_posts/2024-09-28-volle-gaas-in-dixies-2024.md b/apps/jekyll/_posts/2024-09-28-volle-gaas-in-dixies-2024.md index e9c1c18..068662e 100644 --- a/apps/jekyll/_posts/2024-09-28-volle-gaas-in-dixies-2024.md +++ b/apps/jekyll/_posts/2024-09-28-volle-gaas-in-dixies-2024.md @@ -6,6 +6,7 @@ date: 2024/06/13 datestart: 2024/09/28 locationTitle: Dixies location: Pauwelslei 18, 2930 Brasschaat, Belgium +coordinates: 51.307691520686895,4.509293927364616 facebook: https://www.facebook.com/events/447782377805056/ image: /assets/img/events/volle-gaas-in-dixies-2024.jpg --- diff --git a/apps/jekyll/_posts/2024-10-05-a-nightmare-in-rotterdam-2024.md b/apps/jekyll/_posts/2024-10-05-a-nightmare-in-rotterdam-2024.md index 2801ca1..5f98b26 100644 --- a/apps/jekyll/_posts/2024-10-05-a-nightmare-in-rotterdam-2024.md +++ b/apps/jekyll/_posts/2024-10-05-a-nightmare-in-rotterdam-2024.md @@ -5,6 +5,7 @@ title: "A Nightmare in Rotterdam 2024" date: 2023/10/07 datestart: 2024/10/05 location: Ahoyweg 10, 3084 BA Rotterdam, Netherlands +coordinates: 51.881821,4.485960 hosts: - b2s tickets: https://www.b2s.nl/en/events/nightmare-in-rotterdam/nightmare-in-rotterdam-2024/registration diff --git a/apps/jekyll/_posts/2024-10-05-gearbox-presents-overdrive-2-2024.md b/apps/jekyll/_posts/2024-10-05-gearbox-presents-overdrive-2-2024.md index e0a5512..3a5b405 100644 --- a/apps/jekyll/_posts/2024-10-05-gearbox-presents-overdrive-2-2024.md +++ b/apps/jekyll/_posts/2024-10-05-gearbox-presents-overdrive-2-2024.md @@ -6,6 +6,7 @@ date: 2024/06/20 datestart: 2024/10/05 locationTitle: Vibes Eindhoven location: Lardinoisstraat 8, 5611 ZZ Eindhoven, Netherlands +coordinates: 51.443010,5.476010 hosts: - Gearbox Digital - Overdrive Digital diff --git a/apps/jekyll/_posts/2024-10-05-knockout-outdoor-2024.md b/apps/jekyll/_posts/2024-10-05-knockout-outdoor-2024.md index f67fe0c..602e189 100644 --- a/apps/jekyll/_posts/2024-10-05-knockout-outdoor-2024.md +++ b/apps/jekyll/_posts/2024-10-05-knockout-outdoor-2024.md @@ -6,6 +6,7 @@ date: 2024/06/13 datestart: 2024/10/05 locationTitle: Giants Stadium location: SKODA Stadium, Grand Pde, Sydney Olympic Park NSW 2127, Australia +coordinates: -33.844300,151.067550 hosts: - HSU tickets: https://arep.co/p/knockoutoutdoor2024gamesofdestiny/finished diff --git a/apps/jekyll/_posts/2024-12-28-megarave-the-millennium-edition-2024.md b/apps/jekyll/_posts/2024-12-28-megarave-the-millennium-edition-2024.md index 7362e1e..e74bad1 100644 --- a/apps/jekyll/_posts/2024-12-28-megarave-the-millennium-edition-2024.md +++ b/apps/jekyll/_posts/2024-12-28-megarave-the-millennium-edition-2024.md @@ -6,6 +6,7 @@ date: 2024/06/20 datestart: 2024/12/28 locationTitle: Maassilo location: Rodesk B.V., Maashaven Z.z 5, 3081 AE Rotterdam, Netherlands +coordinates: 51.898030,4.494890 hosts: - Megarave - Hardtunes diff --git a/apps/remix/.eslintrc.cjs b/apps/remix/.eslintrc.cjs new file mode 100644 index 0000000..a50c150 --- /dev/null +++ b/apps/remix/.eslintrc.cjs @@ -0,0 +1,84 @@ +/** + * This is intended to be a basic starting point for linting in your app. + * It relies on recommended configs out of the box for simplicity, but you can + * and should modify this configuration to best suit your team's needs. + */ + +/** @type {import('eslint').Linter.Config} */ +module.exports = { + root: true, + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + }, + env: { + browser: true, + commonjs: true, + es6: true, + }, + ignorePatterns: ["!**/.server", "!**/.client"], + + // Base config + extends: ["eslint:recommended"], + + overrides: [ + // React + { + files: ["**/*.{js,jsx,ts,tsx}"], + plugins: ["react", "jsx-a11y"], + extends: [ + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + "plugin:jsx-a11y/recommended", + ], + settings: { + react: { + version: "detect", + }, + formComponents: ["Form"], + linkComponents: [ + { name: "Link", linkAttribute: "to" }, + { name: "NavLink", linkAttribute: "to" }, + ], + "import/resolver": { + typescript: {}, + }, + }, + }, + + // Typescript + { + files: ["**/*.{ts,tsx}"], + plugins: ["@typescript-eslint", "import"], + parser: "@typescript-eslint/parser", + settings: { + "import/internal-regex": "^~/", + "import/resolver": { + node: { + extensions: [".ts", ".tsx"], + }, + typescript: { + alwaysTryTypes: true, + }, + }, + }, + extends: [ + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + ], + }, + + // Node + { + files: [".eslintrc.cjs"], + env: { + node: true, + }, + }, + ], +}; diff --git a/apps/remix/.gitignore b/apps/remix/.gitignore new file mode 100644 index 0000000..8b3f26e --- /dev/null +++ b/apps/remix/.gitignore @@ -0,0 +1,12 @@ +node_modules + +/.cache +/build +.env +.vercel + +*.css +*.css.map + +# Symlinks +app/server/assets/_posts \ No newline at end of file diff --git a/apps/remix/README.md b/apps/remix/README.md new file mode 100644 index 0000000..6c4d216 --- /dev/null +++ b/apps/remix/README.md @@ -0,0 +1,40 @@ +# Welcome to Remix! + +- 📖 [Remix docs](https://remix.run/docs) + +## Development + +Run the dev server: + +```shellscript +npm run dev +``` + +## Deployment + +First, build your app for production: + +```sh +npm run build +``` + +Then run the app in production mode: + +```sh +npm start +``` + +Now you'll need to pick a host to deploy it to. + +### DIY + +If you're familiar with deploying Node applications, the built-in Remix app server is production-ready. + +Make sure to deploy the output of `npm run build` + +- `build/server` +- `build/client` + +## Styling + +This template comes with [Tailwind CSS](https://tailwindcss.com/) already configured for a simple default starting experience. You can use whatever css framework you prefer. See the [Vite docs on css](https://vitejs.dev/guide/features.html#css) for more information. diff --git a/apps/remix/app/components/BannerEvents.tsx b/apps/remix/app/components/BannerEvents.tsx new file mode 100644 index 0000000..06b14e4 --- /dev/null +++ b/apps/remix/app/components/BannerEvents.tsx @@ -0,0 +1,121 @@ +import * as React from "react"; +import createGlobe from "cobe"; +import useResizeObserver from "use-resize-observer"; +import { mergeRefs } from "react-merge-refs"; +import { VisuallyHidden } from "@itwin/itwinui-react"; + +export const BannerEvents = () => { + return ( + <> +
+
+
+ + {/* Logo title text for screen readers since logo title svgs are decorative images */} + Hard.Dance + + + + + +
+ +
+ + + + + +
+
+ +
+

+ {/* Download the {{ site.title }} app and stay in the loop! */} + {/* TODO: Try to use site.title */} + Download the Hard.Dance app and stay in the loop!{" "} + See instructions. +

+ +
+ + ); +}; + +// ---------------------------------------------------------------------------- + +const Globe = () => { + const canvasRef = React.useRef(null); + + const globe = React.useRef | undefined>(); + const phi = React.useRef(0); + + const { ref: resizeObserverRef, width: resizeObserverWidth = 1 } = + useResizeObserver(); + + const onRender = React.useCallback( + (state: Record) => { + state.width = resizeObserverWidth * 2; + state.height = resizeObserverWidth * 2; + state.phi = phi.current; + phi.current += 0.01; + }, + [resizeObserverWidth], + ); + + // TODO: Replace with something more performant. + // Because the dots go missing upon browser resizing and come back after the resizing is complete. + // I think this is because of re-creating the globe each time the width changes. + React.useEffect(() => { + if (canvasRef.current != null) { + const width = canvasRef.current.getBoundingClientRect().width; // Not using resizeObserverWidth as that causes flickering + globe.current = createGlobe(canvasRef.current, { + devicePixelRatio: 2, + width: width * 2, + height: width * 2, + phi: 0, + theta: 0, + dark: 1, + diffuse: 3, + mapSamples: 10000, + mapBrightness: 3, + baseColor: [1, 1, 1], + markerColor: [251 / 255, 100 / 255, 21 / 255], + glowColor: [1.2, 1.2, 1.2], + markers: [], + scale: 1, + offset: [0, 0], + onRender: onRender, + }); + } + + return () => { + globe.current?.destroy(); + }; + }, [onRender]); + + return ; +}; diff --git a/apps/remix/app/components/EventCard.module.scss b/apps/remix/app/components/EventCard.module.scss new file mode 100644 index 0000000..3c44e91 --- /dev/null +++ b/apps/remix/app/components/EventCard.module.scss @@ -0,0 +1,11 @@ +// TODO: Differentiate focus and mapLocation states. Both look the same atm. +.root:is(:has(a:focus-visible), :target), +.showOnMapButton:focus-visible { + outline: var(--border-width) solid var(--color-accent); // TODO: Should we try to use `xxx-color-accent` instead? + outline-offset: var(--border-width); +} + +.showOnMapButton { + position: relative; + z-index: 20; +} \ No newline at end of file diff --git a/apps/remix/app/components/EventCard.tsx b/apps/remix/app/components/EventCard.tsx new file mode 100644 index 0000000..58d531d --- /dev/null +++ b/apps/remix/app/components/EventCard.tsx @@ -0,0 +1,157 @@ +import averageColors from "../data/average-colors"; +import type { Event } from "../data/data"; +import { format, isAfter, isSameDay } from "date-fns"; +import { getDistance } from "geolib"; +import styles from "./EventCard.module.css"; +import cx from "classnames"; + +export const EventCardLi = ({ + event, + index, + userLocation: userLocationProp, +}: { + event: Event; + index: number; + userLocation: string | null; +}) => { + const userLocation = userLocationProp ? userLocationProp.split(",") : null; + + const averageColor = averageColors[event.id]; + const baseTextColor = event.isForegroundBlack ? "black" : "white"; + + // TODO: Change the folder to video instead of videos + const videoUrlWithoutType = `assets/videos/events/${event.id}`; + + const dateStartDate = new Date(event.datestart); + const dateEndDate = new Date(event.dateend); + + const dateFormat = "MMM d"; + const formattedDateStart = format(dateStartDate, dateFormat); + const formattedDateEnd = event.dateend + ? format(dateEndDate, dateFormat) + : undefined; + + const today = new Date(); + + const distanceFromUserSpecifiedLocation = + event.coordinates != null && userLocation != null + ? getDistance( + { + latitude: event.coordinates.lat, + longitude: event.coordinates.lng, + }, + { + latitude: Number(userLocation[0]), + longitude: Number(userLocation[1]), + }, + ) + : undefined; + + // TODO: Make sure user's timezone is taken into account since their timezone may not be equal to the event's timezone + const isHappeningNow = event.dateend + ? !isAfter(dateStartDate, today) && !isAfter(today, dateEndDate) + : isSameDay(dateStartDate, today); + return ( +
  • + {event.featured && event.video && ( + + )} + + {event.title} + +
    + + {event.title} + + + {distanceFromUserSpecifiedLocation != null && ( +
    + {Math.floor(distanceFromUserSpecifiedLocation / 1000)}km away from + you +
    + )} + +
    + + + {event.dateend && ( + <> + {" - "} + + + )} +
    + +
    + {event.is_online && "🛰️"} + {event.flag} +
    + + {isHappeningNow &&
    Today
    } +
    + + {/* TODO: How AT users will know that "Show on map" refers to which event? + i.e. with a callout like "Show on map, button", how to know which event will be shown on the map? */} + {event.coordinates != null && ( + + )} +
  • + ); +}; diff --git a/apps/remix/app/components/EventTitleBar.module.scss b/apps/remix/app/components/EventTitleBar.module.scss new file mode 100644 index 0000000..338afd9 --- /dev/null +++ b/apps/remix/app/components/EventTitleBar.module.scss @@ -0,0 +1,22 @@ +.eventPageTitle { + display: flex; + + // TODO: This needs to target a class name + > h1, + .pageTitleEnd { + margin: 0; + } + + .eventPageTitleStacked { + display: flex; + flex-direction: column-reverse; + + // TODO: This needs to target a class name + > span { + color: var(--xxx-color-text-muted); + font-weight: var(--font-weight-bold); + text-transform: uppercase; + filter: saturate(3); + } + } +} \ No newline at end of file diff --git a/apps/remix/app/components/EventTitleBar.tsx b/apps/remix/app/components/EventTitleBar.tsx new file mode 100644 index 0000000..dbd7d01 --- /dev/null +++ b/apps/remix/app/components/EventTitleBar.tsx @@ -0,0 +1,48 @@ +import type { Event } from "../data/data"; +import { GeneralTitleBar } from "./GeneralTitleBar"; +import { getFormattedDateRange } from "../utils/date"; +import * as React from "react"; + +export const EventTitleBar = ({event}: {event: Event}) => { + const dateFormat = "MMM dd, yyyy"; + + const formattedDateRange = getFormattedDateRange( + dateFormat, + event.datestartDate, + event.dateendDate, + ); + + const onShareClick = React.useCallback(() => { + // Web Share API is supported + if (!!navigator && navigator.share) { + navigator + .share({ + title: document.title, + url: window.location.href, + }) + .then(() => { + console.log("Thanks for sharing!"); + }) + .catch(console.error); + } + // Fallback for browsers that do not support the Web Share API + // Attempt to copy the current URL to the clipboard as a fallback + else { + navigator.clipboard.writeText(window.location.href).then(() => { + alert("URL copied to clipboard"); + }); + } + }, []); + + return + + + + + + + + + + ; +} \ No newline at end of file diff --git a/apps/remix/app/components/EventsGrid.module.scss b/apps/remix/app/components/EventsGrid.module.scss new file mode 100644 index 0000000..29eaa10 --- /dev/null +++ b/apps/remix/app/components/EventsGrid.module.scss @@ -0,0 +1,46 @@ +// TODO: Differentiate focus and mapLocation states. Both look the same atm. +.root:is(:has(a:focus-visible), :target), +.showOnMapButton:focus-visible { + outline: var(--border-width) solid var(--color-accent); // TODO: Should we try to use `xxx-color-accent` instead? + outline-offset: var(--border-width); +} + +.showOnMapButton { + position: relative; + z-index: 20; +} + +.eventListItemStatus { + border-radius: var(--border-radius); + font-size: var(--font-size-small); + font-weight: var(--font-weight-bold); + text-transform: uppercase; + display: flex; + align-items: center; + gap: 1ch; + position: absolute; + top: calc(var(--border-width)*6); + right: calc(var(--border-width)*6); + padding-inline: calc(var(--padding)*.25); + height: calc(var(--border-width)*10); + border-color: rgba(0, 0, 0, 0); + color: var(--color-text); + background-color: rgba(var(--color-background-rgb), 0.5); + -webkit-backdrop-filter: saturate(1.8) blur(20px); + backdrop-filter: saturate(1.8) blur(20px); + + @media(prefers-reduced-transparency: reduce)or (prefers-contrast: more) { + background-color: var(--color-background); + -webkit-backdrop-filter: none; + backdrop-filter: none; + } + + &::before { + content: ""; + height: calc(100% - var(--border-width)*3); + aspect-ratio: 1/1; + border-radius: 100%; + background-color: var(--color-accent); + animation: blink 2s infinite; + } +} \ No newline at end of file diff --git a/apps/remix/app/components/EventsGrid.tsx b/apps/remix/app/components/EventsGrid.tsx new file mode 100644 index 0000000..c765b41 --- /dev/null +++ b/apps/remix/app/components/EventsGrid.tsx @@ -0,0 +1,172 @@ +import { GenericGrid } from "./GenericGrid"; +import type { Event } from "../data/data"; +import { format, isAfter, isSameDay } from "date-fns"; +import { getDistance } from "geolib"; +import genericGridStyles from "./GenericGrid.module.css"; +import styles from "./EventsGrid.module.css"; +import cx from "classnames"; +import averageColors from "../data/average-colors"; + +const EventsGridComponent = (props: React.ComponentProps<"div">) => { + const { ...rest } = props; + + return ; +} + +const EventsGridItem = ({ + event, + index, + userLocation: userLocationProp, +}: { + event: Event; + index: number; + userLocation: string | null; +}) => { + const userLocation = userLocationProp ? userLocationProp.split(",") : null; + + const averageColor = averageColors[event.id]; + const baseTextColor = event.isForegroundBlack ? "black" : "white"; + + // TODO: Change the folder to video instead of videos + const videoUrlWithoutType = `assets/videos/events/${event.id}`; + + const dateStartDate = new Date(event.datestart); + const dateEndDate = new Date(event.dateend); + + const dateFormat = "MMM d"; + const formattedDateStart = format(dateStartDate, dateFormat); + const formattedDateEnd = event.dateend + ? format(dateEndDate, dateFormat) + : undefined; + + const today = new Date(); + + const distanceFromUserSpecifiedLocation = + event.coordinates != null && userLocation != null + ? getDistance( + { + latitude: event.coordinates.lat, + longitude: event.coordinates.lng, + }, + { + latitude: Number(userLocation[0]), + longitude: Number(userLocation[1]), + }, + ) + : undefined; + + // TODO: Make sure user's timezone is taken into account since their timezone may not be equal to the event's timezone + const isHappeningNow = event.dateend + ? !isAfter(dateStartDate, today) && !isAfter(today, dateEndDate) + : isSameDay(dateStartDate, today); + return ( +
  • + {event.featured && event.video && ( + + )} + + {event.title} + +
    + + {event.title} + + + {distanceFromUserSpecifiedLocation != null && ( +
    + {Math.floor(distanceFromUserSpecifiedLocation / 1000)}km away from + you +
    + )} + +
    + + + {event.dateend && ( + <> + {" - "} + + + )} +
    + +
    + {event.is_online && "🛰️"} + {event.flag} +
    + + {isHappeningNow &&
    Today
    } +
    + + {/* TODO: How AT users will know that "Show on map" refers to which event? + i.e. with a callout like "Show on map, button", how to know which event will be shown on the map? */} + {event.coordinates != null && ( + + )} +
  • + ); +}; + + + + +export const EventsGrid = Object.assign(EventsGridComponent, { + Item: EventsGridItem, +}); \ No newline at end of file diff --git a/apps/remix/app/components/EventsMap.module.scss b/apps/remix/app/components/EventsMap.module.scss new file mode 100644 index 0000000..c8399d3 --- /dev/null +++ b/apps/remix/app/components/EventsMap.module.scss @@ -0,0 +1,58 @@ +.aside { + // background-color: red; + + display: flex; + gap: calc(var(--page-padding) - 8px); + padding: var(--page-padding); + + @media only screen and (min-width: 769px) { + padding-inline-end: 0; + } + + @media only screen and (max-width: 768px) { + flex-direction: column; + padding-block-end: 0; + } +} + +.map { + border-radius: var(--border-radius); + overflow: clip; + align-self: stretch; + flex: 1; +} + +.drag { + --drag-thickness: 8px; + --drag-length: 200px; + + background-color: var(--color-background); + position: relative; + align-self: center; + border-radius: calc(infinity * 1px); + flex-shrink: 0; + transition: background-color var(--duration) ease; + + &::after { + content: ''; + position: absolute; + inset: -12px; + } + + &:hover, + &:focus { + background-color: var(--color-background-hover); + } + + @media only screen and (min-width: 769px) { + width: var(--drag-thickness); + height: var(--drag-length); + cursor: col-resize; + } + + @media only screen and (max-width: 768px) { + width: var(--drag-length); + height: var(--drag-thickness); + cursor: row-resize; + } +} \ No newline at end of file diff --git a/apps/remix/app/components/EventsMap.tsx b/apps/remix/app/components/EventsMap.tsx new file mode 100644 index 0000000..a35e469 --- /dev/null +++ b/apps/remix/app/components/EventsMap.tsx @@ -0,0 +1,249 @@ +import type { + ActionFunctionArgs, + LoaderFunction, + LoaderFunctionArgs, + MetaFunction, +} from "@remix-run/node"; +import { Header } from "../components/Header"; +import { Footer } from "../components/Footer"; +import { TitleBar } from "../components/TitleBar"; +import { EventCardLi } from "../components/EventCard"; +import { type Event, markdownToEvent } from "../data/data"; +import fs from "node:fs"; +import path from "node:path"; +import { json, useLoaderData } from "@remix-run/react"; +import type { FileFilterIndexFile } from "../data/filter"; +import _fileFilterIndex from "../data/file-filter-indexes.json"; +import { compareAsc } from "date-fns"; +import { getServerAssetPath } from "../utils/assets"; +import { + AdvancedMarker, + APIProvider, + Map as GMap, + // Marker, + Pin, + useMap, +} from "@vis.gl/react-google-maps"; +import styles from "./EventsMap.module.css"; +import { ClientOnly } from "remix-utils/client-only"; +import cx from "classnames"; +import React from "react"; +import { EventsGrid } from "../components/EventsGrid"; + +import { MarkerClusterer } from "@googlemaps/markerclusterer"; +// import pkg from "@googlemaps/markerclusterer"; +// const { MarkerClusterer } = pkg; + +export const EventsMap = ({ + events, + userLocation: userLocationProp, +}: { events: Event[]; userLocation: string | null }) => { + // TODO: Properly get userlocation in all places, even the cookie, so that no need to split() each time + const userLocation = + userLocationProp != null ? userLocationProp.split(",") : null; + + // TODO: I think defaultCenter is required. So need to have a fallback. Or maybe just the bounds are enough? + const defaultCenter = + userLocation != null + ? { lat: Number(userLocation[0]), lng: Number(userLocation[1]) } + : { lat: 0, lng: 0 }; + + // const { zoom, setZoom } = React.useContext(GMapProviderContext) || {}; + + return ( + + {() => ( + + )} + + ); +}; + +// const GMapProvider = ({ children }: { children: React.ReactNode }) => { +// const [zoom, setZoom] = React.useState(12); + +// return ( +// +// {children} +// +// ); +// }; + +// const GMapProviderContext = React.createContext<{ +// zoom: number; +// setZoom: React.Dispatch>; +// } | null>(null); + +const InsideMap = ({ + events, + userLocation, +}: { events: Event[]; userLocation: string[] | null }) => { + const map = useMap(); + const [markers, setMarkers] = React.useState<{ [key: string]: GMarker }>({}); + const clusterer = React.useRef(null); + + // Listen to change in the hash of the URL. When changed, go to the marker with the same ID. + const goToMarkerFromUrlHash = React.useCallback( + (hash: string) => { + console.log("hash", hash); + if (hash.startsWith("#event-card-")) { + const eventId = hash.slice("#event-card-".length); + console.log("eventId", eventId); + const event = events.find((e) => e.id === eventId); + const mapLocation = event?.coordinates; + if (mapLocation) { + // map?.setCenter( + // new google.maps.LatLng(mapLocation.lat, mapLocation.lng), + // ); + map?.panTo(new google.maps.LatLng(mapLocation.lat, mapLocation.lng)); + } + // console.log("event", event); + } + }, + [events, map], + ); + + const [previousLocationHash, setPreviousLocationHash] = React.useState( + location.hash, + ); + if (previousLocationHash !== location.hash) { + goToMarkerFromUrlHash(location.hash); + setPreviousLocationHash(location.hash); + } + + React.useEffect(() => { + if (!map) return; + if (!clusterer.current) { + clusterer.current = new MarkerClusterer({ map }); + } + }, [map]); + + React.useEffect(() => { + clusterer.current?.clearMarkers(); + clusterer.current?.addMarkers(Object.values(markers)); + }, [markers]); + + const setMarkerRef = (marker: GMarker | null, key: string) => { + if (marker && markers[key]) return; + if (!marker && !markers[key]) return; + + setMarkers((prev) => { + if (marker) { + return { ...prev, [key]: marker }; + } + + const newMarkers = { ...prev }; + delete newMarkers[key]; + return newMarkers; + }); + }; + + React.useEffect(() => { + const latlng = events + .map((e) => + e.coordinates != null + ? new google.maps.LatLng(e.coordinates.lat, e.coordinates.lng) + : null, + ) + .filter(Boolean) as google.maps.LatLng[]; + + // [ + // new google.maps.LatLng(1.23, 4.56), + // new google.maps.LatLng(7.89, 1.01), + // // ... + // ]; + const latlngbounds = new google.maps.LatLngBounds(); + for (let i = 0; i < latlng.length; i++) { + latlngbounds.extend(latlng[i]); + } + + map?.fitBounds(latlngbounds); + }, [events, map]); + + return [ + ...events + .map((event) => { + return event.coordinates != null ? ( + // console.log(e)} + // /> + // + setMarkerRef(marker, event.id)} + onClick={() => { + console.log(event.id); + + document + .querySelector(`#event-card-${event.id}`) + ?.scrollIntoView({ + behavior: "smooth", + }); + + // location.hash = `#event-card-${event.id}`; + // window.location = `#event-card-${event.id}`; + window.location.replace(`#event-card-${event.id}`); + }} + > + {/*

    ABC

    */} + +
    + //
    + ) : null; + }) + .filter(Boolean), + + userLocation != null ? ( + setMarkerRef(marker, "userLocation")} + > + {/*

    ABC

    */} + {/* */} +
    + + ) : undefined, + ]; +}; + diff --git a/apps/remix/app/components/Footer.module.scss b/apps/remix/app/components/Footer.module.scss new file mode 100644 index 0000000..f2d4c40 --- /dev/null +++ b/apps/remix/app/components/Footer.module.scss @@ -0,0 +1,30 @@ +.root { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: auto; + color: var(--xxx-color-text-muted); + font-size: var(--font-size-small); + height: calc(var(--header-height) + env(safe-area-inset-bottom)); + padding-left: calc(var(--page-padding) + env(safe-area-inset-left)); + padding-right: calc(var(--page-padding) + env(safe-area-inset-right)); + padding-bottom: max(1rem, env(safe-area-inset-bottom)); + + @media only screen and (max-width: 768px) { + padding-bottom: calc(var(--header-height) + env(safe-area-inset-bottom) + 1rem); + height: calc(var(--header-height)*2 + env(safe-area-inset-bottom)); + } +} + +.list { + display: flex; + flex-wrap: wrap; + justify-content: center; + column-gap: 2ch; +} + +.anchor { + color: inherit; + text-decoration: none; +} \ No newline at end of file diff --git a/apps/remix/app/components/Footer.tsx b/apps/remix/app/components/Footer.tsx new file mode 100644 index 0000000..d21abf1 --- /dev/null +++ b/apps/remix/app/components/Footer.tsx @@ -0,0 +1,48 @@ +import styles from "./Footer.module.scss"; +import cx from "classnames"; +import { + hardDanceCookiePolicyLink, + hardDanceEmail, + hardDancePrivacyPolicyLink, + hardDanceSiteTitle, +} from "../data/about-data"; + +export const Footer = ({ className }: { className?: string }) => { + const today = new Date(); + + return ( + + ); +}; diff --git a/apps/remix/app/components/Gdpr.module.scss b/apps/remix/app/components/Gdpr.module.scss new file mode 100644 index 0000000..fff330a --- /dev/null +++ b/apps/remix/app/components/Gdpr.module.scss @@ -0,0 +1,39 @@ +.gdpr { + // display: none; + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--page-padding); + position: fixed; + padding: var(--padding) var(--page-padding); + z-index: 1000; + border: 0px solid var(--color-background); + // @include frosted-glass; + background-color: rgba(var(--color-background-rgb), 0.5); + -webkit-backdrop-filter: saturate(1.8) blur(20px); + backdrop-filter: saturate(1.8) blur(20px); + + @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) { + background-color: var(--color-background); + -webkit-backdrop-filter: none; + backdrop-filter: none; + } + + @media only screen and (min-width: 769px) { + inset: auto 0 0 0; + border-top-width: var(--border-width); + padding-bottom: max(var(--padding), env(safe-area-inset-bottom)); + } + + @media only screen and (max-width: 768px) { + // inset: 0 0 auto 0; + inset: auto var(--page-padding) 100px var(--page-padding); + border-width: var(--border-width); + border-radius: var(--border-radius); + padding-top: max(var(--padding), env(safe-area-inset-top)); + } + + > p { + text-wrap: pretty; + } +} diff --git a/apps/remix/app/components/Gdpr.tsx b/apps/remix/app/components/Gdpr.tsx new file mode 100644 index 0000000..f3789ff --- /dev/null +++ b/apps/remix/app/components/Gdpr.tsx @@ -0,0 +1,24 @@ +import styles from "./Gdpr.module.scss"; +import cx from "classnames"; +import { + hardDancePrivacyPolicyLink, +} from "../data/about-data"; + +export const Gdpr = ({ className }: { className?: string }) => { + return ( +
    +

    + This website uses cookies to ensure you get the best experience on our + website.  + Read our privacy policy. +

    + +
    + ); +}; \ No newline at end of file diff --git a/apps/remix/app/components/GeneralTitleBar.module.scss b/apps/remix/app/components/GeneralTitleBar.module.scss new file mode 100644 index 0000000..d0b4b90 --- /dev/null +++ b/apps/remix/app/components/GeneralTitleBar.module.scss @@ -0,0 +1,24 @@ +.pageTitleDrawerItemsWrapper { + display: flex; + flex: 1; + overflow-x: scroll; + scroll-snap-type: x mandatory; + -webkit-overflow-scrolling: touch; + padding: calc(var(--border-width)*2); + padding-right: max(var(--page-padding), env(safe-area-inset-right)); +} + +.pageTitleDrawerItem { + scroll-snap-align: start; + display: flex; + column-gap: 1ch; + + &::before { + content: ""; + width: calc(max(var(--page-padding), env(safe-area-inset-left)) - .5rem); + } + + &:first-child { + margin-inline-start: auto; + } +} \ No newline at end of file diff --git a/apps/remix/app/components/GeneralTitleBar.tsx b/apps/remix/app/components/GeneralTitleBar.tsx new file mode 100644 index 0000000..38c11c9 --- /dev/null +++ b/apps/remix/app/components/GeneralTitleBar.tsx @@ -0,0 +1,42 @@ +import cx from "classnames"; +import styles from "./GeneralTitleBar.module.scss"; + +const GeneralTitleBarComponent = (props: React.ComponentProps<"div">) => { + const { className, children, ...rest } = props; + + return
    + {children} +
    ; +}; + +const GeneralTitleBarPageTitle = (props: React.ComponentProps<"div">) => { + const { children, ...rest } = props; + return

    + {children} +

    ; +} + +const GeneralTitleBarPageTitleStart = (props: React.ComponentProps<"div">) => { + const { className, ...rest } = props; + return
    ; +} + +const GeneralTitleBarPageTitleEnd = (props: React.ComponentProps<"div">) => { + const { className, ...rest } = props; + return
    ; +} + +const GeneralTitleBarPageTitleDrawer = (props: React.ComponentProps<"div">) => { + const { className, ...rest } = props; + return
    ; +} + +export const GeneralTitleBar = Object.assign( + GeneralTitleBarComponent, + { + PageTitle: GeneralTitleBarPageTitle, + PageTitleStart: GeneralTitleBarPageTitleStart, + PageTitleEnd: GeneralTitleBarPageTitleEnd, + PageTitleDrawer: GeneralTitleBarPageTitleDrawer, + }, +); \ No newline at end of file diff --git a/apps/remix/app/components/GenericGrid.module.scss b/apps/remix/app/components/GenericGrid.module.scss new file mode 100644 index 0000000..9ca43b1 --- /dev/null +++ b/apps/remix/app/components/GenericGrid.module.scss @@ -0,0 +1,136 @@ +.grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(min(100%, 20rem), 1fr)); + gap: var(--page-padding); + + // background-color: purple; + // outline: 2px solid pink; + // outline-offset: -2px; + padding: var(--page-padding); + mask-image: linear-gradient(to top, black calc(100% - var(--page-padding)), transparent 100%); +} + +.item { + background-color: rgba(var(--color-background-rgb), 0.5); + -webkit-backdrop-filter: saturate(1.8) blur(20px); + backdrop-filter: saturate(1.8) blur(20px); + border-radius: var(--border-radius); + position: relative; + + @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) { + background-color: var(--color-background); + -webkit-backdrop-filter: none; + backdrop-filter: none; + } + + &:has(a.itemAnchor) { + user-select: none; + } + + @media(prefers-reduced-motion: no-preference) { + &:has(a.itemAnchor) { + transition: transform var(--duration) ease; + } + } + + &:has(a.itemAnchor):hover, + &:has(a.itemAnchor):focus-within { + transform: scale(1.05); + } + + &[data-featured=true]::before { + content: "⭐️"; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + inset: 0 auto auto 0; + border-top-left-radius: inherit; + border-bottom-right-radius: inherit; + width: calc(var(--border-width)*20); + height: calc(var(--border-width)*20); + background-color: inherit; + z-index: 1; + } + + @media(prefers-reduced-motion: reduce) { + &[data-featured=true] video { + display: none; + } + } + + @media(prefers-reduced-motion: no-preference) { + &[data-featured=true] video+img { + height: 0px; + } + } +} + +.image { + width: 100%; + height: 14rem; + object-fit: cover; + mask-image: linear-gradient(#000 90%, transparent 100%); + border-start-start-radius: var(--border-radius); + border-start-end-radius: var(--border-radius); +} + +.metadata { + padding: var(--padding); + padding-top: 0; + display: grid; + grid-template-areas: "subtitle symbol" "title title" "body body"; +} + +.metadataTitle { + grid-area: title; + max-height: 2lh; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + color: var(--color-text); + text-decoration: none; + text-wrap: balance; + font-size: var(--font-size-large); + font-weight: var(--font-weight-bold); +} + +.itemAnchor { + outline: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +.itemAnchor::after { + content: ""; + position: absolute; + inset: 0; + border-radius: var(--border-radius); +} + +.itemAnchor:focus::after { + outline: var(--border-width) solid var(--xxx-color-accent); + outline-offset: var(--border-width); +} + +.metadataSubtitle, +.metadataSymbol { + color: var(--color-text-muted); + font-weight: var(--font-weight-bold); + text-transform: uppercase; +} + +.metadataSubtitle { + grid-area: subtitle; + font-size: var(--font-size-small); + align-self: center; +} + +.metadataSymbol { + grid-area: symbol; + text-align: right; +} + +.metadataBody { + grid-area: body; +} \ No newline at end of file diff --git a/apps/remix/app/components/GenericGrid.tsx b/apps/remix/app/components/GenericGrid.tsx new file mode 100644 index 0000000..0464eab --- /dev/null +++ b/apps/remix/app/components/GenericGrid.tsx @@ -0,0 +1,18 @@ +import cx from "classnames"; +import styles from "./GenericGrid.module.css"; + +const GenericGridComponent = (props: React.ComponentProps<"div">) => { + const { className, children } = props; + + return
      {children}
    ; +}; + +const GenericGridItem = (props: React.ComponentProps<"li">) => { + const { className, children } = props; + + return
  • {children}
  • ; +}; + +export const GenericGrid = Object.assign(GenericGridComponent, { + Item: GenericGridItem, +}); diff --git a/apps/remix/app/components/Header.module.scss b/apps/remix/app/components/Header.module.scss new file mode 100644 index 0000000..9322ffe --- /dev/null +++ b/apps/remix/app/components/Header.module.scss @@ -0,0 +1,140 @@ +.root { + transition: color var(--duration) ease; + border: 0px solid var(--color-background); + user-select: none; + color: var(--color-text); + background-color: rgba(var(--color-background-rgb), 0.5); + -webkit-backdrop-filter: saturate(1.8) blur(20px); + backdrop-filter: saturate(1.8) blur(20px); + grid-area: header; + + @media only screen and (min-width: 769px) { + display: flex; + align-items: stretch; + block-size: var(--header-height); + border-block-end-width: var(--border-width); + } + + @media only screen and (max-width: 768px) { + border-block-start-width: var(--border-width); + } + + @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) { + background-color: var(--color-background); + -webkit-backdrop-filter: none; + backdrop-filter: none; + } +} + +.brand { + display: flex; + align-items: center; + height: 100%; + gap: var(--padding); + padding-inline: var(--page-padding); + + + &:hover { + --translate: -1px; + } + + @media only screen and (max-width: 768px) { + display: none; + } +} + +.icon { + fill: currentColor; + inline-size: calc(var(--icon-size)*1.5 + 2px); + block-size: calc(var(--icon-size)*1.5 + 2px); + + #logo-left { + transform: translate(var(--translate), calc(var(--translate) * -0.7)); + } + + #logo-top { + transform: translate(0, calc(var(--translate) * 1)); + } + + #logo-right { + transform: translate(calc(var(--translate) * -1), calc(var(--translate) * -0.7)); + } +} + +.iconPart { + transform-origin: center; + + @media(prefers-reduced-motion: no-preference) { + transition: transform 1s ease-out; + } +} + +.logo { + fill: currentColor; + height: 33%; +} + +.menu { + display: grid; + + @media only screen and (min-width: 769px) { + grid-template-columns: repeat(3, auto) + } + + @media only screen and (max-width: 768px) { + grid-template-columns: repeat(3, 1fr); + height: 100% + } +} + +.button { + color: inherit; + background-color: rgba(0, 0, 0, 0); + border: none; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + gap: calc(var(--border-radius)*.5); + text-decoration: none; + font-weight: var(--font-weight-bold); + transition: background-color var(--duration) ease; + outline-offset: calc(var(--border-width)*-1); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + + @media(hover: hover) { + &:hover { + background-color: var(--color-background-transparent-hover); + } + } + + @media only screen and (min-width: 769px) { + padding-inline: var(--page-padding); + } + + @media only screen and (max-width: 768px) { + flex-direction: column; + font-size: var(--font-size-small); + padding-top: var(--page-padding); + padding-bottom: max(var(--page-padding), env(safe-area-inset-bottom)); + } + + &[aria-current=page] { + color: var(--color-accent); + + @media only screen and (min-width: 769px) { + box-shadow: inset 0 calc(var(--border-width)*-2) 0 currentColor; + } + + @media only screen and (max-width: 768px) { + box-shadow: inset 0 calc(var(--border-width)*2) 0 currentColor; + } + } + + > svg { + fill: currentColor; + width: var(--icon-size); + height: var(--icon-size); + flex-shrink: 0; + } +} \ No newline at end of file diff --git a/apps/remix/app/components/Header.tsx b/apps/remix/app/components/Header.tsx new file mode 100644 index 0000000..5555407 --- /dev/null +++ b/apps/remix/app/components/Header.tsx @@ -0,0 +1,95 @@ +import { useLocation } from "@remix-run/react"; +import styles from "./Header.module.scss"; +import cx from "classnames"; + +export const Header = ({ className }: { className?: string }) => { + // Inside your component: + const location = useLocation(); + const currentUrl = location.pathname; + + return ( + <> +
    +
    + + + + + + + + +
    + + +
    + + ); +}; diff --git a/apps/remix/app/components/TitleBar.module.scss b/apps/remix/app/components/TitleBar.module.scss new file mode 100644 index 0000000..d419b06 --- /dev/null +++ b/apps/remix/app/components/TitleBar.module.scss @@ -0,0 +1,110 @@ +.titleBar { + display: grid; + column-gap: var(--padding); + align-items: start; + grid-area: title-bar; + margin-block-start: var(--padding); + + @media only screen and (min-width: 769px) { + grid-template-columns: auto 1fr auto; + grid-template-areas: "title start end" "drawer drawer drawer" + } + + @media only screen and (max-width: 768px) { + grid-template-columns: 1fr auto; + grid-template-areas: "title title" "start end" "drawer drawer" + } +} + +.title { + grid-area: title; + text-wrap: balance; + margin-left: max(var(--page-padding), env(safe-area-inset-left)); + + @media only screen and (max-width: 768px) { + margin-right: max(var(--page-padding), env(safe-area-inset-right)) + } +} + +.start { + grid-area: start; + column-gap: var(--padding); + + @media only screen and (max-width: 768px) { + margin-left: max(var(--page-padding), env(safe-area-inset-left)); + } +} + +.end { + display: flex; + column-gap: var(--padding); + grid-area: end; + margin-right: max(var(--page-padding), env(safe-area-inset-right)); +} + +.start, +.drawer { + display: flex; + align-items: center; +} + +.drawer { + box-sizing: content-box; + grid-area: drawer; + max-height: 0; + overflow-y: hidden; + + @media(prefers-reduced-motion: no-preference) { + transition: max-height var(--duration) ease-out, opacity var(--duration) ease-out + } +} + +.itemsWrapper { + display: flex; + flex: 1; + overflow-x: scroll; + scroll-snap-type: x mandatory; + -webkit-overflow-scrolling: touch; + padding: calc(var(--border-width) * 2); + padding-right: max(var(--page-padding), env(safe-area-inset-right)); +} + +.item { + scroll-snap-align: start; + display: flex; + column-gap: 1ch; + + &::before { + content: ""; + width: calc(max(var(--page-padding), env(safe-area-inset-left)) - 0.5rem); + } + + &:first-child { + margin-inline-start: auto; + } +} + + + + + + + + + + + +.filterIconWrapper { + position: relative; +} + +.filterActivatedMarker { + width: 0.5rem; + height: 0.5rem; + background-color: var(--color-accent); + position: absolute; + inset: 0 0 auto auto; + border-radius: 50%; + transform: translate(50%, -50%); + outline: var(--border-width) solid var(--color-background-backdrop); +} \ No newline at end of file diff --git a/apps/remix/app/components/TitleBar.tsx b/apps/remix/app/components/TitleBar.tsx new file mode 100644 index 0000000..5ed7132 --- /dev/null +++ b/apps/remix/app/components/TitleBar.tsx @@ -0,0 +1,275 @@ +import { useFetcher, useLocation, useSearchParams } from "@remix-run/react"; +import cx from "classnames"; +import * as React from "react"; +import { continentsDb } from "../data/countries"; +import hosts from "../data/hosts.json"; +import styles from "./TitleBar.module.css"; + +export const TitleBar = ({ userLocation }: { userLocation: string | null }) => { + const location = useLocation(); + const fetcher = useFetcher(); + const [searchParams, setSearchParams] = useSearchParams(); + + const viewMode = (searchParams.get("viewMode") ?? "gallery") as + | "gallery" + | "withMap"; + + const pageLayout = location.pathname; + + const pageTitleDrawerItemsWrapper = React.useRef(null); + const [showFilters, setShowFilters] = React.useState(false); + + const isAnyFilterEnabled = + Array.from(searchParams.keys()).filter((v) => + ["live", "continent", "host"].includes(v), + ).length > 0; + + const onViewModeChanged = React.useCallback( + (e: React.ChangeEvent) => { + setSearchParams( + (prev) => { + if (e.target.checked) { + prev.set("viewMode", "withMap"); + } else { + prev.delete("viewMode"); + } + return prev; + }, + { preventScrollReset: true }, + ); + }, + [setSearchParams], + ); + + const onGetLocationClicked = React.useCallback(() => { + navigator.geolocation.getCurrentPosition((position) => { + const formData = new FormData(); + formData.append("_action", "use-current-location-clicked"); + formData.append( + "location", + `${position.coords.latitude},${position.coords.longitude}`, + ); + fetcher.submit(formData, { method: "POST" }); + }); + }, [fetcher]); + + const onStopUsingCurrentLocationClicked = React.useCallback(() => { + const formData = new FormData(); + formData.append("_action", "stop-using-current-location-clicked"); + fetcher.submit(formData, { method: "POST" }); + }, [fetcher]); + + return ( +
    +

    Events

    + +
    + + + Past + + + + + Subscribe + + + {/* TODO: Re-add the add button */} + {/* */} +
    + +
    + + + + +
    + + {/* TODO: Confirm that all the filter drawer items are inerted when not in view. Not tabbable. */} +
    +
    +
    + {/* TODO: What is the JSX equivalent of `switch`? */} + +
    + +
    + +
    + + {/*
    + +
    +
    +
    +
    + ); +}; diff --git a/apps/remix/app/data/about-data.ts b/apps/remix/app/data/about-data.ts new file mode 100644 index 0000000..8a47b0f --- /dev/null +++ b/apps/remix/app/data/about-data.ts @@ -0,0 +1,393 @@ +export const aboutBannerContent = `We are not just a platform; we're a vibrant community of hard dance enthusiasts united by our passion for the rhythm, energy, and spirit of the genre. Our journey began with a simple yet powerful vision: to create a worldwide resource where hard dance lovers can discover, share, and engage with events near and far. + +Born out of genuine love and respect for the hard dance scene, our platform is a testament to the strength and unity of our community. We take immense pride in launching this platform — a place built by the community, for the community. It's a space where the heart-pounding beats meet the soulful connections of dancers and fans alike. + +Our dedication goes beyond the dance floor. We're committed to fostering a welcoming and inclusive environment where every member can express themselves freely, share their experiences, and connect with fellow hard dance lovers. This platform is your go-to destination for event information, but it's also a place where memories are made, friendships are forged, and the hard dance culture thrives. + +Welcome to the tribe – your digital home for all things hard dance! +`.trim(); + +export const theCrew = [ + { + name: "Eugene Berzin", + alias: "Treachery", + position: "Owner", + location: "🇪🇸", + email: "eugene@hard.dance", + website: "https://djtreachery.com", + socials: [ + { service: "Facebook", url: "https://www.facebook.com/djtreachery" }, + { service: "Instagram", url: "https://www.instagram.com/djtreachery" }, + { service: "Discord", url: "https://discordapp.com/users/djtreachery" }, + { + service: "Spotify", + url: "https://open.spotify.com/artist/5b4RTDc2Q3bNHmv0L8ZPlj", + }, + { + service: "YouTube", + url: "https://www.youtube.com/channel/UCZFth4RG7KqOig5MAsmft3g", + }, + { service: "Soundcloud", url: "http://www.soundcloud.com/djtreachery" }, + { + service: "Apple Music", + url: "https://music.apple.com/us/artist/treachery/300126894", + }, + ], + }, + { + name: "Jon Graft", + alias: "Johnny Hardstyle", + position: "Owner", + location: "🇺🇸", + email: "me@jongraft.design", + website: "https://jongraft.design", + socials: [ + { service: "Facebook", url: "https://www.facebook.com/FlyersPh9" }, + { service: "Twitter", url: "https://www.twitter.com/JonGraftDesign" }, + { service: "GitHub", url: "https://github.com/FlyersPh9" }, + { service: "Discord", url: "https://discordapp.com/users/flyersph9" }, + ], + }, + { + name: "R", + position: "Developer", + location: "🇺🇸", + }, +]; + +export const theHostsWeCheck = [ + { + name: "A.L.E.X. Events", + url: "https://www.alex-events.net", + facebook: "https://www.facebook.com/Official.alexevents", + }, + { + name: "Airbeat One", + url: "https://airbeat-one.de", + facebook: "https://www.facebook.com/airbeatone", + }, + { + name: "Army of Hardcore USA", + facebook: "https://www.facebook.com/armyofhardcore.usa", + }, + { + name: "Art of Dance", + url: "https://www.artofdance.nl", + facebook: "https://www.facebook.com/artofdanceofficial", + }, + { + name: "b2s", + url: "https://www.b2s.nl", + facebook: "https://www.facebook.com/officialb2s", + }, + { + name: "Bass Events", + url: "https://www.bassevents.be", + facebook: "https://www.facebook.com/bassevents", + }, + { + name: "Basscon", + url: "https://www.bassconmassive.com", + facebook: "https://www.facebook.com/bassconmassive", + }, + { + name: "BKJN events", + url: "https://bkjn.nl", + facebook: "https://www.facebook.com/BKJNevents", + }, + { + name: "Chemistry Event", + facebook: "https://www.facebook.com/profile.php?id=100088066611103", + }, + { + name: "DediKted", + url: "https://linktr.ee/dedikted", + facebook: "https://www.facebook.com/dediktedk1", + }, + { + name: "Devastator Events", + url: "https://devastatorevents.cz", + facebook: "https://www.facebook.com/Devastator.events", + }, + { + name: "Dreamfields Mexico", + url: "https://dreamfields.mx", + facebook: "https://www.facebook.com/dreamfieldsmexico", + }, + { + name: "Dropzone", + url: "https://dropzonefest.com", + facebook: "https://www.facebook.com/dropzonefest", + }, + { + name: "East Coast Hard Dance", + url: "https://eastcoastharddance.com", + facebook: "https://www.facebook.com/EastCoastHardDance", + }, + { + name: "Electric Love", + url: "https://www.electriclove.at", + facebook: "https://www.facebook.com/electriclovefestival", + }, + { + name: "Epic Entertainment", + facebook: "https://www.facebook.com/epicentertainmentnyc1", + }, + { + name: "F2D", + url: "https://travel.f2d.se", + facebook: "https://www.facebook.com/forced2dance", + }, + { + name: "Future of Hardstyle", + url: "https://www.futureofhardstyle.nl", + facebook: "https://www.facebook.com/futureofhardstyle", + }, + { + name: "Extinction", + url: "https://www.elationlv.com", + facebook: "https://www.facebook.com/extinctionusa", + }, + { name: "Fatality", facebook: "https://www.facebook.com/fatalityevent" }, + { + name: "Gearbox Digital", + url: "https://gearboxdigital.com", + facebook: "https://www.facebook.com/GearboxDigital", + }, + { + name: "Hard Dance NYC", + facebook: "https://www.facebook.com/hard.dance.nyc", + }, + { + name: "HARDFEST", + url: "https://www.hardfest.nl", + facebook: "https://www.facebook.com/hardfest.nl", + }, + { + name: "HARDGATE", + url: "https://hardgate.jp", + facebook: "https://www.facebook.com/hardgatejp", + }, + { name: "Hardice", facebook: "https://www.facebook.com/hardice.ch" }, + { + name: "Hardmission", + url: "https://hardmissionfestival.com", + facebook: "https://www.facebook.com/HardmissionFestival", + }, + { + name: "Hardstyle Arena", + facebook: "https://www.facebook.com/FreshHardstyleArena", + }, + { + name: "Harmony of Hardcore", + url: "https://www.harmonyofhardcore.nl", + facebook: "https://www.facebook.com/HOHfestival", + }, + { + name: "Heart of Hard", + url: "https://heartofhard.cz", + facebook: "https://www.facebook.com/heartofhard", + }, + { + name: "Hellfire", + url: "https://hell-fire.co.uk", + facebook: "https://www.facebook.com/Hellfireshow", + }, + { + name: "High Energy Events", + url: "https://www.highenergyevents.nl", + facebook: "https://www.facebook.com/officialhighenergyevents", + }, + { + name: "HSU Events", + url: "https://www.hsuevents.com", + facebook: "https://www.facebook.com/EventsHSU", + }, + { + name: "I AM HARDSTYLE", + url: "https://iamhardstyle.com", + facebook: "https://www.facebook.com/iamhardstyleofficial", + }, + { + name: "Infinity Festival", + url: "https://infinity-festival.nl", + facebook: "https://www.facebook.com/profile.php?id=100091682835269", + }, + { + name: "Intents Festival", + url: "https://www.intentsfestival.nl", + facebook: "https://www.facebook.com/intentsfestival", + }, + { + name: "Let it out events", + facebook: "https://www.facebook.com/profile.php?id=100089362122143", + }, + { + name: "Masif Events", + url: "https://masifsaturdays.com.au", + facebook: "https://www.facebook.com/masifevents", + }, + { + name: "Masters of Hardcore", + url: "https://www.mastersofhardcore.com", + facebook: "https://www.facebook.com/officialMOH", + }, + { + name: "Matrixx", + url: "https://www.matrixx.nl", + facebook: "https://www.facebook.com/MatrixxEvents", + }, + { + name: "Multigroove", + url: "https://multigroove.com", + facebook: "https://www.facebook.com/multigroove", + }, + { + name: "Musical Madness", + url: "https://www.musical-madness.de", + facebook: "https://www.facebook.com/musicalmadnessofficial", + }, + { + name: "MYK Events", + url: "https://www.myk-events.nl", + facebook: "https://www.facebook.com/RevengeWHMH", + }, + { + name: "Mysteryland", + url: "https://www.mysteryland.nl", + facebook: "https://www.facebook.com/Mysteryland", + }, + { + name: "Outlaw Events", + url: "https://www.outlawevents.nl", + facebook: "https://www.facebook.com/outlawevents.nl", + }, + { name: "Overloud Events", facebook: "https://www.facebook.com/ovldevents" }, + { + name: "Paaspop", + url: "https://www.paaspop.nl", + facebook: "https://www.facebook.com/Paaspop", + }, + { + name: "Parookaville", + url: "https://www.parookaville.com", + facebook: "https://www.facebook.com/parookaville", + }, + { + name: "PKHS Hard", + url: "https://pkhs013.nl", + facebook: "https://www.facebook.com/PKHSHARD", + }, + { + name: "Project Hardstyle CH", + facebook: "https://www.facebook.com/ProjectHardstyleCH", + }, + { + name: "Q-dance", + url: "https://www.q-dance.com", + facebook: "https://www.facebook.com/Qdance", + }, + { + name: "Ravefield", + url: "https://ravefield.com", + facebook: "https://www.facebook.com/ravefield.official", + }, + { name: "Ravingz Bass", facebook: "https://www.facebook.com/ravingzbass" }, + { + name: "Rawfare", + url: "https://www.rawfare.nl", + facebook: "https://www.facebook.com/RawfareOfficial", + }, + { + name: "REBELLiON", + url: "https://www.jointherebellion.nl", + facebook: "https://www.facebook.com/jointherebellion.nl", + }, + { + name: "REBiRTH Festival", + url: "https://www.rebirth-festival.nl", + facebook: "https://www.facebook.com/rebirthfestival", + }, + { name: "Recharged", facebook: "https://www.facebook.com/rechargedevent" }, + { + name: "Reminder", + url: "https://reminderhardstyleclassics.com", + facebook: "https://www.facebook.com/hardstyleclassics2006till2011", + }, + { + name: "Ruggengraatjes", + facebook: "https://www.facebook.com/profile.php?id=100089611314203", + }, + { + name: "Shockerz", + url: "https://shockerz.nl", + facebook: "https://www.facebook.com/shockerzofficial", + }, + { + name: "State of Bass", + facebook: "https://www.facebook.com/profile.php?id=100063544059838", + }, + { + name: "Supersized Kingsday", + facebook: "https://www.facebook.com/supersizedkingsdayfestival", + }, + { + name: "The Hardest", + facebook: "https://www.facebook.com/profile.php?id=100089439726875", + }, + { + name: "Thunderdome", + url: "https://www.thunderdome.com", + facebook: "https://www.facebook.com/ThunderdomeIsYou", + }, + { + name: "Timeless Festival", + url: "https://www.timelessfestival.com", + facebook: "https://www.facebook.com/TimelessFestivalOfficial", + }, + { + name: "Tomorrowland", + url: "https://www.tomorrowland.com", + facebook: "https://www.facebook.com/tomorrowland", + }, + { + name: "Twisted Events", + facebook: "https://www.facebook.com/twisted.events.official", + }, + { + name: "Ultimate Bassline Festival", + url: "http://ultimatebassline-festival.be", + facebook: "https://www.facebook.com/profile.php?id=61556131384684", + }, + { + name: "Ultra Worldwide", + url: "https://umfworldwide.com", + facebook: "https://www.facebook.com/Ultra/", + }, + { + name: "WhiteNorat.", + facebook: "https://www.facebook.com/Whitenoratevents", + }, +]; + +export const ourFriends = [ + { + title: "/r/hardstyle", + subtitle: "Reddit", + url: "https://www.reddit.com/r/hardstyle", + }, + { + title: "Hard Dance Release Radar", + subtitle: "Spotify", + url: "https://www.hdrr.info", + }, + { title: "HarderState", subtitle: "Forum", url: "https://harderstate.com" }, +].sort((a, b) => a.title.localeCompare(b.title)); + +export const hardDanceSiteTitle = "Hard.Dance"; +export const hardDanceRepoLink = "https://github.com/Hard-Dance/hard-dance"; +export const hardDanceEmail = "info@hard.dance"; +export const hardDancePrivacyPolicyLink = + "https://www.iubenda.com/privacy-policy/61434249"; +export const hardDanceCookiePolicyLink = + "https://www.iubenda.com/privacy-policy/61434249/cookie-policy"; diff --git a/apps/remix/app/data/average-colors.ts b/apps/remix/app/data/average-colors.ts new file mode 100644 index 0000000..13f88c0 --- /dev/null +++ b/apps/remix/app/data/average-colors.ts @@ -0,0 +1,169 @@ +const averageColors: Record = { + "reverze-synergy-2023": "#5F455D", + "imagination-festival-2024": "#737168", + "hardice-presents-imperatorz-2024": "#19141E", + "reverze-2024": "#474540", + "hellbound-welcome-to-the-machine-2024": "#1B231A", + "masters-of-hardcore-2024": "#39302F", + "supersized-kingsday-festival-2024": "#E46E27", + "mysteryland-2024": "#B3A0AE", + "emporium-festival-2024": "#678E72", + "kingdance-festival-2024": "#3D3427", + "dance4liberation-2024": "#93845C", + "edc-las-vegas-2024": "#A183A4", + "harmony-of-hardcore-2024": "#2F2E2C", + "dropzone-2024": "#454E43", + "defqon-1-weekend-festival-2024": "#8E777F", + "electric-love-festival-2024": "#72386C", + "dominator-festival-2024": "#393525", + "airbeat-one-festival-2024": "#BAA8AD", + "parookaville-2024": "#7D5948", + "hardclassics-festival-2024": "#756849", + "sound-of-the-underground-2024": "#323443", + "relevatez-festival-2024": "#7E4B6B", + "decibel-outdoor-festival-2024": "#653C5A", + "forbidden-island-2024": "#AE6A7F", + "into-the-madness-2024": "#73634f", + "titanium-festival-2024": "#2D2C2C", + "bkjn-events-presents-bulletproof-2024": "#2B3325", + "captain-hardstyle-2024": "#7AC0C7", + "kill-the-noise-festival-2024": "#545B60", + "hard-dance-nyc-presents-sub-zero-project-2024": "#462239", + "avondje-outsiders-2024": "#36262B", + "syndicate-2024": "#633335", + "angerfist-docks-hamburg-2024": "#1B1B1B", + "snakepit-2024": "#123A4C", + "brennan-heart-docks-hamburg-2024": "#604A70", + "basscon-presents-sub-zero-project-2024": "#541210", + "the-hardest-presents-no-limits-2024": "#586342", + "tomorrowland-weekend-1-2024": "#434C4E", + "tomorrowland-weekend-2-2024": "#434C4E", + "basscon-presents-lil-texas-planet-texcore-2024": "#B95F36", + "revenge-portal-to-the-extreme-2024": "#2F332C", + "welcome-to-the-gang-2024": "#D4CDC4", + "hardfest-2024": "#B87A4F", + "city-of-eldorado-2024": "#9F7A3B", + "flashback-2024": "#F0D2D7", + "mystica-entangled-mind-games-2024": "#4F4B83", + "ravemania-2024": "#342A40", + "bkjn-future-night-2024": "#344966", + "hard-dance-nyc-presents-d-sturb-geo-2024": "#503E5C", + "electric-sea-festival-2024": "#584160", + "rawfare-2024": "#194E35", + "solar-eclipse-2024": "#4B5778", + "the-qontinent-2024": "#A18C7A", + "dark-circus-2024": "#62341E", + "rawdefinition-2024": "#275538", + "qlimax-2024": "#8B5322", + "rebelion-the-final-dose-2024": "#133027", + "darkraver-all-night-long-2024": "#211E13", + "overdose-the-final-dose-2024": "#0F2119", + "basscon-geo-2024": "#372923", + "supremacy-2024": "#2d3843", + "synergy-revolution-of-raw-2024": "#5E4772", + "route-666-2024": "#4F523B", + "sub-zero-project-docks-hamburg-2024": "#302C2A", + "supercharged-festival-2024": "#553A2F", + "madness-presents-sub-zero-project-2024": "#242624", + "bassquake-festival-2024": "#4D4E64", + "basscon-presents-wasted-penguinz-2024": "#292522", + "thyron-album-release-night-2024": "#131D3D", + "hard-dance-nyc-presents-wasted-penguinz-2024": "#494555", + "hard-dance-nyc-presents-radical-redemption-2024": "#632f29", + "hard-dance-nyc-presents-junkie-kid-2024": "#522151", + "hardcore-gladiators-2024": "#362F2E", + "shockerz-2024": "#624158", + "hard-dance-nyc-presents-warface-2024": "#5e413a", + "impact-of-theia-2024": "#3D323D", + "multigroove-festival-2024": "#9A6F8E", + "heart-of-hard-presents-riot-shift-2024": "#5D403A", + "hardstyle-invasion-2-2024": "#54362C", + "the-hardest-presents-the-ultimate-battles-2024": "#4D465E", + "basscon-presents-tnt-wasted-penguinz-2024": "#381A32", + "king-of-the-pieps-2024": "#AD306D", + "sub-zero-project-halloween-special-2024": "#36473e", + "q-dance-take-over-at-balaton-sound-2024": "#252028", + "state-of-bass-classics-2024": "#5B354B", + "q-dance-take-over-at-world-dj-festival-2024": "#262128", + "overloud-events-6-year-celebration-2024": "#4F3658", + "i-am-hardstyle-poland-2024": "#3E3C5D", + "unity-2024": "#0D2954", + "heart-of-hard-presents-angerfist-2024": "#324E37", + "basscon-pool-party-2024": "#1F201C", + "infinity-festival-2024": "#5C6C45", + "a-nightmare-in-germany-2024": "#5A1A2A", + "bkjn-21-years-2024": "#453E29", + "recharged-city-of-lights-2024": "#402B36", + "infiltration-2024": "#2E1F13", + "midnight-mafia-viii-2024": "#464025", + "midnight-mafia-order-of-the-lotus-2024": "#3e1b59", + "ultra-music-festival-2024": "#1a3e45", + "hardgate-11-2024": "#432e2b", + "tomorrowland-winter-2024": "#a06e93", + "pat-b-birthday-bash-xxl-2024": "#6A532A", + "pokke-herrie-2024": "#4F6D86", + "reverze-2025": "#6D4581", + "a-new-era-of-up-the-tempo-2024": "#371c21", + "timeless-indoor-jokers-edition-2024": "#544039", + "timeless-festival-2024": "#152226", + "dedikted-the-judgement-day-2024": "#3c1c1e", + "rawfair-a-new-chapter-2024": "#48373b", + "gatekeepers-unlocking-new-possibilities-2024": "#533622", + "royal-kingsnight-a-majestic-night-of-uptempo-kings-and-queens-2024": + "#695b49", + "geen-gezeur-meer-terreur-birthday-rave-2024": "#313541", + "hard-dance-nyc-presents-deadly-guns-2024": "#644145", + "extinction-featuring-frontliner-2024": "#69402e", + "basscon-wasteland-2024": "#684034", + "hard-is-king-april-2024": "#4d3b3b", + "hard-is-king-austin-2024": "#653224", + "fusion-force-2024": "#392c3c", + "galaxy-2024": "#483c52", + "hardwired-summer-special-2024": "#1f1e29", + "owl-festival-2024": "#281216", + "paaspop-2024": "#5814a1", + "madness-presents-rooler-2024": "#271f20", + "10yrs-madness-x-bootshaus-2024": "#355d1a", + "masters-of-hardcore-2025": "#3c3830", + "stuck-on-earth-30-2024": "#524740", + "hardstyle-dna-outdoor-festival-2024": "#284d38", + "masif-gvng-presents-autumn-babies-2024": "#493e2b", + "masif-and-high-voltage-present-rob-gee-2024": "#5e5546", + "rebirth-festival-2024": "#661d31", + "jay-reeve-presents-melodic-madness-2024": "#5e3c20", + "q-dance-take-over-at-sunrise-festival-2024": "#231f26", + "q-dance-take-over-at-sziget-festival-2024": "#231f26", + "raving-nightmare-2024": "#57403c", + "ground-zero-festival-2024": "#2f0669", + "a-nightmare-in-rotterdam-2024": "#721f18", + "kickerz-2024": "#453b35", + "kickerz-festival-2024": "#47392a", + "rebellion-outdoor-festival-2024": "#725973", + "rebellion-indoor-festival-2024": "#2e3869", + "ultimate-bassline-festival-2024": "#414652", + "so-whappy-festival-2024": "#a6baca", + "freshtival-weekend-2024": "#8e8c95", + "hard-dance-nyc-presents-devin-wild-keltek-2024": "#2e5b61", + "rumble-in-the-summer-2024": "#95936f", + "8th-annual-qsa-pre-defqon-meetup-2024": "#7c6e72", + "hard-dance-nyc-presents-lady-faith-2024": "#4d3551", + "nexus-festival-2024": "#1b1f10", + "outlands-festival-2024": "#646349", + "sunrise-festival-2024": "#ec80bd", + "boulevard-outdoor-2024": "#9793c1", + "stereo-sunday-2024": "#99867f", + "wish-outdoor-2024": "#a35539", + "dreamfields-festival-2024": "#ab87cb", + "fantasia-festival-2024": "#5e7679", + "vroeger-was-alles-beter-festival-2024": "#a07e75", + "open-beatz-festival-2024": "#788882", + "nature-one-2024": "#333438", + "shutdown-festival-2024": "#316393", + "electrisize-festival-2024": "#3f1710", + "volle-gaas-in-dixies-2024": "#301141", + "knockout-outdoor-2024": "#5f466c", + "rawness-hypnotic-disorder-2024": "#593e64", + new_key: "New Value", +}; + +export default averageColors; diff --git a/apps/remix/app/data/countries.ts b/apps/remix/app/data/countries.ts new file mode 100644 index 0000000..d4692d8 --- /dev/null +++ b/apps/remix/app/data/countries.ts @@ -0,0 +1,87 @@ +export const countriesDb = { + US: "United States", + NL: "Netherlands", + BE: "Belgium", + DE: "Germany", + CH: "Switzerland", + FR: "France", + AU: "Australia", + MX: "Mexico", + CZ: "Czech Republic", + CA: "Canada", + NO: "Norway", + CL: "Chile", + JP: "Japan", + PL: "Poland", + ES: "Spain", + KR: "South Korea", + MY: "Malaysia", + IT: "Italy", + PT: "Portugal", + AT: "Austria", + RO: "Romania", + HU: "Hungary", + HR: "Croatia", + SE: "Sweden", + FI: "Finland", + GB: "United Kingdom", + TH: "Thailand", +} as const; + +export type CountryCodes = keyof typeof countriesDb; +export type CountryNames = (typeof countriesDb)[keyof typeof countriesDb]; + +export const continentsDb = { + AF: { + name: "Africa", + countries: [], + }, + AS: { + name: "Asia", + countries: ["JP", "KR", "MY", "TH"], + }, + EU: { + name: "Europe", + countries: [ + "NL", + "BE", + "DE", + "CH", + "FR", + "CZ", + "NO", + "PL", + "ES", + "IT", + "PT", + "AT", + "RO", + "HU", + "HR", + "SE", + "FI", + "GB", + ], + }, + NA: { + name: "North America", + countries: ["US", "MX", "CA"], + }, + OC: { + name: "Oceania", + countries: ["AU"], + }, + SA: { + name: "South America", + countries: ["CL"], + }, +} as const satisfies Record< + string, + { + name: string; + countries: CountryCodes[]; + } +>; + +export type ContinentCodes = keyof typeof continentsDb; +export type CountinentValues = (typeof continentsDb)[keyof typeof continentsDb]; diff --git a/apps/remix/app/data/data.ts b/apps/remix/app/data/data.ts new file mode 100644 index 0000000..acdefb0 --- /dev/null +++ b/apps/remix/app/data/data.ts @@ -0,0 +1,95 @@ +import matter from "gray-matter"; +import fs from "node:fs"; +import path from "node:path"; +import { getFlag } from "../utils/flag"; + +type EventMarkdown = { + layout: string; + category: string; + title: string; + date: string; + datestart: string; + dateend?: string; + location: string; + coordinates?: string; + hosts?: string[]; + is_online?: boolean; + featured?: boolean; + image: string; + isForegroundBlack?: boolean; + video?: boolean; + country?: string; + facebook?: string; +}; + +// TODO: If this type becomes big, have smaller subsets to prevent sending large amounts of data to the client. +export type Event = { + id: string; + title: string; + datestart: string; // TODO: Should this be date or string? + datestartDate: Date; + dateend?: string; + dateendDate?: Date; + location: string; + coordinates?: { lat: number; lng: number }; + hosts: string[]; + is_online?: boolean; + featured?: boolean; + image: string; + isForegroundBlack?: boolean; + video?: boolean; + country?: string; + flag?: string; + facebook?: string; + description?: string; +}; + +export const markdownToEvent = (markdownFilePath: string): Event => { + const markdownFileContent = fs.readFileSync(markdownFilePath, "utf8"); + const parsedMarkdown = matter(markdownFileContent); + const fileName = path.basename(markdownFilePath); + + const { + title, + datestart, + dateend, + location, + coordinates: coordinatesString, + hosts, + featured, + is_online, + video, + country, + image, + facebook, + } = parsedMarkdown.data as EventMarkdown; + + const coordinatesStringSplit = coordinatesString?.split(","); + const coordinates = + coordinatesStringSplit != null + ? { + lat: Number(coordinatesStringSplit[0]), + lng: Number(coordinatesStringSplit[1]), + } + : undefined; + + return { + id: fileName.replace(".md", ""), + title, + datestart, + datestartDate: new Date(datestart), + dateend, + dateendDate: dateend ? new Date(dateend) : undefined, + country, + location, + coordinates, + hosts: hosts ?? [], + featured, + is_online, + video, + flag: getFlag(location ?? ""), + image, + facebook, + description: parsedMarkdown.content, + }; +}; diff --git a/apps/remix/app/data/file-filter-indexes.json b/apps/remix/app/data/file-filter-indexes.json new file mode 100644 index 0000000..38caa4e --- /dev/null +++ b/apps/remix/app/data/file-filter-indexes.json @@ -0,0 +1 @@ +{"2024-01-27-hard-dance-nyc-presents-d-sturb-geo-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2023/12/11","hosts":["Hard Dance NYC"],"dateStart":"2024/01/27"},"2024-02-15-hard-dance-nyc-presents-wasted-penguinz-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/01/31","hosts":["Hard Dance NYC"],"dateStart":"2024/02/15"},"2024-02-16-basscon-presents-wasted-penguinz-2024":{"location":"Suite 100 - 919 Fourth Ave, San Diego, CA 92101, United States","countryCode":"US","continentCode":"NA","date":"2024/01/25","hosts":["Basscon"],"dateStart":"2024/02/16"},"2024-02-19-basscon-geo-2024":{"location":"6021 Hollywood Blvd, Los Angeles, CA, United States","countryCode":"US","continentCode":"NA","date":"2024/01/12","hosts":["Basscon"],"dateStart":"2024/02/09"},"2024-02-22-hard-dance-nyc-presents-sub-zero-project-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2023/10/04","hosts":["Hard Dance NYC"],"dateStart":"2024/02/22"},"2024-02-24-basscon-presents-sub-zero-project-2024":{"location":"645 NW 45th St, Seattle, WA 98107-4440, United States","countryCode":"US","continentCode":"NA","date":"2023/11/15","hosts":["Basscon"],"dateStart":"2024/02/24"},"2024-03-01-megarave-the-energiehal-reunion-2025":{"location":"Rodesk B.V., Maashaven Z.z 5, 3081 AE Rotterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Megarave","Rige music","Hardcore Radio","Hardtunes","Rige Bookings","Rigeshop"],"dateStart":"2025/03/01"},"2024-03-01-reverze-2024":{"location":"Schijnpoortweg 113, 2170 Antwerpen, Belgium","countryCode":"BE","continentCode":"EU","date":"2023/03/01","hosts":["Bass Events"],"dateStart":"2024/03/01","dateEnd":"2024/03/02"},"2024-03-02-rawdefinition-2024":{"location":"Burgemeester Drijbersingel 7, 8021 DA Zwolle, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/01","hosts":["High Energy Events"],"dateStart":"2024/03/02"},"2024-03-08-madness-presents-sub-zero-project-2024":{"location":"Königstraße 49, 70173 Stuttgart, Germany","countryCode":"DE","continentCode":"EU","date":"2024/01/23","hosts":["Musical Madness"],"dateStart":"2024/03/08"},"2024-03-08-the-hardest-presents-no-limits-2024":{"location":"Ruiterskwartier 41, Leeuwarden, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/11/15","hosts":["The Hardest"],"dateStart":"2024/03/08"},"2024-03-09-avondje-outsiders-2024":{"location":"Ahoyweg 10, 3084 BA Rotterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/10/04","hosts":["b2s"],"dateStart":"2024/03/09"},"2024-03-09-hellbound-welcome-to-the-machine-2024":{"location":"Hemkade 48, 1506 PS Zaandam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/03/12","hosts":["Multigroove"],"dateStart":"2024/03/09"},"2024-03-09-kill-the-noise-festival-2024":{"location":"Güterbahnhofstrasse 4, 9000 St. Gallen, Switzerland","countryCode":"CH","continentCode":"EU","date":"2023/10/03","hosts":["Project Hardstyle CH"],"dateStart":"2024/03/09"},"2024-03-09-rawfare-2024":{"location":"Shell EV Charging Solutions B.V., Fabriekslaan, 9745 Hoogkerk, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/12/13","hosts":["Rawfare"],"dateStart":"2024/03/09"},"2024-03-09-solar-eclipse-2024":{"location":"Beesdseweg 1a 4104AW Culemborg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/12/14","hosts":["Ruggengraatjes"],"dateStart":"2024/03/09"},"2024-03-15-bkjn-future-night-2024":{"location":"Van der hagenstraat 22, Zoetermeer, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/12/07","hosts":["BKJN Events"],"dateStart":"2024/03/15"},"2024-03-15-brennan-heart-docks-hamburg-2024":{"location":"Spielbudenpl. 19, 20359 Hamburg, Germany","countryCode":"DE","continentCode":"EU","date":"2023/11/14","hosts":["Airbeat One"],"dateStart":"2024/03/15"},"2024-03-15-mystica-entangled-mind-games-2024":{"location":"Pieter Vreedeplein 172, 5038 BW Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/12/06","hosts":["Soundtek"],"dateStart":"2024/03/15"},"2024-03-15-thyron-album-release-night-2024":{"location":"Heuvelring 39-05, 5038 CJ Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/30","hosts":["Chemistry Event"],"dateStart":"2024/03/15"},"2024-03-16-city-of-eldorado-2024":{"location":"1 Chemin de la Terrière, 51510 Fagnières, France","countryCode":"FR","continentCode":"EU","date":"2023/11/27","hosts":["Ravingz Bass"],"dateStart":"2024/03/16"},"2024-03-16-hardclassics-festival-2024":{"location":"De Ven 2, 1981 LW Velsen-Zuid, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/07/31","hosts":["Reminder"],"dateStart":"2024/07/27"},"2024-03-16-hardstyle-invasion-2-2024":{"location":"San Diego, CA, United States","countryCode":"US","continentCode":"NA","date":"2024/02/05","hosts":["SD Hardstylerz"],"dateStart":"2024/03/16"},"2024-03-16-revenge-portal-to-the-extreme-2024":{"location":"Now&Wow Fest., Maashaven Z.z, 3081 AE Rotterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/11/20","hosts":["MYK Events"],"dateStart":"2024/03/16"},"2024-03-16-sound-of-the-underground-2024":{"location":"Hemkade 48, 1506 PS Zaandam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/07/31","hosts":["Reminder"],"dateStart":"2024/03/16"},"2024-03-16-tomorrowland-winter-2024":{"location":"Alpe d'Huez, 38750 Huez, France","countryCode":"FR","continentCode":"EU","date":"2023/04/26","hosts":["Tomorrowland"],"dateStart":"2024/03/16","dateEnd":"2024/03/23","live":true},"2024-03-16-welcome-to-the-gang-2024":{"location":"Bavelseparklaan 13, 4817 ZX Breda, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/11/21","hosts":["Outlaw Events"],"dateStart":"2024/03/16"},"2024-03-22-hard-dance-nyc-presents-warface-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/02/01","hosts":["Hard Dance NYC"],"dateStart":"2024/03/22"},"2024-03-22-ultra-music-festival-2024":{"location":"33 Biscayne Blvd, Miami, FL 33132, United States","countryCode":"US","continentCode":"NA","date":"2023/06/05","hosts":["Ultra Worldwide"],"dateStart":"2024/03/22","dateEnd":"2024/03/24","live":true},"2024-03-23-basscon-presents-tnt-wasted-penguinz-2024":{"location":"900 Marin St, San Francisco, CA, United States","countryCode":"US","continentCode":"NA","date":"2024/02/08","hosts":["Basscon"],"dateStart":"2024/03/23"},"2024-03-23-impact-of-theia-2024":{"location":"43C Boulevard de Verdun, 76000 Rouen, France","countryCode":"FR","continentCode":"EU","date":"2024/02/01","hosts":["Ravingz Bass"],"dateStart":"2024/03/23"},"2024-03-23-recharged-city-of-lights-2024":{"location":"Trivium 170, 4873 LP Etten-Leur, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/26","hosts":["Recharged"],"dateStart":"2024/03/23"},"2024-03-28-hardice-presents-imperatorz-2024":{"location":"Rue de l'Etang 19, 1630 Bulle, Switzerland","countryCode":"CH","continentCode":"EU","date":"2023/02/23","hosts":["Hardice"],"dateStart":"2024/03/28"},"2024-03-29-a-new-era-of-up-the-tempo-2024":{"location":"Heuvelring 94, 5038 CL Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/03/05","hosts":["PKHS Hard"],"dateStart":"2024/03/29"},"2024-03-29-dark-circus-2024":{"location":"Homburg 28, 4153 BS Beesd, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/12/23","hosts":["Let it out events"],"dateStart":"2024/03/29"},"2024-03-29-paaspop-2024":{"location":"Molendijk-Noord 91-01, 5482 WX Schijndel, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/04/09","hosts":["Paaspop","This Is Live Group"],"dateStart":"2024/03/29","dateEnd":"2024/03/31"},"2024-03-30-fusion-force-2024":{"location":"6910 Shirley Ave, Austin, TX 78752, United States","countryCode":"US","continentCode":"NA","date":"2024/02/20","hosts":["Underground Syndicate"],"dateStart":"2024/03/30"},"2024-03-30-masters-of-hardcore-2024":{"location":"Diezekade 2, 5222 AK 's-Hertogenbosch, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/03/25","hosts":["Art of Dance","Masters of Hardcore"],"dateStart":"2024/03/30"},"2024-03-30-ravemania-2024":{"location":"Limmatstrasse 118, 8005 Zürich, Switzerland","countryCode":"CH","continentCode":"EU","date":"2023/12/06","hosts":["Ravefield"],"dateStart":"2024/03/30"},"2024-03-30-route-666-2024":{"location":"Am Messepl. 14, 25813 Husum, Germany","countryCode":"DE","continentCode":"EU","date":"2024/01/19","hosts":["Gearbox Digital"],"dateStart":"2024/03/30"},"2024-03-30-state-of-bass-classics-2024":{"location":"Zijlsingel 2, 2013 DN Haarlem, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/15","hosts":["State of Bass"],"dateStart":"2024/03/30"},"2024-03-30-timeless-indoor-jokers-edition-2024":{"location":"Rue des Deux Provinces 1, 6900 Marche-en-Famenne, Belgium","countryCode":"BE","continentCode":"EU","date":"2023/10/01","hosts":["Timeless Festival"],"dateStart":"2024/03/30"},"2024-03-31-rawfair-a-new-chapter-2024":{"location":"Heuvelring 94, 5038 CL Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/03/14","hosts":["PKHS Hard"],"dateStart":"2024/03/31"},"2024-03-31-rebelion-the-final-dose-2024":{"location":"Siegburger Str. 15 40591 Düsseldorf, Germany","countryCode":"DE","continentCode":"EU","date":"2024/01/11","hosts":["Musical Madness"],"dateStart":"2024/03/31"},"2024-04-05-geen-gezeur-meer-terreur-birthday-rave-2024":{"location":"Now&Wow Fest., Maashaven Z.z, 3081 AE Rotterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/25","hosts":["MYK Events"],"dateStart":"2024/04/05"},"2024-04-05-masif-gvng-presents-autumn-babies-2024":{"location":"127/131 Liverpool St, Sydney NSW 2000, Australia","countryCode":"AU","continentCode":"OC","date":"2024/03/30","hosts":["Masif Events"],"dateStart":"2024/04/05"},"2024-04-06-darkraver-all-night-long-2024":{"location":"Basisweg 63, 1043 AN Amsterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/11","hosts":["Multigroove"],"dateStart":"2024/04/06"},"2024-04-06-dedikted-the-judgement-day-2024":{"location":"Av. Ferrocarriles Pte. 8, El Nopalito, 54800 Cuautitlán de Romero Rubio, Méx., Mexico","countryCode":"MX","continentCode":"NA","date":"2024/03/07","hosts":["DediKted"],"dateStart":"2024/04/06"},"2024-04-06-heart-of-hard-presents-riot-shift-2024":{"location":"Tachovské náměstí 5 13000 Prague, Czech Republic","countryCode":"CZ","continentCode":"EU","date":"2024/02/04","hosts":["Heart of Hard"],"dateStart":"2024/04/06"},"2024-04-06-synergy-revolution-of-raw-2024":{"location":"Ahoyweg 10, 3084 BA Rotterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/16","hosts":["b2s"],"dateStart":"2024/04/06"},"2024-04-12-masif-and-high-voltage-present-rob-gee-2024":{"location":"127/131 Liverpool St, Sydney NSW 2000, Australia","countryCode":"AU","continentCode":"OC","date":"2024/03/31","hosts":["Masif Events"],"dateStart":"2024/04/12"},"2024-04-12-rebirth-festival-2024":{"location":"Antwerpsebaan 7, 5268 KB Helvoirt, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/04/17","hosts":["REBiRTH Festival"],"dateStart":"2024/04/12","dateEnd":"2024/04/14"},"2024-04-13-angerfist-docks-hamburg-2024":{"location":"Spielbudenpl. 19, 20359 Hamburg, Germany","countryCode":"DE","continentCode":"EU","date":"2023/10/16","hosts":["Airbeat One"],"dateStart":"2024/04/13"},"2024-04-13-hard-is-king-april-2024":{"location":"7126 Lawndale Ave, Houston, TX 77023-4213, United States","countryCode":"US","continentCode":"NA","date":"2024/02/19","hosts":["Underground Syndicate"],"dateStart":"2024/04/13"},"2024-04-14-hard-dance-nyc-presents-radical-redemption-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/01/31","hosts":["Hard Dance NYC"],"dateStart":"2024/04/14"},"2024-04-18-extinction-featuring-frontliner-2024":{"location":"517 Fremont St, Las Vegas, NV 89101, United States","countryCode":"US","continentCode":"NA","date":"2024/03/26","hosts":["Extinction"],"dateStart":"2024/04/18"},"2024-04-19-gatekeepers-unlocking-new-possibilities-2024":{"location":"Heuvelring 94, 5038 CL Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/03/14","hosts":["PKHS Hard"],"dateStart":"2024/04/19"},"2024-04-19-madness-presents-rooler-2024":{"location":"Königstraße 49, 70173 Stuttgart, Germany","countryCode":"DE","continentCode":"EU","date":"2024/03/07","hosts":["Musical Madness"],"dateStart":"2024/04/19"},"2024-04-19-overloud-events-6-year-celebration-2024":{"location":"2031 Rue St-Denis, Montréal, QC H2X 3K8, Canada","countryCode":"CA","continentCode":"NA","date":"2024/02/20","hosts":["Overloud Events"],"dateStart":"2024/04/19"},"2024-04-20-bassquake-festival-2024":{"location":"Zur Winterwelt 1, 19243 Wittenburg, Germany","countryCode":"DE","continentCode":"EU","date":"2024/01/23","hosts":["Airbeat One"],"dateStart":"2024/04/20"},"2024-04-20-bkjn-21-years-2024":{"location":"Hemkade 48, 1506 PS Zaandam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/24","hosts":["BKJN Events"],"dateStart":"2024/04/20"},"2024-04-26-heart-of-hard-presents-angerfist-2024":{"location":"Storm Club, Tachovské nám. 290, 130 00 Praha 3-Žižkov, Czech Republic","countryCode":"CZ","continentCode":"EU","date":"2024/02/22","hosts":["Heart of Hard"],"dateStart":"2024/04/26"},"2024-04-26-kingdance-festival-2024":{"location":"Lakeside Zwolle, 8026 Zwolle, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/05/07","hosts":["High Energy Events"],"dateStart":"2024/04/26","dateEnd":"2024/04/27"},"2024-04-26-royal-kingsnight-a-majestic-night-of-uptempo-kings-and-queens-2024":{"location":"Heuvelring 94, 5038 CL Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/03/15","hosts":["PKHS Hard"],"dateStart":"2024/04/26"},"2024-04-26-supersized-kingsday-festival-2025":{"location":"Ekkersweijer 12, 5681 RZ Best, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Supersized Kingsday Festival"],"dateStart":"2025/04/26"},"2024-04-27-hardfest-2024":{"location":"Drienerlolaan 5, 7522 NB Enschede, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/11/22","hosts":["HARDFEST"],"dateStart":"2024/04/27"},"2024-04-27-stuck-on-earth-30-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/03/17","hosts":["Epic Entertainment"],"dateStart":"2024/04/27"},"2024-04-27-supersized-kingsday-festival-2024":{"location":"Ekkersweijer 12, 5681 RZ Best, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/04/27","hosts":["Supersized Kingsday"],"dateStart":"2024/04/27"},"2024-05-03-hard-dance-nyc-presents-junkie-kid-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/03/11","hosts":["Hard Dance NYC"],"dateStart":"2024/05/03"},"2024-05-03-hardstyle-dna-outdoor-festival-2024":{"location":"Kadettangen 14, 1337 Sandvika, Norway","countryCode":"NO","continentCode":"EU","date":"2023/11/07","hosts":["Hardstyle DNA"],"dateStart":"2024/05/03","dateEnd":"2024/05/04"},"2024-05-03-sub-zero-project-docks-hamburg-2024":{"location":"Spielbudenpl. 19, 20359 Hamburg, Germany","countryCode":"DE","continentCode":"EU","date":"2024/01/19","hosts":["Airbeat One"],"dateStart":"2024/05/03"},"2024-05-04-basscon-presents-lil-texas-planet-texcore-2024":{"location":"645 NW 45th St, Seattle, WA 98107-4440, United States","countryCode":"US","continentCode":"NA","date":"2023/11/17","hosts":["Basscon"],"dateStart":"2024/05/04"},"2024-05-04-bkjn-events-presents-bulletproof-2024":{"location":"Veemarktstraat 38C, 5038 CV Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/09/07","hosts":["BKJN Events"],"dateStart":"2024/05/04"},"2024-05-04-flashback-2024":{"location":"Lotto Arena, Schijnpoortweg 119, 2170 Antwerpen, Belgium","countryCode":"BE","continentCode":"EU","date":"2023/12/04","hosts":["Bass Events"],"dateStart":"2024/05/04"},"2024-05-04-infiltration-2024":{"location":"PWA Silverdome, Van der Hagenstraat 20, 2722 NT Zoetermeer, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/26","hosts":["BKJN Events"],"dateStart":"2024/06/08"},"2024-05-04-midnight-mafia-viii-2024":{"location":"1 Showground Road Sydney Olympic Park, NSW, Australia","countryCode":"AU","continentCode":"OC","date":"2024/01/30","hosts":["HSU Events"],"dateStart":"2024/05/04"},"2024-05-05-dance4liberation-2024":{"location":"Lakeside Zwolle, 8026 Zwolle, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/05/07","hosts":["High Energy Events"],"dateStart":"2024/05/05"},"2024-05-11-10yrs-madness-x-bootshaus-2024":{"location":"Auenweg 173 51063 Cologne, Germany","countryCode":"DE","continentCode":"EU","date":"2024/03/07","hosts":["Musical Madness"],"dateStart":"2024/05/11"},"2024-05-11-midnight-mafia-order-of-the-lotus-2024":{"location":"Av. El Salto 5000, Huechuraba, Región Metropolitana, Chile","countryCode":"CL","continentCode":"SA","date":"2024/01/30","hosts":["HSU Events"],"dateStart":"2024/05/11"},"2024-05-11-overdose-the-final-dose-2024":{"location":"Limmatstrasse 118 8005 Zürich, Switzerland","countryCode":"CH","continentCode":"EU","date":"2024/01/11","hosts":["Ravefield"],"dateStart":"2024/05/11"},"2024-05-12-hardgate-11-2024":{"location":"Circus Tokyo, 第5叶ビル 1F/B1F 3 Chome-26-16 Shibuya, Shibuya City, Tokyo 150-0002, Japan","countryCode":"JP","continentCode":"AS","date":"2024/01/01","hosts":["HARDGATE"],"dateStart":"2024/05/12"},"2024-05-16-basscon-pool-party-2024":{"location":"206 N 3rd St, Las Vegas, NV 89101, United States","countryCode":"US","continentCode":"NA","date":"2024/02/22","hosts":["Basscon"],"dateStart":"2024/05/16"},"2024-05-17-edc-las-vegas-2024":{"location":"7000 N. Las Vegas Blvd, Las Vegas, NV 89115, United States","countryCode":"US","continentCode":"NA","date":"2023/05/24","hosts":["Basscon"],"dateStart":"2024/05/17","dateEnd":"2024/05/20","live":true},"2024-05-17-freshtival-weekend-2024":{"location":"Jacobsrietweg 182, 7546 RG Enschede, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/06/07","hosts":["Freshtival"],"dateStart":"2024/05/17","dateEnd":"2024/05/19"},"2024-05-18-hard-is-king-austin-2024":{"location":"6910 Shirley Ave, Austin, TX 78752, United States","countryCode":"US","continentCode":"NA","date":"2024/02/28","hosts":["Underground Syndicate"],"dateStart":"2024/05/18"},"2024-05-18-harmony-of-hardcore-2024":{"location":"Keldonkseweg 8, 5469 EP Erp, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/05/28","hosts":["Harmony of Hardcore"],"dateStart":"2024/05/18"},"2024-05-19-kickerz-2024":{"location":"Willemsplein 10, 6811 KB Arnhem, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/03/06","hosts":["Future of Hardstyle"],"dateStart":"2024/05/19"},"2024-05-23-hard-dance-nyc-presents-devin-wild-keltek-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/03/11","hosts":["Hard Dance NYC"],"dateStart":"2024/05/23"},"2024-05-24-emporium-festival-2025":{"location":"Weg door de Berendonck, Wijchen, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Emporium","Matrixx"],"dateStart":"2025/05/24"},"2024-05-24-i-am-hardstyle-poland-2024":{"location":"Łazienkowska 6A, 00-449 Warszawa, Poland","countryCode":"PL","continentCode":"EU","date":"2024/02/20","hosts":["I AM HARDSTYLE"],"dateStart":"2024/05/24"},"2024-05-25-emporium-festival-2024":{"location":"Thermen Berendonck, Oude Teersdijk 15, 6603 KJ Wijchen, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/05/03","hosts":["Matrixx"],"dateStart":"2024/05/25"},"2024-05-25-ultimate-bassline-festival-2024":{"location":"Rue Pierre-Joseph Antoine, 4040 Herstal, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/02/05","hosts":["Ultimate Bassline Festival"],"dateStart":"2024/05/25"},"2024-05-31-rumble-in-the-summer-2024":{"location":"2631 Whittier Blvd, Los Angeles, CA, United States","countryCode":"US","continentCode":"NA","date":"2024/04/18","hosts":["2HARD"],"dateStart":"2024/05/31"},"2024-06-01-mission-festival-2024":{"location":"Attisholzstrasse 10, 4533 Riedholz, Switzerland","countryCode":"CH","continentCode":"EU","date":"2024/06/19","hosts":["Mission Festival"],"dateStart":"2024/06/01"},"2024-06-08-heaven-hill-festival-2024":{"location":"Dong Open Air, Zur Himmelstreppe, 47506 Neukirchen-Vluyn, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["Heaven & Hill Festival","Permanent"],"dateStart":"2024/06/08"},"2024-06-08-multigroove-festival-2024":{"location":"Hemkade 48, 1506 PS Zaandam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/01","hosts":["Multigroove"],"dateStart":"2024/06/08"},"2024-06-14-gatekeepers-the-unstoppable-force-2024":{"location":"Heuvelring 94, Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["PKHS HARD","PKHS"],"dateStart":"2024/06/14"},"2024-06-14-i-am-hardstyle-present-save-euphoric-2024":{"location":"Auenweg 173, 51063 Köln, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/14","hosts":["I AM HARDSTYLE"],"dateStart":"2024/06/14"},"2024-06-14-masif-presents-hysta-2024":{"location":"127-131 Liverpool St, Sydney NSW 2000, Australia","countryCode":"AU","continentCode":"OC","date":"2024/06/14","hosts":["Masif Events"],"dateStart":"2024/06/14"},"2024-06-14-nexus-festival-2024":{"location":"Av. de la Industria, 80, 28970 Humanes de Madrid, Madrid, Spain","countryCode":"ES","continentCode":"EU","date":"2024/06/13","hosts":["FABRIK"],"dateStart":"2024/06/14"},"2024-06-15-hard-dance-nyc-presents-deadly-guns-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/03/26","hosts":["Hard Dance NYC"],"dateStart":"2024/06/15"},"2024-06-15-hardwired-summer-special-2024":{"location":"Los Angeles, CA, United States","countryCode":"US","continentCode":"NA","date":"2024/03/28","hosts":["Dirty Epic","Singularity"],"dateStart":"2024/06/15"},"2024-06-15-q-dance-take-over-at-world-dj-festival-2024":{"location":"505-5 Banpo-dong, Seocho-gu, Seoul, South Korea","countryCode":"KR","continentCode":"AS","date":"2024/02/19","hosts":["Q-dance"],"dateStart":"2024/06/15"},"2024-06-16-hardtrackerz-presents-dj-hysta-2024":{"location":"Level 29, Rooftop Gtower, Marquis Sky Lounge, 50450 Kuala Lumpur, Federal Territory of Kuala Lumpur, Malaysia","countryCode":"MY","continentCode":"AS","date":"2024/06/19","hosts":["Hardtrackerz Evt"],"dateStart":"2024/06/16"},"2024-06-21-electrifinity-festival-2024":{"location":"Otto-Wels-Straße 2, 83043 Bad Aibling, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["Electrifinity Festival"],"dateStart":"2024/06/21","dateEnd":"2024/06/23"},"2024-06-21-masif-presents-dna-2024":{"location":"127-131 Liverpool St, Sydney NSW 2000, Australia","countryCode":"AU","continentCode":"OC","date":"2024/06/14","hosts":["Masif Events"],"dateStart":"2024/06/21"},"2024-06-21-outlands-festival-2024":{"location":"Soetendaal 5A, 5821 BL Vierlingsbeek, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/13","hosts":["Outlands Festival"],"dateStart":"2024/06/21","dateEnd":"2024/06/23"},"2024-06-21-summer-sanctuary-2024":{"location":"1063 N Mt Vernon Ave, San Bernardino, CA 92411-2228, United States","countryCode":"US","continentCode":"NA","date":"2024/06/19","hosts":["Madhouse","L.A. Raves","Rave Hard"],"dateStart":"2024/06/21"},"2024-06-21-up-the-tempo-bounce-2024":{"location":"Heuvelring 94, Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["PKHS HARD","PKHS"],"dateStart":"2024/06/21"},"2024-06-21-volume-x-kragelund-festival-2024":{"location":"25884 Viöl, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/20","hosts":["Volume X Kragelund Festival"],"dateStart":"2024/06/21","dateEnd":"2024/06/23"},"2024-06-22-addicted-to-oldschool-2024":{"location":"Heuvelring 94, Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["PKHS HARD","PKHS"],"dateStart":"2024/06/22"},"2024-06-22-gabber-gala-2024":{"location":"Museumpark 18, 3015 CX Rotterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Rotterdamterrorcorps","PRSPCT Recordings","Hardcore Radio","DJ Distortion RTC"],"dateStart":"2024/06/22"},"2024-06-22-hardcore-italia-fight-for-your-right-2024":{"location":"Via Montichiari, 18, 25016 Ghedi BS, Italy","countryCode":"IT","continentCode":"EU","date":"2024/06/20","hosts":["Florida","Hardcore Italia","Original Core Events"],"dateStart":"2024/06/22"},"2024-06-22-hardstyle-takeover-gunz-4-hire-adaro-2024":{"location":"Technologiepark 11, 22946 Trittau, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/20","hosts":["Fun-Parc Trittau"],"dateStart":"2024/06/22"},"2024-06-22-welcome-to-wolf-city-2024":{"location":"99 Rue du Général Roguet, 92110 Clichy, France","countryCode":"FR","continentCode":"EU","date":"2024/06/19","hosts":["Amnexia"],"dateStart":"2024/06/22"},"2024-06-26-8th-annual-qsa-pre-defqon-meetup-2024":{"location":"Leidseplein 22 Amsterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/11","dateStart":"2024/06/26"},"2024-06-27-defqon-1-weekend-festival-2024":{"location":"Spijkweg 30, 8256 RJ Biddinghuizen, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/07/10","hosts":["Q-dance"],"dateStart":"2024/06/27","dateEnd":"2024/06/30","live":true},"2024-06-27-sunrise-festival-2024":{"location":"Visbeekdries, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/06/13","hosts":["Sunrise Festival"],"dateStart":"2024/06/27"},"2024-06-28-beach-party-by-nova-era-2024":{"location":"Perafita, Portugal","countryCode":"PT","continentCode":"EU","date":"2024/06/19","hosts":["BEACH PARTY by NOVA ERA"],"dateStart":"2024/06/28","dateEnd":"2024/06/29"},"2024-06-28-masif-mainstage-present-decadence-2024":{"location":"127-131 Liverpool St, Sydney NSW 2000, Australia","countryCode":"AU","continentCode":"OC","date":"2024/06/14","hosts":["Masif Events"],"dateStart":"2024/06/28"},"2024-06-29-boulevard-outdoor-2024":{"location":"Vriezenveenseweg 57, 7641 PE Wierden, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/13","hosts":["Boulevard Outdoor"],"dateStart":"2024/06/29"},"2024-06-29-galaxy-2024":{"location":"4067 W Pico Blvd, Los Angeles, CA 90019-4308, United States","countryCode":"US","continentCode":"NA","date":"2024/02/16","hosts":["Plur Eventz"],"dateStart":"2024/06/29"},"2024-06-29-parkcity-live-2024":{"location":"Bekkerweg 87B, 6417 BV Heerlen, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/19","hosts":["ParkCity Live"],"dateStart":"2024/06/29","dateEnd":"2024/06/30"},"2024-07-03-beats-for-love-2024":{"location":"Vítkovice, 703 00 Ostrava 3, Czech Republic","countryCode":"CZ","continentCode":"EU","date":"2024/06/19","hosts":["Beats For Love"],"dateStart":"2024/07/03","dateEnd":"2024/07/06"},"2024-07-04-electric-love-festival-2024":{"location":"Kurvenstandl, Salzburgring, 5321 Koppl, Austria","countryCode":"AT","continentCode":"EU","date":"2023/07/14","hosts":["Electric Love"],"dateStart":"2024/07/04","dateEnd":"2024/07/07"},"2024-07-04-hard-dance-nyc-presents-lady-faith-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/06/11","hosts":["Hard Dance NYC"],"dateStart":"2024/07/04"},"2024-07-05-karma-outdoor-2024":{"location":"Landsardseweg 37, 5513 PC Wintelre, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/19","hosts":["Karma"],"dateStart":"2024/07/05","dateEnd":"2024/07/06"},"2024-07-05-masif-presents-wasted-penguinz-2024":{"location":"127-131 Liverpool St, Sydney NSW 2000, Australia","countryCode":"AU","continentCode":"OC","date":"2024/06/14","hosts":["Masif Events"],"dateStart":"2024/07/05"},"2024-07-05-saga-festival-2024":{"location":"Romaero, Băneasa, Bucharest, Romania","countryCode":"RO","continentCode":"EU","date":"2024/06/20","hosts":["SAGA Festival"],"dateStart":"2024/07/05","dateEnd":"2024/07/07"},"2024-07-05-sibr-estival-2024":{"location":"Rue Des Berges Du Bî, Vaux-sur-Sûre, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/06/19","hosts":["Sibr'Estival"],"dateStart":"2024/07/05","dateEnd":"2024/07/06"},"2024-07-05-stereo-sunday-2024":{"location":"5913 AN Venlo, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/13","hosts":["Stereo Sunday"],"dateStart":"2024/07/05"},"2024-07-05-up-the-tempo-extreme-2024":{"location":"Heuvelring 94, Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["PKHS HARD","PKHS"],"dateStart":"2024/07/05"},"2024-07-05-wish-outdoor-2024":{"location":"Tuinstraat 28, 5741 EM Beek en Donk, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/13","hosts":["WiSH Outdoor","This is Live Group"],"dateStart":"2024/07/05","dateEnd":"2024/07/07"},"2024-07-06-dreamfields-festival-2024":{"location":"Lathum, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/13","hosts":["Dreamfields Festival","Matrixx"],"dateStart":"2024/07/06"},"2024-07-06-hardcore-gladiators-2024":{"location":"Im Lipperfeld 23, 46047 Oberhausen, Germany","countryCode":"DE","continentCode":"EU","date":"2024/01/31","hosts":["A.L.E.X. Events"],"dateStart":"2024/07/06"},"2024-07-06-q-dance-take-over-at-balaton-sound-2024":{"location":"Lake Balaton, Hungary","countryCode":"HU","continentCode":"EU","date":"2024/02/14","hosts":["Q-dance"],"dateStart":"2024/07/06"},"2024-07-07-dropzone-2024":{"location":"Slatinska ulica 91, HR-53291 Novalja, Hrvatska, Croatia","countryCode":"HR","continentCode":"EU","date":"2023/07/09","hosts":["Dropzone","Musical Madness"],"dateStart":"2024/07/07","dateEnd":"2024/07/12"},"2024-07-10-airbeat-one-festival-2024":{"location":"Neustadt-Glewe, Germany","countryCode":"DE","continentCode":"EU","date":"2023/07/16","hosts":["Airbeat One"],"dateStart":"2024/07/10","dateEnd":"2024/07/14"},"2024-07-12-basscon-presents-geo-2024":{"location":"919 4th Ave, San Diego, CA 92101-6109, United States","countryCode":"US","continentCode":"NA","date":"2024/06/19","hosts":["Basscon"],"dateStart":"2024/07/12"},"2024-07-12-chemistry-presents-element-birthday-bash-2024":{"location":"Heuvelring 39-05, 5038 CJ Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Chemistry Event"],"dateStart":"2024/07/12"},"2024-07-12-city-of-dance-festival-2024":{"location":"Zuidsingel 34A, 4331 RT Middelburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/19","hosts":["City of Dance"],"dateStart":"2024/07/12","dateEnd":"2024/07/14"},"2024-07-12-euphoria-war-present-raakmo-2024":{"location":"300 Lakehurst Rd, Waukegan, IL 60085-6602, United States","countryCode":"US","continentCode":"NA","date":"2024/06/19","hosts":["Euphoria Presents","R O C K Y","Wub Life Ent.","Rakim Garland"],"dateStart":"2024/07/12"},"2024-07-12-hype-o-dream-2024":{"location":"Waregem, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/06/19","hosts":["Hype O Dream"],"dateStart":"2024/07/12","dateEnd":"2024/07/13"},"2024-07-12-madness-presents-devin-wild-the-purge-imperatorz-2024":{"location":"Königstr. 49, Stuttgart, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/14","hosts":["Musical Madness"],"dateStart":"2024/07/12"},"2024-07-12-masif-mainstage-present-hard-trance-reunion-2024":{"location":"127-131 Liverpool St, Sydney NSW 2000, Australia","countryCode":"AU","continentCode":"OC","date":"2024/06/14","hosts":["Masif Events"],"dateStart":"2024/07/12"},"2024-07-12-so-whappy-festival-2024":{"location":"Brunehaut, Belgium","countryCode":"BE","continentCode":"EU","date":"2023/11/07","hosts":["So W'Happy Festival"],"dateStart":"2024/07/12","dateEnd":"2024/07/14"},"2024-07-13-fantasia-festival-2024":{"location":"Vossestraat 67, 9220 Hamme, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/06/13","hosts":["Fantasia Festival"],"dateStart":"2024/07/13"},"2024-07-13-infinity-festival-2024":{"location":"Busselsteeg 22, 5258 VG Berlicum, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/22","hosts":["Infinity Festival"],"dateStart":"2024/07/13","dateEnd":"2024/07/14"},"2024-07-13-matrixx-at-the-park-2024":{"location":"Kelfkensbos 60, 6511 TB Nijmegen, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/19","hosts":["Matrixx"],"dateStart":"2024/07/13","dateEnd":"2024/07/19"},"2024-07-13-vroeger-was-alles-beter-festival-2024":{"location":"Graafsebaan 133, 5248 NL Rosmalen, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/13","hosts":["Vroeger Was Alles Beter"],"dateStart":"2024/07/13"},"2024-07-14-electrobeach-festival-2024":{"location":"La Grande Plage, Le Barcarès, France","countryCode":"FR","continentCode":"EU","date":"2024/06/19","hosts":["Electrobeach Festival"],"dateStart":"2024/07/14","dateEnd":"2024/07/16"},"2024-07-19-dominator-festival-2024":{"location":"Buivensedreef 10, 5521 RN Eersel, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/07/15","hosts":["Art of Dance","Q-dance"],"dateStart":"2024/07/19","dateEnd":"2024/07/20"},"2024-07-19-havelbeats-festival-2024":{"location":"Schiffbauergasse 7, 14467 Potsdam, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/20","hosts":["Havelbeats Festival","Waschhaus Potsdam","Citybounce","Potsdam Bounce"],"dateStart":"2024/07/19","dateEnd":"2024/07/20"},"2024-07-19-hktn-presents-the-funfair-of-tempo-2024":{"location":"Heuvelring 94, Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["PKHS HARD","PKHS"],"dateStart":"2024/07/19"},"2024-07-19-parookaville-2024":{"location":"Nord-Ring 310, 47652 Weeze, Germany","countryCode":"DE","continentCode":"EU","date":"2023/07/24","hosts":["Parookaville"],"dateStart":"2024/07/19","dateEnd":"2024/07/21"},"2024-07-19-tomorrowland-weekend-1-2024":{"location":"Schommelei 1, 2850 Boom, Belgium","countryCode":"BE","continentCode":"EU","date":"2023/11/15","hosts":["Tomorrowland"],"dateStart":"2024/07/19","dateEnd":"2024/07/21","live":true},"2024-07-19-tomorrowland-weekend-2-2024":{"location":"Schommelei 1, 2850 Boom, Belgium","countryCode":"BE","continentCode":"EU","date":"2023/11/15","hosts":["Tomorrowland"],"dateStart":"2024/07/26","dateEnd":"2024/07/28","live":true},"2024-07-20-austria-goes-zrce-2024":{"location":"Slatinska ul. 89, 53291, Novalja, Croatia","countryCode":"HR","continentCode":"EU","date":"2024/06/19","hosts":["Austria goes ZRCE","Noa Beach Club","Aquarius Club","Papaya club"],"dateStart":"2024/07/20","dateEnd":"2024/07/27"},"2024-07-20-q-dance-take-over-at-sunrise-festival-2024":{"location":"78-111 Bagicz, Poland","countryCode":"PL","continentCode":"EU","date":"2024/03/14","hosts":["Q-dance"],"dateStart":"2024/07/20","dateEnd":"2024/07/22"},"2024-07-25-break-the-rules-festival-2024":{"location":"02943 Boxberg, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["Break the Rules - Offizielle Partyseite","ENERGY Sachsen","Partys Lausitz"],"dateStart":"2024/07/25","dateEnd":"2024/07/28"},"2024-07-26-heart-of-hard-presents-roza-2024":{"location":"Tachovské náměstí 5, Prague, Czech Republic","countryCode":"CZ","continentCode":"EU","date":"2024/06/14","hosts":["Heart of Hard","Storm Club Prague","Le Sana"],"dateStart":"2024/07/26"},"2024-07-26-open-beatz-festival-2024":{"location":"Puschendorfer Str. 2, 91074 Herzogenaurach, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/13","hosts":["Open Beatz Festival"],"dateStart":"2024/07/26"},"2024-07-26-wolf-boat-2024":{"location":"Prague, Czech Republic","countryCode":"CZ","continentCode":"EU","date":"2024/06/19","hosts":["X-Massacre Festival"],"dateStart":"2024/07/26"},"2024-07-27-bkjn-events-presents-major-conspiracy-2024":{"location":"Veemarktstraat 38C, 5038 CV Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["BKJN Events","Major Conspiracy"],"dateStart":"2024/07/27"},"2024-07-27-complex-festival-2024":{"location":"Vattenfall InCharge, Marathonweg, 6225 Maastricht, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Complex Maastricht","Doomslayer","Like Minded People","Native Tone","Claydrum"],"dateStart":"2024/07/27","dateEnd":"2024/07/28"},"2024-07-27-emotions-festival-2024":{"location":"Str. Montichiari, 18, 25016 Villaggio Belvedere BS, Italy","countryCode":"IT","continentCode":"EU","date":"2024/06/19","hosts":["Florida","INSOUND","Dorian Gray","Original Core Events"],"dateStart":"2024/07/27"},"2024-07-27-hard-dance-nyc-presents-neek-2024":{"location":"23 Meadow Street, Brooklyn, NY, United States","countryCode":"US","continentCode":"NA","date":"2024/06/19","hosts":["Hard Dance NYC"],"dateStart":"2024/07/27"},"2024-07-27-luna-beach-festival-2024":{"location":"Strand van Luna 1, 1704 ZZ Heerhugowaard, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/19","hosts":["Luna Beach","FG Live Heerhugowaard"],"dateStart":"2024/07/27"},"2024-07-27-supercharged-festival-2024":{"location":"Smaakexplosies, Middenweg, 1505 RK Zaandam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/19","hosts":["Gearbox Digital","Outlaw Events"],"dateStart":"2024/07/27"},"2024-08-01-nature-one-2024":{"location":"Raketenbasis Pydna 56218 Kastellaun, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/13","dateStart":"2024/08/01","dateEnd":"2024/08/04"},"2024-08-01-relevatez-festival-2024":{"location":"Glaubenbergstrasse, 6162 Entlebuch, Switzerland","countryCode":"CH","continentCode":"EU","date":"2023/08/07","hosts":["Ravefield"],"dateStart":"2024/08/01","dateEnd":"2024/08/03"},"2024-08-02-cantonale-fvjc-2024":{"location":"1271 Givrins, Switzerland","countryCode":"CH","continentCode":"EU","date":"2024/06/14","hosts":["Hardice"],"dateStart":"2024/08/02"},"2024-08-02-hard-mess-festival-2024":{"location":"France","countryCode":"FR","continentCode":"EU","date":"2024/02/26","hosts":[],"dateStart":"2024/08/02","dateEnd":"2024/08/04"},"2024-08-02-owl-festival-2024":{"location":"Magnus Stenbocks väg 29, 291 63 Kristianstad, Sweden","countryCode":"SE","continentCode":"EU","date":"2024/01/10","hosts":["F2D"],"dateStart":"2024/08/02","dateEnd":"2024/08/04"},"2024-08-02-weekend-festival-2024":{"location":"Valjakkotie 1, 00370 Espoo, Finland","countryCode":"FI","continentCode":"EU","date":"2024/06/19","hosts":["Weekend Festival"],"dateStart":"2024/08/02","dateEnd":"2024/08/03"},"2024-08-03-bavaria-goes-zrce-2024":{"location":"Slatinska ul. 89, 53291, Novalja, Croatia","countryCode":"HR","continentCode":"EU","date":"2024/06/19","hosts":["Bavaria goes ZRCE"],"dateStart":"2024/08/03","dateEnd":"2024/08/10"},"2024-08-03-rebellion-outdoor-festival-2024":{"location":"IJmeerdijk, Almere, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/11/25","hosts":["REBELLiON"],"dateStart":"2024/08/03"},"2024-08-03-shutdown-festival-2024":{"location":"Sonnenweg 1 3435 Zwentendorf an der Donau, Austria","countryCode":"AT","continentCode":"EU","date":"2024/06/13","hosts":["Shutdown Festival"],"dateStart":"2024/08/03"},"2024-08-03-timeless-festival-2024":{"location":"Rue de la Sauvenière 17, 5580 Rochefort, Belgium","countryCode":"BE","continentCode":"EU","date":"2023/08/14","hosts":["Timeless Festival"],"dateStart":"2024/08/03","dateEnd":"2024/08/04"},"2024-08-04-hardcore-at-sea-2024":{"location":"Bloemendaal, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["BKJN Events"],"dateStart":"2024/08/04"},"2024-08-07-medusa-festival-2024":{"location":"Playa de Cullera 46400 Cullera, Spain","countryCode":"ES","continentCode":"EU","date":"2024/06/19","hosts":["Medusa Festival"],"dateStart":"2024/08/07","dateEnd":"2024/08/12"},"2024-08-08-q-dance-take-over-at-sziget-festival-2024":{"location":"Budapest Óbuda, Hungary","countryCode":"HU","continentCode":"EU","date":"2024/03/14","hosts":["Q-dance"],"dateStart":"2024/08/08"},"2024-08-09-electrisize-festival-2024":{"location":"41812 Erkelenz, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/13","hosts":["Electrisize"],"dateStart":"2024/08/09"},"2024-08-09-the-qontinent-2024":{"location":"Craenendam 1, 9185 Wachtebeke, Belgium","countryCode":"BE","continentCode":"EU","date":"2023/12/20","hosts":["Bass Events","Q-dance"],"dateStart":"2024/08/09","dateEnd":"2024/08/11"},"2024-08-10-shangri-la-festival-2024":{"location":"Zegerplas, Westkanaalweg, 2403 Alphen aan den Rijn, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Team Gabber Events"],"dateStart":"2024/08/10"},"2024-08-14-fm4-frequency-festival-2024":{"location":"Kelsengasse 9, 3100 St. Pölten, Austria","countryCode":"AT","continentCode":"EU","date":"2024/06/19","hosts":["Frequency Festival"],"dateStart":"2024/08/14","dateEnd":"2024/08/17"},"2024-08-16-decibel-outdoor-festival-2024":{"location":"Hilvarenbeek, Safaripark, 5081 NJ Hilvarenbeek, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/08/20","hosts":["b2s"],"dateStart":"2024/08/16","dateEnd":"2024/08/18"},"2024-08-16-echelon-festival-2024":{"location":"Otto-Wels-Straße 2, 83043 Bad Aibling, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["Echelon Festival"],"dateStart":"2024/08/16","dateEnd":"2024/08/18"},"2024-08-17-hardstyle-maniacs-presents-go-hard-2024":{"location":"501 S Mill Ave, Tempe, AZ 85281-3612, United States","countryCode":"US","continentCode":"NA","date":"2024/06/19","hosts":["Hardstyle Maniacs"],"dateStart":"2024/08/17"},"2024-08-22-creamfields-2024":{"location":"Daresbury, WA4 5LP Daresbury, United Kingdom","countryCode":"GB","continentCode":"EU","date":"2024/06/20","hosts":["Creamfields"],"dateStart":"2024/08/22","dateEnd":"2024/08/25"},"2024-08-22-hell-festival-2024":{"location":"Lindenstraße 56, 06536 Berga, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["HELL FESTIVAL"],"dateStart":"2024/08/22","dateEnd":"2024/08/25"},"2024-08-22-loco-beach-2024":{"location":"T4A, Nurburgring, Nürburgring Boulevard 1, 53520 Nürburg, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["Loco Beach - das verrückte Partyfestival"],"dateStart":"2024/08/22","dateEnd":"2024/08/25"},"2024-08-23-electrolapse-festival-2024":{"location":"26210 Saint-Sorlin-en-Valloire, France","countryCode":"FR","continentCode":"EU","date":"2024/06/20","hosts":["Électrolapse"],"dateStart":"2024/08/23","dateEnd":"2024/08/24"},"2024-08-23-fabulous-festival-2024":{"location":"980 Chemin de Pellausy, 31340 Villemur-sur-Tarn, France","countryCode":"FR","continentCode":"EU","date":"2024/06/20","hosts":["Fabulous Festival","KARNAGE RECORDS","KARNAGE PRODUCTIONS","N Production","Plein Phare"],"dateStart":"2024/08/23","dateEnd":"2024/08/25"},"2024-08-23-rustyland-boat-rave-2024":{"location":"Große Elbstraße 9, 22767 Hamburg, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/18","hosts":["Rustyland Festival"],"dateStart":"2024/08/23"},"2024-08-23-sana-duri-2024":{"location":"Frihamnen 3, 417 70 Göteborg, Sweden","countryCode":"SE","continentCode":"EU","date":"2024/06/19","hosts":["Sana Duri - The Hard Sound Festival"],"dateStart":"2024/08/23","dateEnd":"2024/08/24"},"2024-08-24-kickerz-festival-2024":{"location":"Westervoortsedijk 124, 6827 AX Arnhem, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/19","hosts":["Future of Hardstyle"],"dateStart":"2024/08/24"},"2024-08-25-forbidden-island-2024":{"location":"Slatinska ul. 89, 53291, Novalja, Croatia","countryCode":"HR","continentCode":"EU","date":"2023/09/01","hosts":["BKJN Events"],"dateStart":"2024/08/25","dateEnd":"2024/08/29"},"2024-08-30-basscon-wasteland-2024":{"location":"689 S E St, San Bernardino, CA 92408, United States","countryCode":"US","continentCode":"NA","date":"2024/03/23","hosts":["Basscon"],"dateStart":"2024/08/30","dateEnd":"2024/08/31"},"2024-08-30-glemmer-beach-2024":{"location":"Plattedijk 1, 8531 PB Lemmer, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/19","hosts":["Glemmer"],"dateStart":"2024/08/30","dateEnd":"2024/08/31"},"2024-08-30-into-the-madness-2024":{"location":"Am Wassersportsee 7, 53909 Zülpich, Germany","countryCode":"DE","continentCode":"EU","date":"2023/09/06","hosts":["Musical Madness"],"dateStart":"2024/08/30","dateEnd":"2024/09/01"},"2024-08-30-mysteryland-2024":{"location":"Haarlemmermeer, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/04/27","hosts":["Mysteryland"],"dateStart":"2024/08/30","dateEnd":"2024/09/01"},"2024-08-31-affenkafig-festival-2024":{"location":"Am Flugplatz, Mendig, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["Affenkäfig","Rheinaudio"],"dateStart":"2024/08/31","dateEnd":"2024/09/01"},"2024-08-31-ground-zero-festival-2024":{"location":"Kneuterstraat 21, 7384 CT Wilp, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/11/17","hosts":["Ground Zero Festival"],"dateStart":"2024/08/31"},"2024-09-04-delta-festival-2024":{"location":"6 Rue des Fabres, 13001 Marseille, France","countryCode":"FR","continentCode":"EU","date":"2024/06/20","hosts":["DELTA Festival"],"dateStart":"2024/09/04","dateEnd":"2024/09/08"},"2024-09-07-dedikted-the-desolated-world-2024":{"location":"Avenida Ferronales Poniente 8, Cuautitlán, Mexico","countryCode":"MX","continentCode":"NA","date":"2024/06/14","hosts":["DediKted"],"dateStart":"2024/09/07"},"2024-09-07-hakkuh-voor-kids-2024":{"location":"Zwarteweg 90, 1431 VM Aalsmeer, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["EARLY GABBERS Events"],"dateStart":"2024/09/07"},"2024-09-07-pokke-herrie-2024":{"location":"Im Lipperfeld 23, 46047 Oberhausen, Germany","countryCode":"DE","continentCode":"EU","date":"2024/03/03","hosts":["A.L.E.X. Events"],"dateStart":"2024/09/07"},"2024-09-07-sunglow-2024":{"location":"Vrouwe Huisjesweg 1, 3271 LX Mijnsheerenland, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Sunglow Festival"],"dateStart":"2024/09/07"},"2024-09-07-the-hardest-presents-the-ultimate-battles-2024":{"location":"Ruiterskwartier 41, Leeuwarden, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/07","hosts":["The Hardest"],"dateStart":"2024/09/07"},"2024-09-14-dream-village-2024":{"location":"Lage Aard 7-1, 4854 NM Bavel, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Dream Village"],"dateStart":"2024/09/14"},"2024-09-14-supremacy-2024":{"location":"Batavierenweg 25, 6841 HN Arnhem, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/15","hosts":["Art of Dance"],"dateStart":"2024/09/14"},"2024-09-20-august-hall-presents-da-tweekaz-2024":{"location":"420 Mason St, San Francisco, CA 94102, United States","countryCode":"US","continentCode":"NA","date":"2024/06/19","hosts":["August Hall"],"dateStart":"2024/09/20"},"2024-09-20-hardstylemania-presents-ran-d-imperatorz-unicorn-on-ketamine-2024":{"location":"Zur Fuchsfarm 1, 29227 Celle, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["Inkognito Celle"],"dateStart":"2024/09/20"},"2024-09-20-infamous-armada-2024":{"location":"Air Nature Ballon, 22120 Quessoy, France","countryCode":"FR","continentCode":"EU","date":"2024/06/20","hosts":["Infamous Armada","Collectif Interface","T.lesco.P Sound System","TEK-HILARANT Sound-System"],"dateStart":"2024/09/20","dateEnd":"2024/09/22"},"2024-09-21-captain-hardstyle-2024":{"location":"Romanshorn, 8590, Switzerland","countryCode":"CH","continentCode":"EU","date":"2023/09/26","hosts":["Project Hardstyle CH"],"dateStart":"2024/09/21"},"2024-09-21-insomnia-part-iv-2024":{"location":"Olympiaweg 2A, Alphen aan den Rijn, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Team Gabber Events"],"dateStart":"2024/09/21"},"2024-09-21-titanium-festival-2024":{"location":"Middelwaard 2, 4133 LB Vianen, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/09/01","hosts":["BKJN Events"],"dateStart":"2024/09/21"},"2024-09-28-energy-festival-2024":{"location":"Av. Thomas Edison 2, 7000 Mons, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/06/20","hosts":["Energy Festival"],"dateStart":"2024/09/28"},"2024-09-28-volle-gaas-in-dixies-2024":{"location":"Pauwelslei 18, 2930 Brasschaat, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/06/13","dateStart":"2024/09/28"},"2024-10-05-a-nightmare-in-rotterdam-2024":{"location":"Ahoyweg 10, 3084 BA Rotterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/10/07","hosts":["b2s"],"dateStart":"2024/10/05"},"2024-10-05-gearbox-presents-overdrive-2-2024":{"location":"Lardinoisstraat 8, 5611 ZZ Eindhoven, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Gearbox Digital","Overdrive Digital"],"dateStart":"2024/10/05"},"2024-10-05-knockout-outdoor-2024":{"location":"SKODA Stadium, Grand Pde, Sydney Olympic Park NSW 2127, Australia","countryCode":"AU","continentCode":"OC","date":"2024/06/13","hosts":["HSU"],"dateStart":"2024/10/05"},"2024-10-05-syndicate-2024":{"location":"Westfalenhallen Dortmund, Dortmund, Germany","countryCode":"DE","continentCode":"EU","date":"2023/10/07","hosts":["Art of Dance"],"dateStart":"2024/10/05"},"2024-10-11-phobia-2024":{"location":"Phoenix, Arizona, United States","countryCode":"US","continentCode":"NA","date":"2024/06/20","hosts":["SDK Events","Arizona Hardcore Junkies"],"dateStart":"2024/10/11"},"2024-10-12-elektrum-festival-2024":{"location":"Velder 14, 5298 MB Liempde, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Elektrum Festival"],"dateStart":"2024/10/12"},"2024-10-12-team-gabber-invites-north-gabber-2024":{"location":"Olympiaweg 2A, 2406 LG Alphen aan den Rijn, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Team Gabber Events"],"dateStart":"2024/10/12"},"2024-10-13-hardmission-thailand-2024":{"location":"88 Debaratna Rd, Bang Na Tai, Bang Na, Bangkok 10260, Thailand","countryCode":"TH","continentCode":"AS","date":"2024/06/14","hosts":["Weareonthemissionasia","Evolution Events Asia","Fourfront Entertainment Asia","UNITED MUSIC","Hardmission"],"dateStart":"2024/10/13"},"2024-10-13-this-is-sefa-2024":{"location":"Oberhausen, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/14","hosts":["Inurfase","Musical Madness"],"dateStart":"2024/10/13"},"2024-10-16-dirty-workz-presents-dirty-by-nature-2024":{"location":"Oostelijke Handelskade 4, Amsterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["E&A Events","Panama Amsterdam","Dirty Workz"],"dateStart":"2024/10/16"},"2024-10-25-king-of-the-pieps-2024":{"location":"Güterbahnhofstrasse 4 9000 Saint Gallen, Switzerland","countryCode":"CH","continentCode":"EU","date":"2024/02/09","hosts":["Project Hardstyle CH"],"dateStart":"2024/10/25"},"2024-10-26-braindead-halloween-2024":{"location":"Heuvelring 94, 5038 CL Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["PKHS","La gabba","Kickaddict","PKHS HARD"],"dateStart":"2024/10/26"},"2024-10-26-karma-indoor-2024":{"location":"Theo Koomenlaan 1, 5644 HZ Eindhoven, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/19","hosts":["Karma"],"dateStart":"2024/10/26"},"2024-10-31-dream-nation-festival-2024":{"location":"Le Vieux Marché Ga5a, 93420 Villepinte, France","countryCode":"FR","continentCode":"EU","date":"2024/06/20","hosts":["DREAM NATION FESTIVAL"],"dateStart":"2024/10/31","dateEnd":"2024/11/02"},"2024-10-31-halloween-dancing-dead-3":{"location":"Filder Straße 304, 47447 Moers, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/19","hosts":["Heaven & Hill Festival"],"dateStart":"2024/10/31"},"2024-10-31-sub-zero-project-halloween-special-2024":{"location":"Rijnkaai 150, 2000 Antwerpen, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/03/18","hosts":["Bass Events"],"dateStart":"2024/10/31"},"2024-11-02-5-years-of-team-gabber-2024":{"location":"Olympiaweg 2A, 2406 LG Alphen aan den Rijn, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Team Gabber Events"],"dateStart":"2024/11/02"},"2024-11-02-rawness-hypnotic-disorder-2024":{"location":"Heuvelring 116, 5038 CL Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/13","hosts":["Rawness Events"],"dateStart":"2024/11/02"},"2024-11-02-snakepit-2024":{"location":"Restauratie Atelier Eindhoven, schilderijen, Klokgebouw, 5617 AC Eindhoven, Netherlands","countryCode":"NL","continentCode":"EU","date":"2023/11/05","hosts":["Art of Dance","b2s"],"dateStart":"2024/11/02"},"2024-11-08-solareclipse-2024":{"location":"Trivium 170, Etten-Leur, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Galacticmaze"],"dateStart":"2024/11/08"},"2024-11-09-a-nightmare-in-germany-2024":{"location":"Mülheimer Str. 4 46049 Oberhausen, Germany","countryCode":"DE","continentCode":"EU","date":"2024/02/22","hosts":["A.L.E.X. Events"],"dateStart":"2024/11/09"},"2024-11-09-jay-reeve-presents-melodic-madness-2024":{"location":"Veemarktstraat 44, 5038 CV Tilburg, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/03","hosts":["REBiRTH Festival"],"dateStart":"2024/11/09"},"2024-11-09-raving-nightmare-2024":{"location":"Griend 7, 6221 AJ Maastricht, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/21","hosts":["Raving Nightmare"],"dateStart":"2024/11/09"},"2024-11-15-imagination-festival-2024":{"location":"Beranových 667 199 00 Prague, Czech Republic","countryCode":"CZ","continentCode":"EU","date":"2023/02/01","hosts":["Beatworx","Devastator Events"],"dateStart":"2024/11/15"},"2024-11-16-qlimax-2024":{"location":"Batavierenweg 25, 6841 HN Arnhem, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/01","hosts":["Q-dance"],"dateStart":"2024/11/16","live":true},"2024-11-22-imagination-festival-2024":{"location":"Beranových 667 199 00 Prague, Czech Republic","countryCode":"CZ","continentCode":"EU","date":"2023/02/01","hosts":["Beatworx","Devastator Events"],"dateStart":"2024/11/22"},"2024-11-23-masters-of-hardcore-uk-2024":{"location":"Victoria Warehouse WHP, Trafford Wharf Road, Manchester, M17 1, United Kingdom","countryCode":"GB","continentCode":"EU","date":"2024/06/20","hosts":["Masters of Hardcore","Hellfire"],"dateStart":"2024/11/23"},"2024-11-23-rebellion-indoor-festival-2024":{"location":"Kreitweg 1, 5076 NN Haaren, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/02/19","hosts":["REBELLiON"],"dateStart":"2024/11/23"},"2024-11-30-dimitri-k-sacrifice-day-2024":{"location":"Bavelseparklaan, Breda, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["BKJN Events"],"dateStart":"2024/11/30"},"2024-12-07-electric-sea-festival-2024":{"location":"Zur Hansemesse 1, 18106 Rostock, Deutschland, Germany","countryCode":"DE","continentCode":"EU","date":"2023/12/11","hosts":["Airbeat One"],"dateStart":"2024/12/07","dateEnd":"2024/12/08"},"2024-12-07-reminder-artist-special-2024":{"location":"Hemkade 48, Zaandam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Reminder - Hardstyle 2006/2011","Hardstyle Classics Lovers","Hardclassics"],"dateStart":"2024/12/07"},"2024-12-07-route-909-exit-6-2024":{"location":"Homburg 26, Beesd, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Team Gabber Events","Club Rodenburg"],"dateStart":"2024/12/07"},"2024-12-07-unity-2024":{"location":"Hohlstrasse 457 8048 Zürich, Switzerland","countryCode":"CH","continentCode":"EU","date":"2024/02/21","hosts":["Project Hardstyle CH"],"dateStart":"2024/12/07"},"2024-12-14-shockerz-2024":{"location":"Graafsebaan 133, 5248 NL Rosmalen, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/01/31","hosts":["Shockerz"],"dateStart":"2024/12/14"},"2024-12-21-hardmission-prague-2024":{"location":"Za Elektrárnou 419/1, 170 00 Praha 7-Bubeneč, Czech Republic","countryCode":"CZ","continentCode":"EU","date":"2024/06/14","hosts":["Hardmission"],"dateStart":"2024/12/21"},"2024-12-21-pat-b-birthday-bash-xxl-2024":{"location":"Lotto Arena, Schijnpoortweg 119, 2170 Antwerpen, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/02/29","hosts":["Bass Events"],"dateStart":"2024/12/21"},"2024-12-28-megarave-the-millennium-edition-2024":{"location":"Rodesk B.V., Maashaven Z.z 5, 3081 AE Rotterdam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/20","hosts":["Megarave","Hardtunes","Rigeshop","Hardcore Radio","Rige Bookings","Rige music"],"dateStart":"2024/12/28"},"2025-01-25-snowbass-festival-2025":{"location":"Hemkade 48, 1506 PS Zaandam, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Snowbass Festival","Outlaw Events"],"dateStart":"2025/01/25"},"2025-02-01-apex-2025":{"location":"Xaver-Fuhr-Straße 115, 68165 Mannheim, Germany","countryCode":"DE","continentCode":"EU","date":"2024/06/14","hosts":["APEX Mannheim","Musical Madness"],"dateStart":"2025/02/01"},"2025-02-01-ravezone-2025":{"location":"Lardinoisstraat 8, Eindhoven, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Ravezone","X Factor Events","X-Factor Events","Harmony of Hardcore"],"dateStart":"2025/02/01"},"2025-02-14-reverze-2025":{"location":"Schijnpoortweg 113, 2170 Antwerpen, Belgium","countryCode":"BE","continentCode":"EU","date":"2024/03/04","hosts":["Bass Events"],"dateStart":"2025/02/14","dateEnd":"2025/02/15"},"2025-03-29-masters-of-hardcore-2025":{"location":"Diezekade 2, 5222 AK 's-Hertogenbosch, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/03/30","hosts":["Art of Dance","Masters of Hardcore"],"dateStart":"2025/03/29"},"2025-04-18-paaspop-2025":{"location":"Schijndel, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Paaspop"],"dateStart":"2025/04/18"},"2025-06-07-harmony-of-hardcore-2025":{"location":"Dieperskant 24, 5469 PB Erp, Netherlands","countryCode":"NL","continentCode":"EU","date":"2024/06/14","hosts":["Harmony of Hardcore"],"dateStart":"2025/06/07"}} \ No newline at end of file diff --git a/apps/remix/app/data/filter.ts b/apps/remix/app/data/filter.ts new file mode 100644 index 0000000..42c7c0f --- /dev/null +++ b/apps/remix/app/data/filter.ts @@ -0,0 +1,15 @@ +import type { CountryCodes, ContinentCodes } from "./countries"; + +export type FileFilterIndex = { + location: string | undefined; + countryCode?: CountryCodes; + continentCode?: ContinentCodes; + hosts?: string[]; + live?: boolean; + date: string; + dateStart: string; + dateEnd?: string; +}; + +// TODO: Maybe have stricter types for id with const +export type FileFilterIndexFile = Record; diff --git a/apps/remix/app/data/hosts.json b/apps/remix/app/data/hosts.json new file mode 100644 index 0000000..e1f8c6e --- /dev/null +++ b/apps/remix/app/data/hosts.json @@ -0,0 +1 @@ +["2HARD","A.L.E.X. Events","APEX Mannheim","Affenkäfig","Airbeat One","Amnexia","Aquarius Club","Arizona Hardcore Junkies","Art of Dance","August Hall","Austria goes ZRCE","BEACH PARTY by NOVA ERA","BKJN Events","Bass Events","Basscon","Bavaria goes ZRCE","Beats For Love","Beatworx","Boulevard Outdoor","Break the Rules - Offizielle Partyseite","Chemistry Event","City of Dance","Citybounce","Claydrum","Club Rodenburg","Collectif Interface","Complex Maastricht","Creamfields","DELTA Festival","DJ Distortion RTC","DREAM NATION FESTIVAL","DediKted","Devastator Events","Dirty Epic","Dirty Workz","Doomslayer","Dorian Gray","Dream Village","Dreamfields Festival","Dropzone","E&A Events","EARLY GABBERS Events","ENERGY Sachsen","Echelon Festival","Electric Love","Electrifinity Festival","Electrisize","Electrobeach Festival","Elektrum Festival","Emporium","Energy Festival","Epic Entertainment","Euphoria Presents","Evolution Events Asia","Extinction","F2D","FABRIK","FG Live Heerhugowaard","Fabulous Festival","Fantasia Festival","Florida","Fourfront Entertainment Asia","Frequency Festival","Freshtival","Fun-Parc Trittau","Future of Hardstyle","Galacticmaze","Gearbox Digital","Glemmer","Ground Zero Festival","HARDFEST","HARDGATE","HELL FESTIVAL","HSU","HSU Events","Hard Dance NYC","Hardclassics","Hardcore Italia","Hardcore Radio","Hardice","Hardmission","Hardstyle Classics Lovers","Hardstyle DNA","Hardstyle Maniacs","Hardtrackerz Evt","Hardtunes","Harmony of Hardcore","Havelbeats Festival","Heart of Hard","Heaven & Hill Festival","Hellfire","High Energy Events","Hype O Dream","I AM HARDSTYLE","INSOUND","Infamous Armada","Infinity Festival","Inkognito Celle","Inurfase","KARNAGE PRODUCTIONS","KARNAGE RECORDS","Karma","Kickaddict","L.A. Raves","La gabba","Le Sana","Let it out events","Like Minded People","Loco Beach - das verrückte Partyfestival","Luna Beach","MYK Events","Madhouse","Major Conspiracy","Masif Events","Masters of Hardcore","Matrixx","Medusa Festival","Megarave","Mission Festival","Multigroove","Musical Madness","Mysteryland","N Production","Native Tone","Noa Beach Club","Open Beatz Festival","Original Core Events","Outlands Festival","Outlaw Events","Overdrive Digital","Overloud Events","PKHS","PKHS HARD","PKHS Hard","PRSPCT Recordings","Paaspop","Panama Amsterdam","Papaya club","ParkCity Live","Parookaville","Partys Lausitz","Permanent","Plein Phare","Plur Eventz","Potsdam Bounce","Project Hardstyle CH","Q-dance","R O C K Y","REBELLiON","REBiRTH Festival","Rakim Garland","Rave Hard","Ravefield","Ravezone","Raving Nightmare","Ravingz Bass","Rawfare","Rawness Events","Recharged","Reminder","Reminder - Hardstyle 2006/2011","Rheinaudio","Rige Bookings","Rige music","Rigeshop","Rotterdamterrorcorps","Ruggengraatjes","Rustyland Festival","SAGA Festival","SD Hardstylerz","SDK Events","Sana Duri - The Hard Sound Festival","Shockerz","Shutdown Festival","Sibr'Estival","Singularity","Snowbass Festival","So W'Happy Festival","Soundtek","State of Bass","Stereo Sunday","Storm Club Prague","Sunglow Festival","Sunrise Festival","Supersized Kingsday","Supersized Kingsday Festival","T.lesco.P Sound System","TEK-HILARANT Sound-System","Team Gabber Events","The Hardest","This Is Live Group","This is Live Group","Timeless Festival","Tomorrowland","UNITED MUSIC","Ultimate Bassline Festival","Ultra Worldwide","Underground Syndicate","Volume X Kragelund Festival","Vroeger Was Alles Beter","Waschhaus Potsdam","Weareonthemissionasia","Weekend Festival","WiSH Outdoor","Wub Life Ent.","X Factor Events","X-Factor Events","X-Massacre Festival","b2s","Électrolapse"] \ No newline at end of file diff --git a/apps/remix/app/entry.client.tsx b/apps/remix/app/entry.client.tsx new file mode 100644 index 0000000..305d71b --- /dev/null +++ b/apps/remix/app/entry.client.tsx @@ -0,0 +1,18 @@ +/** + * By default, Remix will handle hydrating your app on the client for you. + * You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨ + * For more information, see https://remix.run/file-conventions/entry.client + */ + +import { RemixBrowser } from "@remix-run/react"; +import { startTransition, StrictMode } from "react"; +import { hydrateRoot } from "react-dom/client"; + +startTransition(() => { + hydrateRoot( + document, + + + , + ); +}); diff --git a/apps/remix/app/entry.server.tsx b/apps/remix/app/entry.server.tsx new file mode 100644 index 0000000..5e213e2 --- /dev/null +++ b/apps/remix/app/entry.server.tsx @@ -0,0 +1,140 @@ +/** + * By default, Remix will handle generating the HTTP Response for you. + * You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨ + * For more information, see https://remix.run/file-conventions/entry.server + */ + +import { PassThrough } from "node:stream"; + +import type { AppLoadContext, EntryContext } from "@remix-run/node"; +import { createReadableStreamFromReadable } from "@remix-run/node"; +import { RemixServer } from "@remix-run/react"; +import { isbot } from "isbot"; +import { renderToPipeableStream } from "react-dom/server"; + +const ABORT_DELAY = 5_000; + +export default function handleRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + remixContext: EntryContext, + // This is ignored so we can keep it in the template for visibility. Feel + // free to delete this parameter in your app if you're not using it! + // eslint-disable-next-line @typescript-eslint/no-unused-vars + loadContext: AppLoadContext, +) { + return isbot(request.headers.get("user-agent") || "") + ? handleBotRequest( + request, + responseStatusCode, + responseHeaders, + remixContext, + ) + : handleBrowserRequest( + request, + responseStatusCode, + responseHeaders, + remixContext, + ); +} + +function handleBotRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + remixContext: EntryContext, +) { + return new Promise((resolve, reject) => { + let shellRendered = false; + const { pipe, abort } = renderToPipeableStream( + , + { + onAllReady() { + shellRendered = true; + const body = new PassThrough(); + const stream = createReadableStreamFromReadable(body); + + responseHeaders.set("Content-Type", "text/html"); + + resolve( + new Response(stream, { + headers: responseHeaders, + status: responseStatusCode, + }), + ); + + pipe(body); + }, + onShellError(error: unknown) { + reject(error); + }, + onError(error: unknown) { + responseStatusCode = 500; + // Log streaming rendering errors from inside the shell. Don't log + // errors encountered during initial shell rendering since they'll + // reject and get logged in handleDocumentRequest. + if (shellRendered) { + console.error(error); + } + }, + }, + ); + + setTimeout(abort, ABORT_DELAY); + }); +} + +function handleBrowserRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + remixContext: EntryContext, +) { + return new Promise((resolve, reject) => { + let shellRendered = false; + const { pipe, abort } = renderToPipeableStream( + , + { + onShellReady() { + shellRendered = true; + const body = new PassThrough(); + const stream = createReadableStreamFromReadable(body); + + responseHeaders.set("Content-Type", "text/html"); + + resolve( + new Response(stream, { + headers: responseHeaders, + status: responseStatusCode, + }), + ); + + pipe(body); + }, + onShellError(error: unknown) { + reject(error); + }, + onError(error: unknown) { + responseStatusCode = 500; + // Log streaming rendering errors from inside the shell. Don't log + // errors encountered during initial shell rendering since they'll + // reject and get logged in handleDocumentRequest. + if (shellRendered) { + console.error(error); + } + }, + }, + ); + + setTimeout(abort, ABORT_DELAY); + }); +} diff --git a/apps/remix/app/root.tsx b/apps/remix/app/root.tsx new file mode 100644 index 0000000..8a1add3 --- /dev/null +++ b/apps/remix/app/root.tsx @@ -0,0 +1,94 @@ +import { + Links, + Meta, + Outlet, + Scripts, + ScrollRestoration, + json, + useRouteError, + useRouteLoaderData, +} from "@remix-run/react"; + +import type { LinksFunction, LoaderFunctionArgs } from "@remix-run/node"; + +import appStylesHref from "./styles/style.css?url"; +import appStyles1Href from "./styles/style1.css?url"; +import averageColors from "./data/average-colors"; +import type { CSSProperties } from "react"; +import "@itwin/itwinui-react/styles.css"; +import styles from "./styles/routes/root.module.css"; + +export const links: LinksFunction = () => [ + { rel: "stylesheet", href: appStylesHref }, + { rel: "stylesheet", href: appStyles1Href }, +]; + +export async function loader({ params }: LoaderFunctionArgs) { + return json({ + ENV: Object.fromEntries( + ["VITE_MK", "VITE_WSR", "VITE_WSC"].map((key) => [ + key, + import.meta.env[key], + ]), + ), + averageColor: + averageColors[(params.eventId ?? "").slice("yyyy-mm-dd-".length)], + }); +} + +export function Layout({ children }: { children: React.ReactNode }) { + // const data = useLoaderData(); + const data = useRouteLoaderData("root"); + + return ( + + + + + + +