diff --git a/pages-old/chat/index.md b/archive/pages-1/chat/index.md similarity index 100% rename from pages-old/chat/index.md rename to archive/pages-1/chat/index.md diff --git a/pages-old/chat/privacy-policy.md b/archive/pages-1/chat/privacy-policy.md similarity index 100% rename from pages-old/chat/privacy-policy.md rename to archive/pages-1/chat/privacy-policy.md diff --git a/pages-old/contribute/code-of-conduct.md b/archive/pages-1/contribute/code-of-conduct.md similarity index 100% rename from pages-old/contribute/code-of-conduct.md rename to archive/pages-1/contribute/code-of-conduct.md diff --git a/pages-old/contribute/index.md b/archive/pages-1/contribute/index.md similarity index 100% rename from pages-old/contribute/index.md rename to archive/pages-1/contribute/index.md diff --git a/pages-old/defcon-2023/index.md b/archive/pages-1/defcon-2023/index.md similarity index 100% rename from pages-old/defcon-2023/index.md rename to archive/pages-1/defcon-2023/index.md diff --git a/pages-old/defcon-2023/lab.md b/archive/pages-1/defcon-2023/lab.md similarity index 100% rename from pages-old/defcon-2023/lab.md rename to archive/pages-1/defcon-2023/lab.md diff --git a/pages-old/defcon-2023/party.md b/archive/pages-1/defcon-2023/party.md similarity index 100% rename from pages-old/defcon-2023/party.md rename to archive/pages-1/defcon-2023/party.md diff --git a/pages-old/defcon-2023/talk.md b/archive/pages-1/defcon-2023/talk.md similarity index 100% rename from pages-old/defcon-2023/talk.md rename to archive/pages-1/defcon-2023/talk.md diff --git a/pages-old/docs/accessibility.md b/archive/pages-1/docs/accessibility.md similarity index 100% rename from pages-old/docs/accessibility.md rename to archive/pages-1/docs/accessibility.md diff --git a/pages-old/docs/cryptography.md b/archive/pages-1/docs/cryptography.md similarity index 100% rename from pages-old/docs/cryptography.md rename to archive/pages-1/docs/cryptography.md diff --git a/pages-old/docs/index.md b/archive/pages-1/docs/index.md similarity index 100% rename from pages-old/docs/index.md rename to archive/pages-1/docs/index.md diff --git a/pages-old/docs/networking.md b/archive/pages-1/docs/networking.md similarity index 100% rename from pages-old/docs/networking.md rename to archive/pages-1/docs/networking.md diff --git a/pages-old/docs/overview.md b/archive/pages-1/docs/overview.md similarity index 100% rename from pages-old/docs/overview.md rename to archive/pages-1/docs/overview.md diff --git a/pages-old/docs/private-routing.md b/archive/pages-1/docs/private-routing.md similarity index 100% rename from pages-old/docs/private-routing.md rename to archive/pages-1/docs/private-routing.md diff --git a/pages-old/docs/rpc.md b/archive/pages-1/docs/rpc.md similarity index 100% rename from pages-old/docs/rpc.md rename to archive/pages-1/docs/rpc.md diff --git a/pages-old/donate.md b/archive/pages-1/donate.md similarity index 100% rename from pages-old/donate.md rename to archive/pages-1/donate.md diff --git a/pages-old/download.de.md b/archive/pages-1/download.de.md similarity index 100% rename from pages-old/download.de.md rename to archive/pages-1/download.de.md diff --git a/pages-old/download.md b/archive/pages-1/download.md similarity index 100% rename from pages-old/download.md rename to archive/pages-1/download.md diff --git a/pages-old/index.de.md b/archive/pages-1/index.de.md similarity index 100% rename from pages-old/index.de.md rename to archive/pages-1/index.de.md diff --git a/pages-old/index.md b/archive/pages-1/index.md similarity index 100% rename from pages-old/index.md rename to archive/pages-1/index.md diff --git a/pages-old/translations.md b/archive/pages-1/translations.md similarity index 100% rename from pages-old/translations.md rename to archive/pages-1/translations.md diff --git a/pages-old/web-text.md b/archive/pages-1/web-text.md similarity index 100% rename from pages-old/web-text.md rename to archive/pages-1/web-text.md diff --git a/pages/about-us/FAQ.md b/archive/pages-2/about-us/FAQ.md similarity index 100% rename from pages/about-us/FAQ.md rename to archive/pages-2/about-us/FAQ.md diff --git a/pages/about-us/community.md b/archive/pages-2/about-us/community.md similarity index 100% rename from pages/about-us/community.md rename to archive/pages-2/about-us/community.md diff --git a/pages/about-us/contact-us.md b/archive/pages-2/about-us/contact-us.md similarity index 100% rename from pages/about-us/contact-us.md rename to archive/pages-2/about-us/contact-us.md diff --git a/pages/about-us/index.md b/archive/pages-2/about-us/index.md similarity index 100% rename from pages/about-us/index.md rename to archive/pages-2/about-us/index.md diff --git a/pages/about-us/press.md b/archive/pages-2/about-us/press.md similarity index 100% rename from pages/about-us/press.md rename to archive/pages-2/about-us/press.md diff --git a/pages/about-veilid/accessibility.md b/archive/pages-2/about-veilid/accessibility.md similarity index 100% rename from pages/about-veilid/accessibility.md rename to archive/pages-2/about-veilid/accessibility.md diff --git a/pages/about-veilid/cryptography.md b/archive/pages-2/about-veilid/cryptography.md similarity index 100% rename from pages/about-veilid/cryptography.md rename to archive/pages-2/about-veilid/cryptography.md diff --git a/pages/about-veilid/index.md b/archive/pages-2/about-veilid/index.md similarity index 100% rename from pages/about-veilid/index.md rename to archive/pages-2/about-veilid/index.md diff --git a/pages/about-veilid/networking.md b/archive/pages-2/about-veilid/networking.md similarity index 100% rename from pages/about-veilid/networking.md rename to archive/pages-2/about-veilid/networking.md diff --git a/pages/about-veilid/overview.md b/archive/pages-2/about-veilid/overview.md similarity index 100% rename from pages/about-veilid/overview.md rename to archive/pages-2/about-veilid/overview.md diff --git a/pages/about-veilid/private-routing.md b/archive/pages-2/about-veilid/private-routing.md similarity index 100% rename from pages/about-veilid/private-routing.md rename to archive/pages-2/about-veilid/private-routing.md diff --git a/pages/about-veilid/rpc.md b/archive/pages-2/about-veilid/rpc.md similarity index 100% rename from pages/about-veilid/rpc.md rename to archive/pages-2/about-veilid/rpc.md diff --git a/pages/about-veilid/what-is-veilid.md b/archive/pages-2/about-veilid/what-is-veilid.md similarity index 100% rename from pages/about-veilid/what-is-veilid.md rename to archive/pages-2/about-veilid/what-is-veilid.md diff --git a/pages/blog/index.md b/archive/pages-2/blog/index.md similarity index 100% rename from pages/blog/index.md rename to archive/pages-2/blog/index.md diff --git a/pages/blog/privacy-respecting-network-metrics.md b/archive/pages-2/blog/privacy-respecting-network-metrics.md similarity index 100% rename from pages/blog/privacy-respecting-network-metrics.md rename to archive/pages-2/blog/privacy-respecting-network-metrics.md diff --git a/pages/blog/year-in-review-2024.md b/archive/pages-2/blog/year-in-review-2024.md similarity index 100% rename from pages/blog/year-in-review-2024.md rename to archive/pages-2/blog/year-in-review-2024.md diff --git a/archive/pages-2/chat/beta.md b/archive/pages-2/chat/beta.md new file mode 100644 index 0000000..7c64488 --- /dev/null +++ b/archive/pages-2/chat/beta.md @@ -0,0 +1,23 @@ +--- +title: Beta Testing +description: Help us fix VeilidChat +weight: 2 +layout: subpage +--- + + +### Interactive Support + +Join the VeilidChat channel on our [Discord](https://veilid.com/discord) + +### Join beta and install on iOS + +1. Download TestFlight from the Apple AppStore +2. From your iOS device click on [this link](https://testflight.apple.com/join/0tYeed0k) to join the beta +3. Open TestFlight and install VeilidChat +4. Open VeilidChat, acknowledge the beta notification, and follow the prompts to setup your identity + +### Join beta and install on Android + +1. From your Android device click on [this link](https://play.google.com/store/apps/details?id=com.veilid.veilidchat) to join the beta +2. Open VeilidChat, acknowledge the beta notification, and follow the prompts to setup your identity \ No newline at end of file diff --git a/archive/pages-2/chat/index.md b/archive/pages-2/chat/index.md new file mode 100644 index 0000000..7b398f1 --- /dev/null +++ b/archive/pages-2/chat/index.md @@ -0,0 +1,20 @@ +--- +title: VeilidChat +description: VeilidChat is a proof of concept of the Veilid protocol and framework. +--- + +VeilidChat is a demo of the Veilid framework and protocol working. + +We built it using the [Flutter](https://flutter.dev/) framework and the Veilid core code. + +If you want to try out this proof of concept, please stay tuned for details on how to gain access. + +### Source Code + +VeilidChat is under active development. The source code is available on [Gitlab](https://gitlab.com/veilid/veilidchat), though there are no official builds yet. + + +### Support + +

For app support, please email support@veilid.com

+ diff --git a/archive/pages-2/chat/knownissues.md b/archive/pages-2/chat/knownissues.md new file mode 100644 index 0000000..5fa2631 --- /dev/null +++ b/archive/pages-2/chat/knownissues.md @@ -0,0 +1,16 @@ +--- +title: Known Issues +description: Known issues with the VeilidChat Beta +weight: 3 +layout: subpage +--- + + +* Notifications are not enabled yet. You have to open the app and check for new messages. +* You will experience lag, invitations that don't complete, invitations that complete more than once, slow message sending, message loss, repeated messages, and other oddities. + * Possible Solution: Delete the chat and restart it. Not the contact, just the chat. Swipe it to the left and tap Delete. +* Some features in the UI do not function yet, specifically auto-away presence detection, and notifications bubbles for new messages. +* Report any and all VeilidChat bugs on our bug tracker! https://gitlab.com/veilid/veilidchat/-/issues +Check for duplicates and +1 them rather than making a new issue! +* Things are more problematic on cellular networks right now, better on wifi, but the above issues exist on most network types. +* For live support, please join our [Discord community](/discord) \ No newline at end of file diff --git a/archive/pages-2/chat/privacy-policy.md b/archive/pages-2/chat/privacy-policy.md new file mode 100644 index 0000000..3f0f8df --- /dev/null +++ b/archive/pages-2/chat/privacy-policy.md @@ -0,0 +1,188 @@ +--- +title: Privacy Policy +description: The privacy policy for VeilidChat +weight: 4 +layout: subpage +--- + +### VeilidChat Privacy Policy + +Last Revised 2023 Aug 3 + +This privacy notice for the Veilid Foundation ("Veilid," "we," "us," or "our"), describes how and why we might collect, store, use, and/or share ("process") your information when you use our services ("Services"), such as when you: + +- Download and use our mobile application (VeilidChat), or any other application of ours that links to this privacy notice in the future. + +Reading this privacy notice will help you understand your privacy rights and choices. If you do not agree with our policies and practices, please do not use VeilidChat. If you still have any questions or concerns, please contact us at [support@veilid.com](mailto:support@veilid.com). + +

Summary of Key Points

+ +- VeilidChat is a messaging application built on a decentralized, distributed, and end-to-end fully encrypted framework. +- VeilidChat is a proof-of-concept application in beta-testing and you must receive an invitation to activate the application. +- VeilidChat will never ask you for contact information, personal information, or financial information. +- When you register and use VeilidChat, any information entered into the app is either stored locally on your device, or encrypted and distributed in a method that is inaccessible and irretrievable by the Veilid Foundation (the creators of the application). +- We do not collect or process any personal information, nor do we have the capability to collect or process any personal information from VeilidChat. +- We do not collect or process sensitive personal information, nor do we have the capability to collect or process any sensitive information from VeilidChat. +- We do not receive or transmit any information to or from third parties. +- The Veilid Framework processes encrypted and distributed information to provide and administer services for VeilidChat. +- We do not share personal information. Because of the encrypted and distributed nature of information entered into the VeilidChat app, we are unable to access your personal information. +- How do we keep your information safe? We have organizational and technical processes and procedures in place to protect your personal information. However, no electronic transmission over the internet or information storage technology can be guaranteed to be 100% secure, so we cannot promise or guarantee that unauthorized third parties will not be able to defeat our security and improperly collect, access, steal, or modify your information. +- VeilidChat will provide you with a recovery pass-phrase to use in the event that your app is deleted or your device is no longer available/functional for you. If you cannot access this pass-phrase, you will have to create a new account. The Veilid Foundation is unable to restore your account through any means. +- How do you exercise your rights? The easiest way to exercise your rights is to delete VeilidChat. The Veilid Foundation is a non-profit organization that does not collect, process, or use any of your information. You may contact us by visiting https://veilid.com/contact, or by emailing [support@veilid.com](mailto:support@veilid.com). We will consider and act upon any request in accordance with applicable data protection laws. + +

Table of Contents

+ +1. [What Information Do We Collect?](#section-1) +1. [How Do We Process Your Information?](#section-2) +1. [What Legal Bases Do We Rely On To Process Your Personal Information?](#section-3) +1. [When And With Whom Do We Share Your Personal Information?](#section-4) +1. [How Long Do We Keep Your Information?](#section-5) +1. [How Do We Keep Your Information Safe?](#section-6) +1. [Do We Collect Information From Minors?](#section-7) +1. [What Are Your Privacy Rights?](#section-8) +1. [Controls For Do-not-track Features](#section-9) +1. [US State-specific Privacy Rights](#section-10) +1. [Do We Make Updates To This Notice?](#section-11) +1. [How Can You Contact Us About This Notice?](#section-12) +1. [How Can You Review, Update, Or Delete The Data We Collect From You?](#section-13) +1. [Cookie And Data Analytics Disclosures](#section-14) + +

1. What information do we collect?

+ +VeilidChat collects no information from you. VeilidChat is designed to not collect your information and to operate in an encrypted, distributed manner, which means we cannot access your information even if we wanted to (which we don’t). Any information you enter into VeilidChat on your device is inaccessible to us. + +The Veilid Foundation only collects personal information that you voluntarily provide to us when you request an invitation to the beta version of the application. This will only be the contact information necessary for us to send you an invitation. This process is managed by the Apple App Store and the Veilid Foundation only retains this information long enough to provide it to the Apple App Store to generate an invitation. + +

2. How do we process your information?

+ +We don’t. VeilidChat does not collect your information, nor are we able to collect it. Administration of, improvements to, and changes to the VeilidChat application will be made without any processing of personal information. The Veilid Foundation will never ask you for personal, sensitive, or financial information. + +If you provide any information to us at [support@veilid.com](mailto:support@veilid.com), though our Discord server, through our website at https://veilid.com/contact, or directly via postal mail to our foundation, we will only process that information to answer your questions or attempt to support your issues, with two major exceptions: + +- Legal Obligations. We may process information sent to us via email, our website, or via postal mail where we believe it is necessary for compliance with our legal obligations, such as to cooperate with a law enforcement body or regulatory agency, exercise or defend our legal rights, or disclose your information as evidence in litigation in which we are involved. +- Vital Interests. We may process information sent to us via email, our website, or via postal mail where we believe it is necessary to protect your vital interests or the vital interests of a third party, such as situations involving potential threats to the safety of any person. + +

3. What legal bases do we rely on to process your information?

+ +VeilidChat does not process any personal information. Because the Veilid Foundation cannot access information entered into VeilidChat in any way, shape, or form, the Veilid Foundation does not process your information. + +As for information sent to the Veilid Foundation via email, Discord server, postal mail, or through our website, we only process your personal information when we believe it is necessary and we have a valid legal reason (i.e.,legal obligations) to do so under applicable law, to comply with laws, to protect your rights, or to fulfill our legitimate business interests. + +If you are located in the EU or UK, this section applies to you. + +The General Data Protection Regulation (GDPR) and UK GDPR require us to explain the valid legal bases we rely on in order to process your personal information. VeilidChat does not collect or process personal information. For any information that is sent directly to the Veilid Foundation, we may rely on the following legal bases to process your personal information: + +- Consent. The Veilid Foundation may process your information if you have given us specific permission (i.e. consent) to use your personal information for a specific purpose. This is generally limited to contacting us and requesting an invite code to the beta version of the application, however, the Veilid Foundation does not store this information. Apple, through the App Store, will manage the invitation process. Your contact information cannot be linked to your VeilidChat account by the Veilid Foundation. You can withdraw your consent to Apple at any time. +- Legal Obligations. We may process your information where we believe it is necessary for compliance with our legal obligations, such as to cooperate with a law enforcement body or regulatory agency, exercise or defend our legal rights, or disclose your information as evidence in litigation in which we are involved. +- Vital Interests. We may process your information where we believe it is necessary to protect your vital interests or the vital interests of a third party, such as situations involving potential threats to the safety of any person. + +If you are located in Canada, this section applies to you. + +VeilidChat does not collect or process personal information. For any information that is sent directly to the Veilid Foundation, we may rely on the following legal bases to process your personal information: + +We may process your information if you have given us specific permission (i.e., express consent) to use your personal information for a specific purpose, or in situations where your permission can be inferred (i.e., implied consent). This is generally limited to contacting us and requesting an invite code to the beta version of the application. Apple, through the App Store, will manage the invitation process. Your contact information cannot be linked to your VeilidChat account by the Veilid Foundation. You can withdraw your consent to Apple at any time. + +- In some exceptional cases, we may be legally permitted under applicable law to process your information without your consent, including, for example: +- If collection is clearly in the interests of an individual and consent cannot be obtained in a timely way +- For investigations and fraud detection and prevention +- If it is contained in a witness statement and the collection is necessary to assess, process, or settle an insurance claim +- For identifying injured, ill, or deceased persons and communicating with next of kin +- If we have reasonable grounds to believe an individual has been, is, or may be victim of financial abuse +- If it is reasonable to expect collection and use with consent would compromise the availability or the accuracy of the information and the collection is reasonable for purposes related to investigating a breach of an agreement or a contravention of the laws of Canada or a province +- If disclosure is required to comply with a subpoena, warrant, court order, or rules of the court relating to the production of records +- If it was produced by an individual in the course of their employment, business, or profession and the collection is consistent with the purposes for which the information was produced +- If the collection is solely for journalistic, artistic, or literary purposes +- If the information is publicly available and is specified by the regulations + + +

4. When and with whom do we share your personal information?

+ +In no way, shape, or form do we ever share your personal information. We cannot share what we do not retain, or what we cannot access. + +- Business Transfers. In the event of any merger, sale, or acquisition of any portion of the Veilid Foundation, the Veilid Foundation will provide updates on our website or through application updates for the VeilidChat application through the App Store. Because the Velid Foundation does not collect any personal information, we have no other methods to provide this information to you. + +

5. How long do we keep your information?

+ +We keep your information for as long as necessary to fulfill the purposes outlined in this privacy notice unless otherwise required by law. However, in most cases, we are incapable of retaining information because we do not collect it. + +The Veilid Foundation will only keep your personal information for as long as it is necessary for the purposes set out in this privacy notice, unless a longer retention period is required by law. VeilidChat will retain a local copy of your information (accessible only to your device and the people you directly share information with) for as long as you utilize the application. In future iterations of the application, there will be a “delete messages after a certain period of time” functionality, but for the beta testing proof-of-concept, this functionality has not been introduced. + +

6. How do we keep your information safe?

+ +We have implemented appropriate and reasonable technical and organizational security measures designed to protect the security of any personal information we process. However, despite our safeguards and efforts to secure your information, no electronic transmission over the Internet or information storage technology can be guaranteed to be 100% secure, so we cannot promise or guarantee that any unauthorized third parties will not be able to defeat our security and improperly collect, access, steal, or modify your information. + +Although we will do our best to protect your personal information, transmission of personal information to and from Velid Chat is at your own risk. You should only access VeilidChat within a secure environment. If you lose access to your device, the Velid Foundation cannot access or delete information stored there. + + +

7. Do we collect information from minors?

+ +We do not collect information from or market to anyone. If you suspect that someone underage is violating the Apple App Store terms of service by downloading VeilidChat, please contact Apple at Support.Apple.com. + +

8. What are your privacy rights?

+ +In some regions (like the EEA, UK, and Canada), you have certain rights under applicable data protection laws. These may include the right (i) to request access and obtain a copy of your personal information, (ii) to request rectification or erasure; (iii) to restrict the processing of your personal information; and (iv) if applicable, to data portability. In certain circumstances, you may also have the right to object to the processing of your personal information. + +However, due to the unique nature of VeilidChat, the only information available is stored locally on the user’s device and is inaccessible by the Veilid Foundation. VeilidChat does not collect or process any personal information. If a user wishes to exercise their data rights, they may copy any data within the VeilidChat application and export it themselves, or delete the application from their device. The Veilid Foundation has no access to any user’s data. + +We will consider and act upon any request in accordance with applicable data protection laws. + +If you are located in the EEA or UK and you believe we are unlawfully processing your personal information, you also have the right to complain to your Member State data protection authority or UK data protection authority. + +If you are located in Switzerland, you may contact the Federal Data Protection and Information Commissioner. + +##### Account Information + +If you would at any time like to review or change the information in your account or terminate your account, you can: + +- Log in to your account settings and update your user account. +- Delete the application from your device. + +Upon your decision to delete the application from your device, it will no longer be able to be accessed by anyone, including the creators of the application. Any data still in existence will be encrypted, distributed, and inaccessible by any party. + +However, we may retain some information that is sent directly to the Veilid Foundation via email, our website, our Discord server, or via post mail in our files to prevent fraud, troubleshoot problems, assist with any investigations, enforce our legal terms and/or comply with applicable legal requirements. + +If you have questions or comments about your privacy rights, you may email us at [support@veilid.com](mailto:support@veilid.com). + + +

9. Controls for Do-Not-track Features

+ +Most web browsers and some mobile operating systems and mobile applications include a Do-Not-Track ("DNT") feature or setting you can activate to signal your privacy preference not to have data about your online browsing activities monitored and collected. VeilidChat is compliant with this technology because we do not monitor, track, collect, or process any information. + + +

10. US State-Specific Privacy Rights

+ +- California (knows how to party): + - We do not sell, rent, or share information with anyone, including third parties who engage in direct marketing activities. We do not collect or share your information with anyone, for any reason. No marketing, no third party sharing, nothing. + - VeilidChat has no ability to post public information. If you are under 18 years of age, reside in California, and have a registered account with VeilidChat, you can delete the application on your device and that will serve to exercise your rights to deletion. + - Please note that the Veilid Foundation and the VeilidChat application HAVE NOT collected, rented, shared, or sold any personal information from any individual, and especially not within the past 12 months. +- De-identified Data Disclosure (CA, CO, CT, UT, VA and soon to be more) + - We may use de-identified data in certain circumstances. In those circumstances, not only do we never attempt to re-identify that data, but we are completely unable to re-identify any data because of our encryption and distributed data frameworks. +- Profiling Disclosure (Hi Colorado!) + - We do not engage in profiling of consumers in any way, shape, or form. We especially don’t do it in a way that supports automated decisions that might have a legal or significant effect on anyone. + + +

11. Do we make updates to this notice?

+ +We will update this notice as necessary to stay compliant with relevant laws and as it relates to new features or products available. + +The updated version will be indicated by an updated "Revised" date and the updated version will be effective as soon as it is accessible. If we make material changes to this privacy notice, we may notify you either by prominently posting a notice of such changes on the Veilid Foundation’s website, or by providing an updated policy through the Apple App Store as part of any version updates. Because we do not collect your information, we are unable to directly contact you. We encourage you to review this privacy notice frequently to be informed of how we are protecting your information. + +

12. How can you contact us about this notice?

+ +If you have questions or comments about this notice, you may email us at [support@veilid.com](mailto:support@veilid.com) or contact us by post at: + +
+Veilid Foundation
+P.O. Box 1917
+Leesburg, VA 20177
+
+ + +

13. How can you review, update, or delete the data we collect from you?

+ +The only effective method to review, update, or delete any of your data is locally on the VeilidChat application on your device. The Veilid Foundation is unable to collect or access your information through the VeilidChat application and thus does not have the ability to review, update, or delete information that we do not possess. + + +

14. Cookie and Data Analytics Disclosure

+ +We don’t use cookies. We don’t use data analytics. You can check on our website. diff --git a/archive/pages-2/contribute/code-of-conduct.md b/archive/pages-2/contribute/code-of-conduct.md new file mode 100644 index 0000000..2a64ec1 --- /dev/null +++ b/archive/pages-2/contribute/code-of-conduct.md @@ -0,0 +1,142 @@ +--- +title: Code of Conduct +description: Veilid community and developer code of conduct +weight: 3 +layout: subpage +--- + +Our code of conduct on the Contributor Covenant Code of Conduct and will be updated as needed. + +Questions, comments, or concerns about the code of conduct may be sent to +security@veilid.org. + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at [security@veilid.org](mailto:security@veilid.org). +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations + diff --git a/pages/contribute/getting-started.md b/archive/pages-2/contribute/getting-started.md similarity index 100% rename from pages/contribute/getting-started.md rename to archive/pages-2/contribute/getting-started.md diff --git a/archive/pages-2/contribute/index.md b/archive/pages-2/contribute/index.md new file mode 100644 index 0000000..86ae007 --- /dev/null +++ b/archive/pages-2/contribute/index.md @@ -0,0 +1,49 @@ +--- +title: Contribute +description: Learn about all the ways you can help Veilid +menu: + main: + weight: 50 +weight: 1 +layout: subpage +--- + +### How You Can Help + + + +### Get Started + +Please read our Code of Conduct and then join us on our discord. + +Veilid Discord diff --git a/archive/pages-2/donate.md b/archive/pages-2/donate.md new file mode 100644 index 0000000..5859f9c --- /dev/null +++ b/archive/pages-2/donate.md @@ -0,0 +1,47 @@ +--- +title: Donate +description: Help support Veilid by gifting a tax-deductible donation +menu: + main: + weight: 99 +layout: index +--- + +
+
+

+ Veilid Foundation was formed to develop, distribute, and maintain a privacy focused + communication platform and protocol for the purposes of defending human and civil rights. +

+

+ Supporting us in this mission helps ensure the Veilid framework gets the support and defense + it needs to protect your privacy. +

+

+ You have a very real chance at private, secure, and accessible communication tools. +

+

+ You can escape the data economy and help others do the same. You don't have to be the product. +

+
+
+
+

+ Veilid Foundation Inc is a registered 501c3 non-profit organization; your donations are tax-deductible. +

+
+

You can learn more at Veilid.org

+
+
+
+

+ Clicking one of these links will open a new window or tab. +

+

+

+ Donate via Stripe + Donate via PayPal +
+

+
+ diff --git a/pages/events/index.md b/archive/pages-2/events/index.md similarity index 100% rename from pages/events/index.md rename to archive/pages-2/events/index.md diff --git a/archive/pages-2/index.md b/archive/pages-2/index.md new file mode 100644 index 0000000..51cff3a --- /dev/null +++ b/archive/pages-2/index.md @@ -0,0 +1,34 @@ +--- +title: What is Veilid? +description: Veilid is an open-source, distributed application framework. +menu: + main: + weight: 1 +layout: index +--- + + + + + +
+
+ + VeilidChat App Logo + +
+
+

Ways to Help

+

There a so many ways to join the community and help out:

+ +
+
+ diff --git a/pages/translations.md b/archive/pages-2/translations.md similarity index 100% rename from pages/translations.md rename to archive/pages-2/translations.md diff --git a/pages/web-text.md b/archive/pages-2/web-text.md similarity index 100% rename from pages/web-text.md rename to archive/pages-2/web-text.md diff --git a/cecil.yml b/cecil.yml index 7edb10d..5b9b711 100644 --- a/cecil.yml +++ b/cecil.yml @@ -14,7 +14,7 @@ compile: style: compressed sourcemap: true theme: - - veilid + - veilid2025 social: twitter: "veilidnetwork" fediverse: "@VeilidNetwork@hackers.town" @@ -23,8 +23,6 @@ pages: images: # how to handle images class: 'img-fluid my-2' # put default class to each image (empty by default) virtual: - - path: contact - redirect: /about-us/contact-us/ - path: discord redirect: https://discord.gg/5Qx3B9eedU - path: code @@ -35,8 +33,6 @@ pages: redirect: https://buy.stripe.com/6oE9ACboP5r3ag86oo - path: paypal redirect: https://www.paypal.com/donate/?hosted_button_id=T9NHCFDCE7Q4S - - path: launch - redirect: /defcon/ pagination: max: 12 cache: diff --git a/pages/chat/beta.md b/pages/chat/beta.md index 7c64488..0b389fd 100644 --- a/pages/chat/beta.md +++ b/pages/chat/beta.md @@ -1,6 +1,7 @@ --- title: Beta Testing description: Help us fix VeilidChat +section: Chat weight: 2 layout: subpage --- diff --git a/pages/chat/index.md b/pages/chat/index.md index fa136ee..c2345d2 100644 --- a/pages/chat/index.md +++ b/pages/chat/index.md @@ -1,11 +1,7 @@ --- title: VeilidChat description: VeilidChat is a proof of concept of the Veilid protocol and framework. -menu: - main: - weight: 40 -weight: 1 -layout: subpage +section: "" --- VeilidChat is a demo of the Veilid framework and protocol working. diff --git a/pages/chat/knownissues.md b/pages/chat/knownissues.md index 5fa2631..fc832fc 100644 --- a/pages/chat/knownissues.md +++ b/pages/chat/knownissues.md @@ -1,6 +1,7 @@ --- title: Known Issues description: Known issues with the VeilidChat Beta +section: Chat weight: 3 layout: subpage --- diff --git a/pages/chat/privacy-policy.md b/pages/chat/privacy-policy.md index 3f0f8df..d22f0c2 100644 --- a/pages/chat/privacy-policy.md +++ b/pages/chat/privacy-policy.md @@ -1,6 +1,7 @@ --- title: Privacy Policy description: The privacy policy for VeilidChat +section: Chat weight: 4 layout: subpage --- diff --git a/pages/community.md b/pages/community.md new file mode 100644 index 0000000..3d1d28a --- /dev/null +++ b/pages/community.md @@ -0,0 +1,22 @@ +--- +title: Community +description: Learn about how you can join the Veilid community +menu: + main: + weight: 70 +--- + +We want to build a community people who want a better way to connect and communicate. + +We want to bring together folks to help build great applications using the Veilid framework. + +Join Us on Discord + + +### Why Discord? + +We're doing what we can with what we have. Since we're not trying to become a tech circlejerk, we have to meet people on their level. So come on in and help us build something better! + +### Code of Conduct + +Please take a moment to review our [Code of Conduct](/code-of-conduct) \ No newline at end of file diff --git a/pages/contact-us.md b/pages/contact-us.md new file mode 100644 index 0000000..f4536ed --- /dev/null +++ b/pages/contact-us.md @@ -0,0 +1,18 @@ +--- +title: Contact Us +description: How to contact the Veilid project +menu: + main: + weight: 94 +--- + +

For app support, please email support@veilid.com

+ +

Social Media Accounts

+ + diff --git a/pages/contribute/code-of-conduct.md b/pages/contribute/code-of-conduct.md index 2a64ec1..1ef4641 100644 --- a/pages/contribute/code-of-conduct.md +++ b/pages/contribute/code-of-conduct.md @@ -1,8 +1,8 @@ --- title: Code of Conduct description: Veilid community and developer code of conduct +section: "Contribute" weight: 3 -layout: subpage --- Our code of conduct on the Contributor Covenant Code of Conduct and will be updated as needed. diff --git a/pages/contribute/index.md b/pages/contribute/index.md index 86ae007..9e27f1d 100644 --- a/pages/contribute/index.md +++ b/pages/contribute/index.md @@ -1,49 +1,32 @@ --- title: Contribute -description: Learn about all the ways you can help Veilid +description: How you can help with the project +section: "" menu: main: - weight: 50 -weight: 1 -layout: subpage + weight: 80 --- -### How You Can Help +### Documentation - +We need people to help us write documentation for what is built so far. -### Get Started +### Translation -Please read our Code of Conduct and then join us on our discord. +Volunteers can also help Veilid Framework and developers by providing translations for UI elements. -Veilid Discord +Let's go global! + +### Accessibility + +Please help test and improve accessibility of Veilid.com, VeilidChat, or other developer's applications. + +Let's make it easy for anyone to use Veilid Framework or applications built with Veilid Framework. + +### Code + +Finally, we of course need help with coding. + +### Money + +Learn how you can [donate](/donate) diff --git a/pages/contribute/repositories.md b/pages/contribute/repositories.md new file mode 100644 index 0000000..3158dd8 --- /dev/null +++ b/pages/contribute/repositories.md @@ -0,0 +1,29 @@ +--- +title: Code Repositories +description: The code base for the different parts and tools of Veilid Framework +section: "Contribute" +weight: 2 +--- + +### Running a Node + +To install the Veilid node software, please follow the instructions available in the [repository](https://gitlab.com/veilid/veilid/-/blob/main/INSTALL.md). + +### Starting Development + +Please recursively check out the project using this command + +`git clone git@gitlab.com:veilid/veilid.git` + +Then read the [development](https://gitlab.com/veilid/veilid/-/blob/main/DEVELOPMENT.md) guide to get started. + +There is also a [Veilid Book](https://veilid.gitlab.io/developer-book/). + +### About the Code Repo + +The main repository is located at https://gitlab.com/veilid/veilid and includes several components +- `veilid-core` - the main Veilid crate: https://crates.io/crates/veilid-core +- `veilid-tools` - misc functions for veilid and friends: https://crates.io/crates/veilid-tools +- `veilid-wasm` - Veilid bindings for webassembly: https://crates.io/crates/veilid-wasm +- `veilid-flutter` - Veilid bindings for Flutter/Dart. Comes with an example program: https://crates.io/crates/veilid-flutter +- Also `veilid-server` and `veilid-cli` source are also in this repo for building headless nodes diff --git a/pages/donate.md b/pages/donate.md index 5859f9c..0bff176 100644 --- a/pages/donate.md +++ b/pages/donate.md @@ -1,10 +1,6 @@ --- title: Donate description: Help support Veilid by gifting a tax-deductible donation -menu: - main: - weight: 99 -layout: index ---
diff --git a/pages/events.md b/pages/events.md new file mode 100644 index 0000000..bbeb47f --- /dev/null +++ b/pages/events.md @@ -0,0 +1,11 @@ +--- +title: Events +description: Events where you can meet-up with the Veilid Framework team +menu: + main: + weight: 60 +--- + + +- Def Con 33 (probably) +- HOPE_16 (probably) \ No newline at end of file diff --git a/pages/faq.md b/pages/faq.md new file mode 100644 index 0000000..f6e3b67 --- /dev/null +++ b/pages/faq.md @@ -0,0 +1,63 @@ +--- +title: F.A.Q. +description: Frequently asked questions about Veilid +menu: + main: + weight: 50 +--- + + + +
 
+ + +
+ Have a question? Email press@veilid.org +
+ diff --git a/pages/how-it-works/deep-dive.md b/pages/how-it-works/deep-dive.md new file mode 100644 index 0000000..c87611b --- /dev/null +++ b/pages/how-it-works/deep-dive.md @@ -0,0 +1,13 @@ +--- +title: Veilid Deep-Dive +description: An in-depth, technical overview of Veilid Framework +section: "Deep Dive" +weight: 30 +--- + + + +title: An Overview How Veilid Works + + +description: A high-level, non-technical overview of how Veilid works \ No newline at end of file diff --git a/pages/how-it-works/index.md b/pages/how-it-works/index.md new file mode 100644 index 0000000..f3c5464 --- /dev/null +++ b/pages/how-it-works/index.md @@ -0,0 +1,15 @@ +--- +title: How It Works +description: A high-level, non-technical overview of how Veilid works +section: "" +menu: + main: + weight: 20 +--- + + + +title: An Overview How Veilid Works + + +description: A high-level, non-technical overview of how Veilid works \ No newline at end of file diff --git a/pages/index.md b/pages/index.md index 51cff3a..06296d4 100644 --- a/pages/index.md +++ b/pages/index.md @@ -1,34 +1,26 @@ --- -title: What is Veilid? +title: Veilid description: Veilid is an open-source, distributed application framework. +layout: frontpage menu: main: - weight: 1 -layout: index + weight: 10 --- +### What is Veilid - - - -
-
- - VeilidChat App Logo - +
+
+
-
-

Ways to Help

-

There a so many ways to join the community and help out:

- +
+ a;lkfja;lsdkfj;a
+### Website Redesign + +Please have a look around. Some content has changed and some content has moved. \ No newline at end of file diff --git a/pages/press.md b/pages/press.md new file mode 100644 index 0000000..e14bb8d --- /dev/null +++ b/pages/press.md @@ -0,0 +1,25 @@ +--- +title: Press +description: Information for the press and media about Veilid +--- + +### Press Kit + +PDF press summary: Veilid Framework Press Kit, 20.6 kB + +### Press Contact +Press and media inquiries should be sent to press@veilid.org + +### In The News + +- “America’s Original Hacking Supergroup Creates a Free Framework to Improve App Security.” _Engadget_, [https://www.engadget.com/americas-original-hacking-supergroup-creates-a-free-framework-to-improve-app-security-190043865.html](https://www.engadget.com/americas-original-hacking-supergroup-creates-a-free-framework-to-improve-app-security-190043865.html). Accessed 11 Aug. 2023. +- _Cult of Dead Cow Hacktivists Design Encryption System for Mobile Apps - Play Crazy Game_. 2 Aug. 2023, [https://playcrazygame.com/blog/2023/08/02/cult-of-dead-cow-hacktivists-design-encryption-system-for-mobile-apps/](https://playcrazygame.com/blog/2023/08/02/cult-of-dead-cow-hacktivists-design-encryption-system-for-mobile-apps/). +- “Cult of the Dead Cow Launches Encryption Protocol to Save Your Privacy.” _Gizmodo_, 2 Aug. 2023, [https://gizmodo.com/cult-of-the-dead-cow-launches-veilid-encryption-project-1850699803](https://gizmodo.com/cult-of-the-dead-cow-launches-veilid-encryption-project-1850699803). +- “Cult of the Dead Cow Wants to Save Internet Privacy with a New Encryption Protocol.” _Yahoo News_, 2 Aug. 2023, [https://news.yahoo.com/cult-dead-cow-wants-save-203200064.html](https://news.yahoo.com/cult-dead-cow-wants-save-203200064.html). +- Goodwins, Rupert. _Last Rites for UK’s Ridiculous Online Safety Bill_. [https://www.theregister.com/2023/08/21/opinion\_column\_monday/](https://www.theregister.com/2023/08/21/opinion_column_monday/). Accessed 21 Aug. 2023. +- Hemant, Kumar. “Hacktivist Group CDc to Unveil Veilid Encryption for Privacy-First Apps.” _Candid.Technology_, 2 Aug. 2023, [https://candid.technology/veilid-encryption-cdc-cult-of-dead-cow/](https://candid.technology/veilid-encryption-cdc-cult-of-dead-cow/). +- Johnson, Donovan. “Cult of the Dead Cow Develops Coding Framework for Privacy-Focused Apps.” _Fagen Wasanni Technologies_, 2 Aug. 2023, [https://fagenwasanni.com/ai/cult-of-the-dead-cow-develops-coding-framework-for-privacy-focused-apps/106537/](https://fagenwasanni.com/ai/cult-of-the-dead-cow-develops-coding-framework-for-privacy-focused-apps/106537/). +- Long, Heinrich. “Prominent Hacktivists to Launch Secure Messaging Framework Veilid.” _RestorePrivacy_, 5 Aug. 2023, [https://restoreprivacy.com/prominent-hacktivists-to-launch-secure-messaging-framework-veilid/](https://restoreprivacy.com/prominent-hacktivists-to-launch-secure-messaging-framework-veilid/). +- Menn, Joseph. “Hacking Group Plans System to Encrypt Social Media and Other Apps.” _Washington Post_, 2 Aug. 2023. _www.washingtonpost.com_, [https://www.washingtonpost.com/technology/2023/08/02/encryption-dead-cow-cult-apps-def-con/](https://www.washingtonpost.com/technology/2023/08/02/encryption-dead-cow-cult-apps-def-con/). +- RHC, Redazione. “Cult of the dead Cow presenta il protocollo Veilid. Una nuova alternativa al ‘capitalismo della sorveglianza.’” _Red Hot Cyber_, 3 Aug. 2023, [https://www.redhotcyber.com/post/cult-of-the-dead-cow-presenta-il-protocollo-veilid-una-nuova-alternativa-al-capitalismo-della-sorveglianza/](https://www.redhotcyber.com/post/cult-of-the-dead-cow-presenta-il-protocollo-veilid-una-nuova-alternativa-al-capitalismo-della-sorveglianza/). +- _Veilid Unveiled by Cult of the Dead Cow - Security - ITnews_. [https://www.itnews.com.au/news/veilid-unveiled-by-cult-of-the-dead-cow-599475](https://www.itnews.com.au/news/veilid-unveiled-by-cult-of-the-dead-cow-599475). Accessed 22 Aug. 2023. \ No newline at end of file diff --git a/pages/who-built-veild.md b/pages/who-built-veild.md new file mode 100644 index 0000000..eaaf527 --- /dev/null +++ b/pages/who-built-veild.md @@ -0,0 +1,58 @@ +--- +title: About Us +description: About the core team and community building Veilid +menu: + main: + weight: 80 +--- + +Veilid Framework is lead by members of the Veilid Foundation and the core team. Veilid's community of contributors has been fantastic in supporting and contributing to the project. + + + +### Veilid Foundation Members + + +
+

Christien Rioux

+

Christien Rioux is the primary author and inventor of Veilid's core technology. A long-time member and figure in the security industry and hacker scene, Christien is a member of CULT OF THE DEAD COW, and formerly L0pht Heavy Industries, the formative hacker think-tank. He has been a company founder and published numerous security tools and advisories over the years, and is also proprietor of the hacker-fashion line HACK.XXX. Christien is a staunch believer that if you want to change the present you need to build the future.

+
+ +
+

Katelyn Bowden

+

Katelyn Bowden is a hacker, activist, and CULT OF THE DEAD COW member, who embraces the human side of hacking and tech. Katelyn has dedicated her life to changing the world for the positive- between her work fighting Non-consensual pornography, and her dedication to educating users on security, she is dedicated to making the internet a safer place for everyone. Her alignment is chaotic good, with a hard emphasis on the chaos. She also creates strange furby art and has over 60 dead things on display in her house.

+
+ +
+

Paul Miller

+

Paul Miller is the founder/leader/community organizer of hackers.town, Projekt:ONI (Optimistic Nihilists Inc.) organizer and founder, Hacker, Infosec professional, and is a passionate privacy advocate. Paul has worked to show the ways a centralized internet has harmed our culture and the future. He believes you should always be N00bin', and that collectively we can restore the promise of the future the internet once offered us.

+
+ +### Contributors + +Veilid contributors include coders, admins, writers, legal, and more. + +- TC Johnson +- Jun34u, cDc +- DethVeggie, cDc +- Beka Valentine +- signal9 +- Obscure, cDc +- Kirk 'Teknique' Strauser +- Alice 'c0debabe' Rhodes +- Abbie 'antijingoist' Gonzalez +- snowchyld, NsF +- John 'Wrewdison' Whelan +- Robert 'LambdaCalculus' Menes +- Glenn Kurtzrock +- Daniel Meyerson +- CylentKnight +- Robert 'Slugnoodle' Notarfrancesco +- Rebecah Miller +- Ray Watson +- Rob "Bourbon" Curtis + + +### Special Thanks + +A heart-felt thank you to our families and friends for putting up with supporting us. diff --git a/pages/why-use-veilid.md b/pages/why-use-veilid.md new file mode 100644 index 0000000..cffc1ee --- /dev/null +++ b/pages/why-use-veilid.md @@ -0,0 +1,11 @@ +--- +title: Why Veilid +description: An overview of the benefits of using Veilid +menu: + main: + weight: 30 +--- + +### For Developers + +### For Everyone \ No newline at end of file diff --git a/themes/veilid2025/assets/scss/bootstrap/_accordion.scss b/themes/veilid2025/assets/scss/bootstrap/_accordion.scss new file mode 100644 index 0000000..17e5436 --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_accordion.scss @@ -0,0 +1,158 @@ +// +// Base styles +// + +.accordion { + // scss-docs-start accordion-css-vars + --#{$prefix}accordion-color: #{$accordion-color}; + --#{$prefix}accordion-bg: #{$accordion-bg}; + --#{$prefix}accordion-transition: #{$accordion-transition}; + --#{$prefix}accordion-border-color: #{$accordion-border-color}; + --#{$prefix}accordion-border-width: #{$accordion-border-width}; + --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; + --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; + --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; + --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; + --#{$prefix}accordion-btn-color: #{$accordion-button-color}; + --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; + --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; + --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; + --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; + --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; + --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; + --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; + --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; + --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; + // scss-docs-end accordion-css-vars +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); + @include font-size($font-size-base); + color: var(--#{$prefix}accordion-btn-color); + text-align: left; // Reset button style + background-color: var(--#{$prefix}accordion-btn-bg); + border: 0; + @include border-radius(0); + overflow-anchor: none; + @include transition(var(--#{$prefix}accordion-transition)); + + &:not(.collapsed) { + color: var(--#{$prefix}accordion-active-color); + background-color: var(--#{$prefix}accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list + + &::after { + background-image: var(--#{$prefix}accordion-btn-active-icon); + transform: var(--#{$prefix}accordion-btn-icon-transform); + } + } + + // Accordion icon + &::after { + flex-shrink: 0; + width: var(--#{$prefix}accordion-btn-icon-width); + height: var(--#{$prefix}accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--#{$prefix}accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--#{$prefix}accordion-btn-icon-width); + @include transition(var(--#{$prefix}accordion-btn-icon-transition)); + } + + &:hover { + z-index: 2; + } + + &:focus { + z-index: 3; + outline: 0; + box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--#{$prefix}accordion-color); + background-color: var(--#{$prefix}accordion-bg); + border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); + + &:first-of-type { + @include border-top-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + &:not(:first-of-type) { + border-top: 0; + } + + // Only set a border-radius on the last item if the accordion is collapsed + &:last-of-type { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + &.collapsed { + @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + > .accordion-collapse { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + } + } +} + +.accordion-body { + padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); +} + + +// Flush accordion items +// +// Remove borders and border-radius to keep accordion items edge-to-edge. + +.accordion-flush { + > .accordion-item { + border-right: 0; + border-left: 0; + @include border-radius(0); + + &:first-child { border-top: 0; } + &:last-child { border-bottom: 0; } + + // stylelint-disable selector-max-class + > .accordion-header .accordion-button { + &, + &.collapsed { + @include border-radius(0); + } + } + // stylelint-enable selector-max-class + + > .accordion-collapse { + @include border-radius(0); + } + } +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .accordion-button::after { + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; + } + } +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_alert.scss b/themes/veilid2025/assets/scss/bootstrap/_alert.scss new file mode 100644 index 0000000..b8cff9b --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_alert.scss @@ -0,0 +1,68 @@ +// +// Base styles +// + +.alert { + // scss-docs-start alert-css-vars + --#{$prefix}alert-bg: transparent; + --#{$prefix}alert-padding-x: #{$alert-padding-x}; + --#{$prefix}alert-padding-y: #{$alert-padding-y}; + --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; + --#{$prefix}alert-color: inherit; + --#{$prefix}alert-border-color: transparent; + --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); + --#{$prefix}alert-border-radius: #{$alert-border-radius}; + --#{$prefix}alert-link-color: inherit; + // scss-docs-end alert-css-vars + + position: relative; + padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); + margin-bottom: var(--#{$prefix}alert-margin-bottom); + color: var(--#{$prefix}alert-color); + background-color: var(--#{$prefix}alert-bg); + border: var(--#{$prefix}alert-border); + @include border-radius(var(--#{$prefix}alert-border-radius)); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; + color: var(--#{$prefix}alert-link-color); +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $alert-dismissible-padding-r; + + // Adjust close link position + .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: $stretched-link-z-index + 1; + padding: $alert-padding-y * 1.25 $alert-padding-x; + } +} + + +// scss-docs-start alert-modifiers +// Generate contextual modifier classes for colorizing the alert +@each $state in map-keys($theme-colors) { + .alert-#{$state} { + --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); + } +} +// scss-docs-end alert-modifiers diff --git a/themes/veilid2025/assets/scss/bootstrap/_badge.scss b/themes/veilid2025/assets/scss/bootstrap/_badge.scss new file mode 100644 index 0000000..cc3d269 --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_badge.scss @@ -0,0 +1,38 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + // scss-docs-start badge-css-vars + --#{$prefix}badge-padding-x: #{$badge-padding-x}; + --#{$prefix}badge-padding-y: #{$badge-padding-y}; + @include rfs($badge-font-size, --#{$prefix}badge-font-size); + --#{$prefix}badge-font-weight: #{$badge-font-weight}; + --#{$prefix}badge-color: #{$badge-color}; + --#{$prefix}badge-border-radius: #{$badge-border-radius}; + // scss-docs-end badge-css-vars + + display: inline-block; + padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); + @include font-size(var(--#{$prefix}badge-font-size)); + font-weight: var(--#{$prefix}badge-font-weight); + line-height: 1; + color: var(--#{$prefix}badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius(var(--#{$prefix}badge-border-radius)); + @include gradient-bg(); + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_breadcrumb.scss b/themes/veilid2025/assets/scss/bootstrap/_breadcrumb.scss new file mode 100644 index 0000000..b8252ff --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_breadcrumb.scss @@ -0,0 +1,40 @@ +.breadcrumb { + // scss-docs-start breadcrumb-css-vars + --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; + --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; + --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; + @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); + --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; + --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; + --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; + --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; + --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; + // scss-docs-end breadcrumb-css-vars + + display: flex; + flex-wrap: wrap; + padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); + margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); + @include font-size(var(--#{$prefix}breadcrumb-font-size)); + list-style: none; + background-color: var(--#{$prefix}breadcrumb-bg); + @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: var(--#{$prefix}breadcrumb-item-padding-x); + + &::before { + float: left; // Suppress inline spacings and underlining of the separator + padding-right: var(--#{$prefix}breadcrumb-item-padding-x); + color: var(--#{$prefix}breadcrumb-divider-color); + content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; + } + } + + &.active { + color: var(--#{$prefix}breadcrumb-item-active-color); + } +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_button-group.scss b/themes/veilid2025/assets/scss/bootstrap/_button-group.scss new file mode 100644 index 0000000..55ae3f6 --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_button-group.scss @@ -0,0 +1,142 @@ +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + flex: 1 1 auto; + } + + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + > .btn-check:checked + .btn, + > .btn-check:focus + .btn, + > .btn:hover, + > .btn:focus, + > .btn:active, + > .btn.active { + z-index: 1; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + + .input-group { + width: auto; + } +} + +.btn-group { + @include border-radius($btn-border-radius); + + // Prevent double borders when buttons are next to each other + > :not(.btn-check:first-child) + .btn, + > .btn-group:not(:first-child) { + margin-left: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn.dropdown-toggle-split:first-child, + > .btn-group:not(:last-child) > .btn { + @include border-end-radius(0); + } + + // The left radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-start-radius(0); + } +} + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// +// Split button dropdowns +// + +.dropdown-toggle-split { + padding-right: $btn-padding-x * .75; + padding-left: $btn-padding-x * .75; + + &::after, + .dropup &::after, + .dropend &::after { + margin-left: 0; + } + + .dropstart &::before { + margin-right: 0; + } +} + +.btn-sm + .dropdown-toggle-split { + padding-right: $btn-padding-x-sm * .75; + padding-left: $btn-padding-x-sm * .75; +} + +.btn-lg + .dropdown-toggle-split { + padding-right: $btn-padding-x-lg * .75; + padding-left: $btn-padding-x-lg * .75; +} + + +// The clickable button for toggling the menu +// Set the same inset shadow as the :active state +.btn-group.show .dropdown-toggle { + @include box-shadow($btn-active-box-shadow); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// +// Vertical button groups +// + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + + > .btn, + > .btn-group { + width: 100%; + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-bottom-radius(0); + } + + > .btn ~ .btn, + > .btn-group:not(:first-child) > .btn { + @include border-top-radius(0); + } +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_buttons.scss b/themes/veilid2025/assets/scss/bootstrap/_buttons.scss new file mode 100644 index 0000000..caa4518 --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_buttons.scss @@ -0,0 +1,216 @@ +// +// Base styles +// + +.btn { + // scss-docs-start btn-css-vars + --#{$prefix}btn-padding-x: #{$btn-padding-x}; + --#{$prefix}btn-padding-y: #{$btn-padding-y}; + --#{$prefix}btn-font-family: #{$btn-font-family}; + @include rfs($btn-font-size, --#{$prefix}btn-font-size); + --#{$prefix}btn-font-weight: #{$btn-font-weight}; + --#{$prefix}btn-line-height: #{$btn-line-height}; + --#{$prefix}btn-color: #{$btn-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-width: #{$btn-border-width}; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-border-radius: #{$btn-border-radius}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; + --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; + --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); + // scss-docs-end btn-css-vars + + display: inline-block; + padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); + font-family: var(--#{$prefix}btn-font-family); + @include font-size(var(--#{$prefix}btn-font-size)); + font-weight: var(--#{$prefix}btn-font-weight); + line-height: var(--#{$prefix}btn-line-height); + color: var(--#{$prefix}btn-color); + text-align: center; + text-decoration: if($link-decoration == none, null, none); + white-space: $btn-white-space; + vertical-align: middle; + cursor: if($enable-button-pointers, pointer, null); + user-select: none; + border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); + @include border-radius(var(--#{$prefix}btn-border-radius)); + @include gradient-bg(var(--#{$prefix}btn-bg)); + @include box-shadow(var(--#{$prefix}btn-box-shadow)); + @include transition($btn-transition); + + &:hover { + color: var(--#{$prefix}btn-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + background-color: var(--#{$prefix}btn-hover-bg); + border-color: var(--#{$prefix}btn-hover-border-color); + } + + .btn-check + &:hover { + // override for the checkbox/radio buttons + color: var(--#{$prefix}btn-color); + background-color: var(--#{$prefix}btn-bg); + border-color: var(--#{$prefix}btn-border-color); + } + + &:focus-visible { + color: var(--#{$prefix}btn-hover-color); + @include gradient-bg(var(--#{$prefix}btn-hover-bg)); + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:focus-visible + & { + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:checked + &, + :not(.btn-check) + &:active, + &:first-child:active, + &.active, + &.show { + color: var(--#{$prefix}btn-active-color); + background-color: var(--#{$prefix}btn-active-bg); + // Remove CSS gradients if they're enabled + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-active-border-color); + @include box-shadow(var(--#{$prefix}btn-active-shadow)); + + &:focus-visible { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + } + + .btn-check:checked:focus-visible + & { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + &:disabled, + &.disabled, + fieldset:disabled & { + color: var(--#{$prefix}btn-disabled-color); + pointer-events: none; + background-color: var(--#{$prefix}btn-disabled-bg); + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-disabled-border-color); + opacity: var(--#{$prefix}btn-disabled-opacity); + @include box-shadow(none); + } +} + + +// +// Alternate buttons +// + +// scss-docs-start btn-variant-loops +@each $color, $value in $theme-colors { + .btn-#{$color} { + @if $color == "light" { + @include button-variant( + $value, + $value, + $hover-background: shade-color($value, $btn-hover-bg-shade-amount), + $hover-border: shade-color($value, $btn-hover-border-shade-amount), + $active-background: shade-color($value, $btn-active-bg-shade-amount), + $active-border: shade-color($value, $btn-active-border-shade-amount) + ); + } @else if $color == "dark" { + @include button-variant( + $value, + $value, + $hover-background: tint-color($value, $btn-hover-bg-tint-amount), + $hover-border: tint-color($value, $btn-hover-border-tint-amount), + $active-background: tint-color($value, $btn-active-bg-tint-amount), + $active-border: tint-color($value, $btn-active-border-tint-amount) + ); + } @else { + @include button-variant($value, $value); + } + } +} + +@each $color, $value in $theme-colors { + .btn-outline-#{$color} { + @include button-outline-variant($value); + } +} +// scss-docs-end btn-variant-loops + + +// +// Link buttons +// + +// Make a button look and behave like a link +.btn-link { + --#{$prefix}btn-font-weight: #{$font-weight-normal}; + --#{$prefix}btn-color: #{$btn-link-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-active-color: #{$btn-link-hover-color}; + --#{$prefix}btn-active-border-color: transparent; + --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; + --#{$prefix}btn-disabled-border-color: transparent; + --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows + --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; + + text-decoration: $link-decoration; + @if $enable-gradients { + background-image: none; + } + + &:hover, + &:focus-visible { + text-decoration: $link-hover-decoration; + } + + &:focus-visible { + color: var(--#{$prefix}btn-color); + } + + &:hover { + color: var(--#{$prefix}btn-hover-color); + } + + // No need for an active state here +} + + +// +// Button Sizes +// + +.btn-lg { + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); +} + +.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_card.scss b/themes/veilid2025/assets/scss/bootstrap/_card.scss new file mode 100644 index 0000000..d3535a9 --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_card.scss @@ -0,0 +1,239 @@ +// +// Base styles +// + +.card { + // scss-docs-start card-css-vars + --#{$prefix}card-spacer-y: #{$card-spacer-y}; + --#{$prefix}card-spacer-x: #{$card-spacer-x}; + --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; + --#{$prefix}card-title-color: #{$card-title-color}; + --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; + --#{$prefix}card-border-width: #{$card-border-width}; + --#{$prefix}card-border-color: #{$card-border-color}; + --#{$prefix}card-border-radius: #{$card-border-radius}; + --#{$prefix}card-box-shadow: #{$card-box-shadow}; + --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; + --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; + --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; + --#{$prefix}card-cap-bg: #{$card-cap-bg}; + --#{$prefix}card-cap-color: #{$card-cap-color}; + --#{$prefix}card-height: #{$card-height}; + --#{$prefix}card-color: #{$card-color}; + --#{$prefix}card-bg: #{$card-bg}; + --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; + --#{$prefix}card-group-margin: #{$card-group-margin}; + // scss-docs-end card-css-vars + + position: relative; + display: flex; + flex-direction: column; + min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 + height: var(--#{$prefix}card-height); + color: var(--#{$prefix}body-color); + word-wrap: break-word; + background-color: var(--#{$prefix}card-bg); + background-clip: border-box; + border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + @include border-radius(var(--#{$prefix}card-border-radius)); + @include box-shadow(var(--#{$prefix}card-box-shadow)); + + > hr { + margin-right: 0; + margin-left: 0; + } + + > .list-group { + border-top: inherit; + border-bottom: inherit; + + &:first-child { + border-top-width: 0; + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); + } + + &:last-child { + border-bottom-width: 0; + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); + } + } + + // Due to specificity of the above selector (`.card > .list-group`), we must + // use a child selector here to prevent double borders. + > .card-header + .list-group, + > .list-group + .card-footer { + border-top: 0; + } +} + +.card-body { + // Enable `flex-grow: 1` for decks and groups so that card blocks take up + // as much space as possible, ensuring footers are aligned to the bottom. + flex: 1 1 auto; + padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); + color: var(--#{$prefix}card-color); +} + +.card-title { + margin-bottom: var(--#{$prefix}card-title-spacer-y); + color: var(--#{$prefix}card-title-color); +} + +.card-subtitle { + margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list + margin-bottom: 0; + color: var(--#{$prefix}card-subtitle-color); +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link { + &:hover { + text-decoration: if($link-hover-decoration == underline, none, null); + } + + + .card-link { + margin-left: var(--#{$prefix}card-spacer-x); + } +} + +// +// Optional textual caps +// + +.card-header { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + margin-bottom: 0; // Removes the default margin-bottom of + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:first-child { + @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); + } +} + +.card-footer { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:last-child { + @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); + } +} + + +// +// Header navs +// + +.card-header-tabs { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + border-bottom: 0; + + .nav-link.active { + background-color: var(--#{$prefix}card-bg); + border-bottom-color: var(--#{$prefix}card-bg); + } +} + +.card-header-pills { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list +} + +// Card image +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--#{$prefix}card-img-overlay-padding); + @include border-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch +} + +.card-img, +.card-img-top { + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-bottom { + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); +} + + +// +// Card groups +// + +.card-group { + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + margin-bottom: var(--#{$prefix}card-group-margin); + } + + @include media-breakpoint-up(sm) { + display: flex; + flex-flow: row wrap; + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 + flex: 1 0 0%; + margin-bottom: 0; + + + .card { + margin-left: 0; + border-left: 0; + } + + // Handle rounded corners + @if $enable-rounded { + &:not(:last-child) { + @include border-end-radius(0); + + .card-img-top, + .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-right-radius: 0; + } + .card-img-bottom, + .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-right-radius: 0; + } + } + + &:not(:first-child) { + @include border-start-radius(0); + + .card-img-top, + .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-left-radius: 0; + } + .card-img-bottom, + .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-left-radius: 0; + } + } + } + } + } +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_carousel.scss b/themes/veilid2025/assets/scss/bootstrap/_carousel.scss new file mode 100644 index 0000000..3a13522 --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_carousel.scss @@ -0,0 +1,236 @@ +// Notes on the classes: +// +// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) +// even when their scroll action started on a carousel, but for compatibility (with Firefox) +// we're preventing all actions instead +// 2. The .carousel-item-start and .carousel-item-end is used to indicate where +// the active slide is heading. +// 3. .active.carousel-item is the current slide. +// 4. .active.carousel-item-start and .active.carousel-item-end is the current +// slide in its in-transition state. Only one of these occurs at a time. +// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end +// is the upcoming slide in transition. + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; + @include clearfix(); +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + @include transition($carousel-transition); +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + + +// +// Alternate transitions +// + +.carousel-fade { + .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; + } + + .carousel-item.active, + .carousel-item-next.carousel-item-start, + .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; + } + + .active.carousel-item-start, + .active.carousel-item-end { + z-index: 0; + opacity: 0; + @include transition(opacity 0s $carousel-transition-duration); + } +} + + +// +// Left/right controls for nav +// + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + // Use flex for alignment (1-3) + display: flex; // 1. allow flex styles + align-items: center; // 2. vertically center contents + justify-content: center; // 3. horizontally center contents + width: $carousel-control-width; + padding: 0; + color: $carousel-control-color; + text-align: center; + background: none; + border: 0; + opacity: $carousel-control-opacity; + @include transition($carousel-control-transition); + + // Hover/focus state + &:hover, + &:focus { + color: $carousel-control-color; + text-decoration: none; + outline: 0; + opacity: $carousel-control-hover-opacity; + } +} +.carousel-control-prev { + left: 0; + background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); +} +.carousel-control-next { + right: 0; + background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); +} + +// Icons for within +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: $carousel-control-icon-width; + height: $carousel-control-icon-width; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; +} +.carousel-control-next-icon { + background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; +} + +// Optional indicator pips/controls +// +// Add a container (such as a list) with the following class and add an item (ideally a focusable control, +// like a button) with data-bs-target for each slide your carousel holds. + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + // Use the .carousel-control's width as margin so we don't overlay those + margin-right: $carousel-control-width; + margin-bottom: 1rem; + margin-left: $carousel-control-width; + + [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: $carousel-indicator-width; + height: $carousel-indicator-height; + padding: 0; + margin-right: $carousel-indicator-spacer; + margin-left: $carousel-indicator-spacer; + text-indent: -999px; + cursor: pointer; + background-color: $carousel-indicator-active-bg; + background-clip: padding-box; + border: 0; + // Use transparent borders to increase the hit area by 10px on top and bottom. + border-top: $carousel-indicator-hit-area-height solid transparent; + border-bottom: $carousel-indicator-hit-area-height solid transparent; + opacity: $carousel-indicator-opacity; + @include transition($carousel-indicator-transition); + } + + .active { + opacity: $carousel-indicator-active-opacity; + } +} + + +// Optional captions +// +// + +.carousel-caption { + position: absolute; + right: (100% - $carousel-caption-width) * .5; + bottom: $carousel-caption-spacer; + left: (100% - $carousel-caption-width) * .5; + padding-top: $carousel-caption-padding-y; + padding-bottom: $carousel-caption-padding-y; + color: $carousel-caption-color; + text-align: center; +} + +// Dark mode carousel + +@mixin carousel-dark() { + .carousel-control-prev-icon, + .carousel-control-next-icon { + filter: $carousel-dark-control-icon-filter; + } + + .carousel-indicators [data-bs-target] { + background-color: $carousel-dark-indicator-active-bg; + } + + .carousel-caption { + color: $carousel-dark-caption-color; + } +} + +.carousel-dark { + @include carousel-dark(); +} + +@if $enable-dark-mode { + @include color-mode(dark) { + @if $color-mode-type == "media-query" { + .carousel { + @include carousel-dark(); + } + } @else { + .carousel, + &.carousel { + @include carousel-dark(); + } + } + } +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_close.scss b/themes/veilid2025/assets/scss/bootstrap/_close.scss new file mode 100644 index 0000000..4d6e73c --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_close.scss @@ -0,0 +1,63 @@ +// Transparent background and border properties included for button version. +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + +.btn-close { + // scss-docs-start close-css-vars + --#{$prefix}btn-close-color: #{$btn-close-color}; + --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; + --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; + --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; + --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; + --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; + --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; + --#{$prefix}btn-close-white-filter: #{$btn-close-white-filter}; + // scss-docs-end close-css-vars + + box-sizing: content-box; + width: $btn-close-width; + height: $btn-close-height; + padding: $btn-close-padding-y $btn-close-padding-x; + color: var(--#{$prefix}btn-close-color); + background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements + border: 0; // for button elements + @include border-radius(); + opacity: var(--#{$prefix}btn-close-opacity); + + // Override 's hover style + &:hover { + color: var(--#{$prefix}btn-close-color); + text-decoration: none; + opacity: var(--#{$prefix}btn-close-hover-opacity); + } + + &:focus { + outline: 0; + box-shadow: var(--#{$prefix}btn-close-focus-shadow); + opacity: var(--#{$prefix}btn-close-focus-opacity); + } + + &:disabled, + &.disabled { + pointer-events: none; + user-select: none; + opacity: var(--#{$prefix}btn-close-disabled-opacity); + } +} + +@mixin btn-close-white() { + filter: var(--#{$prefix}btn-close-white-filter); +} + +.btn-close-white { + @include btn-close-white(); +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .btn-close { + @include btn-close-white(); + } + } +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_containers.scss b/themes/veilid2025/assets/scss/bootstrap/_containers.scss new file mode 100644 index 0000000..83b3138 --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_containers.scss @@ -0,0 +1,41 @@ +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +@if $enable-container-classes { + // Single container class with breakpoint max-widths + .container, + // 100% wide container at all breakpoints + .container-fluid { + @include make-container(); + } + + // Responsive containers that are 100% wide until a breakpoint + @each $breakpoint, $container-max-width in $container-max-widths { + .container-#{$breakpoint} { + @extend .container-fluid; + } + + @include media-breakpoint-up($breakpoint, $grid-breakpoints) { + %responsive-container-#{$breakpoint} { + max-width: $container-max-width; + } + + // Extend each breakpoint which is smaller or equal to the current breakpoint + $extend-breakpoint: true; + + @each $name, $width in $grid-breakpoints { + @if ($extend-breakpoint) { + .container#{breakpoint-infix($name, $grid-breakpoints)} { + @extend %responsive-container-#{$breakpoint}; + } + + // Once the current breakpoint is reached, stop extending + @if ($breakpoint == $name) { + $extend-breakpoint: false; + } + } + } + } + } +} diff --git a/themes/veilid2025/assets/scss/bootstrap/_dropdown.scss b/themes/veilid2025/assets/scss/bootstrap/_dropdown.scss new file mode 100644 index 0000000..587ebb4 --- /dev/null +++ b/themes/veilid2025/assets/scss/bootstrap/_dropdown.scss @@ -0,0 +1,250 @@ +// The dropdown wrapper (`
`) +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; + + // Generate the caret automatically + @include caret(); +} + +// The dropdown menu +.dropdown-menu { + // scss-docs-start dropdown-css-vars + --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; + --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; + --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; + --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; + --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; + @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); + --#{$prefix}dropdown-color: #{$dropdown-color}; + --#{$prefix}dropdown-bg: #{$dropdown-bg}; + --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; + --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; + --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; + --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; + --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; + --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; + --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; + --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; + --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; + --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; + --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; + --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; + --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; + --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; + --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; + --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; + --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; + --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; + // scss-docs-end dropdown-css-vars + + position: absolute; + z-index: var(--#{$prefix}dropdown-zindex); + display: none; // none by default, but block on "open" of the menu + min-width: var(--#{$prefix}dropdown-min-width); + padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); + margin: 0; // Override default margin of ul + @include font-size(var(--#{$prefix}dropdown-font-size)); + color: var(--#{$prefix}dropdown-color); + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + list-style: none; + background-color: var(--#{$prefix}dropdown-bg); + background-clip: padding-box; + border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); + @include border-radius(var(--#{$prefix}dropdown-border-radius)); + @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); + + &[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--#{$prefix}dropdown-spacer); + } + + @if $dropdown-padding-y == 0 { + > .dropdown-item:first-child, + > li:first-child .dropdown-item { + @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + > .dropdown-item:last-child, + > li:last-child .dropdown-item { + @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + + } +} + +// scss-docs-start responsive-breakpoints +// We deliberately hardcode the `bs-` prefix because we check +// this custom property in JS to determine Popper's positioning + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .dropdown-menu#{$infix}-start { + --bs-position: start; + + &[data-bs-popper] { + right: auto; + left: 0; + } + } + + .dropdown-menu#{$infix}-end { + --bs-position: end; + + &[data-bs-popper] { + right: 0; + left: auto; + } + } + } +} +// scss-docs-end responsive-breakpoints + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// Just add .dropup after the standard .dropdown class and you're set. +.dropup { + .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(up); + } +} + +.dropend { + .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(end); + &::after { + vertical-align: 0; + } + } +} + +.dropstart { + .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(start); + &::before { + vertical-align: 0; + } + } +} + + +// Dividers (basically an `
`) within the dropdown +.dropdown-divider { + height: 0; + margin: var(--#{$prefix}dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); + opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
element +} + +// Links, buttons, and more within the dropdown menu +// +// `