├── .babelrc ├── .editorconfig ├── .eslintrc.json ├── .gitignore ├── .nvmrc ├── .prettierrc ├── README.md ├── antwar.bootstrap.js ├── antwar.config.js ├── assets ├── extra │ ├── CNAME │ ├── _redirects │ ├── favicon.ico │ ├── favicon.png │ └── meta-image.png ├── fonts │ ├── finlandica-bold.eot │ ├── finlandica-bold.ttf │ ├── finlandica-bold.woff │ ├── finlandica-bold.woff2 │ ├── finlandica-regular.eot │ ├── finlandica-regular.ttf │ ├── finlandica-regular.woff │ └── finlandica-regular.woff2 └── img │ ├── 0__Y4UPv2ALNKFdlvy2.jpg │ ├── 0__gu03jXqzYBgzz4Ei.jpg │ ├── 1__0__5Rkm__2Nxg7uYv6H4LBJg.jpeg │ ├── 1__0kjyBJoc3OeU__XwvjpdVjw.jpeg │ ├── 1__1jtCSqZW2LKZzDgj8UxY2g.jpeg │ ├── 1__2KKfYoHfrYY7yqO4pHfFhA.jpeg │ ├── 1__2mHylzaFJgLYdvMd6XyxGw.jpeg │ ├── 1__34wNixshnoIw8s5ZqlyK9g.jpeg │ ├── 1__3W1tDzg0qVe1a9eKp7xyAQ.jpeg │ ├── 1__43dWDPRr__2EGgoeLRGNX7Q.jpeg │ ├── 1__5LvmVDxnv128Z2__PFeTuew.jpeg │ ├── 1__5X8QAgunoLAxiSozJJL5gg.png │ ├── 1__61Ub71rYGRhiWpnmiwOQgg.jpeg │ ├── 1__61eIhGvdILUjZG6am8Gzyw.jpeg │ ├── 1__7Vg0H2b6uMKK3k__06Hpm3A.jpeg │ ├── 1__7YX1BmzKa__e__rTJAcn3S3g.jpeg │ ├── 1__7psRiZEqhiQPTK4l2__eFGA.jpeg │ ├── 1__7qHfDJwyBpUcpmvi2QUdHw.jpeg │ ├── 1__8iL0G5xC2QRlzRBJraCFLg.jpeg │ ├── 1__9i1MqXdiip__WnNL____xv34w.png │ ├── 1__9sEUxAIOAmFBa83fmBqN3g.jpeg │ ├── 1__9ybC__WlvGhSoRotiupbrPA.jpeg │ ├── 1__Bbz5AXnUoiqbvb9kX1Mj__w.jpeg │ ├── 1__BwhQBaKTWp99JQw3d1OobA.jpeg │ ├── 1__C4MT6SgNoC4lKeypStcHFg.jpeg │ ├── 1__CK0mQjZxkRUSAszZnU8fpQ.jpeg │ ├── 1__CV4____75EuwGzJXQ4KCojKw.jpeg │ ├── 1__D3FFNbADI8uoMUKs3kDyDg.jpeg │ ├── 1__D8tSAbFmsy9gz0nwqdV__Tg.jpeg │ ├── 1__DJAej0__DUNwSB1XjDw4R7w.png │ ├── 1__DLhdGf8LMUNOXrNp__B93Qg.jpeg │ ├── 1__DhRYGnHVB15BmYkARbyrVg.png │ ├── 1__E2rLy8BY5lmeJGRFwPUKYg.jpeg │ ├── 1__FPGz5UNa__bL__8yQ4oeyzUg.jpeg │ ├── 1__FPpz__vC3KNP4hDTUCSBCIg.jpeg │ ├── 1__FkXxlbvDlwSZQYcm5FHkhA.jpeg │ ├── 1__Fw77gTcsoHxSrEd7nDrRnw.jpeg │ ├── 1__GAqrw1XMgdNdsAfTk__YqPA.jpeg │ ├── 1__GGmsiw6zGy4HNEJ1Xfwnvw.png │ ├── 1__GMr54NOSXiGSttSdAGFQMg.jpeg │ ├── 1__GQl43DfLpSgJpQ0GTxS__CQ.jpeg │ ├── 1__GSCVwnK1mU96AayUlW1xnQ.jpeg │ ├── 1__HTo3XXrjH1SpPV7WuTwntQ.jpeg │ ├── 1__HVnU__bNF3SLbZoWZHqKYhw.png │ ├── 1__HwGJxXZnlIZV__7U3__7__Rbw.jpeg │ ├── 1__InQ701dzcChwaDSAJ8OEpg.jpeg │ ├── 1__J09MJ8ultNBVPr__HaeYEIg.jpeg │ ├── 1__JQcprsHCEMLfIXh274YCvw.jpeg │ ├── 1__KA25APp__nOpU8__XGfPSDcw.png │ ├── 1__KOfG8lHFAK4pJKlGQdcfSw.jpeg │ ├── 1__KZ9sYBulSXVnh2NWsn1pjg.png │ ├── 1__KxBzevFzSqtWbaHc__HOQ1g.jpeg │ ├── 1__LVB0wRh3VZfXquoG13FsfA.png │ ├── 1__Lq3QbVERIjJPPvIkb__DJpQ.jpeg │ ├── 1__MTHNsN2ZJTIu5__dgzYZZAg.jpeg │ ├── 1__OOZAPPXLutWkVZMB__9eEnw.jpeg │ ├── 1__OwPQ3KLOmJgqrS75FAvPow.jpeg │ ├── 1__PEDpKSvEA75WLst4cgJ1Hw.jpeg │ ├── 1__PF4xnEL0__4gmydOFM1uWOA.png │ ├── 1__PIYtdLaP2LBYd__3faTsdfg.jpeg │ ├── 1__PLWF__aB4iOEmljSWAZ4t8g.jpeg │ ├── 1__Qxz__AwMSypWEHpIIwcCmzQ.jpeg │ ├── 1__RAoUB5mdW4qklv2BbB46gw.png │ ├── 1__RJ7icNUSIy8teCvF__uYO8g.jpeg │ ├── 1__RryWS__ybB0kqrJldXEXGRQ.jpeg │ ├── 1__SrSxegMBiLX1tiQ7v0Gcuw.jpeg │ ├── 1__Tj9TieZBvejCBVY2pdl2ow.jpeg │ ├── 1__U2Nrxl66g__p2rGHZw__5lHw.jpeg │ ├── 1__V0m6Z03faS6ejw6cisWtwg.jpeg │ ├── 1__VFzeqE7FwxHq__fXNkSMgpQ.png │ ├── 1__VLL69izNaWmkKe__w__SL1gA.png │ ├── 1__VT0gZm1fdZ4dtzuT__cTSSw.jpeg │ ├── 1__Vd11SE1xBHrmix2TGxtf6w.jpeg │ ├── 1__WLOvwUwBQxTd25g6NOKgEg.png │ ├── 1__WU4dl6aTo3eoGSd__Y__vSBw.jpeg │ ├── 1__XCwZ6aaQzx6K__YsMc__lTIw.jpeg │ ├── 1__Y6Mh4DTW9dvk__AQmwMBZ3A.png │ ├── 1__YHeZL3ZmxWCkSSLyiM4fLg.jpeg │ ├── 1__YI1NznJ19Rtj8siD0jWGLg.jpeg │ ├── 1__ZXtCx5fbToIGRzChkzVfSw.jpeg │ ├── 1__ZY1fj4t__vGNDvfZcQ8Ux7g.jpeg │ ├── 1__Zi7djJhTv1CoCXcPyLPlRg.jpeg │ ├── 1__Zn8a__V__hZnDzaHIZf5p7xw.png │ ├── 1____EKRi4fdzhwVBd7wq__9A6g.jpeg │ ├── 1____LYrs4__VqoiQRzFH3FyvOg.png │ ├── 1____XPFFREABrkifELO9yJfzg.jpeg │ ├── 1____n1nUF07ooxSq5g3RCzOxw.jpeg │ ├── 1____o5jk7PLESIRuYLzm2YbbQ.png │ ├── 1____xfL26W16zYT5HssIkegJA.png │ ├── 1__aRNaqTGMuiO3jJ4C__ni3hg.jpeg │ ├── 1__alDWQJrl1d0i__Y8__cii8Rw.jpeg │ ├── 1__bRa9D4mpptqP7GyAxZsTSg.jpeg │ ├── 1__cFvPk3sJHNFfFFDO3585__g.jpeg │ ├── 1__cPrtPxeOHFHeHN6GYYzdFw.png │ ├── 1__cR54Z7ODaflQytYpYp27pw.jpeg │ ├── 1__clyERp4CjFvqyl0EHKr3cQ.jpeg │ ├── 1__copWTZQ4r2y9RD0fKmrkbw.jpeg │ ├── 1__dEnozl2ACvKZlUvDAv3IhQ.jpeg │ ├── 1__dRSRRV5KZRkejuUW4BtroA.jpeg │ ├── 1__eksuScrjBDgIxmJb7l6e8A.png │ ├── 1__exaW6x3LkEprvG0HJkWeGQ.jpeg │ ├── 1__f1EeO3KT082qO8lZMvpNew.jpeg │ ├── 1__g6gcZjA4fKAL__4exuhWKBQ.png │ ├── 1__hFksMe0lRfLM3nuyTpVa2A.jpeg │ ├── 1__i8oZKoQLKRMXbwolqit__kQ.png │ ├── 1__icPl2pBJcknYay7zkE7U6A.png │ ├── 1__jY____92Cpeeo9Upq__Ndfxqw.jpeg │ ├── 1__jk0VirJgZvJD5LM6R7b7Jw.jpeg │ ├── 1__kHgUtx5I0e028CiTgi0jkg.jpeg │ ├── 1__kYSoRt1kc3T__LYDbKJv38w.jpeg │ ├── 1__kblwRax6hDyA7OSI__4MYsw.png │ ├── 1__koRcT1S1qixq3JeG7wHRLQ.jpeg │ ├── 1__kuOIOHYVG86DiP9sziOJgQ.jpeg │ ├── 1__l15YQ8__90epBFllRRkrBQQ.jpeg │ ├── 1__l3BeD6nJCWYB9pVau7GyFg.png │ ├── 1__lHc9O9tUuk9Q2J9oQSd9Gg.png │ ├── 1__lJHi8lshH7HiWk__PEw5Utw.png │ ├── 1__lyW0Iri__kqG8veUPt8COIg.jpeg │ ├── 1__mooogiAqcfjdTcE6Rx__YYQ.jpeg │ ├── 1__nNO0ccjlKwCNEQ__sdLES1Q.jpeg │ ├── 1__nOY__ruArMDgdyhvLUAaQsA.jpeg │ ├── 1__niUvDTf12CKZ__8ru8bFV8g.jpeg │ ├── 1__njCZxE2vffyybJvMUUdRlw.png │ ├── 1__o9TmdVfPxscKeR9txE__h8A.jpeg │ ├── 1__o__edJUeFVjy__iHUM1lOI5Q.jpeg │ ├── 1__ob943W__Nd__92xTBQgle5Ng.jpeg │ ├── 1__pAx0kXuMzT__VcapgAD4IVw.jpeg │ ├── 1__q4rUj63HjeefZv7YN1q46Q.jpeg │ ├── 1__qEsLz60cp__O1dwHhZC1hDw.jpeg │ ├── 1__qIQlJky4s2bdf18aB8AgQw.jpeg │ ├── 1__qhIflNjfRC3jqUkDLPoN1w.png │ ├── 1__qhsjbqc1hxvHOlzoh5__9VA.jpeg │ ├── 1__qiR__6Zj__x66uyHa__zFaBMg.png │ ├── 1__r64xZXCMZZs3UDmI0ah9Gg.jpeg │ ├── 1__rJeyhu1qOz6q__A__DW1516g.jpeg │ ├── 1__rWjq6xWHz__yay0va7tPp8g.jpeg │ ├── 1__sNznFKPCjpebaaRHKtf__GQ.jpeg │ ├── 1__sqBFzSmf02WuHKMOedm8KQ.jpeg │ ├── 1__tYqMdteIum45QYt6OH1YAQ.png │ ├── 1__tglOtx6icFNlueDWjypOKA.jpeg │ ├── 1__ts4TFmY1Ic1Y6Fg8thICDQ.jpeg │ ├── 1__tyNl29OrgHzYRu1__XFH0qw.jpeg │ ├── 1__ur4651t6W__J__v9z6Ua3F8Q.jpeg │ ├── 1__vEUinixD9t81RlbwpxO5BQ.png │ ├── 1__vK__ZvQxQP0__X__j9m38TncQ.jpeg │ ├── 1__vMb8LVcBbkVvnEdQR1v__QA.png │ ├── 1__vPiMgLUh9eBQP55d2HyUhA.jpeg │ ├── 1__vRyazvXpNXcqhc6gH8jmwA.jpeg │ ├── 1__vjvxktj16lX49nzBPEgvaw.png │ ├── 1__wz1hAARpuRrOYUQIGlAf__Q.jpeg │ ├── 1__x2vhxOc1C4dkqVfKA0U5SQ.jpeg │ ├── 1__xRezi604__WJ__Sp1zBPBB8g.png │ ├── 1__x__zkJSb2sMh2g1GDaphksg.jpeg │ ├── 1__yCdZlB3U8I6vOcxMm__txgQ.jpeg │ ├── 1__ytxuOu93lHlG5OY7q__JPGQ.jpeg │ ├── 1__yw8EwaE__tHrjG3AC8KYGBA.png │ ├── 1__yziEGgSPjrY6c4qoKixDoQ.png │ ├── 1__zCAj5seQkNbli39bs0ogQQ.jpeg │ ├── 1__zCm1FYoiCBp1eFWY5uBBsw.jpeg │ ├── 1__z__UXmWAtFw91toTScbv1lQ.jpeg │ ├── afterparty.jpg │ ├── bear-with-me.jpg │ ├── coffee.jpg │ ├── come-join.jpg │ ├── dancingbaby.gif │ ├── emojis │ ├── .DS_Store │ ├── emoji-bear.png │ ├── emoji-handshake.png │ ├── emoji-kokko.png │ ├── emoji-out_of_office.png │ ├── emoji-perkele.png │ ├── emoji-torillatavataan.png │ ├── emoji-waiting.png │ └── nordicfamily.png │ ├── finnish-coffee.jpg │ ├── getting-ready.jpg │ ├── headers │ └── front.svg │ ├── logo.svg │ ├── lunch-time.jpg │ ├── mobile-01.png │ ├── mobile-02.png │ ├── mobile-03.jpeg │ ├── pattern.svg │ ├── sketchnote-01.jpeg │ ├── sketchnote-02.gif │ ├── sketchnote-03.png │ ├── sketchnote-04.jpeg │ ├── sketchnote-05.png │ ├── sketchnote-06.gif │ ├── sketchnote-07.png │ ├── sketchnote-08.jpeg │ ├── smoosh.jpg │ ├── venue-location.png │ ├── venue │ ├── atmosphere.jpg │ ├── bar.jpg │ ├── confetti.jpg │ ├── dj.jpg │ └── gig.jpg │ └── workshop.jpg ├── components ├── AnchorHeader.js ├── AnchorProvider.js ├── Author.js ├── Contact.js ├── ContactMini.js ├── Contacts.js ├── Countdown.js ├── Footer.js ├── Header.js ├── Keywords.js ├── Link.js ├── Markdown.js ├── Meta.js ├── Moment.js ├── Navigation.js ├── Organizer.js ├── PrevNext.js ├── Schedule.js ├── ScheduleIcon.js ├── ScheduleLegend.js ├── SessionLink.js ├── SessionSpeakers.js ├── Speaker.js ├── Sponsor.js ├── Sponsors.js ├── Subscribe.js ├── Talk.js ├── VenueGallery.js ├── Workshop.js ├── connect.js ├── index.js ├── navigation-pages.js ├── schedule-types.js └── tweak-sponsors.js ├── layouts ├── BlogIndex.js ├── BlogPage.js ├── Page.js └── SiteBody.js ├── loaders └── page-loader.js ├── package-lock.json ├── package.json ├── pages ├── 2018.js ├── 2019.js ├── 2021.js ├── 2022.js ├── 404.js ├── about.js ├── blog │ ├── 2017-11-14_React-Finland-is-From-Devs-to-Devs-a807f8d41949.md │ ├── 2017-11-15_Which-Code-of-Conduct--5bc331626eda.md │ ├── 2017-12-21_Ticket-Sales-Open-27th-of-December-c7a3c0c26068.md │ ├── 2018-01-17_React-Finland-2018---Call-for-Sponsors-b193c561fa5.md │ ├── 2018-01-18_Why-Visit-React-Finland--6cef6d2655aa.md │ ├── 2018-01-19_The-Venue-of-React-Finland-2018-52b569a28f52.md │ ├── 2018-01-23_The-Technology-Behind-React-Finland-5d944cc6e438.md │ ├── 2018-01-30_React-Finland-2018-Keynotes-ff1e1b7b2850.md │ ├── 2018-02-26_Case-Study---React-Finland-Website-108a1128a683.md │ ├── 2018-02-26_React-Finland-2018---Sold-out--Workshops-left-a83cb91ac52f.md │ ├── 2018-02-27_Sponsors-of-React-Finland-2018-8dfa06cced99.md │ ├── 2018-04-05_react-finland-app-what-is-it.md │ ├── 2018-04-30_React-Finland-2018---Lessons-Learned-754a5f29067c.md │ ├── 2018-05-06_React-Finland-2018---Blog-Coverage-e65bcece8946.md │ ├── 2018-10-21_Summary-of-GraphQL-Finland-2018-a769460ebfdd.md │ ├── 2018-12-07_React-Finland-2019--24-26-04-2019----Tickets-Are-Available-2014211c9f56.md │ ├── 2018-12-14_React-Finland-2019-MCs-1d49a2de1a77.md │ ├── 2019-01-04_React-Finland-2019-Keynotes---Workshop-on-TypeScript-d7f77a22d178.md │ ├── 2019-01-08_GraphQL-Finland-2018-Conference-Videos-8656a801c631.md │ ├── 2019-01-09_Seven-Reasons-to-Visit-React-Finland-2019-d290d3417b67.md │ ├── 2019-02-07_Interview---TypeScript-with-Michel-Weststrate-8afd7fd24b32.md │ ├── 2019-03-18_Sponsors-of-React-Finland-2019-348c59b1272d.md │ ├── 2019-03-19_Diversity-Tickets-for-React-Finland-2019-82636600cb97.md │ ├── 2019-03-22_Volunteer-for-React-Finland-2019-4f48aa0fb485.md │ ├── 2019-04-16_2019-Parties-and-Community-Events-e7a22af12ea6.md │ ├── 2019-04-17_Pre-post-conference-Activities-8420751f315.md │ ├── 2019-04-24_RF2019-Live-Streams-Are-Available-3c85476cd670.md │ ├── 2019-05-02_React-Finland-2019---Blog-Coverage-and-Photo-Galleries-73ebbbf47d8d.md │ ├── 2019-05-08_what-david-learned-with-nik-graf.md │ ├── 2019-05-20_State-Management-with-Michel--David--Luca--and-Farzad-6543fcc2e601.md │ ├── 2019-05-27_Design-Systems-with-Andrey-and-Varya-bc8ae922cab0.md │ ├── 2019-05-28_Testing-with-Juha--Maaret--and-Manuel-5b7a10b925d5.md │ ├── 2019-06-03_Case-Studies-with-Kadi--Glenn--and-Dustin-734e241d97bc.md │ ├── 2019-06-05_Animations-and-unpopular-opinions-with-Bruno-and-Nik-95da66ea5456.md │ ├── 2019-06-11_React-Native-with-Jamon--Rick--and-Ville-3bb1d0b73ff.md │ ├── 2019-06-12_Styling-in-React-with-Artem-and-Artem-d690f7563187.md │ ├── 2019-06-23_Tooling-with-Tejas--Bohdan--Tom----and-Christoffer-77246a82a89b.md │ ├── 2019-06-24_Architecture-with-Monica-and-Carolyn-5057b2631bbb.md │ ├── 2019-06-24_Performance-with-Anna-and-Sven-e4544d87e7d6.md │ ├── 2019-10-15_React-Finland-2020---What-s-to-Come-and-Call-for-Sponsors-8b8345768b3e.md │ ├── 2019-10-17_Why-aren-t-we-a-non-profit-anymore--6256146e1ac5.md │ ├── 2019-10-20_18-assorted-tips-for-aspiring-speakers-e730c16b4d21.md │ ├── 2019-11-12_react-finland-2020.md │ ├── 2019-11-20_recap-of-rf2019.md │ ├── 2019-12-03_why-no-cfp.md │ ├── 2020-01-17_rf-2020-diversity-scholarships.md │ ├── 2020-02-28-covid-19-statement.md │ ├── 2020-03-18-rf-2020-postponed.md │ ├── 2020-04-22-rf-2020-online-workshops.md │ ├── 2020-05-07-rf-2020-online-mini-conf-vol-1.md │ ├── 2020-05-28-rf-2021.md │ ├── 2020-06-04-rf-2020-online-mini-conf-vol-1-recap.md │ ├── 2020-08-03-rf-2020-online-mini-conf-vol-2.md │ ├── 2020-09-01-rf-2020-online-mini-conf-vol-2-recap.md │ ├── 2020-09-02-rf-2020-online-mini-conf-vol-3.md │ ├── 2020-09-03-cfp-for-mini-confs.md │ ├── 2020-10-05-online-mini-conf-vol-4.md │ ├── 2020-10-05-rf-2020-online-mini-conf-vol-3-recap.md │ ├── 2020-11-02-online-mini-conf-vol-5.md │ ├── 2020-11-02-rf-2020-online-mini-conf-vol-4-recap.md │ ├── 2020-12-10-rf-2020-online-mini-conf-vol-5-recap.md │ ├── 2021-02-03-vodcast-01.md │ ├── 2021-03-01-vodcast-02.md │ ├── 2021-03-15-rf21-call-for-participants.md │ ├── 2021-04-07-vodcast-03.md │ ├── 2021-05-04-vodcast-04.md │ ├── 2021-05-28-vodcast-05.md │ ├── 2021-06-14-react-finland-2021.md │ ├── 2021-07-21-rf21-schedule-highlights.md │ └── 2022-03-11-rf-2022.md ├── for-attendees.js ├── for-speakers.js ├── for-sponsors.js ├── imprint.js ├── index.js ├── privacy-policy.js ├── satellite-event-guidelines.js ├── schedule.js ├── speakers.js ├── workshops.js └── youtube-embed.js ├── patches └── antwar+0.26.0.patch ├── postcss.config.js ├── styleguide.config.js ├── styles ├── fontello-codes.css ├── footer.scss ├── intro.scss ├── nav.scss ├── sponsors.scss ├── style.scss ├── subscribe.scss ├── utilities.scss └── variables.scss ├── templates └── page.ejs ├── utils ├── index.js ├── render-page.js └── slugify.js └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "modules": false 7 | } 8 | ], 9 | "@babel/preset-react" 10 | ], 11 | "plugins": [ 12 | "@babel/plugin-syntax-object-rest-spread", 13 | "@babel/plugin-proposal-object-rest-spread", 14 | "react-hot-loader/babel" 15 | ], 16 | "env": { 17 | "start": { 18 | "presets": [ 19 | "react-hmre" 20 | ] 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # Change these settings to your own preference 11 | indent_style = space 12 | indent_size = 2 13 | 14 | # We recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true, 6 | "node": true 7 | }, 8 | "extends": [ 9 | "eslint:recommended", 10 | "plugin:react/recommended", 11 | "prettier", 12 | "plugin:jsx-a11y/recommended" 13 | ], 14 | "plugins": ["prettier", "jsx-a11y"], 15 | "rules": { 16 | "prettier/prettier": "error" 17 | }, 18 | "parser": "babel-eslint", 19 | "parserOptions": { 20 | "sourceType": "module", 21 | "allowImportExportEverywhere": "true", 22 | "ecmaFeatures": { 23 | "jsx": true 24 | } 25 | }, 26 | "settings": { 27 | "react": { 28 | "version": "16.3.2" 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | .antwar 3 | .eslintcache 4 | .idea 5 | books/ 6 | build/ 7 | node_modules/ 8 | styles-old 9 | yarn.lock 10 | # Local Netlify folder 11 | .netlify -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v10.20.1 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5" 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Finland site 2 | 3 | ## Development mode 4 | 5 | ``` 6 | nvm use 7 | npm i # or yarn 8 | npm start # or yarn start 9 | ``` 10 | Then open http://127.0.0.1:3000/ 11 | 12 | ## Deployment 13 | 14 | netlify login 15 | netlify deploy --dir=build 16 | netlify deploy --dir=build --prod 17 | 18 | -------------------------------------------------------------------------------- /antwar.bootstrap.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | // Needed for JSX compilation to work 3 | require("@babel/register"); 4 | 5 | const antwar = require("antwar"); 6 | const request = require("request"); 7 | const antwarConfig = require("./antwar.config.js"); 8 | const environment = process.argv[2]; 9 | 10 | // Check that the API is up before starting 11 | request 12 | .get(antwarConfig.apiUrl) 13 | .on("response", () => { 14 | antwar[environment]({ 15 | environment, 16 | antwar: antwarConfig, 17 | webpack: require("./webpack.config"), 18 | }) 19 | .then(() => { 20 | if (environment !== "build") { 21 | console.log("Surf to http://localhost:3000"); 22 | } 23 | }) 24 | .catch(err => { 25 | console.error(err); 26 | 27 | process.exit(1); 28 | }); 29 | }) 30 | .on("error", function(err) { 31 | console.error(err); 32 | }); 33 | -------------------------------------------------------------------------------- /assets/extra/CNAME: -------------------------------------------------------------------------------- 1 | react-finland.fi 2 | -------------------------------------------------------------------------------- /assets/extra/_redirects: -------------------------------------------------------------------------------- 1 | /blog/conference-dos-and-don-ts-56973b82229a/ https://futurefrontend.com/blog/conference-dos-and-donts/ 2 | /blog/brief-guide-to-finnish-vol--1---basics-7f43f37d5017/ https://futurefrontend.com/blog/brief-guide-to-finnish-vol-1/ 3 | /blog/brief-guide-to-finnish-vol--2-a72607379e4c/ https://futurefrontend.com/blog/brief-guide-to-finnish-vol-2/ 4 | /blog/brief-guide-to-finnish-vol--3-1e16a61c661d/ https://futurefrontend.com/blog/brief-guide-to-finnish-vol-3/ 5 | /blog/brief-guide-to-finnish-vol--4---saapas-a99d6eb1034f/ https://futurefrontend.com/blog/brief-guide-to-finnish-vol-4/ 6 | /blog/brief-guide-to-finnish-vol--5---kuusi-373575fcfdf3/ https://futurefrontend.com/blog/brief-guide-to-finnish-vol-5/ 7 | -------------------------------------------------------------------------------- /assets/extra/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/extra/favicon.ico -------------------------------------------------------------------------------- /assets/extra/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/extra/favicon.png -------------------------------------------------------------------------------- /assets/extra/meta-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/extra/meta-image.png -------------------------------------------------------------------------------- /assets/fonts/finlandica-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/fonts/finlandica-bold.eot -------------------------------------------------------------------------------- /assets/fonts/finlandica-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/fonts/finlandica-bold.ttf -------------------------------------------------------------------------------- /assets/fonts/finlandica-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/fonts/finlandica-bold.woff -------------------------------------------------------------------------------- /assets/fonts/finlandica-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/fonts/finlandica-bold.woff2 -------------------------------------------------------------------------------- /assets/fonts/finlandica-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/fonts/finlandica-regular.eot -------------------------------------------------------------------------------- /assets/fonts/finlandica-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/fonts/finlandica-regular.ttf -------------------------------------------------------------------------------- /assets/fonts/finlandica-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/fonts/finlandica-regular.woff -------------------------------------------------------------------------------- /assets/fonts/finlandica-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/fonts/finlandica-regular.woff2 -------------------------------------------------------------------------------- /assets/img/0__Y4UPv2ALNKFdlvy2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/0__Y4UPv2ALNKFdlvy2.jpg -------------------------------------------------------------------------------- /assets/img/0__gu03jXqzYBgzz4Ei.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/0__gu03jXqzYBgzz4Ei.jpg -------------------------------------------------------------------------------- /assets/img/1__0__5Rkm__2Nxg7uYv6H4LBJg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__0__5Rkm__2Nxg7uYv6H4LBJg.jpeg -------------------------------------------------------------------------------- /assets/img/1__0kjyBJoc3OeU__XwvjpdVjw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__0kjyBJoc3OeU__XwvjpdVjw.jpeg -------------------------------------------------------------------------------- /assets/img/1__1jtCSqZW2LKZzDgj8UxY2g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__1jtCSqZW2LKZzDgj8UxY2g.jpeg -------------------------------------------------------------------------------- /assets/img/1__2KKfYoHfrYY7yqO4pHfFhA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__2KKfYoHfrYY7yqO4pHfFhA.jpeg -------------------------------------------------------------------------------- /assets/img/1__2mHylzaFJgLYdvMd6XyxGw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__2mHylzaFJgLYdvMd6XyxGw.jpeg -------------------------------------------------------------------------------- /assets/img/1__34wNixshnoIw8s5ZqlyK9g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__34wNixshnoIw8s5ZqlyK9g.jpeg -------------------------------------------------------------------------------- /assets/img/1__3W1tDzg0qVe1a9eKp7xyAQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__3W1tDzg0qVe1a9eKp7xyAQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__43dWDPRr__2EGgoeLRGNX7Q.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__43dWDPRr__2EGgoeLRGNX7Q.jpeg -------------------------------------------------------------------------------- /assets/img/1__5LvmVDxnv128Z2__PFeTuew.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__5LvmVDxnv128Z2__PFeTuew.jpeg -------------------------------------------------------------------------------- /assets/img/1__5X8QAgunoLAxiSozJJL5gg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__5X8QAgunoLAxiSozJJL5gg.png -------------------------------------------------------------------------------- /assets/img/1__61Ub71rYGRhiWpnmiwOQgg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__61Ub71rYGRhiWpnmiwOQgg.jpeg -------------------------------------------------------------------------------- /assets/img/1__61eIhGvdILUjZG6am8Gzyw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__61eIhGvdILUjZG6am8Gzyw.jpeg -------------------------------------------------------------------------------- /assets/img/1__7Vg0H2b6uMKK3k__06Hpm3A.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__7Vg0H2b6uMKK3k__06Hpm3A.jpeg -------------------------------------------------------------------------------- /assets/img/1__7YX1BmzKa__e__rTJAcn3S3g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__7YX1BmzKa__e__rTJAcn3S3g.jpeg -------------------------------------------------------------------------------- /assets/img/1__7psRiZEqhiQPTK4l2__eFGA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__7psRiZEqhiQPTK4l2__eFGA.jpeg -------------------------------------------------------------------------------- /assets/img/1__7qHfDJwyBpUcpmvi2QUdHw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__7qHfDJwyBpUcpmvi2QUdHw.jpeg -------------------------------------------------------------------------------- /assets/img/1__8iL0G5xC2QRlzRBJraCFLg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__8iL0G5xC2QRlzRBJraCFLg.jpeg -------------------------------------------------------------------------------- /assets/img/1__9i1MqXdiip__WnNL____xv34w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__9i1MqXdiip__WnNL____xv34w.png -------------------------------------------------------------------------------- /assets/img/1__9sEUxAIOAmFBa83fmBqN3g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__9sEUxAIOAmFBa83fmBqN3g.jpeg -------------------------------------------------------------------------------- /assets/img/1__9ybC__WlvGhSoRotiupbrPA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__9ybC__WlvGhSoRotiupbrPA.jpeg -------------------------------------------------------------------------------- /assets/img/1__Bbz5AXnUoiqbvb9kX1Mj__w.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Bbz5AXnUoiqbvb9kX1Mj__w.jpeg -------------------------------------------------------------------------------- /assets/img/1__BwhQBaKTWp99JQw3d1OobA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__BwhQBaKTWp99JQw3d1OobA.jpeg -------------------------------------------------------------------------------- /assets/img/1__C4MT6SgNoC4lKeypStcHFg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__C4MT6SgNoC4lKeypStcHFg.jpeg -------------------------------------------------------------------------------- /assets/img/1__CK0mQjZxkRUSAszZnU8fpQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__CK0mQjZxkRUSAszZnU8fpQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__CV4____75EuwGzJXQ4KCojKw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__CV4____75EuwGzJXQ4KCojKw.jpeg -------------------------------------------------------------------------------- /assets/img/1__D3FFNbADI8uoMUKs3kDyDg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__D3FFNbADI8uoMUKs3kDyDg.jpeg -------------------------------------------------------------------------------- /assets/img/1__D8tSAbFmsy9gz0nwqdV__Tg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__D8tSAbFmsy9gz0nwqdV__Tg.jpeg -------------------------------------------------------------------------------- /assets/img/1__DJAej0__DUNwSB1XjDw4R7w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__DJAej0__DUNwSB1XjDw4R7w.png -------------------------------------------------------------------------------- /assets/img/1__DLhdGf8LMUNOXrNp__B93Qg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__DLhdGf8LMUNOXrNp__B93Qg.jpeg -------------------------------------------------------------------------------- /assets/img/1__DhRYGnHVB15BmYkARbyrVg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__DhRYGnHVB15BmYkARbyrVg.png -------------------------------------------------------------------------------- /assets/img/1__E2rLy8BY5lmeJGRFwPUKYg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__E2rLy8BY5lmeJGRFwPUKYg.jpeg -------------------------------------------------------------------------------- /assets/img/1__FPGz5UNa__bL__8yQ4oeyzUg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__FPGz5UNa__bL__8yQ4oeyzUg.jpeg -------------------------------------------------------------------------------- /assets/img/1__FPpz__vC3KNP4hDTUCSBCIg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__FPpz__vC3KNP4hDTUCSBCIg.jpeg -------------------------------------------------------------------------------- /assets/img/1__FkXxlbvDlwSZQYcm5FHkhA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__FkXxlbvDlwSZQYcm5FHkhA.jpeg -------------------------------------------------------------------------------- /assets/img/1__Fw77gTcsoHxSrEd7nDrRnw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Fw77gTcsoHxSrEd7nDrRnw.jpeg -------------------------------------------------------------------------------- /assets/img/1__GAqrw1XMgdNdsAfTk__YqPA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__GAqrw1XMgdNdsAfTk__YqPA.jpeg -------------------------------------------------------------------------------- /assets/img/1__GGmsiw6zGy4HNEJ1Xfwnvw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__GGmsiw6zGy4HNEJ1Xfwnvw.png -------------------------------------------------------------------------------- /assets/img/1__GMr54NOSXiGSttSdAGFQMg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__GMr54NOSXiGSttSdAGFQMg.jpeg -------------------------------------------------------------------------------- /assets/img/1__GQl43DfLpSgJpQ0GTxS__CQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__GQl43DfLpSgJpQ0GTxS__CQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__GSCVwnK1mU96AayUlW1xnQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__GSCVwnK1mU96AayUlW1xnQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__HTo3XXrjH1SpPV7WuTwntQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__HTo3XXrjH1SpPV7WuTwntQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__HVnU__bNF3SLbZoWZHqKYhw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__HVnU__bNF3SLbZoWZHqKYhw.png -------------------------------------------------------------------------------- /assets/img/1__HwGJxXZnlIZV__7U3__7__Rbw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__HwGJxXZnlIZV__7U3__7__Rbw.jpeg -------------------------------------------------------------------------------- /assets/img/1__InQ701dzcChwaDSAJ8OEpg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__InQ701dzcChwaDSAJ8OEpg.jpeg -------------------------------------------------------------------------------- /assets/img/1__J09MJ8ultNBVPr__HaeYEIg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__J09MJ8ultNBVPr__HaeYEIg.jpeg -------------------------------------------------------------------------------- /assets/img/1__JQcprsHCEMLfIXh274YCvw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__JQcprsHCEMLfIXh274YCvw.jpeg -------------------------------------------------------------------------------- /assets/img/1__KA25APp__nOpU8__XGfPSDcw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__KA25APp__nOpU8__XGfPSDcw.png -------------------------------------------------------------------------------- /assets/img/1__KOfG8lHFAK4pJKlGQdcfSw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__KOfG8lHFAK4pJKlGQdcfSw.jpeg -------------------------------------------------------------------------------- /assets/img/1__KZ9sYBulSXVnh2NWsn1pjg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__KZ9sYBulSXVnh2NWsn1pjg.png -------------------------------------------------------------------------------- /assets/img/1__KxBzevFzSqtWbaHc__HOQ1g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__KxBzevFzSqtWbaHc__HOQ1g.jpeg -------------------------------------------------------------------------------- /assets/img/1__LVB0wRh3VZfXquoG13FsfA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__LVB0wRh3VZfXquoG13FsfA.png -------------------------------------------------------------------------------- /assets/img/1__Lq3QbVERIjJPPvIkb__DJpQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Lq3QbVERIjJPPvIkb__DJpQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__MTHNsN2ZJTIu5__dgzYZZAg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__MTHNsN2ZJTIu5__dgzYZZAg.jpeg -------------------------------------------------------------------------------- /assets/img/1__OOZAPPXLutWkVZMB__9eEnw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__OOZAPPXLutWkVZMB__9eEnw.jpeg -------------------------------------------------------------------------------- /assets/img/1__OwPQ3KLOmJgqrS75FAvPow.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__OwPQ3KLOmJgqrS75FAvPow.jpeg -------------------------------------------------------------------------------- /assets/img/1__PEDpKSvEA75WLst4cgJ1Hw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__PEDpKSvEA75WLst4cgJ1Hw.jpeg -------------------------------------------------------------------------------- /assets/img/1__PF4xnEL0__4gmydOFM1uWOA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__PF4xnEL0__4gmydOFM1uWOA.png -------------------------------------------------------------------------------- /assets/img/1__PIYtdLaP2LBYd__3faTsdfg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__PIYtdLaP2LBYd__3faTsdfg.jpeg -------------------------------------------------------------------------------- /assets/img/1__PLWF__aB4iOEmljSWAZ4t8g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__PLWF__aB4iOEmljSWAZ4t8g.jpeg -------------------------------------------------------------------------------- /assets/img/1__Qxz__AwMSypWEHpIIwcCmzQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Qxz__AwMSypWEHpIIwcCmzQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__RAoUB5mdW4qklv2BbB46gw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__RAoUB5mdW4qklv2BbB46gw.png -------------------------------------------------------------------------------- /assets/img/1__RJ7icNUSIy8teCvF__uYO8g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__RJ7icNUSIy8teCvF__uYO8g.jpeg -------------------------------------------------------------------------------- /assets/img/1__RryWS__ybB0kqrJldXEXGRQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__RryWS__ybB0kqrJldXEXGRQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__SrSxegMBiLX1tiQ7v0Gcuw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__SrSxegMBiLX1tiQ7v0Gcuw.jpeg -------------------------------------------------------------------------------- /assets/img/1__Tj9TieZBvejCBVY2pdl2ow.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Tj9TieZBvejCBVY2pdl2ow.jpeg -------------------------------------------------------------------------------- /assets/img/1__U2Nrxl66g__p2rGHZw__5lHw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__U2Nrxl66g__p2rGHZw__5lHw.jpeg -------------------------------------------------------------------------------- /assets/img/1__V0m6Z03faS6ejw6cisWtwg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__V0m6Z03faS6ejw6cisWtwg.jpeg -------------------------------------------------------------------------------- /assets/img/1__VFzeqE7FwxHq__fXNkSMgpQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__VFzeqE7FwxHq__fXNkSMgpQ.png -------------------------------------------------------------------------------- /assets/img/1__VLL69izNaWmkKe__w__SL1gA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__VLL69izNaWmkKe__w__SL1gA.png -------------------------------------------------------------------------------- /assets/img/1__VT0gZm1fdZ4dtzuT__cTSSw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__VT0gZm1fdZ4dtzuT__cTSSw.jpeg -------------------------------------------------------------------------------- /assets/img/1__Vd11SE1xBHrmix2TGxtf6w.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Vd11SE1xBHrmix2TGxtf6w.jpeg -------------------------------------------------------------------------------- /assets/img/1__WLOvwUwBQxTd25g6NOKgEg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__WLOvwUwBQxTd25g6NOKgEg.png -------------------------------------------------------------------------------- /assets/img/1__WU4dl6aTo3eoGSd__Y__vSBw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__WU4dl6aTo3eoGSd__Y__vSBw.jpeg -------------------------------------------------------------------------------- /assets/img/1__XCwZ6aaQzx6K__YsMc__lTIw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__XCwZ6aaQzx6K__YsMc__lTIw.jpeg -------------------------------------------------------------------------------- /assets/img/1__Y6Mh4DTW9dvk__AQmwMBZ3A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Y6Mh4DTW9dvk__AQmwMBZ3A.png -------------------------------------------------------------------------------- /assets/img/1__YHeZL3ZmxWCkSSLyiM4fLg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__YHeZL3ZmxWCkSSLyiM4fLg.jpeg -------------------------------------------------------------------------------- /assets/img/1__YI1NznJ19Rtj8siD0jWGLg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__YI1NznJ19Rtj8siD0jWGLg.jpeg -------------------------------------------------------------------------------- /assets/img/1__ZXtCx5fbToIGRzChkzVfSw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__ZXtCx5fbToIGRzChkzVfSw.jpeg -------------------------------------------------------------------------------- /assets/img/1__ZY1fj4t__vGNDvfZcQ8Ux7g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__ZY1fj4t__vGNDvfZcQ8Ux7g.jpeg -------------------------------------------------------------------------------- /assets/img/1__Zi7djJhTv1CoCXcPyLPlRg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Zi7djJhTv1CoCXcPyLPlRg.jpeg -------------------------------------------------------------------------------- /assets/img/1__Zn8a__V__hZnDzaHIZf5p7xw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__Zn8a__V__hZnDzaHIZf5p7xw.png -------------------------------------------------------------------------------- /assets/img/1____EKRi4fdzhwVBd7wq__9A6g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1____EKRi4fdzhwVBd7wq__9A6g.jpeg -------------------------------------------------------------------------------- /assets/img/1____LYrs4__VqoiQRzFH3FyvOg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1____LYrs4__VqoiQRzFH3FyvOg.png -------------------------------------------------------------------------------- /assets/img/1____XPFFREABrkifELO9yJfzg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1____XPFFREABrkifELO9yJfzg.jpeg -------------------------------------------------------------------------------- /assets/img/1____n1nUF07ooxSq5g3RCzOxw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1____n1nUF07ooxSq5g3RCzOxw.jpeg -------------------------------------------------------------------------------- /assets/img/1____o5jk7PLESIRuYLzm2YbbQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1____o5jk7PLESIRuYLzm2YbbQ.png -------------------------------------------------------------------------------- /assets/img/1____xfL26W16zYT5HssIkegJA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1____xfL26W16zYT5HssIkegJA.png -------------------------------------------------------------------------------- /assets/img/1__aRNaqTGMuiO3jJ4C__ni3hg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__aRNaqTGMuiO3jJ4C__ni3hg.jpeg -------------------------------------------------------------------------------- /assets/img/1__alDWQJrl1d0i__Y8__cii8Rw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__alDWQJrl1d0i__Y8__cii8Rw.jpeg -------------------------------------------------------------------------------- /assets/img/1__bRa9D4mpptqP7GyAxZsTSg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__bRa9D4mpptqP7GyAxZsTSg.jpeg -------------------------------------------------------------------------------- /assets/img/1__cFvPk3sJHNFfFFDO3585__g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__cFvPk3sJHNFfFFDO3585__g.jpeg -------------------------------------------------------------------------------- /assets/img/1__cPrtPxeOHFHeHN6GYYzdFw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__cPrtPxeOHFHeHN6GYYzdFw.png -------------------------------------------------------------------------------- /assets/img/1__cR54Z7ODaflQytYpYp27pw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__cR54Z7ODaflQytYpYp27pw.jpeg -------------------------------------------------------------------------------- /assets/img/1__clyERp4CjFvqyl0EHKr3cQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__clyERp4CjFvqyl0EHKr3cQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__copWTZQ4r2y9RD0fKmrkbw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__copWTZQ4r2y9RD0fKmrkbw.jpeg -------------------------------------------------------------------------------- /assets/img/1__dEnozl2ACvKZlUvDAv3IhQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__dEnozl2ACvKZlUvDAv3IhQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__dRSRRV5KZRkejuUW4BtroA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__dRSRRV5KZRkejuUW4BtroA.jpeg -------------------------------------------------------------------------------- /assets/img/1__eksuScrjBDgIxmJb7l6e8A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__eksuScrjBDgIxmJb7l6e8A.png -------------------------------------------------------------------------------- /assets/img/1__exaW6x3LkEprvG0HJkWeGQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__exaW6x3LkEprvG0HJkWeGQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__f1EeO3KT082qO8lZMvpNew.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__f1EeO3KT082qO8lZMvpNew.jpeg -------------------------------------------------------------------------------- /assets/img/1__g6gcZjA4fKAL__4exuhWKBQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__g6gcZjA4fKAL__4exuhWKBQ.png -------------------------------------------------------------------------------- /assets/img/1__hFksMe0lRfLM3nuyTpVa2A.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__hFksMe0lRfLM3nuyTpVa2A.jpeg -------------------------------------------------------------------------------- /assets/img/1__i8oZKoQLKRMXbwolqit__kQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__i8oZKoQLKRMXbwolqit__kQ.png -------------------------------------------------------------------------------- /assets/img/1__icPl2pBJcknYay7zkE7U6A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__icPl2pBJcknYay7zkE7U6A.png -------------------------------------------------------------------------------- /assets/img/1__jY____92Cpeeo9Upq__Ndfxqw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__jY____92Cpeeo9Upq__Ndfxqw.jpeg -------------------------------------------------------------------------------- /assets/img/1__jk0VirJgZvJD5LM6R7b7Jw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__jk0VirJgZvJD5LM6R7b7Jw.jpeg -------------------------------------------------------------------------------- /assets/img/1__kHgUtx5I0e028CiTgi0jkg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__kHgUtx5I0e028CiTgi0jkg.jpeg -------------------------------------------------------------------------------- /assets/img/1__kYSoRt1kc3T__LYDbKJv38w.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__kYSoRt1kc3T__LYDbKJv38w.jpeg -------------------------------------------------------------------------------- /assets/img/1__kblwRax6hDyA7OSI__4MYsw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__kblwRax6hDyA7OSI__4MYsw.png -------------------------------------------------------------------------------- /assets/img/1__koRcT1S1qixq3JeG7wHRLQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__koRcT1S1qixq3JeG7wHRLQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__kuOIOHYVG86DiP9sziOJgQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__kuOIOHYVG86DiP9sziOJgQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__l15YQ8__90epBFllRRkrBQQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__l15YQ8__90epBFllRRkrBQQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__l3BeD6nJCWYB9pVau7GyFg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__l3BeD6nJCWYB9pVau7GyFg.png -------------------------------------------------------------------------------- /assets/img/1__lHc9O9tUuk9Q2J9oQSd9Gg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__lHc9O9tUuk9Q2J9oQSd9Gg.png -------------------------------------------------------------------------------- /assets/img/1__lJHi8lshH7HiWk__PEw5Utw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__lJHi8lshH7HiWk__PEw5Utw.png -------------------------------------------------------------------------------- /assets/img/1__lyW0Iri__kqG8veUPt8COIg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__lyW0Iri__kqG8veUPt8COIg.jpeg -------------------------------------------------------------------------------- /assets/img/1__mooogiAqcfjdTcE6Rx__YYQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__mooogiAqcfjdTcE6Rx__YYQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__nNO0ccjlKwCNEQ__sdLES1Q.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__nNO0ccjlKwCNEQ__sdLES1Q.jpeg -------------------------------------------------------------------------------- /assets/img/1__nOY__ruArMDgdyhvLUAaQsA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__nOY__ruArMDgdyhvLUAaQsA.jpeg -------------------------------------------------------------------------------- /assets/img/1__niUvDTf12CKZ__8ru8bFV8g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__niUvDTf12CKZ__8ru8bFV8g.jpeg -------------------------------------------------------------------------------- /assets/img/1__njCZxE2vffyybJvMUUdRlw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__njCZxE2vffyybJvMUUdRlw.png -------------------------------------------------------------------------------- /assets/img/1__o9TmdVfPxscKeR9txE__h8A.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__o9TmdVfPxscKeR9txE__h8A.jpeg -------------------------------------------------------------------------------- /assets/img/1__o__edJUeFVjy__iHUM1lOI5Q.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__o__edJUeFVjy__iHUM1lOI5Q.jpeg -------------------------------------------------------------------------------- /assets/img/1__ob943W__Nd__92xTBQgle5Ng.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__ob943W__Nd__92xTBQgle5Ng.jpeg -------------------------------------------------------------------------------- /assets/img/1__pAx0kXuMzT__VcapgAD4IVw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__pAx0kXuMzT__VcapgAD4IVw.jpeg -------------------------------------------------------------------------------- /assets/img/1__q4rUj63HjeefZv7YN1q46Q.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__q4rUj63HjeefZv7YN1q46Q.jpeg -------------------------------------------------------------------------------- /assets/img/1__qEsLz60cp__O1dwHhZC1hDw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__qEsLz60cp__O1dwHhZC1hDw.jpeg -------------------------------------------------------------------------------- /assets/img/1__qIQlJky4s2bdf18aB8AgQw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__qIQlJky4s2bdf18aB8AgQw.jpeg -------------------------------------------------------------------------------- /assets/img/1__qhIflNjfRC3jqUkDLPoN1w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__qhIflNjfRC3jqUkDLPoN1w.png -------------------------------------------------------------------------------- /assets/img/1__qhsjbqc1hxvHOlzoh5__9VA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__qhsjbqc1hxvHOlzoh5__9VA.jpeg -------------------------------------------------------------------------------- /assets/img/1__qiR__6Zj__x66uyHa__zFaBMg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__qiR__6Zj__x66uyHa__zFaBMg.png -------------------------------------------------------------------------------- /assets/img/1__r64xZXCMZZs3UDmI0ah9Gg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__r64xZXCMZZs3UDmI0ah9Gg.jpeg -------------------------------------------------------------------------------- /assets/img/1__rJeyhu1qOz6q__A__DW1516g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__rJeyhu1qOz6q__A__DW1516g.jpeg -------------------------------------------------------------------------------- /assets/img/1__rWjq6xWHz__yay0va7tPp8g.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__rWjq6xWHz__yay0va7tPp8g.jpeg -------------------------------------------------------------------------------- /assets/img/1__sNznFKPCjpebaaRHKtf__GQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__sNznFKPCjpebaaRHKtf__GQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__sqBFzSmf02WuHKMOedm8KQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__sqBFzSmf02WuHKMOedm8KQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__tYqMdteIum45QYt6OH1YAQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__tYqMdteIum45QYt6OH1YAQ.png -------------------------------------------------------------------------------- /assets/img/1__tglOtx6icFNlueDWjypOKA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__tglOtx6icFNlueDWjypOKA.jpeg -------------------------------------------------------------------------------- /assets/img/1__ts4TFmY1Ic1Y6Fg8thICDQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__ts4TFmY1Ic1Y6Fg8thICDQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__tyNl29OrgHzYRu1__XFH0qw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__tyNl29OrgHzYRu1__XFH0qw.jpeg -------------------------------------------------------------------------------- /assets/img/1__ur4651t6W__J__v9z6Ua3F8Q.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__ur4651t6W__J__v9z6Ua3F8Q.jpeg -------------------------------------------------------------------------------- /assets/img/1__vEUinixD9t81RlbwpxO5BQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__vEUinixD9t81RlbwpxO5BQ.png -------------------------------------------------------------------------------- /assets/img/1__vK__ZvQxQP0__X__j9m38TncQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__vK__ZvQxQP0__X__j9m38TncQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__vMb8LVcBbkVvnEdQR1v__QA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__vMb8LVcBbkVvnEdQR1v__QA.png -------------------------------------------------------------------------------- /assets/img/1__vPiMgLUh9eBQP55d2HyUhA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__vPiMgLUh9eBQP55d2HyUhA.jpeg -------------------------------------------------------------------------------- /assets/img/1__vRyazvXpNXcqhc6gH8jmwA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__vRyazvXpNXcqhc6gH8jmwA.jpeg -------------------------------------------------------------------------------- /assets/img/1__vjvxktj16lX49nzBPEgvaw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__vjvxktj16lX49nzBPEgvaw.png -------------------------------------------------------------------------------- /assets/img/1__wz1hAARpuRrOYUQIGlAf__Q.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__wz1hAARpuRrOYUQIGlAf__Q.jpeg -------------------------------------------------------------------------------- /assets/img/1__x2vhxOc1C4dkqVfKA0U5SQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__x2vhxOc1C4dkqVfKA0U5SQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__xRezi604__WJ__Sp1zBPBB8g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__xRezi604__WJ__Sp1zBPBB8g.png -------------------------------------------------------------------------------- /assets/img/1__x__zkJSb2sMh2g1GDaphksg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__x__zkJSb2sMh2g1GDaphksg.jpeg -------------------------------------------------------------------------------- /assets/img/1__yCdZlB3U8I6vOcxMm__txgQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__yCdZlB3U8I6vOcxMm__txgQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__ytxuOu93lHlG5OY7q__JPGQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__ytxuOu93lHlG5OY7q__JPGQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__yw8EwaE__tHrjG3AC8KYGBA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__yw8EwaE__tHrjG3AC8KYGBA.png -------------------------------------------------------------------------------- /assets/img/1__yziEGgSPjrY6c4qoKixDoQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__yziEGgSPjrY6c4qoKixDoQ.png -------------------------------------------------------------------------------- /assets/img/1__zCAj5seQkNbli39bs0ogQQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__zCAj5seQkNbli39bs0ogQQ.jpeg -------------------------------------------------------------------------------- /assets/img/1__zCm1FYoiCBp1eFWY5uBBsw.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__zCm1FYoiCBp1eFWY5uBBsw.jpeg -------------------------------------------------------------------------------- /assets/img/1__z__UXmWAtFw91toTScbv1lQ.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/1__z__UXmWAtFw91toTScbv1lQ.jpeg -------------------------------------------------------------------------------- /assets/img/afterparty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/afterparty.jpg -------------------------------------------------------------------------------- /assets/img/bear-with-me.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/bear-with-me.jpg -------------------------------------------------------------------------------- /assets/img/coffee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/coffee.jpg -------------------------------------------------------------------------------- /assets/img/come-join.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/come-join.jpg -------------------------------------------------------------------------------- /assets/img/dancingbaby.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/dancingbaby.gif -------------------------------------------------------------------------------- /assets/img/emojis/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/.DS_Store -------------------------------------------------------------------------------- /assets/img/emojis/emoji-bear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/emoji-bear.png -------------------------------------------------------------------------------- /assets/img/emojis/emoji-handshake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/emoji-handshake.png -------------------------------------------------------------------------------- /assets/img/emojis/emoji-kokko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/emoji-kokko.png -------------------------------------------------------------------------------- /assets/img/emojis/emoji-out_of_office.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/emoji-out_of_office.png -------------------------------------------------------------------------------- /assets/img/emojis/emoji-perkele.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/emoji-perkele.png -------------------------------------------------------------------------------- /assets/img/emojis/emoji-torillatavataan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/emoji-torillatavataan.png -------------------------------------------------------------------------------- /assets/img/emojis/emoji-waiting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/emoji-waiting.png -------------------------------------------------------------------------------- /assets/img/emojis/nordicfamily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/emojis/nordicfamily.png -------------------------------------------------------------------------------- /assets/img/finnish-coffee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/finnish-coffee.jpg -------------------------------------------------------------------------------- /assets/img/getting-ready.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/getting-ready.jpg -------------------------------------------------------------------------------- /assets/img/lunch-time.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/lunch-time.jpg -------------------------------------------------------------------------------- /assets/img/mobile-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/mobile-01.png -------------------------------------------------------------------------------- /assets/img/mobile-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/mobile-02.png -------------------------------------------------------------------------------- /assets/img/mobile-03.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/mobile-03.jpeg -------------------------------------------------------------------------------- /assets/img/pattern.svg: -------------------------------------------------------------------------------- 1 | patternCreated using Figma -------------------------------------------------------------------------------- /assets/img/sketchnote-01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/sketchnote-01.jpeg -------------------------------------------------------------------------------- /assets/img/sketchnote-02.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/sketchnote-02.gif -------------------------------------------------------------------------------- /assets/img/sketchnote-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/sketchnote-03.png -------------------------------------------------------------------------------- /assets/img/sketchnote-04.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/sketchnote-04.jpeg -------------------------------------------------------------------------------- /assets/img/sketchnote-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/sketchnote-05.png -------------------------------------------------------------------------------- /assets/img/sketchnote-06.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/sketchnote-06.gif -------------------------------------------------------------------------------- /assets/img/sketchnote-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/sketchnote-07.png -------------------------------------------------------------------------------- /assets/img/sketchnote-08.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/sketchnote-08.jpeg -------------------------------------------------------------------------------- /assets/img/smoosh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/smoosh.jpg -------------------------------------------------------------------------------- /assets/img/venue-location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/venue-location.png -------------------------------------------------------------------------------- /assets/img/venue/atmosphere.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/venue/atmosphere.jpg -------------------------------------------------------------------------------- /assets/img/venue/bar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/venue/bar.jpg -------------------------------------------------------------------------------- /assets/img/venue/confetti.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/venue/confetti.jpg -------------------------------------------------------------------------------- /assets/img/venue/dj.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/venue/dj.jpg -------------------------------------------------------------------------------- /assets/img/venue/gig.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/venue/gig.jpg -------------------------------------------------------------------------------- /assets/img/workshop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/site/ba1f9b45881a6479fd9c66dab5b4d7fa38dc47a4/assets/img/workshop.jpg -------------------------------------------------------------------------------- /components/AnchorHeader.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import cx from "classnames"; 4 | 5 | const AnchorHeader = ({ level, anchor, className, children }, { getId }) => { 6 | let id = getId && getId(anchor, children); 7 | 8 | return React.createElement( 9 | `h${level}`, 10 | { className: cx("heading", className) }, 11 | [ 12 | 13 | {children} 14 | , 15 | 16 | # 17 | , 18 | ] 19 | ); 20 | }; 21 | AnchorHeader.contextTypes = { 22 | getId: PropTypes.func, 23 | }; 24 | AnchorHeader.propTypes = { 25 | level: PropTypes.number, 26 | className: PropTypes.string, 27 | anchor: PropTypes.string, 28 | children: PropTypes.node, 29 | }; 30 | 31 | export default AnchorHeader; 32 | -------------------------------------------------------------------------------- /components/AnchorProvider.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import isObject from "is-object"; 4 | import { slugify } from "../utils"; 5 | 6 | class AnchorProvider extends React.Component { 7 | constructor() { 8 | super(); 9 | 10 | this.ids = {}; // { id: index }. Example: { foo: 1 } 11 | } 12 | getChildContext() { 13 | const parent = this; 14 | 15 | return { 16 | getId: (anchor, children) => { 17 | let id = slugify( 18 | anchor || 19 | (Array.isArray(children) ? children : [children]) 20 | .filter(c => !isObject(c)) 21 | .join() 22 | ); 23 | 24 | // Check for duplicate id 25 | if (parent.ids[id]) { 26 | parent.ids[id]++; 27 | 28 | id += `-${parent.ids[id]}`; 29 | } else { 30 | parent.ids[id] = 1; 31 | } 32 | 33 | return id; 34 | }, 35 | }; 36 | } 37 | render() { 38 | return this.props.children; 39 | } 40 | } 41 | AnchorProvider.childContextTypes = { 42 | getId: PropTypes.func, 43 | }; 44 | AnchorProvider.propTypes = { 45 | children: PropTypes.node, 46 | }; 47 | 48 | export default AnchorProvider; 49 | -------------------------------------------------------------------------------- /components/Author.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const Author = ({ author }) =>
{author}
; 4 | 5 | export default Author; 6 | -------------------------------------------------------------------------------- /components/Contact.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactCountryFlag from "react-country-flag"; 3 | import PropTypes from "prop-types"; 4 | import Markdown from "./Markdown"; 5 | import AnchorHeader from "./AnchorHeader"; 6 | 7 | const Contact = ({ 8 | name, 9 | image, 10 | social, 11 | country, 12 | about, 13 | headerLevel = 2, 14 | children, 15 | }) => ( 16 |
17 |
18 | 23 | {about 30 | 31 | {name} 32 | 33 | 34 | 35 | 36 | 37 | 38 |
39 | {social.homepage && {social.homepage}} 40 | 41 | {social.github && ( 42 | 43 | 44 | 45 | )} 46 | 47 | {social.twitter && ( 48 | 49 | 50 | 51 | )} 52 | 53 | {social.linkedin && ( 54 | 55 | 56 | 57 | )} 58 | 59 | {social.twitch && ( 60 | 61 | 62 | 63 | )} 64 |
65 |
66 | 67 |
68 | {about ? : "No bio yet."} 69 |
70 | 71 | {children} 72 |
73 | ); 74 | Contact.propTypes = { 75 | name: PropTypes.string, 76 | image: PropTypes.object, 77 | social: PropTypes.object, 78 | country: PropTypes.object, 79 | about: PropTypes.string, 80 | headerLevel: PropTypes.number, 81 | children: PropTypes.node, 82 | }; 83 | 84 | export default Contact; 85 | -------------------------------------------------------------------------------- /components/ContactMini.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { slugify } from "../utils"; 4 | 5 | const ContactMiniContent = ({ image, name }) => [ 6 | about, 13 |
14 | {name} 15 |
, 16 | ]; 17 | ContactMiniContent.propTypes = { 18 | image: PropTypes.object, 19 | name: PropTypes.string, 20 | }; 21 | 22 | const ContactMini = ({ name, about, image }) => ( 23 |
24 | 25 | 26 | 27 |
28 | ); 29 | ContactMini.propTypes = { 30 | name: PropTypes.string, 31 | about: PropTypes.string, 32 | image: PropTypes.object, 33 | }; 34 | 35 | export default ContactMini; 36 | -------------------------------------------------------------------------------- /components/Contacts.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Contact from "./Contact"; 3 | 4 | const Contacts = ({ items = [], render, renderProps = {} }) => ( 5 | <> 6 | {items.map((contact, key) => 7 | React.createElement(render || Contact, { 8 | ...contact, 9 | ...renderProps, 10 | key, 11 | }) 12 | )} 13 | 14 | ); 15 | 16 | export default Contacts; 17 | -------------------------------------------------------------------------------- /components/Countdown.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import timediff from "timediff"; 4 | 5 | class Countdown extends React.Component { 6 | constructor(props) { 7 | super(props); 8 | this.updateCountdown = this.updateCountdown.bind(this); 9 | this.state = { 10 | currentDate: Date.now(), 11 | }; 12 | } 13 | 14 | componentDidMount() { 15 | this.interval = setInterval(this.updateCountdown, 1000); 16 | } 17 | 18 | componentWillUnmount() { 19 | clearInterval(this.interval); 20 | } 21 | 22 | updateCountdown() { 23 | this.setState({ currentDate: Date.now() }); 24 | } 25 | 26 | render() { 27 | const { days, hours, minutes, seconds } = timediff( 28 | this.state.currentDate, 29 | this.props.toDate, 30 | "D:H:m:S" 31 | ); 32 | return ( 33 |
34 |

Till the event:

35 |
{days} days
36 |
{hours}h
37 |
{minutes}m
38 |
{seconds}s
39 |
40 | ); 41 | } 42 | } 43 | Countdown.propTypes = { 44 | initialDate: PropTypes.string, 45 | toDate: PropTypes.string, 46 | }; 47 | 48 | export default Countdown; 49 | -------------------------------------------------------------------------------- /components/Footer.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import Navigation from "./Navigation"; 4 | import navigationPages from "./navigation-pages"; 5 | 6 | const Footer = ({ pathname }) => { 7 | return ( 8 | 22 | ); 23 | }; 24 | Footer.propTypes = { 25 | pathname: PropTypes.string, 26 | }; 27 | 28 | export default Footer; 29 | -------------------------------------------------------------------------------- /components/Header.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import Link from "./Link"; 4 | import Navigation from "./Navigation"; 5 | import logo from "assets/img/logo.svg"; 6 | import navigationPages from "./navigation-pages"; 7 | //import Countdown from "./Countdown"; 8 | //import Interactive from "antwar-interactive"; 9 | 10 | const Header = ({ pathname, title }) => { 11 | const isHomePage = pathname === "/"; 12 | return isHomePage ? ( 13 |
14 |
15 | 16 | 17 |

18 | React Finland Logo 25 | 26 | React 27 | Finland 28 | 29 |

30 | 31 | 32 | {/*

React Finland 2021

*/} 33 | 34 | {/* 35 |
36 | 39 | to 40 | 43 |
Live
44 |
*/} 45 | {/* 51 | 55 | Register 56 | 57 | 58 | />*/} 59 |
60 |
61 | ) : ( 62 |
63 |
64 | 65 |

66 | React Finland Logo 73 | 74 | React 75 | Finland 76 | 77 |

78 | 79 | 80 |

{title}

81 |
82 |
83 | ); 84 | }; 85 | Header.propTypes = { 86 | pathname: PropTypes.string, 87 | title: PropTypes.string, 88 | }; 89 | 90 | export default Header; 91 | -------------------------------------------------------------------------------- /components/Keywords.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | const Keywords = ({ items }) => ( 5 |
    6 | {items.map(keyword => ( 7 |
  • 8 | {keyword} 9 |
  • 10 | ))} 11 |
12 | ); 13 | Keywords.propTypes = { 14 | items: PropTypes.array, 15 | }; 16 | 17 | export default Keywords; 18 | -------------------------------------------------------------------------------- /components/Link.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Link as RRLink } from "react-router-dom"; 3 | import PropTypes from "prop-types"; 4 | 5 | const Link = ({ to, children, ...props }) => 6 | /^https?:\/\//.test(to) ? ( 7 | 8 | {children} 9 | 10 | ) : ( 11 | 12 | {children} 13 | 14 | ); 15 | Link.propTypes = { 16 | to: PropTypes.string, 17 | children: PropTypes.node, 18 | props: PropTypes.object, 19 | }; 20 | 21 | export default Link; 22 | -------------------------------------------------------------------------------- /components/Markdown.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable react/display-name, react/prop-types */ 2 | import React from "react"; 3 | import ReactMarkdown from "react-markdown"; 4 | import PropTypes from "prop-types"; 5 | import AnchorHeader from "./AnchorHeader"; 6 | // import Schedule from "./Schedule"; 7 | 8 | const Tip = ({ text }) => ( 9 |
10 | 11 | {text.slice(2)} 12 |
13 | ); 14 | Tip.propTypes = { 15 | text: PropTypes.string, 16 | }; 17 | 18 | const Warning = ({ text }) => ( 19 |
20 | 21 | {text.slice(2)} 22 |
23 | ); 24 | Warning.propTypes = { 25 | text: PropTypes.string, 26 | }; 27 | 28 | const renderers = { 29 | heading: ({ level, children }) => ( 30 | {children} 31 | ), 32 | // TODO: This should assume all images are remote as the API should handle them 33 | // -> process markdown at the API even 34 | image: ({ alt, src }) => { 35 | const srcParts = alt ? alt.split("|") : []; 36 | alt = srcParts[0] || ""; 37 | const width = srcParts[1] || ""; 38 | const height = srcParts[2] || ""; 39 | const className = srcParts[3] || ""; 40 | 41 | if (src.startsWith("@react-finland/")) { 42 | src = src.split("@react-finland/content-2018/images/")[1]; 43 | 44 | return ( 45 | {alt} 52 | ); 53 | } 54 | 55 | src = src.split("assets/img/")[1]; 56 | 57 | return ( 58 | {alt} 65 | ); 66 | }, 67 | paragraph: ({ children }) => { 68 | const text = children[0]; 69 | 70 | // Example: T> 71 | if (text.startsWith && text.startsWith("T> ")) { 72 | return ; 73 | } 74 | 75 | // Example: W> 76 | if (text.startsWith && text.startsWith("W> ")) { 77 | return ; 78 | } 79 | 80 | return

{children}

; 81 | }, 82 | }; 83 | 84 | const Markdown = ({ source, ...props }) => ( 85 | 86 | ); 87 | Markdown.propTypes = { 88 | source: PropTypes.string, 89 | props: PropTypes.object, 90 | }; 91 | 92 | export default Markdown; 93 | -------------------------------------------------------------------------------- /components/Meta.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Helmet from "react-helmet-async"; 3 | import PropTypes from "prop-types"; 4 | 5 | const Meta = ({ siteName, title, description, keywords = [] }) => ( 6 | 7 | 8 | 9 | 10 | 11 | {siteName} - {title} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ); 28 | Meta.propTypes = { 29 | siteName: PropTypes.string, 30 | title: PropTypes.string, 31 | description: PropTypes.string, 32 | keywords: PropTypes.array, 33 | }; 34 | 35 | export default Meta; 36 | -------------------------------------------------------------------------------- /components/Moment.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import moment from "moment"; 4 | 5 | const Moment = ({ className, datetime, format = "D MMM YYYY" }) => ( 6 | 9 | ); 10 | 11 | Moment.propTypes = { 12 | className: PropTypes.string, 13 | datetime: PropTypes.string, 14 | format: PropTypes.string, 15 | }; 16 | 17 | export default Moment; 18 | -------------------------------------------------------------------------------- /components/Navigation.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import classnames from "classnames"; 3 | import PropTypes from "prop-types"; 4 | import Link from "./Link"; 5 | 6 | const NavigationRow = ({ links, pathname, className, ...props }) => ( 7 |
    8 | {links.map((link, i) => { 9 | const linkClassNames = classnames("nav--link", { 10 | "nav--link_selected": link.url && link.url === pathname, 11 | }); 12 | return ( 13 |
  • 14 | {link.url ? {link.title} : link.title} 15 |
  • 16 | ); 17 | })} 18 |
19 | ); 20 | NavigationRow.propTypes = { 21 | links: PropTypes.array, 22 | pathname: PropTypes.string, 23 | className: PropTypes.string, 24 | props: PropTypes.object, 25 | }; 26 | 27 | const Navigation = ({ pages, pathname }) => ( 28 | 33 | ); 34 | Navigation.propTypes = { 35 | pages: PropTypes.array, 36 | pathname: PropTypes.string, 37 | }; 38 | 39 | export default Navigation; 40 | -------------------------------------------------------------------------------- /components/Organizer.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | const Organizer = ({ name, image, about }) => ( 5 |
6 | {about} 13 | 14 |
{name}
15 |
16 | ); 17 | Organizer.propTypes = { 18 | name: PropTypes.string, 19 | image: PropTypes.object, 20 | about: PropTypes.string, 21 | }; 22 | 23 | export default Organizer; 24 | -------------------------------------------------------------------------------- /components/PrevNext.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Link from "./Link"; 3 | 4 | const PrevNext = ({ 5 | next, 6 | nextText, 7 | previous, 8 | previousText, 9 | getTitle = () => {}, 10 | }) => { 11 | if (!(next || previous)) { 12 | return
; 13 | } 14 | 15 | // XXX: make sure page spans whole container if it's the only one 16 | let style = { 17 | width: "100%", 18 | }; 19 | if (next && previous) { 20 | style = {}; 21 | } 22 | 23 | return ( 24 |
25 | {previous ? ( 26 |
27 | {previousText} 28 | 29 | {getTitle(previous)} 30 | 31 |
32 | ) : null} 33 | {next ? ( 34 |
35 | {nextText} 36 | 37 | {getTitle(next)} 38 | 39 |
40 | ) : null} 41 |
42 | ); 43 | }; 44 | 45 | export default PrevNext; 46 | -------------------------------------------------------------------------------- /components/ScheduleIcon.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import scheduleTypes from "./schedule-types"; 4 | 5 | const ScheduleIcon = ({ type }) => 6 | scheduleTypes[type] ? ( 7 | 10 | ) : null; 11 | ScheduleIcon.propTypes = { 12 | type: PropTypes.string, 13 | }; 14 | 15 | export default ScheduleIcon; 16 | -------------------------------------------------------------------------------- /components/ScheduleLegend.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ScheduleIcon from "./ScheduleIcon"; 3 | import scheduleTypes from "./schedule-types"; 4 | 5 | const ScheduleLegend = () => ( 6 |
7 | Legend 8 | 9 | {Object.keys(scheduleTypes).map(type => ( 10 |
11 | 12 | {scheduleTypes[type].title} 13 |
14 | ))} 15 |
16 | ); 17 | 18 | export default ScheduleLegend; 19 | -------------------------------------------------------------------------------- /components/SessionLink.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { slugify } from "utils"; 4 | 5 | const PrefixedSessionLink = prefix => { 6 | const SessionLink = ({ title }) => ( 7 | 8 | 9 | 👩‍💻 10 | 11 | {title} 12 | 13 | ); 14 | SessionLink.propTypes = { 15 | title: PropTypes.string, 16 | }; 17 | 18 | return SessionLink; 19 | }; 20 | 21 | export default PrefixedSessionLink; 22 | -------------------------------------------------------------------------------- /components/SessionSpeakers.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { slugify } from "../utils"; 4 | 5 | const SessionSpeakers = ({ speakers = [], prefix }) => ( 6 | 7 | {speakers.map(({ name, image, about }, i) => [ 8 | speakers.length > 1 && i === speakers.length - 1 && ( 9 | and 10 | ), 11 | 16 | {about 24 | {name} 25 | , 26 | ])} 27 | 28 | ); 29 | SessionSpeakers.propTypes = { 30 | speakers: PropTypes.array, 31 | }; 32 | 33 | export default SessionSpeakers; 34 | -------------------------------------------------------------------------------- /components/Speaker.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { AnchorHeader, Contact, Contacts } from "components"; 4 | import SessionLink from "./SessionLink"; 5 | import Talk from "./Talk.js"; 6 | 7 | const Speaker = ({ talks, workshops, ...contact }) => ( 8 | 9 | {talks && 10 | talks.length > 0 && ( 11 |
12 | Talks 13 | 18 |
19 | )} 20 | {workshops && 21 | workshops.length > 0 && 22 | workshops.every(({ title }) => title) && ( 23 |
24 | Workshops 25 | 30 |
31 | )} 32 |
33 | ); 34 | Speaker.propTypes = { 35 | talks: PropTypes.array, 36 | workshops: PropTypes.array, 37 | contact: PropTypes.object, 38 | }; 39 | 40 | export default Speaker; 41 | -------------------------------------------------------------------------------- /components/Sponsor.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | const SponsorContent = ({ image, name, props }) => ( 5 | {name} 6 | ); 7 | SponsorContent.propTypes = { 8 | image: PropTypes.object, 9 | name: PropTypes.string, 10 | props: PropTypes.object, 11 | }; 12 | 13 | const Sponsor = ({ name, about, social, image, logoProps }) => ( 14 |
15 | 16 | 17 | 18 |
19 | ); 20 | Sponsor.propTypes = { 21 | name: PropTypes.string, 22 | about: PropTypes.string, 23 | social: PropTypes.object, 24 | image: PropTypes.object, 25 | logoProps: PropTypes.object, 26 | }; 27 | 28 | export default Sponsor; 29 | -------------------------------------------------------------------------------- /components/Sponsors.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { AnchorHeader, Contacts, Sponsor } from "./"; 4 | import * as tweakSponsors from "./tweak-sponsors"; 5 | 6 | const Sponsors = ({ 7 | goldSponsors, 8 | silverSponsors, 9 | bronzeSponsors, 10 | partners, 11 | }) => ( 12 |
13 |
14 | 15 | Sponsors 16 | 17 |
18 |
19 | 20 | 21 | 🥇 22 | 23 | Gold Sponsor 24 | 25 |
26 | 27 | {goldSponsors && goldSponsors.length < 1 && ( 28 | Become a sponsor 29 | )} 30 |
31 |
32 |
33 | 34 | 35 | 🥈 36 | 37 | Silver Sponsors 38 | 39 |
40 | 41 | {silverSponsors && silverSponsors.length < 4 && ( 42 | Become a sponsor 43 | )} 44 |
45 |
46 | 47 |
48 | 49 | 50 | 🥉 51 | 52 | Bronze Sponsors 53 | 54 |
55 | 59 | {bronzeSponsors && bronzeSponsors.length < 6 && ( 60 | Become a sponsor 61 | )} 62 |
63 |
64 | 65 | {/* 66 |
67 | 68 | 69 | 🎊 70 | 71 | Platform Sponsor 72 | 73 |
74 | 75 |
76 |
77 | */} 78 | 79 |
80 | 81 | Partners 82 | 83 |
84 | 85 |
86 |
87 |
88 | ); 89 | Sponsors.propTypes = { 90 | partners: PropTypes.array, 91 | goldSponsors: PropTypes.array, 92 | silverSponsors: PropTypes.array, 93 | bronzeSponsors: PropTypes.array, 94 | }; 95 | 96 | export default Sponsors; 97 | -------------------------------------------------------------------------------- /components/Subscribe.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const Subscribe = () => { 4 | return ( 5 |
9 | 21 |
32 |
{ 43 | e.preventDefault(); 44 | mjOpenPopin(e, document.querySelector("#subscribe-button")); 45 | }} 46 | onKeyDown={e => { 47 | e.preventDefault(); 48 | mjOpenPopin(e, document.querySelector("#subscribe-button")); 49 | }} 50 | > 51 | Subscribe to get React Finland related news to your mail. 52 |
53 |
54 |
55 | ); 56 | }; 57 | 58 | export default Subscribe; 59 | -------------------------------------------------------------------------------- /components/VenueGallery.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Gallery from "react-photo-gallery"; 3 | import Lightbox from "react-image-lightbox"; 4 | 5 | const PHOTOS = [ 6 | { 7 | src: require("assets/img/venue/confetti.jpg"), 8 | width: 2, 9 | height: 1, 10 | alt: "Confetti", 11 | }, 12 | { 13 | src: require("assets/img/venue/atmosphere.jpg"), 14 | width: 1, 15 | height: 1, 16 | alt: "Atmosphere", 17 | }, 18 | { 19 | src: require("assets/img/venue/bar.jpg"), 20 | width: 1, 21 | height: 1, 22 | alt: "Bar", 23 | }, 24 | { 25 | src: require("assets/img/venue/dj.jpg"), 26 | width: 1.5, 27 | height: 1, 28 | alt: "DJ", 29 | }, 30 | { 31 | src: require("assets/img/venue/gig.jpg"), 32 | width: 1.5, 33 | height: 1, 34 | alt: "Gig", 35 | }, 36 | ]; 37 | 38 | class VenueGallery extends React.Component { 39 | constructor(props) { 40 | super(props); 41 | 42 | this.state = { currentImage: 0 }; 43 | this.closeLightbox = this.closeLightbox.bind(this); 44 | this.openLightbox = this.openLightbox.bind(this); 45 | } 46 | render() { 47 | const currentImage = this.state.currentImage; 48 | 49 | return ( 50 |
51 | 52 | {this.state.lightboxIsOpen && ( 53 | 57 | )} 58 |
59 | ); 60 | } 61 | openLightbox(event, obj) { 62 | this.setState(() => ({ 63 | currentImage: obj.index, 64 | lightboxIsOpen: true, 65 | })); 66 | } 67 | closeLightbox() { 68 | this.setState(() => ({ 69 | lightboxIsOpen: false, 70 | })); 71 | } 72 | } 73 | 74 | export default VenueGallery; 75 | -------------------------------------------------------------------------------- /components/Workshop.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { AnchorHeader, Markdown, SessionSpeakers } from "components"; 4 | 5 | const Workshop = ({ 6 | speakers, 7 | day, 8 | begin, 9 | end, 10 | title, 11 | description, 12 | location, 13 | headerLevel = 2, 14 | }) => ( 15 |
16 | 17 | {title || "To be announced."} 18 | 19 | 20 | 21 | 22 | {day && begin && end && ( 23 |
24 | {day}, - 25 | 26 | ,  27 | 28 |
29 | )} 30 | 31 | {description ? ( 32 | 33 | ) : ( 34 |
To be announced.
35 | )} 36 | 37 | {location && ( 38 | <> 39 | Location 40 |
41 | {location.name}{" "} 42 | {location.address ? `- ${location.address},${location.city}` : null} 43 |
44 | 45 | )} 46 |
47 | ); 48 | Workshop.propTypes = { 49 | speakers: PropTypes.array, 50 | title: PropTypes.string, 51 | day: PropTypes.string, 52 | begin: PropTypes.string, 53 | end: PropTypes.string, 54 | description: PropTypes.string, 55 | headerLevel: PropTypes.number, 56 | location: PropTypes.object, 57 | }; 58 | 59 | export default Workshop; 60 | -------------------------------------------------------------------------------- /components/connect.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { request } from "graphql-request"; 3 | import config from "config"; 4 | 5 | function connect(query, propsToVars, props) { 6 | return component => { 7 | let queryCache = {}; 8 | 9 | class Connect extends React.Component { 10 | constructor(props) { 11 | super(props); 12 | 13 | this.state = { data: queryCache || null }; 14 | } 15 | componentDidMount() { 16 | this.fetchData().then(data => this.setState(() => data)); 17 | } 18 | render() { 19 | if (this.state.data === null) { 20 | return null; 21 | } else { 22 | return React.createElement(component, { 23 | ...props, 24 | ...this.props, 25 | ...this.state.data, 26 | }); 27 | } 28 | } 29 | fetchData() { 30 | let variables = { 31 | conferenceId: config.conferenceId, 32 | }; 33 | if (propsToVars) { 34 | variables = { 35 | ...variables, 36 | ...propsToVars(this.props), 37 | }; 38 | } 39 | return request(config.apiUrl, query, variables).then(data => { 40 | queryCache = data; 41 | 42 | return { data }; 43 | }); 44 | } 45 | } 46 | 47 | return Connect; 48 | }; 49 | } 50 | 51 | export default connect; 52 | -------------------------------------------------------------------------------- /components/index.js: -------------------------------------------------------------------------------- 1 | export { default as AnchorHeader } from "./AnchorHeader"; 2 | export { default as AnchorProvider } from "./AnchorProvider"; 3 | export { default as Contacts } from "./Contacts"; 4 | export { default as Contact } from "./Contact"; 5 | export { default as ContactMini } from "./ContactMini"; 6 | export { default as Header } from "./Header"; 7 | export { default as Link } from "./Link"; 8 | export { default as Navigation } from "./Navigation"; 9 | export { default as Markdown } from "./Markdown"; 10 | export { default as Meta } from "./Meta"; 11 | export { default as Organizer } from "./Organizer"; 12 | export { default as Schedule } from "./Schedule"; 13 | export { default as ScheduleLegend } from "./ScheduleLegend"; 14 | export { default as SessionSpeakers } from "./SessionSpeakers"; 15 | export { default as Subscribe } from "./Subscribe"; 16 | export { default as Speaker } from "./Speaker"; 17 | export { default as Sponsors } from "./Sponsors"; 18 | export { default as Sponsor } from "./Sponsor"; 19 | export { default as Footer } from "./Footer"; 20 | export { default as VenueGallery } from "./VenueGallery"; 21 | export { default as Workshop } from "./Workshop"; 22 | export { default as Moment } from "./Moment"; 23 | export { default as Author } from "./Author"; 24 | export { default as PrevNext } from "./PrevNext"; 25 | export { default as connect } from "./connect"; 26 | -------------------------------------------------------------------------------- /components/schedule-types.js: -------------------------------------------------------------------------------- 1 | const types = { 2 | KEYNOTE: { icon: "🗝", title: "Keynote" }, 3 | LIGHTNING_TALK: { icon: "⚡️", title: "Lightning talk" }, 4 | TALK: { icon: "🎙", title: "Presentation" }, 5 | PANEL: { icon: "🙋", title: "Panel" }, 6 | WORKSHOP: { icon: "👩‍💻", title: "Workshop" }, 7 | COFFEE_BREAK: { icon: "☕", title: "Coffee break" }, 8 | BREAKFAST: { icon: "🥐", title: "Breakfast" }, 9 | LUNCH: { icon: "🍽️", title: "Lunch" }, 10 | ORGANIZATIONAL: { icon: "💤", title: "Organizational" }, 11 | PARTY: { icon: "🎉", title: "Party" }, 12 | }; 13 | 14 | export default types; 15 | -------------------------------------------------------------------------------- /components/tweak-sponsors.js: -------------------------------------------------------------------------------- 1 | function tweakBronzeSponsors(sponsors) { 2 | // Tweak Rohea 3 | return sponsors 4 | ? sponsors.map(sponsor => { 5 | if (sponsor.name === "Rohea") { 6 | return { 7 | ...sponsor, 8 | logoProps: { 9 | style: { 10 | background: "black", 11 | padding: "1em", 12 | }, 13 | }, 14 | }; 15 | } 16 | 17 | return sponsor; 18 | }) 19 | : []; 20 | } 21 | 22 | export { tweakBronzeSponsors as bronze }; 23 | -------------------------------------------------------------------------------- /layouts/BlogIndex.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import _ from "lodash"; 4 | import { Link, Moment } from "../components"; 5 | 6 | const BlogIndex = ({ section }) => ( 7 |
8 |

Blog Posts

9 | 10 |
    11 | {_.map(section.pages(), (page, i) => ( 12 |
  • 13 | 14 |

    {page.file.attributes.title}

    15 | 16 | {page.file.attributes.date ? ( 17 | 21 | ) : null} 22 |

    {page.file.preview}

    23 | 24 |
  • 25 | ))} 26 |
27 |
28 | ); 29 | 30 | BlogIndex.propTypes = { 31 | section: PropTypes.object, 32 | }; 33 | 34 | export default BlogIndex; 35 | -------------------------------------------------------------------------------- /layouts/BlogPage.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import React from "react"; 3 | import PropTypes from "prop-types"; 4 | import { Moment, Author, PrevNext } from "../components"; 5 | import Page from "./Page"; 6 | 7 | const BlogPage = ({ 8 | page: { 9 | file: { 10 | attributes: { author, date, updateDate }, 11 | body, 12 | }, 13 | previous, 14 | next, 15 | }, 16 | config, 17 | }) => { 18 | let postAuthor = author || (config.blog && config.blog.author); 19 | 20 | if (_.isFunction(postAuthor)) { 21 | postAuthor = postAuthor(); 22 | } 23 | 24 | const footer = ( 25 | 26 | page.file.title} 32 | /> 33 | 34 | ); 35 | 36 | return ( 37 | 38 |
39 | 40 | {postAuthor && } 41 | 42 | ); 43 | }; 44 | 45 | BlogPage.propTypes = { 46 | page: PropTypes.object, 47 | section: PropTypes.object, 48 | config: PropTypes.object, 49 | }; 50 | 51 | function Dates({ date, updateDate }) { 52 | return ( 53 |
54 | {date && ( 55 |
56 | Published:{" "} 57 | 58 |
59 | )} 60 | {updateDate && ( 61 |
62 | Updated:{" "} 63 | 64 |
65 | )} 66 |
67 | ); 68 | } 69 | 70 | Dates.propTypes = { 71 | date: PropTypes.string, 72 | updateDate: PropTypes.string, 73 | }; 74 | 75 | export default BlogPage; 76 | -------------------------------------------------------------------------------- /layouts/Page.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | // import { Disqus } from "@survivejs/components"; 4 | 5 | const Page = ({ footer, children }) => { 6 | return ( 7 |
8 |
9 |
10 |
{children}
11 |
12 | {footer} 13 | 14 |
15 | 16 | {/**/} 17 |
18 |
19 |
20 |
21 | ); 22 | }; 23 | 24 | Page.propTypes = { 25 | title: PropTypes.string, 26 | footer: PropTypes.object, 27 | children: PropTypes.node, 28 | }; 29 | 30 | export default Page; 31 | -------------------------------------------------------------------------------- /layouts/SiteBody.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { HelmetProvider } from "react-helmet-async"; 4 | // import Interactive from "antwar-interactive"; 5 | import { 6 | AnchorProvider, 7 | Footer, 8 | Header, 9 | Meta /* Subscribe */, 10 | } from "../components"; 11 | 12 | import "normalize.css/normalize.css"; 13 | import "../styles/style.scss"; 14 | 15 | const siteName = "React Finland"; 16 | 17 | const SiteBody = ( 18 | { 19 | children, 20 | location: { pathname }, 21 | page: { file: { title, description, keywords }, previous, next } = {}, 22 | }, 23 | { router } 24 | ) => { 25 | return ( 26 | 31 | 32 | 38 |
39 |
40 | 41 |
50 | {previous && ( 51 | 52 | Previous post 53 | 54 | )} 55 | {next && ( 56 | 57 | Next post 58 | 59 | )} 60 |
61 | 62 |
68 |
{children}
69 |
70 | {/* 71 | 72 | */} 73 |
74 |
75 |
76 |
77 | ); 78 | }; 79 | SiteBody.propTypes = { 80 | children: PropTypes.node, 81 | location: PropTypes.object, 82 | page: PropTypes.object, 83 | conference: PropTypes.shape({ 84 | partners: PropTypes.array, 85 | goldSponsors: PropTypes.array, 86 | silverSponsors: PropTypes.array, 87 | bronzeSponsors: PropTypes.array, 88 | }), 89 | }; 90 | 91 | export default SiteBody; 92 | -------------------------------------------------------------------------------- /pages/2018.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { connect, Markdown, Sponsors } from "components"; 3 | 4 | const main = ` 5 | React Finland was a great success! Read about [what lessons we learned](/blog/react-finland-2018---lessons-learned-754a5f29067c/) and [how people experienced the conference](/blog/react-finland-2018---blog-coverage-e65bcece8946/). 6 | 7 | See also [2018 speakers](/2018/speakers/), [schedule](/2018/schedule/), and [workshops](/2018/workshops/).`; 8 | 9 | const PageFor2018 = ({ conference }) => ( 10 | <> 11 |
12 |
13 | 14 |
15 |
16 | 17 | 18 | ); 19 | 20 | export default ({ conferenceId }) => 21 | connect( 22 | ` 23 | fragment SpeakerFragment on Contact { 24 | name 25 | about 26 | social { 27 | homepage 28 | github 29 | twitter 30 | linkedin 31 | } 32 | image { 33 | url 34 | } 35 | } 36 | 37 | fragment SponsorFragment on Contact { 38 | name 39 | social { 40 | homepage 41 | } 42 | about 43 | image { 44 | url 45 | } 46 | } 47 | 48 | query PageQuery($conferenceId: ID!) { 49 | conference(id: $conferenceId) { 50 | mcs { 51 | ...SpeakerFragment 52 | } 53 | keynoteSpeakers { 54 | ...SpeakerFragment 55 | } 56 | speakers { 57 | ...SpeakerFragment 58 | } 59 | lightningTalkSpeakers { 60 | ...SpeakerFragment 61 | } 62 | workshopInstructors { 63 | ...SpeakerFragment 64 | } 65 | partners { 66 | ...SponsorFragment 67 | } 68 | goldSponsors { 69 | ...SponsorFragment 70 | } 71 | silverSponsors { 72 | ...SponsorFragment 73 | } 74 | bronzeSponsors { 75 | ...SponsorFragment 76 | } 77 | } 78 | } 79 | `, 80 | () => ({ 81 | conferenceId, 82 | }) 83 | )(PageFor2018); 84 | -------------------------------------------------------------------------------- /pages/2019.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { connect, Markdown, Sponsors } from "components"; 3 | 4 | const main = ` 5 | React Finland was a great success! [See the recap video to see how it went!](https://www.youtube.com/watch?v=BO_osndeLII). 6 | 7 | See also [2019 speakers](/2019/speakers/), [schedule](/2019/schedule/), and [workshops](/2019/workshops/).`; 8 | 9 | const PageFor2019 = ({ conference }) => ( 10 | <> 11 |
12 |
13 | 14 |
15 |
16 | 17 | 18 | ); 19 | 20 | export default ({ conferenceId }) => 21 | connect( 22 | ` 23 | fragment SpeakerFragment on Contact { 24 | name 25 | about 26 | social { 27 | homepage 28 | github 29 | twitter 30 | linkedin 31 | } 32 | image { 33 | url 34 | } 35 | } 36 | 37 | fragment SponsorFragment on Contact { 38 | name 39 | social { 40 | homepage 41 | } 42 | about 43 | image { 44 | url 45 | } 46 | } 47 | 48 | query PageQuery($conferenceId: ID!) { 49 | conference(id: $conferenceId) { 50 | mcs { 51 | ...SpeakerFragment 52 | } 53 | keynoteSpeakers { 54 | ...SpeakerFragment 55 | } 56 | speakers { 57 | ...SpeakerFragment 58 | } 59 | lightningTalkSpeakers { 60 | ...SpeakerFragment 61 | } 62 | workshopInstructors { 63 | ...SpeakerFragment 64 | } 65 | partners { 66 | ...SponsorFragment 67 | } 68 | goldSponsors { 69 | ...SponsorFragment 70 | } 71 | silverSponsors { 72 | ...SponsorFragment 73 | } 74 | bronzeSponsors { 75 | ...SponsorFragment 76 | } 77 | } 78 | } 79 | `, 80 | () => ({ 81 | conferenceId, 82 | }) 83 | )(PageFor2019); 84 | -------------------------------------------------------------------------------- /pages/2021.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { connect, Markdown, Sponsors } from "components"; 3 | 4 | const main = `React Finland 2021 took place between 30th of August and 3rd of September. 5 | 6 | The conference sessions occurred online due to the exceptional circumstances. We ran the conference in a vodcast format that worked out like this: 7 | 8 | * Each session was scoped to a specific theme 9 | * There was be a host and three to four speakers 10 | * The sessions took ~1.5-2h and there was a 15 minute slot to demo and present for each speaker 11 | * You could send your questions and comments through YouTube and Twitch and we'll cover them live during the sessions 12 | 13 | You can access the content freely. [See the schedule](/2021/schedule/) for the videos. You can also [try out our online venue](https://reactfinland.github.io/venue/). 14 | 15 | > [Learn more from the conference announcement](/blog/react-finland-2021/) and [read about the highlights of the upcoming conference](/blog/rf21-schedule-highlights/).`; 16 | 17 | const PageFor2021 = ({ conference }) => ( 18 | <> 19 |
20 |
21 | 22 |
23 |
24 | 25 | 26 | ); 27 | 28 | export default ({ conferenceId }) => 29 | connect( 30 | ` 31 | fragment SpeakerFragment on Contact { 32 | name 33 | about 34 | social { 35 | homepage 36 | github 37 | twitter 38 | linkedin 39 | } 40 | image { 41 | url 42 | } 43 | } 44 | 45 | fragment SponsorFragment on Contact { 46 | name 47 | social { 48 | homepage 49 | } 50 | about 51 | image { 52 | url 53 | } 54 | } 55 | 56 | query PageQuery($conferenceId: ID!) { 57 | conference(id: $conferenceId) { 58 | mcs { 59 | ...SpeakerFragment 60 | } 61 | keynoteSpeakers { 62 | ...SpeakerFragment 63 | } 64 | speakers { 65 | ...SpeakerFragment 66 | } 67 | lightningTalkSpeakers { 68 | ...SpeakerFragment 69 | } 70 | workshopInstructors { 71 | ...SpeakerFragment 72 | } 73 | partners { 74 | ...SponsorFragment 75 | } 76 | goldSponsors { 77 | ...SponsorFragment 78 | } 79 | silverSponsors { 80 | ...SponsorFragment 81 | } 82 | bronzeSponsors { 83 | ...SponsorFragment 84 | } 85 | } 86 | } 87 | `, 88 | () => ({ 89 | conferenceId, 90 | }) 91 | )(PageFor2021); 92 | -------------------------------------------------------------------------------- /pages/2022.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { connect, Markdown, Sponsors } from "components"; 3 | 4 | const main = `React Finland 2022 took place between 12th and 16th of September. 5 | 6 | The first three days were focused on workshops while the last two where the conference itself. 7 | 8 | See also [2022 speakers](/2022/speakers/), [schedule](/2022/schedule/), and [workshops](/2022/workshops/). 9 | 10 | > [Learn more from the conference announcement](/blog/rf-2022/).`; 11 | 12 | const PageFor2022 = ({ conference }) => ( 13 | <> 14 |
15 |
16 | 17 |
18 |
19 | 20 | 21 | ); 22 | 23 | export default ({ conferenceId }) => 24 | connect( 25 | ` 26 | fragment SpeakerFragment on Contact { 27 | name 28 | about 29 | social { 30 | homepage 31 | github 32 | twitter 33 | linkedin 34 | } 35 | image { 36 | url 37 | } 38 | } 39 | 40 | fragment SponsorFragment on Contact { 41 | name 42 | social { 43 | homepage 44 | } 45 | about 46 | image { 47 | url 48 | } 49 | } 50 | 51 | query PageQuery($conferenceId: ID!) { 52 | conference(id: $conferenceId) { 53 | mcs { 54 | ...SpeakerFragment 55 | } 56 | keynoteSpeakers { 57 | ...SpeakerFragment 58 | } 59 | speakers { 60 | ...SpeakerFragment 61 | } 62 | lightningTalkSpeakers { 63 | ...SpeakerFragment 64 | } 65 | workshopInstructors { 66 | ...SpeakerFragment 67 | } 68 | partners { 69 | ...SponsorFragment 70 | } 71 | goldSponsors { 72 | ...SponsorFragment 73 | } 74 | silverSponsors { 75 | ...SponsorFragment 76 | } 77 | bronzeSponsors { 78 | ...SponsorFragment 79 | } 80 | } 81 | } 82 | `, 83 | () => ({ 84 | conferenceId, 85 | }) 86 | )(PageFor2022); 87 | -------------------------------------------------------------------------------- /pages/404.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import dancingBaby from "assets/img/dancingbaby.gif"; 3 | 4 | const NotFound = () => ( 5 |
6 |
7 |

8 | You {`didn't`} find the page you were looking for but at least you found 9 | a dancing baby! 10 |

11 | Dancing baby 12 |
13 |
14 | ); 15 | 16 | export default NotFound; 17 | -------------------------------------------------------------------------------- /pages/about.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { 3 | AnchorHeader, 4 | Contacts, 5 | Markdown, 6 | Organizer, 7 | connect, 8 | } from "components"; 9 | 10 | const intro = ` 11 | Our goal is to connect our valued speakers with our local community in the most fruitful way we can and provide Finnish hospitality to our conference visitors. 12 | 13 | We hope to create something unique by combining our northern traditions with speakers and visitors from all around the world. 14 | `; 15 | 16 | const About = ({ conference }) => ( 17 | <> 18 |
19 |
20 | 21 |
22 |
24 | 25 | The Organizers 26 |
27 |

28 | React Finland is organized as a community effort. All of us are 29 | developers and this shows in the conference. 30 |

31 |
32 |
33 | 37 |
38 | 39 | ); 40 | 41 | export default connect(` 42 | query PageQuery($conferenceId: ID!) { 43 | conference(id: $conferenceId) { 44 | organizers { 45 | name 46 | image { 47 | url 48 | } 49 | about 50 | } 51 | } 52 | } 53 | 54 | `)(About); 55 | -------------------------------------------------------------------------------- /pages/blog/2017-11-14_React-Finland-is-From-Devs-to-Devs-a807f8d41949.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: React Finland is From Devs to Devs 3 | description: Why does it matter? 4 | date: "2017-11-14T12:31:25.085Z" 5 | categories: [] 6 | keywords: [] 7 | slug: /@bebraw/from-devs-to-devs-a807f8d41949 8 | --- 9 | 10 | ![Photographer at ReactNext 2017](img/1__1jtCSqZW2LKZzDgj8UxY2g.jpeg) 11 | 12 | One important thing to understand about [React Finland](https://react-finland.fi/) (Helsinki, late April 2018) is that it’s a conference organized by developers for developers. Why is this important? We believe this gives us the following advantages: 13 | 14 | - As we’ve seen conferences and organized ones before, [we have a good idea of what an ideal conference should be like](/blog/conference-dos-and-don-ts-56973b82229a/). 15 | - Due to our strong connections in the development community, we were able to attract a varied and diverse set of speakers from around the world. The roster includes people such as Ken Wheeler, David Khourshid, Sara Vieira, and Sia Karamalegos. A part of the roster is still emerging and no doubt our conference will help the people involved and we want to enable that. 16 | - There’s less pressure to make profit than in a purely commercial one. The total budget of the event is around 50.000 euros and our goal is to cover it through sales with minimal support from sponsors. 17 | - We can focus on delivering value to our speakers and audience. We want to connect both well to the country and local businesses and reward especially workshop organizers financially. We know the time commitment it takes and it’s only fair too compensate for it. 18 | 19 | Perhaps the best part of organizing the conference is that we can bring fascinating people to a remote part of Europe that nobody seems to know that well. It’s a chance for us to show what the country is made of. This is one the reasons why we want to arrange a tour of Finland. 20 | 21 | It’s about time north receives a proper React conference and [we will provide one next April](https://react-finland.fi/)! 22 | -------------------------------------------------------------------------------- /pages/blog/2017-11-15_Which-Code-of-Conduct--5bc331626eda.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Which Code of Conduct? 3 | description: Which CoC to choose for the conference? 4 | date: "2017-11-15T12:46:02.591Z" 5 | categories: [] 6 | keywords: [] 7 | slug: /@bebraw/which-code-of-conduct-5bc331626eda 8 | --- 9 | 10 | ![There’s a samurai if you look closely](img/1__0__5Rkm__2Nxg7uYv6H4LBJg.jpeg) 11 | 12 | Behavior is a tricky topic. What might be considered normal in one culture, might be considered rude in some other one. 13 | 14 | > Culture is your operating system — Terence McKenna 15 | 16 | What does this have to do with a conference like [React Finland](https://react-finland.fi/)? We will have attendees with varied cultural backgrounds. To get most out of a conference, you should feel safe. For this reason, many conferences implement **a code of conduct (CoC).** 17 | 18 | A CoC exists to: 19 | 20 | 1. Make sure there are boundaries for acceptable behavior. 21 | 2. Allow the organizers to handle violations related to this behavior. 22 | 23 | The bigger question is, what’s acceptable behavior. Where to draw the limits? 24 | 25 | Perhaps the question is a red herring. A CoC is more about providing a release valve. If people feel they are being harassed, there should be a mechanism to help deal with it. Then dialogue can begin and everyone involved can learn about what went wrong. 26 | 27 | ### So Which CoC to Choose? 28 | 29 | We still haven’t chosen a CoC for React Finland. Multiple options exist and I’ve listed a few below: 30 | 31 | - [Conference Code of Conduct](http://confcodeofconduct.com/) 32 | - [Berlin Code of Conduct](http://berlincodeofconduct.org/) 33 | - [ReactVienna Code of Conduct](https://github.com/reactvienna/code-of-conduct) 34 | - [Clojutre Code of Conduct](http://clojutre.org/2017/#conduct) 35 | 36 | Personally, I would rather stick with something simple that’s straight to the point. I would phrase it like this: “If you feel you are being harassed or observe what might be construed as such, contact the organizers.” 37 | 38 | Would that be enough or should we pick a heavier such as one linked above? How can we guarantee people spend their time studying the details when a simple guideline might do the same trick? 39 | -------------------------------------------------------------------------------- /pages/blog/2017-12-21_Ticket-Sales-Open-27th-of-December-c7a3c0c26068.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Ticket Sales Open 27th of December 3 | description: >- 4 | The time has come to open ticket sales for React Finland (24–26.4.2018, 5 | Helsinki). The event has one day for workshops and two days for… 6 | date: "2017-12-21T14:51:16.490Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/ticket-sales-open-27th-of-december-c7a3c0c26068 10 | --- 11 | 12 | ![We don’t like to wear shoes inside buildings.](img/1__clyERp4CjFvqyl0EHKr3cQ.jpeg) 13 | 14 | The time has come to open ticket sales for [React Finland](https://react-finland.fi/) (24–26.4.2018, Helsinki). The event has one day for workshops and two days for presentations (single track). 15 | 16 | #### Pricing for the Workshops 17 | 18 | The workshops are limited to twenty persons and split into early and late bird tickets. Except for the full day one on state management, our workshops last four hours. A workshop like this will cost 150 euros for the first ten and 200 euros for the latter. A full day workshop costs the double (300/400 euros). 19 | 20 | We split the workshop profit (50/50%) with the speakers doing the workshops. Doing this allows us to cover some of our costs while allowing us to reward the speakers as well. 21 | 22 | The pricing model was designed to encourage smaller groups. If there’s demand, then we’ll have funds to arrange help to manage with larger ones. 23 | 24 | #### Pricing for the Conference 25 | 26 | The conference itself (two days) has been split into three pricing groups: early, regular, and late bird. Each slot has been limited to hundred people. The pricing goes from 250 euros to 300 euros and finally 350 euros. 27 | 28 | The idea is the same here and the pricing has been designed to keep the conference relatively small. If there’s demand, then we are prepared to deal with it thanks to the pricing. 29 | 30 | #### When and how to get the tickets? 31 | 32 | To keep this fair to everyone, we will open the ticket sales to public on 27th of December at 18:00:00 UTC. To get a notification of this [subscribe to our mailing list](http://eepurl.com/dfbVAX). 33 | 34 | ### Conference API is available now 35 | 36 | While working on the conference site, I realized it makes sense to decouple the site content from the site itself. After wrangling a while, it was clear to me [a npm package](https://github.com/ReactFinland/content-2018) is a smart way to do this. 37 | 38 | Doing this was necessary to allow the mobile application of the conference to receive updates through [a GraphQL API](https://github.com/ReactFinland/graphql-api). You can [try the API online](https://api.react-finland.fi/graphql-2018) to explore what the conference has to offer! 39 | 40 | ### Conclusion 41 | 42 | The conference is shaping up well. [The venue we booked](http://www.valkoinensali.com/) touches Finnish history. If it was good enough for the presidents of the past, it’s likely so for developers of the future. 43 | -------------------------------------------------------------------------------- /pages/blog/2018-01-17_React-Finland-2018---Call-for-Sponsors-b193c561fa5.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: React Finland 2018 — Call for Sponsors 3 | description: >- 4 | Even though React Finland is a non-profit conference, this doesn’t mean we 5 | don’t need money to run the conference. The entire budget for… 6 | date: '2018-01-17T13:22:59.379Z' 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/call-for-sponsors-b193c561fa5 10 | --- 11 | 12 | ![Each medium post needs a more or less pointless header image!](img/1__RryWS__ybB0kqrJldXEXGRQ.jpeg) 13 | Each medium post needs a more or less pointless header image! 14 | 15 | Even though [React Finland](https://react-finland.fi/) is a non-profit conference, this doesn’t mean we don’t need money to run the conference. The entire budget for the conference is around 50.000 € and I designed the initial version of it without any external money (i.e. sponsors). 16 | 17 | That said, I believe we’ll be able to provide a better conference for everyone involved with a limited amount of sponsoring. In addition to decreasing the financial risks related to organizing, it will also allow us to organize it better. In practice this means nicer service (free access to nearby sauna facility for example). We put the money back to the people instead of our pockets. 18 | 19 | For this reason, [we are now looking for sponsors](https://react-finland.fi/for-sponsors/). Get in touch if your company is interested! -------------------------------------------------------------------------------- /pages/blog/2018-01-19_The-Venue-of-React-Finland-2018-52b569a28f52.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: The Venue of React Finland 2018 3 | description: >- 4 | The venue of React Finland 2018 is a unique hall right in the old imperial 5 | center of Helsinki. Valkoinen Sali (White Hall in English) has… 6 | date: "2018-01-19T08:57:24.316Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/the-venue-of-react-finland-2018-52b569a28f52 10 | --- 11 | 12 | The venue of [React Finland](https://react-finland.fi/) 2018 is a unique hall right in the old imperial center of Helsinki. [Valkoinen Sali](http://www.valkoinensali.com/) (White Hall in English) has origins in its past and it has hosted our presidents. If it’s good enough for them, it’s good enough for three hundred developers. 13 | 14 | Valkoinen Sali suits a single track conference well. It was renovated in 2016 and you can expect the venue to be top quality. There’s a separate bar and a balcony for our gold sponsors. 15 | 16 | Instead of trying to convince you that we picked a good place for the conference, have a look at the images below: 17 | 18 | ![](img/1__jY____92Cpeeo9Upq__Ndfxqw.jpeg) 19 | ![](img/1__kYSoRt1kc3T__LYDbKJv38w.jpeg) 20 | ![](img/1__l15YQ8__90epBFllRRkrBQQ.jpeg) 21 | 22 | ![](img/1__HwGJxXZnlIZV__7U3__7__Rbw.jpeg) 23 | ![](img/1__WU4dl6aTo3eoGSd__Y__vSBw.jpeg) 24 | 25 | ![](img/1__ZY1fj4t__vGNDvfZcQ8Ux7g.jpeg) 26 | ![](img/1__KxBzevFzSqtWbaHc__HOQ1g.jpeg) 27 | 28 | [Get your ticket to React Finland 2018 now!](https://ti.to/react-finland/2018) 29 | 30 | > [There’s more information about the venue available online (partly Finnish).](https://venuu.fi/en/venues/valkoinen-sali-helsinki) 31 | -------------------------------------------------------------------------------- /pages/blog/2018-01-30_React-Finland-2018-Keynotes-ff1e1b7b2850.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: React Finland 2018 Keynotes 3 | description: >- 4 | Keynotes are one of the defining features of a conference. They set the tone 5 | for further discussion and hence it’s important to choose them… 6 | date: "2018-01-30T16:56:06.646Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/react-finland-2018-keynotes-ff1e1b7b2850 10 | --- 11 | 12 | ![[Keys and notes.](https://pixabay.com/en/piano-music-score-music-sheet-1655558/) Got it?](img/1__aRNaqTGMuiO3jJ4C__ni3hg.jpeg) 13 | 14 | Keynotes are one of the defining features of a conference. They set the tone for further discussion and hence it’s important to choose them well. This time around we have two speakers well known in the React community: [Ken Wheeler](https://twitter.com/ken_wheeler) and [Jani Eväkallio](https://twitter.com/jevakallio). 15 | 16 | #### Ken Wheeler — How React changed everything 17 | 18 | ![Ken and his kid posing for us. Ken is also known as Kenye in the community.](img/0__Y4UPv2ALNKFdlvy2.jpg) 19 | 20 | This talk will examine how React changed the front end landscape as we know it. We’ll start by recounting the pre-React landscape, including prior art. Next, we’ll venture into the introduction of React, and its reception and growth. 21 | 22 | But most importantly, we will take a look at the core idea of React, and why it transcends language or rendering target and posit on what that means going forward, including what React might look like years from now. 23 | 24 | #### Jani Eväkallio — The New Best Practices 25 | 26 | ![Jani showing his poker face for us. You don’t want to play poker with Jani. Believe me.](img/0__gu03jXqzYBgzz4Ei.jpg) 27 | 28 | When React was first introduced, it was ridiculed for going against established web development best practices as we knew them. Five years later, React is the gold standard for how we create user interfaces. 29 | 30 | Along the way, we’ve discovered a new set of tools, design patterns and programming techniques. In this talk, we’ll explore how we can apply the React philosophy to software engineering problems far beyond the React ecosystem. 31 | 32 | #### Conclusion 33 | 34 | We are fortunate to have two world class speakers to give keynotes at [React Finland 2018](https://react-finland.fi/). And the rest of the speakers are going to be amazing as well. 35 | 36 | There are [still tickets left](https://react-finland.fi/#tickets) although we sold out our early birds for the presentations. Don’t visit Finland for weather, visit it for React. 37 | -------------------------------------------------------------------------------- /pages/blog/2018-02-26_React-Finland-2018---Sold-out--Workshops-left-a83cb91ac52f.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: React Finland 2018 — Sold out! Workshops left 3 | description: >- 4 | React Finland 2018 has officially been sold out. And this happened two months 5 | before the conference! I expected this to take far longer and… 6 | date: "2018-02-26T16:33:22.389Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/react-finland-2018-sold-out-workshops-left-a83cb91ac52f 10 | --- 11 | 12 | ![[Moomin house in the Winter.](https://pixabay.com/en/winter-snowing-moomin-world-moomin-2438791/) Don’t worry, we won’t have scary moomins in React Finland!](img/1__PEDpKSvEA75WLst4cgJ1Hw.jpeg) 13 | 14 | React Finland 2018 has officially been sold out. And this happened two months before the conference! I expected this to take far longer and the strong demand was a surprise. 15 | 16 | The conference will have around three hundred attendees. Size-wise it’s quite ideal as I feel it’s not too small or too big. You will have a lot of time to make new friends and discover new technologies. 17 | 18 | #### Still Workshop Tickets Left 19 | 20 | That said, [there are still workshop tickets left](https://react-finland.fi/#tickets). Especially if you are close to Helsinki, this might be something fun for you. We don’t fly all our speakers to Helsinki for nothing! 21 | 22 | The prices start from 150 € per a four hour workshop. In return you’ll get to spend time with one of the leading names in the industry while learning a lot about a topic such as Babel, ReasonML, state management, testing, or universal apps. 23 | 24 | > We give half of the workshop profits to the speakers and also cover their travel and accommodation. Doing this is fair given the effort they put into their work and should in my opinion be the standard in the industry. 25 | -------------------------------------------------------------------------------- /pages/blog/2018-12-14_React-Finland-2019-MCs-1d49a2de1a77.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: React Finland 2019 MCs 3 | description: >- 4 | One of the improvements we are going to make for React Finland 2019 is the 5 | introduction of MCs. We’ll have two past speakers for this task… 6 | date: "2018-12-14T12:09:13.023Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/2019-mcs-1d49a2de1a77 10 | --- 11 | 12 | One of the improvements we are going to make for [React Finland 2019](https://react-finland.fi/) is the introduction of MCs. We’ll have two past speakers for this task, one for each conference day. 13 | 14 | ### Jani Eväkallio 15 | 16 | ![Jani in his bear costume](img/1__CV4____75EuwGzJXQ4KCojKw.jpeg) 17 | 18 | [Jani Eväkallio](https://twitter.com/jevakallio) is one of the better known Finnish web developers out there. He gave a keynote last year and this time around he’ll keep us entertained during the first conference day. 19 | 20 | In addition to MCing the sessions, he’ll host a special event — **#SMOOSH**. I don’t exactly know what’s in store but that sounds like a lot of fun. 21 | 22 | ### Sara Vieira 23 | 24 | ![Sara being chased by a bear](img/1__Lq3QbVERIjJPPvIkb__DJpQ.jpeg) 25 | 26 | [Sara Vieira](https://twitter.com/NikkitaFTW) is one of our former speakers as well. She is a well-known figure in the community and will keep us awake on the second day of the conference. 27 | -------------------------------------------------------------------------------- /pages/blog/2019-01-04_React-Finland-2019-Keynotes---Workshop-on-TypeScript-d7f77a22d178.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: React Finland 2019 Keynotes + Workshop on TypeScript 3 | description: >- 4 | React Finland 2019 (24–26.04) will have keynotes by Michel Weststrate and Rick 5 | Hanlon. Michel will also hold a full day workshop about… 6 | date: "2019-01-04T13:23:48.208Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/2019-keynotes-d7f77a22d178 10 | --- 11 | 12 | [React Finland](https://react-finland.fi/) 2019 (24–26.04) will have keynotes by Michel Weststrate and Rick Hanlon. Michel will also hold a full day workshop about TypeScript. 13 | 14 | ![Michel Weststrate](img/1__alDWQJrl1d0i__Y8__cii8Rw.jpeg) 15 | Michel Weststrate 16 | 17 | #### Michel Weststrate — MobX — The Journey 18 | 19 | [Michel Weststrate](https://react-finland.fi/speakers/#michel-weststrate) is famous for developing MobX and pushing the art of state management further. In the first edition of React Finland he spoke about [immer](https://www.npmjs.com/package/immer), a solution designed to make it easier to write reducers for Redux. 20 | 21 | Michel is an experienced practitioner in TypeScript and will hold [a full day workshop about the topic](https://react-finland.fi/workshops/#typescript-from-novice-to-expert). The workshop is aimed primarily for TypeScript beginners. 22 | 23 | Given the language is becoming a mainstream option, this workshop is a good choice. I spent most of the year with the language this year and I can see how it improve your development experience while making refactoring safer and easier. 24 | 25 | > If you already enrolled to a workshop and want to participate in Michel’s instead, let us know (info react-finland.fi) and we’ll change your ticket. 26 | 27 | #### Rick Hanlon — React Native 28 | 29 | ![Rick Hanlon](img/1__PIYtdLaP2LBYd__3faTsdfg.jpeg) 30 | 31 | [Rick Hanlon](https://react-finland.fi/speakers/#rick-hanlon) from Facebook will discuss React Native and where it’s going in his keynote for the second day. 32 | 33 | Rick is well known for his contributions to Jest, a popular testing choice for React projects, and will be a great addition to the roster of React Finland. 34 | -------------------------------------------------------------------------------- /pages/blog/2019-03-22_Volunteer-for-React-Finland-2019-4f48aa0fb485.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Volunteer for React Finland 2019 3 | description: >- 4 | Even with a big team (we are about six), you’ll still need external support to 5 | organize a conference. Especially this time the scope (~350… 6 | date: "2019-03-22T16:30:31.304Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/volunteer-for-react-finland-2019-4f48aa0fb485 10 | --- 11 | 12 | ![Volunteers in action ([Pixabay](https://pixabay.com/photos/caucasian-charity-community-3390232/))](img/1__o__edJUeFVjy__iHUM1lOI5Q.jpeg) 13 | 14 | Even with a big team (we are about six), you’ll still need external support to organize a conference. Especially this time the scope (~350 people) will be a great challenge as we have to ensure everything runs smoothly. 15 | 16 | This is where volunteering comes in. Often conferences offer volunteering options and React Finland isn’t an exception to the rule. Should you choose to volunteer to help us out at the conference, the offer is the following: 17 | 18 | - We expect you to work during the conference (24–26.04) 19 | - In return, you’ll get access to the conference days including the extra program (comedy show, afterparty) 20 | - You’ll also receive swag and a special organizer shirt (limited edition) 21 | - You won’t go hungry (Finnish food included) 22 | - We won’t be able to provide travel/accommodation 23 | 24 | That said, if you are interested in the conference, this could be one way for you to join it. In the case above sounds like the thing for you, [apply to become a volunteer](https://goo.gl/forms/rsmd9m1lESz0UJPu2). 25 | -------------------------------------------------------------------------------- /pages/blog/2019-04-16_2019-Parties-and-Community-Events-e7a22af12ea6.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2019 Parties and Community Events 3 | description: >- 4 | Whenever there’s a bigger conference in town, it has an electrifying effect as 5 | it encourages people to set up their own events. It’s a… 6 | date: "2019-04-16T09:47:11.888Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/2019-parties-and-community-events-e7a22af12ea6 10 | --- 11 | 12 | ![Nerd parties are best parties](img/1__sqBFzSmf02WuHKMOedm8KQ.jpeg) 13 | 14 | Whenever there’s a bigger conference in town, it has an electrifying effect as it encourages people to set up their own events. It’s a great chance to meet the local developers and go sauna with them. 15 | 16 | #### 23.04 (Tuesday) 18:00–21:00 — React Helsinki — April Meetup 17 | 18 | React Helsinki, the local user group, is having their April meetup one day before the conference. You’ll learn at least about React Native and micro-frontends there. Given there’s limited amount of space, [register now](https://meetabit.com/events/react-helsinki-april-2019). 19 | 20 | #### 24.04 (Wednesday) 18:00–22:00 — Sauna with Reaktor 21 | 22 | One of our gold sponsors, Reaktor, wants to sauna with you. There will be also something drink/eat. For those participating in our workshops, there will be a shuttle (not a space one) from the venue to Reaktor offices. Again, the space is limited, so [please register.](https://www.reaktor.com/react-finland-afterparty/) 23 | 24 | #### 25.04 (Thursday) 18:00–20:00 — #SMOOSH 25 | 26 | After sold out shows in London and Berlin, we’re bringing the [#SMOOSH comedy show](https://smoosh.fun) to Helsinki! 27 | 28 | Join us for an evening of standup, improv, and even a sing-along. This show will be unforgettable, no matter how much you try to forget it. 😉 29 | 30 | #### 26.04 (Friday) 18:00–23:00 — Afterparty at Tiivistämö 31 | 32 | What’s a better way to end a week than to have an afterparty. We’ll go to a specific place, Tiivistämö, for this and we’ll organize transport from the venue. You’ll have a nice chance to hang out with other developers in this space dedicated to us. I’ve also heard rumors of a DJ. We might skip karaoke, though. 33 | 34 | #### Conclusion 35 | 36 | I hope to see you at the events around the conference. It’s going to be a busy week! 37 | -------------------------------------------------------------------------------- /pages/blog/2019-04-24_RF2019-Live-Streams-Are-Available-3c85476cd670.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: RF2019 Live Streams Are Available 3 | description: >- 4 | React Finland 2019 has started in form of workshops. The main attraction will 5 | be of course the conference days. 6 | date: "2019-04-24T10:18:21.976Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/rf2019-live-streams-are-available-3c85476cd670 10 | --- 11 | 12 | ![React Finland 2019 in motion](img/1__BwhQBaKTWp99JQw3d1OobA.jpeg) 13 | 14 | React Finland 2019 has started in form of workshops. The main attraction will be of course the conference days. 15 | 16 | To follow the tradition started with [GraphQL Finland](https://graphql-finland.fi), we’ll livestream the event apart from the comedy show to the public. 17 | 18 | Tune it at the following urls: 19 | 20 | - [Thursday](https://www.youtube.com/watch?v=gDkUpx0dVc0) (25.04)— [Schedule](https://react-finland.fi/schedule/#2019-04-25-first-conference-day) 21 | - [Friday](https://www.youtube.com/watch?v=d_BtZ8bv0sw) (26.04)— [Schedule](https://react-finland.fi/schedule/#2019-04-26-second-conference-day) 22 | 23 | There will be video recordings later (like a week or two after the conference) and you can of course watch the longer videos meanwhile to get the talks. 24 | -------------------------------------------------------------------------------- /pages/blog/2019-05-27_Design-Systems-with-Andrey-and-Varya-bc8ae922cab0.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Design Systems with Andrey and Varya 3 | description: >- 4 | To continue on React Finland 2019 sessions, this time we’ll cover design 5 | systems. Andrey Okonetchnikov and Varya Stepanova spoke about the… 6 | date: "2019-05-27T09:39:29.805Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/design-systems-with-andrey-and-varya-bc8ae922cab0 10 | --- 11 | 12 | ![[Webbidevaus](https://webbidevaus.fi) interviewing Varya for a podcast](img/1__61Ub71rYGRhiWpnmiwOQgg.jpeg) 13 | 14 | To continue on React Finland 2019 sessions, this time we’ll cover design systems. [Andrey Okonetchnikov](http://okonet.ru) and [Varya Stepanova](https://varya.me) spoke about the topic. Andrey also held a workshop during the first day of the event. 15 | 16 | ## Andrey Okonetchnikov  —  A Common Design Language. Let Designers and Developers talk to each other 17 | 18 | ![Sketch notes by [David Leuliette](https://davidl.fr/)](img/1__q4rUj63HjeefZv7YN1q46Q.jpeg) 19 | 20 | It is common in organizations to separate designers (the ones who design) from developers (the ones who implement the design). The split has led to different ways of working. 21 | 22 | Designers think in terms of higher level design concepts (color, spacing, fonts, abstract forms) while developers think in terms of their domain (in web you think about CSS, HTML, and JavaScript for example). 23 | 24 | Andrey’s talk was all about this split and how to deal with it. His proposal is to improve communication between the “factions” through component driven development and using a design system as a common language to bridge the gap. 25 | 26 | - To hear Andrey’s thoughts on the topic, [go to 21:09 at the podcast](https://webbidevaus.fi/44). 27 | - [Online slides](https://speakerdeck.com/okonet/a-common-design-language) 28 | - [pdf slides](https://slides.react-finland.fi/2019/andrey-okonetchnikov.pdf) 29 | 30 | 31 | 32 | ## Varya Stepanova  —  A practical guide to building your design system infrastructure 33 | 34 | ![Sketch notes by [David Leuliette](https://davidl.fr/)](img/1__yCdZlB3U8I6vOcxMm__txgQ.jpeg) 35 | 36 | Assuming you are ready to develop your design system now, how to get started? 37 | 38 | Although you could pick up a solution like Styleguidist like Storybook, there’s more to the topic. That’s where Varya Stepanova’s talk comes in. 39 | 40 | - To hear Varya’s thoughts on the topic, [go to 35:52 at the podcast](https://webbidevaus.fi/44). 41 | - [Online slides](https://varya.me/react-finland-2019/) 42 | - [pdf slides](https://slides.react-finland.fi/2019/varya-stepanova.pdf) 43 | 44 | 45 | 46 | ## Conclusion 47 | 48 | For me, it feels like the time has come for design systems to go mainstream in web development. The technical solutions are getting more mature and people are starting to get a better hang of the approach and the value it provides. 49 | 50 | I think the greatest value is in improving communication between different stakeholders and that alone is a big step ahead for reducing waste in development. 51 | -------------------------------------------------------------------------------- /pages/blog/2019-06-05_Animations-and-unpopular-opinions-with-Bruno-and-Nik-95da66ea5456.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Animations and unpopular opinions with Bruno and Nik 3 | description: >- 4 | We ended the first day of the conference with two talks — one about animations 5 | and one about (un)popular opinions about React. It’s… 6 | date: "2019-06-05T08:37:06.845Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/animations-and-unpopular-opinions-with-bruno-and-nik-95da66ea5456 10 | --- 11 | 12 | ![Nik Graf and David Hasselhoff](img/1__OOZAPPXLutWkVZMB__9eEnw.jpeg) 13 | 14 | We ended the first day of the conference with two talks — one about animations and one about (un)popular opinions about React. It’s important for me to have light content at the end as the audience will be a little tired already so Bruno’s and Nik’s talks felt like great fits for the purpose. 15 | 16 | ## Bruno Lourenço  —  Delightful UI animations by understanding the brain 17 | 18 | ![Sketch notes by [David Leuliette](https://davidl.fr/)](img/1__eksuScrjBDgIxmJb7l6e8A.png) 19 | 20 | If there’s one technique that can make a good application or a site great, it’s the usage of animations. When implemented correctly, they can add polish and improve usability. The question is, why do some animations look amazing while some feel off somehow. 21 | 22 | That’s what the talk by Bruno Lourenço was about and at the end of his talk he stunned us with a new release of his animation library, [react-morph](https://github.com/brunnolou/react-morph). I recommend checking it out as it’s perhaps the easiest way to implement morph style animations using React. 23 | 24 | - To hear Bruno’s thoughts on the topic, [go to 52:25 at the podcast](https://webbidevaus.fi/45). 25 | 26 | 27 | 28 | ## Nik Graf  —  Un(popular) Opinions 29 | 30 | ![Sketch notes by [David Leuliette](https://davidl.fr/)](img/1__lJHi8lshH7HiWk__PEw5Utw.png) 31 | 32 | Usually developers tend to be quite opinionated. For instance, I am sold on using vim bindings when editing and I prefer to format my code using Prettier. 33 | 34 | Sometimes what feels like a best practice, can become anti-pattern as the approach is understood better. Nik’s talk was all about this. 35 | 36 | - To hear Nik’s thoughts on the topic, [go to 17:24 at the podcast](https://webbidevaus.fi/46). 37 | - [pdf slides](https://slides.react-finland.fi/2019/nik-graf.pdf) 38 | 39 | 40 | 41 | ## Conclusion 42 | 43 | If you haven’t tried your React user interface yet, I recommend checking out [react-morph](https://github.com/brunnolou/react-morph). The API is amazingly simple. 44 | 45 | When it comes to adopting technology, consider the impact of hype as it tends to exaggerate the benefits. You may end up cycling back to the starting point unless there’s a tangible reason for the move. It’s easy to shoot yourself in a foot with something new and flashy as the downsides aren’t fully understood yet. 46 | -------------------------------------------------------------------------------- /pages/blog/2019-06-12_Styling-in-React-with-Artem-and-Artem-d690f7563187.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Styling in React with Artem and Artem 3 | description: >- 4 | Ever since the introduction of React, styling has been a contentious topic. 5 | Since then, a variety of solutions have appeared and finally… 6 | date: "2019-06-12T08:14:35.333Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/styling-with-artem-and-artem-d690f7563187 10 | --- 11 | 12 | ![CSS in real life](img/1__2KKfYoHfrYY7yqO4pHfFhA.jpeg) 13 | 14 | Ever since the introduction of React, styling has been a contentious topic. Since then, a variety of solutions have appeared and finally the community has begun to gravitate towards certain practices that hide some of the technical complexity. In our styling session with Artem Sapegin and Artem Zakharchenko, we got a taste of what’s to come. 15 | 16 | ## Artem Sapegin  —  Custom CSS is the path to inconsistent UI 17 | 18 | ![Sketch notes by [David Leuliette](https://davidl.fr)](img/1__KZ9sYBulSXVnh2NWsn1pjg.png) 19 | 20 | How much CSS should developers write? If adding a new feature forces you to write new CSS, are you doing it right? It’s easy to end up with a codebase that duplicates similar CSS for slightly different purposes. For this reason, even a simple application can end up having multiple different concepts for the same idea. 21 | 22 | Artem Sapegin’s talk shows how custom CSS is the path to an inconsistent UI and how to approach this problem by using primitive components that are then used to compose UIs. 23 | 24 | Although it will take time to develop the primitives, you’ll gain consistency through composition and end up writing less CSS as the specific details are hidden away behind neat APIs. 25 | 26 | - [Online slides](https://stopwritingcss.netlify.com/) 27 | - [pdf slides](https://slides.react-finland.fi/2019/artem-sapegin.pdf) 28 | - To hear Artem’s thoughts about the topic, [go to 48:58 at the podcast](https://webbidevaus.fi/46). 29 | 30 | 31 | 32 | ## Artem Zakharchenko  —  Creating layouts that last 33 | 34 | ![Sketch notes by [David Leuliette](https://davidl.fr)](img/1__kblwRax6hDyA7OSI__4MYsw.png) 35 | 36 | When writing layouts, you often have to think on a rather low level. You might end up setting up a CSS grid and then figuring out how to transition from a layout to another using media queries. 37 | 38 | What if layouts were a first class citizen instead? It’s this idea that Artem Zakharchenko explores in his talk about creating layouts that last. 39 | 40 | - [kettanaito/atomic-layout](https://github.com/kettanaito/atomic-layout) 41 | - To hear Artem’s thoughts about the topic, [go to 48:58 at the podcast](https://webbidevaus.fi/46). 42 | 43 | 44 | 45 | ## Conclusion 46 | 47 | I like the fact that the discussion about styling in React is shifting more to the level of practices. You can apply design tokens and primitive components to hide the details and your styling solution. 48 | 49 | As shown by Artem Zakharchenko’s talk, it’s possible to rethink the way we layout our views by composing them differently and relying on new standards underneath. 50 | -------------------------------------------------------------------------------- /pages/blog/2019-06-24_Architecture-with-Monica-and-Carolyn-5057b2631bbb.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Architecture with Monica and Carolyn 3 | description: >- 4 | Even not having or thinking about architecture, means you’ll end up with one. 5 | Sometimes concrete structures can be identified from ad hoc… 6 | date: "2019-06-24T06:22:58.197Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/architecture-with-monica-and-carolyn-5057b2631bbb 10 | --- 11 | 12 | ![Why do we rewrite software? *facepalm* by [Nick Tulinen](http://www.nicktulinen.com)](img/1__sNznFKPCjpebaaRHKtf__GQ.jpeg) 13 | 14 | Even not having or thinking about architecture, means you’ll end up with one. Sometimes concrete structures can be identified from ad hoc ones that develop over times. As patterns are found, then also their strengths and weaknesses become more aware. 15 | 16 | The question is, how to create architectures that last time and to develop tools that are more than just “intuitive”. 17 | 18 | ## Monica Lent  —  Building resilient frontend architecture 19 | 20 | ![Sketch notes by [David Leuliette](https://davidl.fr/)](img/1__vjvxktj16lX49nzBPEgvaw.png) 21 | 22 | Why do we rewrite software? What’s the cost of refactoring? How to develop architectures that last time? It’s these questions that Monica Lent seeked to answer in her talk about building resilient frontend architectures. 23 | 24 | - To hear Monica’s thoughts about the topic, [go to 59:53 at the podcast](https://webbidevaus.fi/47). 25 | - [pdf slides](https://slides.react-finland.fi/2019/monica-lent.pdf) 26 | 27 | 28 | 29 | ## Carolyn Stransky  —  “Intuitive” Tooling 30 | 31 | ![Sketch notes by [David Leuliette](https://davidl.fr/)](img/1__WLOvwUwBQxTd25g6NOKgEg.png) 32 | 33 | A lot of tooling we use is marketed as intuitive. But what does that mean in the end? Intuitive to one person likely isn’t so to another. The topic boils into remembering we were all beginners once and being empathetic to that. In her talk, Carolyn explores the space further. 34 | 35 | - To hear Carolyn’s thoughts about the topic, [go to 59:53 at the podcast](https://webbidevaus.fi/47). 36 | - [pdf slides](https://slides.react-finland.fi/2019/carolyn-stransky.pdf) 37 | 38 | 39 | 40 | ## Conclusion 41 | 42 | For me, having an architecture session at the end was the perfect way to finish the conference. There’s a lot to be learned from Monica’s and Carolyn’s talks and in some ways it boils down to being pragmatic and empathetic when developing software. Everyone was a beginner at some point. 43 | -------------------------------------------------------------------------------- /pages/blog/2019-06-24_Performance-with-Anna-and-Sven-e4544d87e7d6.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Performance with Anna and Sven 3 | description: >- 4 | Performance can be a concern when working with bigger applications. Sometimes 5 | issues can come up when a low latency in the UI is required… 6 | date: "2019-06-24T05:48:07.986Z" 7 | categories: [] 8 | keywords: [] 9 | slug: /@bebraw/performance-with-anna-and-sven-e4544d87e7d6 10 | --- 11 | 12 | ![Performance in React (Native) with Anna Doubková](img/1__C4MT6SgNoC4lKeypStcHFg.jpeg) 13 | 14 | Performance can be a concern when working with bigger applications. Sometimes issues can come up when a low latency in the UI is required. It’s for this reason why I wanted to have a performance session in [React Finland](https://react-finland.fi) 2019. 15 | 16 | ## Anna Doubková  —  Practical Performance for React (Native) 17 | 18 | ![Sketch notes by [David Leuliette](https://davidl.fr/)](img/1__xRezi604__WJ__Sp1zBPBB8g.png) 19 | 20 | When working with React Native, there are specific parts of the stack where you can run into performance issues. In her talk, Anna discusses how her company approached optimizing their application. 21 | 22 | When it comes to React and React Native, the basic rules of optimization apply. Measure before changing anything. For this purpose, React provides great tooling these days and you should use it to pinpoint the bottlenecks in rendering. 23 | 24 | - [pdf slides](https://slides.react-finland.fi/2019/anna-doubkova.pdf) 25 | - [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi) 26 | 27 | 28 | 29 | ## Sven Sauleau  —  WebAssembly — The Next Big Platform 30 | 31 | ![Sketch notes by [David Leuliette](https://davidl.fr/)](img/1____LYrs4__VqoiQRzFH3FyvOg.png) 32 | 33 | There’s only so much you can do with vanilla JavaScript. One of the recent developments in browsers is the introduction of WebAssembly. It’s a new compile target that gives a promise of high performance. 34 | 35 | For CPU bound tasks, it’s possible to push calculation to WebAssembly side of the fence while interacting with the code through JavaScript. It’s exactly this that Sven demonstrated in his talk. 36 | 37 | - [pdf slides](https://slides.react-finland.fi/2019/sven-sauleau.pdf) 38 | 39 | 40 | 41 | ## Conclusion 42 | 43 | Even with the improvements in React, performance can remain an issue. It’s important to at least learn how to measure before doing blind changes. Often in software architecture, there can be trade-offs to be made so that the desired level of performance can be reached. 44 | -------------------------------------------------------------------------------- /pages/blog/2020-01-17_rf-2020-diversity-scholarships.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland 2020 - Diversity Scholarships" 3 | date: 2020-01-17 4 | keywords: ["react-finland"] 5 | --- 6 | 7 | One of the prevailing issues in the tech industry has to do with diversity. By enabling people from different backgrounds to participate, we open our minds to new viewpoints. 8 | 9 | Historically we've put increasing focus to diversity in React Finland and we try to better each year. In the past we've done this by giving away diversity tickets to let people who might not otherwise be able to participate to come and join the conference. 10 | 11 | ## Diversity Scholarships 12 | 13 | For the 2020 edition of React Finland, we want to go a step further. By definition, diversity tickets fit best people who have access to accommodation and can travel easily to Finland. Although a good gesture, I believe we can do a little bit more. 14 | 15 | Because of this reason, we've decided to offer **diversity scholarships** in addition to **diversity tickets** for React Finland 2020. 16 | 17 | The way it works is that we'll give out ten diversity tickets. In addition to these ten, we'll distribute ten diversity scholarships that include accommodation in addition to a ticket. 18 | 19 | It's a small experiment for us and I hope we'll be able to attract people that will be able to make our event accessible to someone who might otherwise miss it. 20 | 21 | ## Criteria 22 | 23 | We've chosen the following criteria for React Finland 2020: 24 | 25 | - We'll prioritize underpresented people 26 | - Within Finland, we'll give emphasis to people from outside of the Greater Helsinki area. If you live within Greater Helsinki Area and want to join the conference, you can still volunteer by sending a free form email (info at react-finland.fi). 27 | - We'll want to attract people from abroad as well and this is where scholarships will likely help. 28 | 29 | ## Conclusion 30 | 31 | To apply, [please fill the form](https://forms.gle/x9TeyodW1kmYfpEG6). We'll go through applications as we receive them (expect a delay of a few days) and the call will end after the diversity tickets and scholarships have been given away. 32 | 33 | ![Coffee at React Finland 2019](assets/img/coffee.jpg) 34 | -------------------------------------------------------------------------------- /pages/blog/2020-02-28-covid-19-statement.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland 2020 - COVID-19 Statement" 3 | date: 2020-02-28 4 | keywords: ["react-finland"] 5 | --- 6 | 7 | We've been following this year's COVID-19 (Corona virus) outbreak with both fear and anxiety. In addition to the cost on society, it has implications on conferences like React Finland. In this post, I want to clarify different scenarios on how the conference will play out depending on the progress of the crisis. 8 | 9 | ## Possible scenarios 10 | 11 | 1. Conference happens as planned - In the ideal scenario we would be able to run the conference as planned. That said, there are already signs that this might not happen. 12 | 2. Conference runs locally - In the case that there are global travel restrictions in place but it's still possible to organize the conference locally, we'll run the event as a local event while streaming the content. The workshops will run remote (online). 13 | 3. Conference runs online - In the case it's not possible to run the conference at all, we'll run it fully online. We'll go with this option in case the government of Finland declares a national emergency and forbids public events altogether. 14 | 15 | In case we end up running the conference locally (1. or 2.), we'll make sure adequate measures are taken to protect our visitors as instructed by the local health authorities. 16 | 17 | ## What about my money? 18 | 19 | Given we're aware you might have invested a lot of money to join our conference, here are the options when it comes to the tickets: 20 | 21 | 1. In case we'll have to go with the online option (either 2. or 3.) and you want to participate the online edition, we'll refund 50% of the ticket price to account for the reduced experience. The rule applies both to workshops and the conference itself. The workshop instructors will receive all ticket income instead of our usual 50/50 split to make up for the fact that we won't have to cover for the logistics. 22 | 2. Alternatively, we can transfer your ticket to the 2021 edition and refund the difference between your ticket price and the early bird ticket. Assuming we start pricing from 299 euros again, the difference would be counted against that value. 23 | 24 | The key point here is that we still want to offer you a conference experience even if it means a reduced one. 25 | 26 | ## Conclusion 27 | 28 | We'll keep an eye on the situation as it develops. We still want to run the conference even if it means altering the concept for this. It's an unfortunate situation for all and I hope we can find ways to get through the challenge as a community. 29 | -------------------------------------------------------------------------------- /pages/blog/2020-09-01-rf-2020-online-mini-conf-vol-2-recap.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland 2020 - Online Mini-Conference #2 - Recap" 3 | date: 2020-09-01 4 | keywords: ["react-finland", "mini-conference"] 5 | --- 6 | 7 | The mini-conference about state management took place 27th of August. It was our second online event and it seems we have found a good format by now. 8 | 9 | > The mini-conference sessions are available as a [YouTube playlist](https://www.youtube.com/playlist?list=PL-a9lBflNu2oC5Rit5oW9hFVdGJrzEW6Q) as they finish. 10 | 11 | ## David Khourshid - Introduction to Statecharts 12 | 13 | The event started with David Khourshid's introduction to statecharts. He live-coded through a simple example to explain the approach. 14 | 15 | The lecture was part of our premium offering and it's now available to the public as well. 16 | 17 | 18 | 19 | ## David Khourshid - Everything is an Actor 20 | 21 | In his talk, David Khourshid showed us how everything is an actor and the implications this has on software design. 22 | 23 | 24 | 25 | ## Yan Lavryushev - Dive in Effector 26 | 27 | Yan Lavryushev focused on [Effector](https://effector.now.sh/), a new state management library that works well with React. 28 | 29 | 30 | 31 | ## Christian Alfoni - Stitches 32 | 33 | Christian Alfoni dived into [Stitches](https://stitches.dev/), a new css-in-js approach in his talk. He focused on his journey with the library and how he discovered the architecture. 34 | 35 | 36 | 37 | ## Panel 38 | 39 | We wrapped up the event with a panel about state management: 40 | 41 | 42 | 43 | ## Conclusion 44 | 45 | I hope you enjoyed our second event! The next event about design systems happens 22nd of September. You can already get tickets (free or premium) for it so feel free to [get one in advance](https://fienta.com/react-finland-2020?e8677b7f3a2f2d38052763b8d1cd9117). 46 | -------------------------------------------------------------------------------- /pages/blog/2020-09-03-cfp-for-mini-confs.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Online Mini-Conferences - Call for Papers" 3 | date: 2020-09-03 4 | keywords: ["react-finland", "mini-conference"] 5 | --- 6 | 7 | As React Finland runs in an online mini-conference format till the next physical event at the end of May 2021, it's a good chance to bring in speakers we otherwise might not be able to due to geography. Usually our cast has been somewhat focused on Europe but with online you don't have the same constraints anymore. 8 | 9 | To make most out of the situation, we've decided to run a call for papers (CFP) procedure for the online events. 10 | 11 | ## What are React Finland online mini-conferences 12 | 13 | I've outlined before what React Finland has to offer in terms of online mini-conferences: 14 | 15 | - The events take place on roughly a monthly interval. 16 | - Each event has three speakers with a 30 minute slot for each. On top of that there's 10 minutes for a QA. 17 | - Both theoretical and practical talks are welcome. Live coding works as well. We try to have a good mixture of topics for each event. 18 | - All sessions are themed and most talks should fit well within it to foster discussion and exchange. 19 | - Each session contains an introduction to the topic and a fireside chat (casual discussion) at the beginning and a panel at the end. 20 | - You can perform your talk either live or pre-record it with our producer. 21 | - The final talk will be produced and available through our YouTube channel (https://www.youtube.com/ReactFinland) after the event. 22 | - If the talk fits one our sessions, we'll be in touch regarding the arrangements. 23 | 24 | If above sounds fine and you want to share something with the React Finland community, [please participate in our CFP](https://forms.gle/UkAzxCoAQqfKuwMy5). 25 | 26 | ## Conclusion 27 | 28 | Difficult times require different thinking and so far running online mini-conferences have shown early promise and I hope we'll do even better as we gain experience. It's a great time for us to run a call for papers as it's something we haven't done yet and now it's the perfect time to do it. 29 | -------------------------------------------------------------------------------- /pages/blog/2020-10-05-rf-2020-online-mini-conf-vol-3-recap.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland 2020 - Online Mini-Conference #3 - Recap" 3 | date: 2020-10-05T15:00:00Z 4 | keywords: ["react-finland", "mini-conference"] 5 | --- 6 | 7 | The third mini-conference about state management took place 22nd of September. 8 | 9 | > The mini-conference sessions are available as a [YouTube playlist](https://www.youtube.com/playlist?list=PL-a9lBflNu2oC5Rit5oW9hFVdGJrzEW6Q) as they finish. 10 | 11 | ## Juho Vepsäläinen - Introduction to Design Systems 12 | 13 | The event started with Juho Vepsäläinen's introduction to design systems. 14 | 15 | The lecture was part of our premium offering and it's now available to the public as well. 16 | 17 | 18 | 19 | ## Shodipo Ayomide - Design from the dimension of open-source 20 | 21 | In his talk, Shodipo Ayomide helped us to understand how to approach design in open-source software.- 22 | 23 | 24 | 25 | ## Yang Zhang - Building React UIs visually 26 | 27 | Yang Zhang focused on [Plasmic](https://www.plasmic.app/), a visual tool designed to help create React applications. 28 | 29 | 30 | 31 | ## Juho Vepsäläinen - Design Systems with Deno and Oceanwind 32 | 33 | Juho Vepsäläinen discussed his on-going design system related work with Jani Eväkallio. The approach is built around bleeding edge technology including [Deno](https://deno.land/), [Oceanwind](https://github.com/lukejacksonn/oceanwind), and [typed-html](https://github.com/nicojs/typed-html). 34 | 35 | 36 | 37 | ## Panel 38 | 39 | We wrapped up the event with a panel about design systems: 40 | 41 | 42 | 43 | ## Conclusion 44 | 45 | I hope you enjoyed our third event! 46 | -------------------------------------------------------------------------------- /pages/blog/2020-11-02-rf-2020-online-mini-conf-vol-4-recap.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland 2020 - Online Mini-Conference #4 - Recap" 3 | date: 2020-11-02T15:00:00Z 4 | keywords: ["react-finland", "mini-conference"] 5 | --- 6 | 7 | The fourth mini-conference about lessons learned took place 28th of October. 8 | 9 | > The mini-conference sessions are available as a [YouTube playlist](https://www.youtube.com/playlist?list=PL-a9lBflNu2oC5Rit5oW9hFVdGJrzEW6Q) as they finish. 10 | 11 | ## Diego Haz - Reakit – Toolkit for building accessible UIs 12 | 13 | In his talk, Diego Haz discussed [Reakit](https://reakit.io/), a UI toolkit for React that makes it easier to develop accessible component libraries. The talk covers the general approach and explains why Reakit was built the way it is. 14 | 15 | 16 | 17 | ## Luke Jackson - Oceanwind 18 | 19 | In his discussion with Juho Vepsäläinen, Luke Jackson goes through [Oceanwind](https://www.npmjs.com/package/oceanwind), a styling approach. Oceanwind implements the styling semantics of [Tailwind](https://tailwindcss.com/) but in an opposite manner. 20 | 21 | Instead of coming with a CSS file with all the possible utility CSS rules, Oceanwind composes the required CSS based on usage. As a result, less tooling is required and the approach works both as a runtime and through server-side rendering while being performant and yielding good results. 22 | 23 | 24 | 25 | ## Mikhail Novikov - Lessons learned from burnout 26 | 27 | In his discussion with Juho Vepsäläinen, Mikhail Novikov goes through the lessons he learned from burnout. As an industry, we seem to be particularly vulnerable to it and therefore it was an important topic to discuss in our conference series. 28 | 29 | See [Fullstack health](https://fullstack.health/) for a podcast about the topic and [Understanding Job Burnout](https://itrevolution.com/understanding-job-burnout-christina-maslach/) article to learn more about the topic. 30 | 31 | 32 | 33 | ## Panel 34 | 35 | We wrapped up the event with a panel about lessons learned: 36 | 37 | 38 | 39 | ## Conclusion 40 | 41 | I hope you enjoyed our fourth event! The next event about performance happens 2nd of December. You can already get tickets (free or premium) for it so feel free to [get one in advance](https://fienta.com/react-finland-2020?e8677b7f3a2f2d38052763b8d1cd9117). 42 | -------------------------------------------------------------------------------- /pages/blog/2020-12-10-rf-2020-online-mini-conf-vol-5-recap.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland 2020 - Online Mini-Conference #5 - Recap" 3 | date: 2020-12-10T11:00:00Z 4 | keywords: ["react-finland", "mini-conference"] 5 | --- 6 | 7 | The fifth mini-conference about performance took place 2nd of December. 8 | 9 | > The mini-conference sessions are available as a [YouTube playlist](https://www.youtube.com/playlist?list=PL-a9lBflNu2oC5Rit5oW9hFVdGJrzEW6Q) as they finish. 10 | 11 | ## Milecia McGregor - Making Your React Apps Perform At Scale 12 | 13 | As you add more components to your React application, you'll start to notice performance issues. Maybe data isn't loading as fast or you notice that things are happening out of order. There are tools and techniques you can use to handle these kind of issue at a large scale. In this talk, attendees will learn how to analyze their React apps for solvable issues and learn some state management and async handling techniques. 14 | 15 | 16 | 17 | ## Nik Graf - Tips and tricks for optimizing your React application 18 | 19 | In this talk, Nik Graf will discuss his experience in optimizing React applications as he goes through a few specific cases where he improved performance. 20 | 21 | 22 | 23 | ## Andrey Goncharov and Juho Vepsäläinen - Live Coding - Optimizing a React application 24 | 25 | In this session, Andrey Goncharov and Juho Vepsäläinen will walk through series optimizations against a simple grid component that's optimized step by step while learning how to profile the application, how to apply React APIs to speed it up, and what might be the next steps. 26 | 27 | 28 | 29 | ## Panel 30 | 31 | We wrapped up the event with a panel about performance: 32 | 33 | 34 | 35 | ## Conclusion 36 | 37 | I hope you enjoyed our fifth event! The next one takes place somewhere around January or February after a brief holiday break. 38 | -------------------------------------------------------------------------------- /pages/blog/2021-02-03-vodcast-01.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland Vodcast #1 - Components" 3 | date: 2021-02-03T16:00:00Z 4 | keywords: ["react-finland", "vodcast"] 5 | --- 6 | 7 | As we had to postpone the live portion of React Finland last year, we moved to online events for now. We organized five mini-conferences with three speakers each, and now we're starting a series of vodcasts as we're changing the format. 8 | 9 | ## What's a vodcast? 10 | 11 | Compared to the earlier online events, this one is more condensed, and coding focused. We call the new format a vodcast. You can think it more like a podcast but with a video. As it's not audio-only, we can show code easier and discuss it. 12 | 13 | ## Schedule 14 | 15 | We have three guests awaiting you and Juho Vepsäläinen will host the session. The event begins 16:00 (GMT+0) 24th of February, and it should take roughly two hours, although we're flexible. 16 | 17 | For the first event about React components, we've invited three guests to cover the topic: 18 | 19 | - Pedro Duarte ([@peduarte](https://twitter.com/peduarte)) - [Radix UI](https://radix-ui.com/primitives/docs/overview/introduction) is a UI toolkit designed around component composition 20 | - Anurag Hazra ([@anuraghazru](https://twitter.com/anuraghazru)) - [Renderlesskit](https://github.com/timelessco/renderlesskit-react) uses hook based composition for components 21 | - Sascha Tandel ([@saschatandel](https://twitter.com/saschatandel)) - [Twind](https://twind.dev/) provides a styling approach inspired by Tailwind (successor of [Beamwind](https://github.com/kenoxa/beamwind) and [Oceanwind](https://github.com/lukejacksonn/oceanwind)) that has its implications for component design 22 | 23 | It's going to be interesting to see the different ways we can design and compose our React components, and I hope fruitful conversations will come out of the session. 24 | 25 | ## How to participate? 26 | 27 | The event will be freely available and we will stream it to YouTube. Subscribe to the event below or [by using direct link](https://www.youtube.com/watch?v=o_TqhovGSjk): 28 | 29 | 38 | -------------------------------------------------------------------------------- /pages/blog/2021-03-01-vodcast-02.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland Vodcast #2 - Accessibility" 3 | date: 2021-03-01T16:00:00Z 4 | keywords: ["react-finland", "vodcast"] 5 | --- 6 | 7 | In [the previous vodcast](/blog/vodcast-01/) we covered React components. In the second event, we'll focus on accessibility. 8 | 9 | The format felt good. Two hours of technical demonstrations and discussion fits online well, and it also allowed us to bring in comments from the YouTube audience. 10 | 11 | ## Schedule 12 | 13 | Juho Vepsäläinen will host the session, and the event begins 16:00 (GMT+0) 29th of March and will last about two hours. Here's what we have in mind: 14 | 15 | - Nicolas Steenhout [@vavroom](https://twitter.com/vavroom) will show us how to escape divsoup. 16 | - Eeva-Jonna Panula [@EevisPanula](https://twitter.com/EevisPanula) gives us a lesson on motion. 17 | - Amy Carney [@click2carney](https://twitter.com/click2carney) will share her experiences about refactoring a React application to be more accessible 18 | 19 | ## How to participate? 20 | 21 | The event will be freely available and we will stream it to YouTube. Subscribe to the event below or [by using direct link](https://www.youtube.com/watch?v=jouctaXwpdU): 22 | 23 | 32 | -------------------------------------------------------------------------------- /pages/blog/2021-04-07-vodcast-03.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland Vodcast #3 - Full Stack React" 3 | date: 2021-04-07T16:00:00Z 4 | keywords: ["react-finland", "vodcast"] 5 | --- 6 | 7 | In [the previous vodcast](/blog/vodcast-02/) we covered accessibility. In the third event, we'll focus on full stack React. 8 | 9 | ## Schedule 10 | 11 | Juho Vepsäläinen will host the session, and the event begins 16:00 (GMT+0) 28th of April and will last about two hours. Here's what we have in mind: 12 | 13 | - Ali Spittel [@aspittel](https://twitter.com/aspittel) will demonstrate Amplify. 14 | - Amadeus Mader [@Marc_van_Sax ](https://twitter.com/Marc_van_Sax) will showcase Next.js 15 | - Brandon Bayer [@flybayer](https://twitter.com/flybayer) builds on top of Next.js with his Blitz.js demo 16 | 17 | ## How to participate? 18 | 19 | The event will be freely available and we will stream it to YouTube. Subscribe to the event below or [by using direct link](https://www.youtube.com/watch?v=ee3riQ0aVbs): 20 | 21 | 30 | -------------------------------------------------------------------------------- /pages/blog/2021-05-04-vodcast-04.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland Vodcast #4 - Next.js" 3 | date: 2021-05-04T16:00:00Z 4 | keywords: ["react-finland", "vodcast"] 5 | --- 6 | 7 | In [the previous vodcast](/blog/vodcast-03/) we covered full stack React. In the third event, we'll focus specifically on Next.js. 8 | 9 | ## Schedule 10 | 11 | Juho Vepsäläinen will host the session, and the event begins 16:00 (GMT+0) 26th of May and will last about two hours. Here are our speakers: 12 | 13 | - Cassidy Williams [@cassidoo](https://twitter.com/cassidoo) 14 | - David Wippel [@kelkes](https://twitter.com/kelkes) 15 | - Pedro Filho [@pedrofilhome](https://twitter.com/pedrofilhome) 16 | 17 | ## How to participate? 18 | 19 | The event will be freely available and we will stream it to YouTube. Subscribe to the event below or [by using direct link](https://www.youtube.com/watch?v=mMU-j0WoTCs): 20 | 21 | 30 | -------------------------------------------------------------------------------- /pages/blog/2021-05-28-vodcast-05.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "React Finland Vodcast #5 - Design tools" 3 | date: 2021-05-28T16:00:00Z 4 | keywords: ["react-finland", "vodcast"] 5 | --- 6 | 7 | In [the previous vodcast](/blog/vodcast-04/) we covered Next.js. In the fourth event, we'll focus specifically on design tools. 8 | 9 | ## Schedule 10 | 11 | Juho Vepsäläinen will host the session, and the event begins 16:00 (GMT+0) 29th of June and will last about two hours. Here are our speakers: 12 | 13 | - Laura Järvinen [@koodauslaura](https://www.instagram.com/koodauslaura/) 14 | - Margarita Roi [@riittagirl](https://twitter.com/riittagirl) 15 | - Lazar Nikolov [@NikolovLazar](https://twitter.com/NikolovLazar) 16 | 17 | ## How to participate? 18 | 19 | The event will be freely available and we will stream it to YouTube. Subscribe to the event below or [by using direct link](https://www.youtube.com/watch?v=AuwpOsrzHC8): 20 | 21 | 30 | -------------------------------------------------------------------------------- /pages/for-sponsors.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Markdown } from "components"; 3 | 4 | const intro = ` 5 | React Finland is the largest React conference in the Nordics arranged 12.09-16.09. The conference begins with three workshop days and the following conference days include topics ranging from state management to emerging ones. 6 | `; 7 | 8 | const main = ` 9 | ## International Speakers 10 | 11 | The twenty speakers of the conference have varying backgrounds and our roster includes many of the leading names from the community. The single track format allows our visitors to get most out of the experience. In particular, we want to connect the speakers with the local community as well as possible. 12 | 13 | ## Focused Audience 14 | 15 | We expect the audience to contain plenty of international flavor. Our target is to reach between 300 and 400 attendees. Usually 20-30% of our attendees are from abroad. 16 | 17 | ## National and International Visibility 18 | 19 | The conference will have visibility both in national and international level and will reach the ecosystem in React and React Native widely. It has been positioned as a developers to developers conference but we are willing to provide visibility to limited amount of companies in order to produce the highest quality conference we can. We see sponsorships as value add and believe good collaborations can improve the experience for everyone involved. 20 | 21 | ## Your Spot to Shine 22 | 23 | We are offering the perfect spot for companies to promote their knowledge and presence in the React ecosystem through sponsorships. In addition, there will be also side activities with speakers and organizers to connect and communicate with top level professionals. 24 | 25 | ## Packages 26 | 27 | | | BRONZE | SILVER | GOLD 28 | | - | - | - | 29 | | Cost (VAT 0) | 3.000 € | 7.500 € | 15.000 € 30 | | Available | 6 | 4 | 2 31 | | Conference tickets | 2 x ☺ | 4 x ☺ | 6 x ☺ 32 | | Visibility on social media and website | ☺ | ☺ ☺ | ☺ ☺ ☺ 33 | | Logo size on website and app | ☺ | ☺ ☺ | ☺ ☺ ☺ 34 | | Banner in conference | ✓ | ✓ | ✓ 35 | | Banner on stage | | | ✓ 36 | | Logo on slides between the talks | ✓ | ✓ | ✓ 37 | | Job announcements | | ✓ | ✓ 38 | | Area in sponsor lounge for booths / promotion | | ✓ | ✓ 39 | | Item in the goodie bag* | | | ✓ 40 | | Attendance for the speaker events (e.g. the speakers' dinner) | | | ☺ 41 | | Special requests | | | ✓ 42 | 43 | > The \* means we'll let people decide whether they want swag and what kind of swag they want as we're environmentally conscious. If attendees don't want swag, we'll use the equivalent amount of money for charity instead. 44 | 45 | ## How to Sponsor? 46 | 47 | If you are interested in any of our sponsorship packages, get in touch (info react-finland.fi)! 48 | `; 49 | 50 | const ForSponsors = () => ( 51 | <> 52 |
53 |
54 | 55 |
56 |
58 |
59 | 60 |
61 | 62 | ); 63 | 64 | export default ForSponsors; 65 | -------------------------------------------------------------------------------- /pages/imprint.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Markdown } from "components"; 3 | 4 | const main = ` 5 | \`\`\` 6 | TOSKA Osuuskunta 7 | c/o Aleksi Pousar 8 | Työpajankatu 17 A 258 9 | 00580 Helsinki 10 | \`\`\` 11 | 12 | * info react-finland.fi 13 | * VAT: FI30883078 14 | `; 15 | 16 | const Imprint = () => ( 17 |
18 |
19 | 20 |
21 |
22 | ); 23 | 24 | export default Imprint; 25 | -------------------------------------------------------------------------------- /pages/satellite-event-guidelines.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Markdown } from "components"; 3 | 4 | const intro = ` 5 | In this short guide, we list the important things to keep in mind when running satellite events around the conference. 6 | 7 | For any questions, get in touch through our Slack (registration at site index) or via email (info at react-finland.fi). 8 | `; 9 | 10 | const main = `* The schedule has been planned so that there’s a late session for each day from Monday to Friday. The point is that it’s likely best to organize something around these times as people are free from their work by then. That said, if you want to organize something during the day (say internally), that’s viable as well. For some of the late events, the times differ to make sure we can bring American speakers onboard easily so take care when scheduling. 11 | * It’s good to start the satellite event at least half an hour before the stream starts. 12 | * For some of the events, we’ll try to bring speakers online from satellite events themselves. 13 | * At the very least, there should be a person responsible for connecting to the stream through YouTube and then showing it on the screen. In addition, they should relay any questions and comments from the live audience to the stream through YouTube chat. These in turn can then be discussed live in the stream. 14 | * When it comes to catering, it’s up to you to figure out if you want to offer something. If you do, it can be a good idea to consider vegan options. 15 | * In terms of personnel restrictions, refer to the recommendations provided by the officials. There may be personnel limits and further requirements in place to consider. 16 | * Especially for foreign events (as in not held in Finland), we can send a Finland related package to bring some of the cultural elements (salmiakki and other things) in play. It’s good to do this weeks beforehand so that the package will arrive in time. 17 | * Marketing-wise, we will list all of the events on our website. It’s also recommended to collaborate with local meetups to run these events as joint events as they have the reach to the local community and many times they haven’t been able to do anything for a long time. Hopefully now we can restart their operations as a side effect. 18 | * Health-wise, it's advised to follow the recommendations of the local authorities.`; 19 | 20 | const SatelliteEventGuidelines = () => ( 21 | <> 22 |
23 |
24 | 25 |
26 |
28 |
29 | 30 |
31 | 32 | ); 33 | 34 | export default SatelliteEventGuidelines; 35 | -------------------------------------------------------------------------------- /pages/schedule.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { 3 | AnchorHeader, 4 | Markdown, 5 | Schedule as ScheduleComp, 6 | // ScheduleLegend, 7 | connect, 8 | } from "../components"; 9 | 10 | const Schedule = ({ conference, year }) => { 11 | if (!conference) { 12 | return null; 13 | } 14 | return ( 15 | <> 16 |
17 |
18 | It's possible to [subscribe to the conference calendar directly to keep up to date with any changes](https://api.react-finland.fi/calendar-2022.ics).`} 22 | /> 23 |
24 |
26 |
27 | {/*conference.schedules && */} 28 | {conference.schedules.map(({ day, description, intervals }) => ( 29 | 30 | 31 | {day} 32 | {description && ` - ${description}`} 33 | 34 | 35 | 36 | ))} 37 |
38 | 39 | ); 40 | }; 41 | 42 | export default ({ conferenceId, year }) => 43 | connect( 44 | ` 45 | query PageQuery($conferenceId: ID!) { 46 | conference(id: $conferenceId) { 47 | schedules { 48 | day 49 | description 50 | intervals { 51 | begin 52 | end 53 | title 54 | mc { 55 | name 56 | image { 57 | url 58 | } 59 | } 60 | location { 61 | name 62 | social { 63 | googleMaps 64 | } 65 | address 66 | city 67 | } 68 | sessions { 69 | type 70 | title 71 | description 72 | speakers { 73 | name 74 | image { 75 | url 76 | } 77 | } 78 | keywords 79 | urls { 80 | drawing 81 | slides 82 | web 83 | video 84 | demo 85 | } 86 | sessions { 87 | type 88 | title 89 | description 90 | speakers { 91 | name 92 | image { 93 | url 94 | } 95 | } 96 | keywords 97 | urls { 98 | drawing 99 | slides 100 | web 101 | video 102 | demo 103 | } 104 | } 105 | } 106 | urls { 107 | video 108 | } 109 | } 110 | } 111 | } 112 | } 113 | `, 114 | () => ({ conferenceId }), 115 | { year } 116 | )(Schedule); 117 | -------------------------------------------------------------------------------- /pages/speakers.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { Contacts, Speaker, connect } from "../components"; 4 | 5 | const Speakers = ({ conference }) => ( 6 |
7 | 12 |
13 | ); 14 | Speakers.propTypes = { 15 | conference: PropTypes.object, 16 | }; 17 | 18 | export default ({ conferenceId }) => 19 | connect( 20 | ` 21 | query PageQuery($conferenceId: ID!) { 22 | conference(id: $conferenceId) { 23 | allSpeakers { 24 | name 25 | talks { 26 | day 27 | begin 28 | end 29 | title 30 | type 31 | description 32 | urls { 33 | slides 34 | web 35 | video 36 | demo 37 | } 38 | } 39 | workshops { 40 | title 41 | type 42 | description 43 | } 44 | about 45 | social { 46 | homepage 47 | github 48 | twitter 49 | linkedin 50 | twitch 51 | } 52 | image { 53 | url 54 | } 55 | country { 56 | code 57 | } 58 | } 59 | } 60 | } 61 | `, 62 | () => ({ 63 | conferenceId, 64 | }) 65 | )(Speakers); 66 | -------------------------------------------------------------------------------- /pages/workshops.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { Contacts, Workshop, Markdown, connect } from "components"; 4 | 5 | const intro = `All the workshops take place live at Paasitorni. Note that full day workshops include a lunch and refreshments. If you participate into two half-day workshops, we'll organize lunch for you.`; 6 | 7 | const Workshops = ({ conference }) => ( 8 |
9 | 10 | 11 |
12 | ); 13 | Workshops.propTypes = { 14 | conference: PropTypes.object, 15 | }; 16 | 17 | export default ({ conferenceId }) => 18 | connect( 19 | ` 20 | query PageQuery($conferenceId: ID!) { 21 | conference(id: $conferenceId) { 22 | workshops { 23 | day 24 | begin 25 | end 26 | speakers { 27 | name 28 | about 29 | image { 30 | url 31 | } 32 | } 33 | title 34 | description 35 | location { 36 | name 37 | address 38 | city 39 | } 40 | } 41 | } 42 | } 43 | `, 44 | () => ({ 45 | conferenceId, 46 | }) 47 | )(Workshops); 48 | -------------------------------------------------------------------------------- /pages/youtube-embed.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | // https://www.youtube.com/embed/vpeO0J7FXAE 4 | // https://www.youtube.com/live_chat?v=vpeO0J7FXAE&embed_domain=react-finland.fi 5 | // https://react-finland.fi/youtube-embed/?id=5olfi5wbgF4&domain=react-finland.fi 6 | 7 | const YouTubeEmbed = () => ( 8 |
9 |
10 |
14 |