diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index fb41372d..adefae35 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -26,7 +26,7 @@ kotlinx-datetime = "0.6.1"
ktor = "3.0.1"
android-svg = "1.4"
logbackClassic = "1.5.6"
-markdown = "0.26.0"
+markdown = "0.29.0"
postgresql = "42.7.3"
androidx-navigation = "2.8.0-alpha10"
@@ -58,7 +58,7 @@ components-ui-tooling-preview = { module = "org.jetbrains.compose.components:com
compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose-android" }
compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose-android" }
-multiplatform-markdown-renderer-m3 = { module = "com.mikepenz:multiplatform-markdown-renderer-m3", version.ref = "markdown" }
+multiplatform-markdown-renderer = { module = "com.mikepenz:multiplatform-markdown-renderer", version.ref = "markdown" }
# ktor
ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts
index 2be9739b..5d0205d8 100644
--- a/shared/build.gradle.kts
+++ b/shared/build.gradle.kts
@@ -70,7 +70,6 @@ kotlin {
implementation(libs.kotlinx.datetime)
implementation(libs.androidx.navigation.compose)
- implementation(libs.multiplatform.markdown.renderer.m3)
implementation(libs.ktor.client.core)
}
diff --git a/shared/src/commonMain/composeResources/files/app-privacy-policy.md b/shared/src/commonMain/composeResources/files/app-privacy-policy.md
new file mode 100644
index 00000000..65123061
--- /dev/null
+++ b/shared/src/commonMain/composeResources/files/app-privacy-policy.md
@@ -0,0 +1,301 @@
+**KotlinConf App Privacy Policy**
+
+Version 1.1, effective from February 28, 2024
+
+In this KotlinConf App Privacy Policy (“Privacy Policy”), we describe
+the types of data, including Personal Data (collectively, "data"), that
+we and our associated companies collect from you when you use the
+KotlinConf app and the functionalities and services it offers
+(collectively, the "App"), how we and our associated companies use and
+disclose that data, and your options to access or update your data.
+
+The data controllers are JetBrains Expo B.V. with its business address
+at Huidekoperstraat 26, 1017 ZM, the Netherlands, and [its associated
+companies](https://www.jetbrains.com/company/contacts/#headquarters-international-sales):
+JetBrains N.V., JetBrains s.r.o. and JetBrains GmbH.
+
+JetBrains and its associated companies act as joint data controllers,
+who are jointly responsible for compliance with data protection
+legislation. JetBrains Expo B.V. is primarily
+responsible for exercising the rights of data subjects and providing
+information about data processing.
+
+**Definitions**
+
+The following definitions are used throughout this Privacy Policy:
+
+**JetBrains Website**. The website of JetBrains which can be found on
+[https://www.jetbrains.com/](https://www.jetbrains.com/).
+
+**KotlinConf**. The official event by
+[JetBrains](https://www.jetbrains.com/) under the name KotlinConf
+of which more information can be directly found on the website
+[https://kotlinconf.com/](https://kotlinconf.com/).
+
+**Personal Data** means any data relating to an identified or
+identifiable natural person.
+
+All other capitalized terms used in this Privacy Policy shall have the
+same meaning as defined in article 4 GDPR (such as personal data,
+controller, processor, data subject, and others), unless defined
+otherwise in this definition clause.
+
+**Why We Collect Data and What We Collect**
+
+We collect data for various reasons as reflected in our [general
+Privacy
+Policy](https://www.jetbrains.com/legal/docs/privacy/privacy/) which
+can be found on the JetBrains Website, but for this App specifically we
+collect data for only the following reasons:
+
+a) **To provide you with the basic functionalities of the App.** Upon
+your (re-)installation of the App we generate and collect a random ID,
+which is required to provide you with the basic functionalities of this
+App, such as in any case the account management (used for the setup or
+management of a user’s account) and other processing connected with the
+use of this App. Please note that we do not collect, store or process
+any Personal Data, such as your Device ID, so we can’t trace the random
+ID back to any device or person. We use [Google
+Cloud](https://cloud.google.com/terms/cloud-privacy-notice)
+Platform, as third party service provider, acting as a data
+processor, to assist us in hosting and providing the App to you or in
+our operations. The legal basis for this data processing is the
+performance of a contract between you and us.
+
+b) **To improve the App and KotlinConf.** We may collect anonymous data
+based on your use of the App and we may use feedback that you provide
+voluntarily through the App, in particular on the talks during
+KotlinConf, as applicable. We use such data to better understand the
+usage patterns of the App, the options it provides and the behavior,
+preferences and feedback of our KoltinConf audience. Collection of data
+based on your use of the App and feedback that you provide voluntarily
+through the App is done anonymously but if you decide to share any
+Personal Data in your feedback the legal basis for this data processing
+shall be your consent.
+
+Categories of data involved in data processing include:
+
+- generated random ID,
+
+- data about usage of the App and services,
+
+- votes, comments, voluntarily provided feedback, and any data provided
+ in survey responses,
+
+Where appropriate, we will prompt you to give us your consent to the
+collection and processing of your data as described above. This will in
+any case happen within the App upon your first use of it, in a clear and
+conspicuous manner. You can manage your Personal Data and opt-outs as
+described in the Transparency section below.
+
+**Your Privacy Choices And Rights**
+
+Your Privacy Choices. The privacy choices you may have about your
+Personal Data are determined by applicable law and are described below.
+
+● Mobile Devices. We may send push notifications through the App. You
+may opt out from receiving these push notifications by changing the
+settings on your mobile device.
+
+Please note you must separately opt out in each browser and on each
+device.
+
+**Children**
+
+This App is not designed for and is not offered to children under the
+age of 16. If we discover that a person under the age of 16 has
+submitted information directly to us, we will endeavor to delete the
+information from our systems.
+
+**Transparency**
+
+To respect your privacy, before using your Personal Data we will inform
+you about the categories of Personal Data we collect and the purposes we
+use them for. We will also inform you about the data management options
+that you may have. For this purpose, we use this Privacy Policy and the
+Terms of Use found in the App. In this case, the App does not collect,
+store or process any Personal Data. Should you wish to get more detailed
+information on this topic, please do not hesitate to contact us.
+
+**Sharing**
+
+Collected Personal Data are shared based on this Privacy Policy.
+Additionally, we share collected Personal Data within the JetBrains
+group of companies described above, which act as joint data controllers
+and process Personal Data for the purposes described above.
+
+We may share your Personal Data with [Google Cloud Platform which
+third party hosts and helps us provide you with this
+App.](https://cloud.google.com/terms/cloud-privacy-notice)
+
+We may also share your Personal Data with certain third parties if we
+are obliged to do so under applicable legislation (especially with tax
+authorities or with other government bodies exercising their statutory
+powers) or if such sharing is necessary to achieve the purposes defined
+above (especially with government bodies or with parties harmed as a
+result of violations of applicable laws).
+
+To adhere to the requirements of the California Consumer Privacy Act
+(CCPA), we hereby notify you that JetBrains will not a) retain, use,
+sell, or otherwise disclose any Personal Data for any purpose other than
+to provide the App; or b) retain, use, sell, or disclose such Personal
+Data outside of the direct relationship between you and JetBrains; or c)
+use Personal Data other than as described within this Privacy Policy.
+
+**Security**
+
+We take steps to ensure that your information is treated securely and in
+accordance with this Privacy Policy. To secure your Personal Data, this
+App is designed with security and privacy in mind. Unfortunately, no
+system is 100% secure, and we cannot ensure or warrant the security of
+any information you provide to us. To the fullest extent permitted by
+applicable law, we do not accept liability for unauthorized access,
+acquisition, use, disclosure, or loss of personal information.
+
+We encrypt your data in transfer and at rest where it is technically
+feasible. External web resources are protected by SSL encryption.
+
+We review the processes of Personal Data usage before implementing them.
+This is done to minimize data usage and to make sure that you as the
+data owner are informed about the processing. When the reason for data
+storage expires, we remove your Personal Data from our servers or
+anonymize it for further usage. By the nature of the activity within
+which your data is collected, in particular when using the App to
+provide feedback. it may appear in our internal datasets used for
+researching the results of the voting. Before using the datasets for
+research or other purposes you are not informed of, we remove or
+anonymize your Personal Data in the datasets.
+
+We are using [Google
+Cloud](https://cloud.google.com/terms/cloud-privacy-notice)
+Platform as a third party to host the App and to process your
+data in accordance with this Privacy Policy. While choosing the
+partners, we ascertain their compliance with legal regulations and
+security standards to make sure your data are stored in a secure
+location with appropriate security measures in place.
+
+**Location of Your Information**
+
+Any servers or services of the App that contain Personal Data are
+located within the EU. At times, JetBrains may process or transfer some
+of your Personal Data to our affiliate companies outside of the EU. Any
+such transfer will be made in accordance with the applicable laws on
+data protection and this Privacy Policy and will be based on a relevant
+adequacy decision of the European Commission, especially on standard
+data protection clauses.
+
+**Third-Party Links**
+
+The App may contain links to other websites/applications and other
+websites/applications may reference or link to our App. These
+third-party services are not controlled by us. We encourage our users to
+read the privacy policies of each website and application with which
+they interact. We do not endorse, screen, or approve, and are not
+responsible for, the privacy practices or content of such other websites
+or applications. Providing personal information to third-party websites
+or applications is at your own risk.
+
+**Data Retention, Withdrawal of Approval, Access to Data and Your
+Rights**
+
+As the App does not collect, store or process any Personal Data, there
+is no Personal Data that needs to be removed from our servers if you
+choose to cease using this App at any time. Generally, we retain your
+Personal Data as long as we need to in order to achieve the purpose for
+which it was collected. We may retain your information if it is required
+to comply with legal obligations and/or defense in case of violation of
+any JetBrains terms of use and/or Privacy Policies. We may also have
+copies of your information in application logs, weblogs, and/or backups
+made for security and support purposes or consent text accepted before
+the Personal Data collection. These backups will not be accessible as
+separately delineated information. We may store Personal Data as
+reflected above for as long as you are using the App and/or for as long
+as you have it installed on your device. Further, we may keep the data
+to protect ourselves from damage in case of litigation in accordance
+with the current legislation. Please note, however, that you must retain
+a copy of all data that you have placed on our servers in the case of
+any loss; further, if you cease using our software and/or services, we
+will not be responsible for the retention of any of your data.
+
+If applicable, you are responsible for the correctness of the Personal
+Data you provide to us. We expect you to check the Personal Data you
+provide to us and if any inconsistency takes place, update your Personal
+Data or report the inconsistency to JetBrains.
+
+As permitted by applicable law, EU residents may request a copy of the
+information that we hold about them. As we do not collect, store or
+process any Personal Data with the App we do not hold any information
+about you.
+
+Moreover, as set out in locally applicable Personal Data protection law,
+you may have the right to: (i) request access to your Personal Data;
+(ii) request rectification of your Personal Data; (iii) request erasure
+of your Personal Data; (iv) request a restriction on the processing of
+your Personal Data; (v) request Personal Data portability; or (vi)
+object to the processing of your Personal Data. Please note that as we
+do not collect, store or process any Personal Data with the App, some of
+the rights can’t be exercised.
+
+- **Right of Access.** You may have the right to obtain from us a
+ confirmation as to whether or not Personal Data concerning you are
+ being processed, and, where that is the case, to request access to
+ your Personal Data. The information about Personal Data processing
+ includes the purposes of the processing, the categories of Personal
+ Data concerned, and the recipients or categories of recipients to whom
+ your Personal Data have been or will be disclosed, etc. However, this
+ is not an absolute right and the interests of other individuals may
+ restrict your right of access. Further, you may have the right to
+ obtain a copy of your Personal Data undergoing processing. For
+ additional copies requested, we may charge a reasonable fee based on
+ administrative costs.
+
+- **Right to Rectification.** You may have the right to obtain from us
+ the rectification of inaccurate Personal Data. Depending on the
+ purposes of the processing, you may have the right to have incomplete
+ Personal Data made complete, in particular by providing a
+ supplementary statement.
+
+- **Right to Erasure (Right to Be Forgotten).** Under certain
+ circumstances, you may have the right to require us to delete your
+ Personal Data.
+
+- **Right to a Restriction of Processing.** Under certain circumstances,
+ you may have the right to require us to restrict the processing of
+ your Personal Data. In this case, the respective Personal Data will be
+ marked and may only be processed by us for certain purposes.
+
+- **Right to Personal Data portability.** Under certain circumstances,
+ you may have the right to receive the Personal Data concerning you,
+ which you have provided to us, in a structured, commonly used, and
+ machine-readable format, and to transmit these Personal Data to
+ another entity.
+
+- **Right to Object.** Under certain circumstances, you may have the
+ right to object, on grounds relating to their particular situation, at
+ any time to the processing of your Personal Data by us and we can be
+ required to no longer process your Personal Data.
+
+Where applicable, these rights can be exercised via the email
+address [privacy@jetbrains.com](privacy@jetbrains.com).
+
+You may also contact JetBrains to get up-to-date information about your
+Personal Data processing and any Personal Data recipients.
+
+You may lodge a complaint related to the processing of your personal data with the competent data protection supervisory authority, i.e. in the Netherlands the Authority Personal Data (*Autoriteit Persoonsgegevens*), with its visiting address at Hoge Nieuwstraat 8, 2514 EL Den Haag. For more information, please visit [https://autoriteitpersoonsgegevens.nl](https://autoriteitpersoonsgegevens.nl).
+
+**Changes to this Policy**
+
+This Privacy Policy is current as of the Effective Date set forth above.
+We may change this Privacy Policy from time to time, so please be sure
+to check back periodically. We will post any changes to this Privacy
+Policy in the App. If we make any changes to this Privacy Policy that
+materially affect our practices with regard to the Personal Data we have
+previously collected from you, we will endeavor to provide you with an
+advance notice of such change by highlighting the change upon your
+subsequent use of the App.
+
+**Reaching out**
+
+If you have any questions or concerns, or you feel that this Privacy
+Policy has been violated in any way, please let us know immediately by
+contacting [privacy@jetbrains.com](privacy@jetbrains.com).
diff --git a/shared/src/commonMain/composeResources/files/visitors-privacy-policy.md b/shared/src/commonMain/composeResources/files/visitors-privacy-policy.md
new file mode 100644
index 00000000..acbc6d94
--- /dev/null
+++ b/shared/src/commonMain/composeResources/files/visitors-privacy-policy.md
@@ -0,0 +1,130 @@
+Dear Visitors, We at JetBrains Expo B.V. and our associated companies,
+which can be found listed on:
+[https://www.jetbrains.com/company/contacts/](https://www.jetbrains.com/company/contacts/)
+(collectively referred to as “JetBrains” or “our” or “we”), respect you
+and are committed to honoring and safeguarding your privacy. This
+Privacy Policy describes our privacy practices regarding the collection
+and use of your personal data when you visit our event KotlinConf 2024
+which takes place in the Bella Center Copenhagen, Copenhagen, Denmark
+(“premises”) between the dates of May 22th and 24th, 2023.
+
+This Privacy Policy may be amended from time to time. The respective
+latest version of the Privacy Policy at the point of time of your visit
+shall apply. The data controllers are JetBrains Expo B.V.,
+Huidekoperstraat 26, 1017 ZM Amsterdam, the Netherlands, and the
+[associated companies, JetBrains](https://www.jetbrains.com/company/contacts/) N.V., JetBrains
+GmbH and JetBrains s.r.o.
+
+JetBrains and its associated companies act as joint data controllers,
+who are jointly responsible for compliance with data protection
+legislation. JetBrains Expo B.V. is primarily responsible for exercising
+the rights of data subjects and providing information about data
+processing.
+
+### Following instructions
+
+Each Visitor to the premises shall always follow the instructions of our
+staff.
+
+### Regular visits
+
+In case of a regular visit, we shall obtain certain limited personal
+information from you as described hereunder.
+
+Video surveillance
+Please be informed that Bella Center Copenhagen operates video
+surveillance in the premises where KotlinConf 2024 will be held and the
+rest of their premises. For more information we refer to their
+[Privacy Policy](https://www.bellagroup.dk/en/privacy) and
+further information which can be found on their website:
+[https://www.bellacenter.dk/en](https://www.bellacenter.dk/en).
+
+Photos and records
+Please note that during KotlinConf we usually take illustrative or
+documentary photos and/or audio/visual records, which can include your
+images and capture your appearance. These records may serve for the
+adequate public use within our marketing and promotional activities on
+our social networks or in selected public media. In accordance with the
+GDPR we shall ask for your consent where required before making and
+sharing, as applicable, such photos or records on our social networks or
+in selected public media. We will not take nor publish any photos or
+records displaying you in a degrading way.
+
+Badge printing at registration
+We use pretix to provide badge printing services for those attending
+KotlinConf 2024. Your information will be shared with pretix for the
+purpose of printing on your name badge the contact information as
+provided during your registration for KotlinConf 2024 (such as your full
+name and company name). Pretix will only process your name for the
+purposes described above in compliance with applicable laws. A name
+badge is required to gain access to KotlinConf 2024.
+
+Badge scanning
+Furthermore, please note that during KotlinConf 2024 we use pretix to
+provide badge scanning services, also called lead retrieval or scanning,
+to certain exhibitors and/or sponsors. On the name badge there shall be
+a QR-code which holds certain personal data as provided by you during
+your registration for KotlinConf 2024 (such as your full name, contact
+details such as e-mail, job title and company name). Exhibitors and/or
+sponsors at KotlinConf 2024 may wish to scan your badge so they can
+contact you with more information. By allowing your badge to be scanned,
+you are consenting to have pretix provide the above-mentioned
+information to the exhibitor and/or sponsor for the purposes of further
+(marketing) communication and to contact you with more information
+post-event. As the scanning is based on your consent to the exhibitor
+and/or sponsor, if you do not wish to be contacted by the party in
+question, please communicate this directly to them at the event or
+thereafter.
+
+For more information about pretix we refer to their [privacy
+page](https://pretix.eu/about/en/privacy).
+
+**Purpose for processing personal data**
+
+The legal basis for data processing is our legitimate interest in the
+organization of our events, in promoting and marketing our products and
+services, crime prevention and ensuring safety for our visitors, staff
+and ourselves.
+
+**Specific collection and processing of personal data**
+
+Please note that we will obtain your specific consent for any other
+purpose or occasion of your personal data collection and processing not
+mentioned explicitly in this Privacy Policy.
+
+### Use, security and retention of personal data
+
+Your personal data is maintained in a secure manner. Only authorized
+employees and security personnel have access to them. We will only keep
+your personal data for as long as is reasonably necessary for the
+purposes outlined above or to comply with legal requirements under
+applicable law(s).
+
+We do NOT transfer or share your personal data with other persons or
+organizations unless required or permitted by law except for sharing
+within the JetBrains group of companies described above, which act as
+joint data controllers and process personal data for the purposes
+described above. We may share your data with certain [third
+parties](https://www.jetbrains.com/legal/privacy/third-parties.html)
+which help us to run our business such as for badge printing, badge
+scanning, catering services or t-shirt supplies.
+
+### Your rights
+
+You have the following rights under the law regarding your personal
+data: Right of access, right to rectification, right to erasure, right
+to restriction of processing, right to personal data portability, and
+right to object. Should you wish to (i) exercise them, (ii) to revoke
+any consent given to us, or (iii) if you have any concerns as to how
+your data is processed you can contact us at
+[privacy@jetbrains.com](mailto:privacy@jetbrains.com).
+
+You may also contact JetBrains to get up-to-date information about your
+personal data processing and any personal data recipients.
+
+For more details and further information on your rights, please visit
+the pertinent segment in our Privacy Policy accessible at
+[https://www.jetbrains.com/legal/docs/privacy/privacy/](https://www.jetbrains.com/legal/docs/privacy/privacy/).
+
+You may lodge a complaint related to the processing of your personal data with the competent data protection supervisory authority, i.e. in the Netherlands the Authority Personal Data (*Autoriteit Persoonsgegevens*), with its visiting address at Hoge Nieuwstraat 8, 2514 EL Den Haag. For more information, please visit [https://autoriteitpersoonsgegevens.nl](https://autoriteitpersoonsgegevens.nl).
+
diff --git a/shared/src/commonMain/composeResources/files/visitors-terms.md b/shared/src/commonMain/composeResources/files/visitors-terms.md
new file mode 100644
index 00000000..b8581892
--- /dev/null
+++ b/shared/src/commonMain/composeResources/files/visitors-terms.md
@@ -0,0 +1,205 @@
+These General Terms and Conditions for Visitors apply for every visit to
+KotlinConf 2024 (“KotlinConf”, “event”). The KotlinConf of 2024 takes
+place in the Bella Center Copenhagen, Copenhagen, Denmark (“premises”)
+between May 22 - 24, 2024. Please read these General Terms and
+Conditions for Visitors carefully before visiting and entering the
+premises of KotlinConf. By visiting KotlinConf and entering the
+premises, you are entering into a legal agreement with JetBrains Expo
+B.V., with its registered address at Huidekoperstraat 26, 1017 ZM
+Amsterdam, the Netherlands, registered with the Dutch Chamber of
+Commerce under the number: 74098896, VAT ID number: NL 85977129
+("JetBrains", "we"), and you hereby agree to abide by these Terms.
+Nothing in these Terms limits any rights a consumer might have under
+applicable consumer protection laws.
+
+If you do not agree to all of the terms and conditions set forth in
+these General Terms and Conditions for Visitors, please do not visit
+KotlinConf or enter the premises. The General Terms and Conditions for
+Visitors are a binding agreement between JetBrains and you.
+
+**Definitions**
+
+In addition to the definitions specified above, the following
+definitions are used throughout these General Terms and Conditions for
+Visitors:
+
+**Ticket**. Any entrance or activity ticket that provides access to
+KotlinConf. Tickets are divided into: Conference Ticket(s), which
+only provide regular admission to the conference and Workshop
+Ticket(s), which provide access to one pre-selected workshop and the
+regular admission to the conference.
+
+**Visitor**. Any person who enters the premises at which KotlinConf is
+held and participates in the event.
+
+**Group** and **Group Visit**. A group of visitors who visit KotlinConf
+as a group.
+
+**Organizer**. An individual, company, or institution who/which
+organized or organizes Group Visits.
+
+**Website**. Any website that is the property of JetBrains s.r.o.,
+including but not limited to everything hosted under the domains listed
+at
+[https://www.jetbrains.com/legal/websites/](https://www.jetbrains.com/legal/websites/)
+
+These General Terms and Conditions for Visitors shall apply to any visit
+to and all Visitors to KotlinConf.
+
+The applicability of these General Terms and Conditions for Visitors
+shall be without prejudice to the potential applicability of other
+contractual terms and conditions and/or regulations applied by
+JetBrains, such as the Terms of Use, and other terms published on the
+Website from time to time.
+
+**Entrance admission**
+
+Visitors are given access to KoltinConf upon the presentation of a valid
+Ticket or valid ID at the entrance and upon the condition that they take
+into account our [Code of
+Conduct](https://kotlinconf.com/code-of-conduct). Furthermore, if a
+Student Discount was used during the purchase of the Ticket the Visitor
+will need to provide a valid academic ID together with the valid Ticket
+or valid ID. You can print your Ticket or present it on a mobile device
+at the entrance.
+
+For the avoidance of doubt, please be aware that on May 22, 2024 the
+workshops shall be held while the conference shall be held on May 23 -
+24, 2024. If you have purchased a Workshop Ticket this gives you access
+to attend your pre-selected workshop on May 22, 2024 and provides
+regular admission to the conference, if you have purchased the
+Conference Ticket this means you can’t attend the workshops but shall
+only receive regular admission to the conference.
+
+JetBrains reserves the right to refuse admission to Visitors if it
+determines, in its sole discretion, that the Visitor poses a threat to
+the health and/or safety of other Visitors or the staff of KotlinConf
+and/or the safety of the premises, our partners and the event in
+general.
+
+**Your visit to KotlinConf**
+
+You visit KotlinConf at your own risk. As a Visitor, you are obliged to
+comply with these General Terms and Conditions for Visitors and follow
+directions and instructions given by our staff. If you violate these
+General Terms and Conditions for Visitors and/or act in violation of
+directions and instructions given by our staff (to you), in any way, we
+may, in our sole discretion, decide to refuse subsequent admission to
+KotlinConf. In such an event, we will not be obligated to compensate for
+any damages or to refund the Ticket.
+
+As Visitor you shall be liable for any damage you inflict to JetBrains
+and to any of our property during your visit to KotlinConf.
+
+*Privacy*
+
+Please be informed that Bella Center Copenhagen operates video
+surveillance in the premises where KotlinConf 2024 will be held and the
+rest of their premises. For more information we refer to their
+[Privacy Policy](https://www.bellagroup.dk/en/privacy) and
+further information which can be found on their website:
+[https://www.bellacenter.dk/en](https://www.bellacenter.dk/en).
+
+For more information about the collection and use of your personal data
+by JetBrains when you visit KotlinConf, you can refer to our Privacy
+Policy for Visitors, hard copies of which are also available from our
+staff.
+
+We regularly grant permission or ask our staff or third parties to make
+audiovisual material, such as photographs or videos, during KotlinConf.
+Such content is usually made for marketing purposes or to use on our
+Website or other social media. Before making and using any such content
+in which our Visitors will be recognizable, we always try to ask for
+consent in advance. We ask you to make any objections to the recording
+or publication of visual material in which you are recognizable known to
+us at [privacy@jetbrains.com](mailto:privacy@jetbrains.com) or by
+informing one of our staff members. In the event of an objection,
+JetBrains shall undertake to prevent the further recording and/or
+publication of the material. You may withdraw the consent given or
+request us to stop using, or request us to remove, a specific photo(s)
+and/or video(s) from our social media and/or Website at any time. If you
+want to make use of these rights, please send the relevant request to
+[privacy@jetbrains.com](mailto:privacy@jetbrains.com).
+
+Further information on data processing, including your rights, such as
+the right of access, is available in our Privacy Policy available at
+[https://www.jetbrains.com/legal/docs/privacy/privacy/](https://www.jetbrains.com/legal/docs/privacy/privacy/).
+
+**Rules**
+
+To make sure that everyone’s visit is safe and pleasant, we have rules
+that our Visitors must follow. Our rules, and other information can be
+found at
+[https://kotlinconf.com/code-of-conduct/](https://kotlinconf.com/code-of-conduct/).
+The code of conduct of the premises at which KotlinConf shall be held
+can be found at
+LINK. We ask our Visitors to always follow the instructions given
+by our staff.
+
+During your visit to KotlinConf, you, as a Visitor, shall not:
+
+- possess, use or trade in drugs;
+
+- possess weapons or any objects that can be used as weapons;
+
+- commit theft or vandalism;
+
+- use violence or threaten violence;
+
+- make discriminatory remarks;
+
+- engage in any form of sexual intimidation;
+
+- bring anyone into disrepute;
+
+- consume your own food or drinks;
+
+- take service items (plates, glasses etc.) outside the building;
+
+- drink excessively;
+
+- cause excessive noise in the immediate vicinity;
+
+- use the internet network of the premises for illegal purposes;
+
+- use the internet network of the premises to download or visit illegal
+ or offensive content;
+
+- enter or cross areas that are not meant for Visitors or that have been
+ barricaded;
+
+- interact with exhibits or use those in the manner contradicting the
+ guidance provided by staff members;
+
+- smoke;
+
+- bring any animals (including pets) along, with the exception of
+ service animals.
+
+**Liability of JetBrains**
+
+JetBrains shall only be liable for direct damage sustained by a Visitor
+which is the direct consequence of intent (*opzet*) or gross negligence
+(*grove nalatigheid*) on the part of JetBrains. JetBrains shall not be
+liable for indirect damage, such as consequential damage, lost profits,
+etc.
+
+The liability of JetBrains shall be limited to the lower of the
+following two sums:
+
+1) the sum paid out to JetBrains by its insurance company with respect
+ to that individual claim; or
+
+2) the reimbursement made to JetBrains by a third party for the damage
+ with respect to that individual claim.
+
+**Terms for Group Visits**
+
+This section shall apply in cases in which an Organizer wants to
+organize or has organized a Group Visit. In such cases all agreements
+are concluded between the Organizer and JetBrains.
+
+It is the responsibility of the Organizer to ensure that the members of
+the Group comply with the [Code of
+Conduct](https://kotlinconf.com/code-of-conduct) and these General
+Terms and Conditions for Visitors.
diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml
index 22a0e010..1cd8c455 100644
--- a/shared/src/commonMain/composeResources/values/strings.xml
+++ b/shared/src/commonMain/composeResources/values/strings.xml
@@ -17,4 +17,13 @@ We will process your data in accordance with the App Privacy Policy. You can adj
JetBrains News
Get news about JetBrains products.
Let’s get started!
+
+ General Terms and Conditions
+ KotlinConf 2024 General Terms and Conditions for Visitors
+ Version 1.0 of May 1, 2024
+
+ Privacy Policy
+ KotlinConf 2024 Privacy Policy for Visitors
+ Version 1.0 of May 1, 2024
+
diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/App.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/App.kt
index 7c9f8b71..066197b0 100644
--- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/App.kt
+++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/App.kt
@@ -38,6 +38,7 @@ import org.jetbrains.kotlinconf.ui.components.StyledText
import org.jetbrains.kotlinconf.ui.theme.KotlinConfTheme
import kotlin.reflect.typeOf
import org.jetbrains.compose.reload.DevelopmentEntryPoint
+import org.jetbrains.kotlinconf.screens.PrivacyPolicyForVisitors
import org.jetbrains.kotlinconf.screens.StartNotificationsScreen
const val apiEndpoint = "https://kotlinconf-app-prod.labs.jb.gg"
@@ -81,6 +82,10 @@ fun App(context: ApplicationContext) {
Modifier.clickable { navController.navigate(CodeOfConductScreen) }
)
StyledText("Settings", Modifier.clickable { navController.navigate(SettingsScreen) })
+ StyledText(
+ "Privacy policy for visitors",
+ Modifier.clickable { navController.navigate(PrivacyPolicyForVisitorsScreen) }
+ )
StyledText(
"Terms of use",
Modifier.clickable { navController.navigate(TermsOfUseScreen) }
@@ -116,8 +121,11 @@ fun App(context: ApplicationContext) {
composable {
Settings()
}
+ composable {
+ PrivacyPolicyForVisitors(onBack = navController::popBackStack)
+ }
composable {
- TermsOfUse()
+ TermsOfUse(onBack = navController::popBackStack)
}
composable {
Partners()
diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/BaseScreens.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/BaseScreens.kt
new file mode 100644
index 00000000..4b292afa
--- /dev/null
+++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/BaseScreens.kt
@@ -0,0 +1,81 @@
+package org.jetbrains.kotlinconf
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import kotlinconfapp.ui_components.generated.resources.Res
+import kotlinconfapp.ui_components.generated.resources.arrow_left_24
+import kotlinconfapp.ui_components.generated.resources.main_header_back
+import org.jetbrains.compose.resources.stringResource
+import org.jetbrains.kotlinconf.ui.components.Divider
+import org.jetbrains.kotlinconf.ui.components.MainHeaderTitleBar
+import org.jetbrains.kotlinconf.ui.components.MarkdownView
+import org.jetbrains.kotlinconf.ui.components.StyledText
+import org.jetbrains.kotlinconf.ui.components.TopMenuButton
+import org.jetbrains.kotlinconf.ui.theme.KotlinConfTheme
+
+@Composable
+fun ScreenWithTitle(
+ title: String,
+ onBack: () -> Unit,
+ content: @Composable () -> Unit,
+) {
+ Column(Modifier.fillMaxSize()) {
+ MainHeaderTitleBar(
+ title = title,
+ startContent = {
+ TopMenuButton(
+ icon = Res.drawable.arrow_left_24,
+ contentDescription = stringResource(Res.string.main_header_back),
+ onClick = onBack,
+ )
+ }
+ )
+
+ Divider(thickness = 1.dp, color = KotlinConfTheme.colors.strokePale)
+
+ Column(
+ Modifier
+ .fillMaxSize()
+ .background(color = KotlinConfTheme.colors.mainBackground)
+ .padding(horizontal = 12.dp)
+ .verticalScroll(rememberScrollState())
+ ) {
+ content()
+ }
+ }
+}
+
+@Composable
+fun MarkdownScreenWithTitle(
+ title: String,
+ header: String,
+ subheader: String,
+ loadText: suspend () -> ByteArray,
+ onBack: () -> Unit,
+ endContent: @Composable () -> Unit = {},
+) {
+ ScreenWithTitle(title, onBack) {
+ if (header.isNotEmpty()) {
+ StyledText(header, style = KotlinConfTheme.typography.h1, modifier = Modifier.padding(vertical = 12.dp))
+ }
+
+ if (subheader.isNotEmpty()) {
+ StyledText(
+ subheader,
+ style = KotlinConfTheme.typography.text2,
+ color = KotlinConfTheme.colors.noteText,
+ )
+ }
+
+ MarkdownView(loadText, modifier = Modifier.padding(vertical = 12.dp))
+
+ endContent()
+ }
+}
diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation.kt
index 01b33c4e..691cc444 100644
--- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation.kt
+++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation.kt
@@ -32,6 +32,9 @@ data object StartNotificationsScreen
@Serializable
data object SettingsScreen
+@Serializable
+data object PrivacyPolicyForVisitorsScreen
+
@Serializable
data object TermsOfUseScreen
diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/PrivacyPolicyForVisitors.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/PrivacyPolicyForVisitors.kt
new file mode 100644
index 00000000..95510220
--- /dev/null
+++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/PrivacyPolicyForVisitors.kt
@@ -0,0 +1,22 @@
+package org.jetbrains.kotlinconf.screens
+
+import androidx.compose.runtime.Composable
+import kotlinconfapp.shared.generated.resources.Res
+import kotlinconfapp.shared.generated.resources.privacy_policy_for_visitors
+import kotlinconfapp.shared.generated.resources.privacy_policy_for_visitors_title
+import kotlinconfapp.shared.generated.resources.privacy_policy_for_visitors_version
+import org.jetbrains.compose.resources.ExperimentalResourceApi
+import org.jetbrains.compose.resources.stringResource
+import org.jetbrains.kotlinconf.MarkdownScreenWithTitle
+
+@OptIn(ExperimentalResourceApi::class)
+@Composable
+fun PrivacyPolicyForVisitors(onBack: () -> Unit) {
+ MarkdownScreenWithTitle(
+ title = stringResource(Res.string.privacy_policy_for_visitors),
+ header = stringResource(Res.string.privacy_policy_for_visitors_title),
+ subheader = stringResource(Res.string.privacy_policy_for_visitors_version),
+ loadText = { Res.readBytes("files/visitors-privacy-policy.md") },
+ onBack = onBack
+ )
+}
diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/StartScreens.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/StartScreens.kt
index 65094d1a..0d224a84 100644
--- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/StartScreens.kt
+++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/StartScreens.kt
@@ -44,6 +44,7 @@ import kotlinconfapp.shared.generated.resources.privacy_policy_title
import kotlinconfapp.ui_components.generated.resources.Res
import kotlinconfapp.ui_components.generated.resources.arrow_left_24
import kotlinconfapp.ui_components.generated.resources.arrow_right_24
+import org.jetbrains.compose.resources.ExperimentalResourceApi
import org.jetbrains.compose.resources.stringResource
import org.jetbrains.compose.resources.vectorResource
import org.jetbrains.kotlinconf.ui.components.Action
@@ -51,6 +52,7 @@ import org.jetbrains.kotlinconf.ui.components.ActionSize
import org.jetbrains.kotlinconf.ui.components.Button
import org.jetbrains.kotlinconf.ui.components.Divider
import org.jetbrains.kotlinconf.ui.components.MainHeaderTitleBar
+import org.jetbrains.kotlinconf.ui.components.MarkdownView
import org.jetbrains.kotlinconf.ui.components.SettingsItem
import org.jetbrains.kotlinconf.ui.components.StyledText
import org.jetbrains.kotlinconf.ui.components.TopMenuButton
@@ -92,8 +94,13 @@ fun StartPrivacyPolicyScreen(
thickness = 1.dp,
color = KotlinConfTheme.colors.strokePale,
)
- // TODO add actual text of the privacy policy
- StyledText("Privacy policy text goes here")
+ MarkdownView(
+ loadText = {
+ @OptIn(ExperimentalResourceApi::class)
+ AppRes.readBytes("files/app-privacy-policy.md")
+ },
+ modifier = Modifier.padding(horizontal = 12.dp).verticalScroll(rememberScrollState())
+ )
Spacer(Modifier.weight(1f))
Divider(
thickness = 1.dp,
diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/TermsOfUse.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/TermsOfUse.kt
index df2fa407..163cd48f 100644
--- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/TermsOfUse.kt
+++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/TermsOfUse.kt
@@ -1,21 +1,24 @@
package org.jetbrains.kotlinconf.screens
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
import kotlinconfapp.shared.generated.resources.Res
-import kotlinconfapp.shared.generated.resources.arrow_left_24
-import org.jetbrains.compose.resources.painterResource
-import org.jetbrains.kotlinconf.LocalNavController
-import org.jetbrains.kotlinconf.ui.components.StyledText
+import kotlinconfapp.shared.generated.resources.general_terms
+import kotlinconfapp.shared.generated.resources.visitors_terms_title
+import kotlinconfapp.shared.generated.resources.visitors_terms_version
+import org.jetbrains.compose.resources.ExperimentalResourceApi
+import org.jetbrains.compose.resources.stringResource
+import org.jetbrains.kotlinconf.MarkdownScreenWithTitle
@Composable
-fun TermsOfUse() {
- val navController = LocalNavController.current
- Column {
- Image(painterResource(Res.drawable.arrow_left_24), "back", modifier = Modifier.clickable { navController.popBackStack() })
- StyledText("Terms of Use")
- }
-}
\ No newline at end of file
+fun TermsOfUse(onBack: () -> Unit) {
+ MarkdownScreenWithTitle(
+ title = stringResource(Res.string.general_terms),
+ header = stringResource(Res.string.visitors_terms_title),
+ subheader = stringResource(Res.string.visitors_terms_version),
+ loadText = {
+ @OptIn(ExperimentalResourceApi::class)
+ Res.readBytes("files/visitors-terms.md")
+ },
+ onBack = onBack
+ )
+}
diff --git a/ui-components/build.gradle.kts b/ui-components/build.gradle.kts
index 8d55a052..c2a060cd 100644
--- a/ui-components/build.gradle.kts
+++ b/ui-components/build.gradle.kts
@@ -35,6 +35,8 @@ kotlin {
implementation(libs.coil.compose)
implementation(libs.coil.network.ktor3)
+
+ implementation(libs.multiplatform.markdown.renderer)
}
jvmMain.dependencies {
implementation(libs.ktor.client.okhttp)
diff --git a/ui-components/src/commonMain/kotlin/org/jetbrains/kotlinconf/ui/components/MarkdownView.kt b/ui-components/src/commonMain/kotlin/org/jetbrains/kotlinconf/ui/components/MarkdownView.kt
new file mode 100644
index 00000000..3a0993c7
--- /dev/null
+++ b/ui-components/src/commonMain/kotlin/org/jetbrains/kotlinconf/ui/components/MarkdownView.kt
@@ -0,0 +1,57 @@
+package org.jetbrains.kotlinconf.ui.components
+
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import com.mikepenz.markdown.compose.Markdown
+import com.mikepenz.markdown.model.DefaultMarkdownColors
+import com.mikepenz.markdown.model.DefaultMarkdownTypography
+import org.jetbrains.kotlinconf.ui.theme.KotlinConfTheme
+
+@Composable
+fun MarkdownView(
+ loadText: suspend () -> ByteArray,
+ modifier: Modifier = Modifier,
+) {
+ var text by remember { mutableStateOf("") }
+ LaunchedEffect(loadText) {
+ text = loadText().decodeToString()
+ }
+
+ Markdown(
+ text, DefaultMarkdownColors(
+ text = KotlinConfTheme.colors.longText,
+ codeText = KotlinConfTheme.colors.secondaryText,
+ linkText = KotlinConfTheme.colors.primaryText,
+ codeBackground = KotlinConfTheme.colors.mainBackground,
+ inlineCodeText = KotlinConfTheme.colors.secondaryText,
+ inlineCodeBackground = KotlinConfTheme.colors.mainBackground,
+ dividerColor = KotlinConfTheme.colors.strokePale,
+ tableText = KotlinConfTheme.colors.longText,
+ tableBackground = KotlinConfTheme.colors.mainBackground,
+ ), typography = DefaultMarkdownTypography(
+ text = KotlinConfTheme.typography.text1,
+ code = KotlinConfTheme.typography.text1,
+ h1 = KotlinConfTheme.typography.h1,
+ h2 = KotlinConfTheme.typography.h2,
+ h3 = KotlinConfTheme.typography.h3,
+ h4 = KotlinConfTheme.typography.h4,
+ h5 = KotlinConfTheme.typography.h4,
+ h6 = KotlinConfTheme.typography.h4,
+ quote = KotlinConfTheme.typography.text2,
+ paragraph = KotlinConfTheme.typography.text1,
+ ordered = KotlinConfTheme.typography.text1,
+ bullet = KotlinConfTheme.typography.text1,
+ list = KotlinConfTheme.typography.text1,
+ link = KotlinConfTheme.typography.text1,
+ inlineCode = KotlinConfTheme.typography.text1,
+ ),
+ modifier = modifier
+ )
+}