From b0b7394b46c18430f60d2a7ea1fb13d4604f4f8b Mon Sep 17 00:00:00 2001 From: Wil Wade Date: Mon, 16 Sep 2024 13:32:28 -0400 Subject: [PATCH] Get notified (#19) # Description Adds a get notified tag and form and privacy policy - Closes #18 ## Type of change Please delete options that are not relevant. - [x] Content Change (Required approval in Slack: `#frequency-xyz` and remember that changes along the way trigger re-approval.) - [x] Approved HE (Required for technical wording) - [x] Approved CM - [x] New Feature # How to Test? Please describe how to test that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration 1. Pull and run locally 2. See that the get notified button on the right doesn't cover important text 3. Click the button and see that it loads the form 4. Form errors 5. Thank you after submitting the form # Checklist: - [x] I have performed a self-review of my code - [ ] I have commented my code & PR, particularly in hard-to-understand areas - [x] I have checked at all the breakpoints to make sure it works on all screen sizes --- cors-proxy/README.md | 82 ++++ cors-proxy/index.mjs | 49 ++ cors-proxy/package.json | 11 + cors-proxy/server.mjs | 67 +++ cors-proxy/serverless.yaml | 18 + src/app.html | 6 +- src/components/Footer.svelte | 2 + src/components/GetNotified/GetNotified.svelte | 160 +++++++ src/components/GetNotified/Stars.svelte | 48 ++ src/components/GetNotified/Wave.svelte | 9 + src/components/Header/Header.svelte | 30 +- src/components/Header/NavItems.svelte | 7 +- src/components/Sections/Section2.svelte | 4 +- src/components/Sections/Section3.svelte | 2 +- src/components/Sections/Section4.svelte | 4 +- src/components/Sections/Section5.svelte | 4 +- src/components/SideTag.svelte | 63 +++ src/lib/assets/DiscordLogo-White.svg | 7 + src/lib/assets/DiscordLogo.svg | 3 +- src/routes/(home)/+layout.svelte | 13 + src/routes/{ => (home)}/+page.svelte | 42 +- src/routes/+layout.svelte | 17 +- src/routes/privacy/+layout.svelte | 15 + src/routes/privacy/+page.svelte | 422 ++++++++++++++++++ src/style/app.css | 12 +- tailwind.config.js | 4 +- tests/test.ts | 12 +- 27 files changed, 1050 insertions(+), 63 deletions(-) create mode 100644 cors-proxy/README.md create mode 100644 cors-proxy/index.mjs create mode 100644 cors-proxy/package.json create mode 100644 cors-proxy/server.mjs create mode 100644 cors-proxy/serverless.yaml create mode 100644 src/components/GetNotified/GetNotified.svelte create mode 100644 src/components/GetNotified/Stars.svelte create mode 100644 src/components/GetNotified/Wave.svelte create mode 100644 src/components/SideTag.svelte create mode 100644 src/lib/assets/DiscordLogo-White.svg create mode 100644 src/routes/(home)/+layout.svelte rename src/routes/{ => (home)}/+page.svelte (59%) create mode 100644 src/routes/privacy/+layout.svelte create mode 100644 src/routes/privacy/+page.svelte diff --git a/cors-proxy/README.md b/cors-proxy/README.md new file mode 100644 index 00000000..0dd31093 --- /dev/null +++ b/cors-proxy/README.md @@ -0,0 +1,82 @@ +# Serverless CORS Proxy + +This is a simple serverless CORS proxy that supports `POST` requests. + +This is used by the contact form. + +## Features + +- Supports `POST` requests to a single `PROXY_TARGET_URL` +- Adds CORS headers for cross-origin requests + +## Serverless.yaml + +See [./serverless.yaml] to use [serverless.com config](https://www.serverless.com/) + +## Environment Variables + +These are the environment variables used by the handler. + +- `PROXY_TARGET_URL`: Where the proxy will redirect the requests to +- `PROXY_ALLOWED_ORIGIN`: (Default `'*'`) The `Access-Control-Allow-Origin` string for the local server. + +## Setup + +### 1. Running Locally + +To run the CORS proxy locally: + +1. Run the proxy locally: + + ```bash + PROXY_TARGET_URL="https://example.com/submit-form" npm run start + ``` + + - Replace `https://example.com/submit-form` with the target URL. + +2. Use the following `curl` example to test a `POST` request from your terminal: + + ```bash + curl -X POST "http://localhost:3000/" \ + -d "param1=value1¶m2=value2" + ``` + + - Replace `param1=value1¶m2=value2` with your actual form data. + +### 2. Using with an HTML Form and JavaScript Fetch + +You can use this proxy to submit a form using JavaScript `fetch`. Here’s an example: + +#### HTML Form: + +```html +
+ + + +
+ + +``` diff --git a/cors-proxy/index.mjs b/cors-proxy/index.mjs new file mode 100644 index 00000000..a7242e39 --- /dev/null +++ b/cors-proxy/index.mjs @@ -0,0 +1,49 @@ +import https from 'node:https'; +import process from 'node:process'; + +export const handler = async (event) => { + const targetUrl = process.env.PROXY_TARGET_URL; + + const postData = event.body; + + const options = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }; + + return new Promise((resolve, _reject) => { + const req = https.request(targetUrl, options, (response) => { + let data = ''; + + // Collect response data + response.on('data', (chunk) => (data += chunk)); + + // When the request is complete + response.on('end', () => { + resolve({ + statusCode: 200, + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + status: response.statusCode, + headers: response.headers, + body: data, + }), + }); + }); + }); + + req.on('error', (error) => { + resolve({ + statusCode: 500, + body: JSON.stringify({ message: 'Error in request', error: error.message }), + }); + }); + + req.write(postData); + req.end(); + }); +}; diff --git a/cors-proxy/package.json b/cors-proxy/package.json new file mode 100644 index 00000000..f7eb83e3 --- /dev/null +++ b/cors-proxy/package.json @@ -0,0 +1,11 @@ +{ + "name": "cors-proxy", + "type": "module", + "version": "1.0.0", + "description": "A simple CORS proxy for serverless environments.", + "main": "index.mjs", + "scripts": { + "start": "node server.mjs" + }, + "dependencies": {} +} diff --git a/cors-proxy/server.mjs b/cors-proxy/server.mjs new file mode 100644 index 00000000..63250a5b --- /dev/null +++ b/cors-proxy/server.mjs @@ -0,0 +1,67 @@ +import http from 'http'; +import { handler } from './index.mjs'; +import url from 'url'; +import process from 'node:process'; + +const allowedOrigin = process.env.PROXY_ALLOWED_ORIGIN || '*'; + +// Function to parse the HTTP request body +const getRequestBody = (req) => { + return new Promise((resolve, reject) => { + let body = ''; + req.on('data', (chunk) => { + body += chunk.toString(); + }); + req.on('end', () => { + resolve(body); + }); + req.on('error', (err) => { + reject(err); + }); + }); +}; + +// Start the HTTP server +const server = http.createServer(async (req, res) => { + // Set CORS headers + res.setHeader('Access-Control-Allow-Origin', allowedOrigin); + res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + + // Handle OPTIONS request for CORS preflight + if (req.method === 'OPTIONS') { + res.writeHead(200); + res.end(); + return; + } + + if (req.method === 'POST') { + const parsedUrl = url.parse(req.url, true); + const body = await getRequestBody(req); + + // Convert HTTP request into a Lambda event format + const lambdaEvent = { + httpMethod: req.method, + queryStringParameters: parsedUrl.query, + body: body, + }; + + // Call the handler (same code used in AWS Lambda) + const lambdaResponse = await handler(lambdaEvent); + + // Send response + res.writeHead(lambdaResponse.statusCode, { + ...lambdaResponse.headers, + 'Access-Control-Allow-Origin': '*', // Make sure to include CORS in response too + }); + res.end(lambdaResponse.body); + } else { + res.statusCode = 405; + res.end('Only POST requests are supported'); + } +}); + +// Start server on port 3000 +server.listen(3000, () => { + console.log('Local server running on http://localhost:3000'); +}); diff --git a/cors-proxy/serverless.yaml b/cors-proxy/serverless.yaml new file mode 100644 index 00000000..36436708 --- /dev/null +++ b/cors-proxy/serverless.yaml @@ -0,0 +1,18 @@ +service: xyz-form-cors-proxy + +frameworkVersion: '4' + +provider: + name: aws + runtime: nodejs20.x + +functions: + hello: + handler: handler.handler + events: + - http: + method: post + cors: + origin: 'https://*.frequency.xyz' + headers: + - Content-Type diff --git a/src/app.html b/src/app.html index 8f37ae9c..7901cc35 100644 --- a/src/app.html +++ b/src/app.html @@ -8,7 +8,7 @@ - + @@ -35,8 +35,8 @@ %sveltekit.head% - - + + + +
+
+
+
+
+
+
+
+
+
+
+

Interested in Frequency's ecosystem?

+

Get notified when more developer tools are available.

+
+
+
+
+
+ {#if !formSuccess} +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+ {:else} +
+

Thank You!

+
+ {/if} + + +
+ +
+
+

Join our Discord

+

Become a part of shaping the future of the digital landscape with Frequency.

+
+
+
+
+ + diff --git a/src/components/GetNotified/Stars.svelte b/src/components/GetNotified/Stars.svelte new file mode 100644 index 00000000..82c11507 --- /dev/null +++ b/src/components/GetNotified/Stars.svelte @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/GetNotified/Wave.svelte b/src/components/GetNotified/Wave.svelte new file mode 100644 index 00000000..57f927b6 --- /dev/null +++ b/src/components/GetNotified/Wave.svelte @@ -0,0 +1,9 @@ + + + diff --git a/src/components/Header/Header.svelte b/src/components/Header/Header.svelte index 72bb091a..9f2d22e8 100644 --- a/src/components/Header/Header.svelte +++ b/src/components/Header/Header.svelte @@ -27,20 +27,22 @@ id="header" class={`freq-container z-50 flex max-w-page items-center justify-between sm:pt-[10px] lg:pt-[30px] ${isNavOpen ? 'fixed' : ''}`} > - - - + + + + +
diff --git a/src/components/Header/NavItems.svelte b/src/components/Header/NavItems.svelte index 551e5d11..96e96d87 100644 --- a/src/components/Header/NavItems.svelte +++ b/src/components/Header/NavItems.svelte @@ -1,10 +1,15 @@ -{#if isDesktop} +{#if !isOnHomePage} + About. +{:else if isDesktop} (section = 1)}>About. {/if} diff --git a/src/components/Sections/Section2.svelte b/src/components/Sections/Section2.svelte index bf0de886..c181adea 100644 --- a/src/components/Sections/Section2.svelte +++ b/src/components/Sections/Section2.svelte @@ -19,12 +19,12 @@ >.02 -

Taking back control

+

Taking back control

With Frequency, you will have a choice in how your favorite applications and websites utilize your data. Obtain control over your privacy and how your data is shared. diff --git a/src/components/Sections/Section3.svelte b/src/components/Sections/Section3.svelte index 32500277..82df4b97 100644 --- a/src/components/Sections/Section3.svelte +++ b/src/components/Sections/Section3.svelte @@ -20,7 +20,7 @@
-

+

Take Your Content & Relationships With You

diff --git a/src/components/Sections/Section4.svelte b/src/components/Sections/Section4.svelte index 77956e5b..5ed3156e 100644 --- a/src/components/Sections/Section4.svelte +++ b/src/components/Sections/Section4.svelte @@ -15,10 +15,10 @@ class="sm:flex-end flex text-navy sm:flex-col sm:items-end sm:gap-6 lg:flex-row-reverse lg:items-start lg:justify-end lg:gap-12" > -

Support Your Preferred Apps

+

Support Your Preferred Apps

- + Frequency is set to unveil a distinctive feature that allows you to express support for the apps and services within the Frequency network that you love. This feature will also enable you to publicly alter your choices, and, if necessary, reevaluate your support of apps and services, encouraging ethical conduct and responsibility. diff --git a/src/components/Sections/Section5.svelte b/src/components/Sections/Section5.svelte index a191e6d3..65ed05c5 100644 --- a/src/components/Sections/Section5.svelte +++ b/src/components/Sections/Section5.svelte @@ -23,9 +23,9 @@ >
-

The Core of Our Technology

+

The Core of Our Technology

- + The creators of Frequency are at the forefront of innovation. They've created the Decentralized Social Networking Protocol (DSNP), an open-source solution that establishes a shared social graph independent of specific applications or centralized platforms. diff --git a/src/components/SideTag.svelte b/src/components/SideTag.svelte new file mode 100644 index 00000000..1c8310f4 --- /dev/null +++ b/src/components/SideTag.svelte @@ -0,0 +1,63 @@ + + +
+ +
+ +{#if isPopupOpen} +
+
+ +
+ +
+
+
+{/if} + + diff --git a/src/lib/assets/DiscordLogo-White.svg b/src/lib/assets/DiscordLogo-White.svg new file mode 100644 index 00000000..48cdc8fe --- /dev/null +++ b/src/lib/assets/DiscordLogo-White.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/lib/assets/DiscordLogo.svg b/src/lib/assets/DiscordLogo.svg index 701be8ad..563878b7 100644 --- a/src/lib/assets/DiscordLogo.svg +++ b/src/lib/assets/DiscordLogo.svg @@ -1,8 +1,7 @@ - - \ No newline at end of file + diff --git a/src/routes/(home)/+layout.svelte b/src/routes/(home)/+layout.svelte new file mode 100644 index 00000000..ba0519e9 --- /dev/null +++ b/src/routes/(home)/+layout.svelte @@ -0,0 +1,13 @@ + + +
+ +
+ + + +
diff --git a/src/routes/+page.svelte b/src/routes/(home)/+page.svelte similarity index 59% rename from src/routes/+page.svelte rename to src/routes/(home)/+page.svelte index 1909b39a..4316c9c5 100644 --- a/src/routes/+page.svelte +++ b/src/routes/(home)/+page.svelte @@ -1,13 +1,14 @@ - -
-
-
- -
- -
-
-
-
+
+
diff --git a/src/routes/privacy/+layout.svelte b/src/routes/privacy/+layout.svelte new file mode 100644 index 00000000..e46f8e2b --- /dev/null +++ b/src/routes/privacy/+layout.svelte @@ -0,0 +1,15 @@ + + +
+
+
+ +
+
+
diff --git a/src/routes/privacy/+page.svelte b/src/routes/privacy/+page.svelte new file mode 100644 index 00000000..e1d6add2 --- /dev/null +++ b/src/routes/privacy/+page.svelte @@ -0,0 +1,422 @@ +
+

Privacy Policy

+
+

+ Last Updated: September 16, 2024 +

+

+ This Privacy Notice applies to the processing of personal information by the Frequency Network Foundation (“Frequency Network Foundation,” “we,” “us,” or “our”) in connection with our website at + https://www.frequency.xyz (the “Site”). +

+

+ However, this Privacy Notice does not apply to the Frequency Network Foundation’s + processing of personal information in connection with operation of the Frequency Community Rewards Program or the website + located at https://claimfrequency.xyz. +

+
    +
  1. NOTICE REGARDING USE OF THE BLOCKCHAIN
  2. +
  3. UPDATES TO THIS PRIVACY NOTICE
  4. +
  5. PERSONAL INFORMATION WE COLLECT
  6. +
  7. HOW WE USE PERSONAL INFORMATION
  8. +
  9. HOW WE DISCLOSE PERSONAL INFORMATION
  10. +
  11. YOUR PRIVACY CHOICES AND RIGHTS
  12. +
  13. + INTERNATIONAL TRANSFERS OF PERSONAL INFORMATION +
  14. +
  15. RETENTION OF PERSONAL INFORMATION
  16. +
  17. SUPPLEMENTAL NOTICE FOR EU GDPR
  18. +
  19. CHILDREN’S INFORMATION
  20. +
  21. THIRD-PARTY WEBSITES/APPLICATIONS
  22. +
  23. CONTACT US
  24. +
+

1. NOTICE REGARDING USE OF THE BLOCKCHAIN

+

+ Aspects of the Site may be hosted on or interact with the blockchain, including Frequency, a layer 1 blockchain + integrated into the Polkadot platform (“Frequency Network”). Where you use aspects of the Site that are hosted on + or interact with the blockchain, information about your interactions and/or transactions will be provided to the + applicable blockchain network and may be accessible to third parties due to the nature of the blockchain protocol. +

+

2. UPDATES TO THIS PRIVACY NOTICE

+

+ We may update this Privacy Notice from time to time in our sole discretion. If we do, we’ll let you know by + posting the updated Privacy Notice on our website, and/or we may also send other communications. +

+

3. PERSONAL INFORMATION WE COLLECT

+

+ We collect personal information that you provide to us, personal information we obtain automatically when you + interact with the Site, and personal information from third-party sources, as described below. +

+
A. Personal Information You Provide to Us Directly
+

We may collect personal information that you provide to us.

+
    +
  • + Participant Information. If you participate in the Site, we may collect personal information + from you, such as details about your Frequency Network message source account, details about your account with a + wallet or service that allow you access to the Frequency Network (example: Frequency Access) (“Frequency Network Access Service”), details about your account with an authorized Provider (as defined below), documentation you provide that + is required as a condition for all rewards, wallet information, details about the rewards you are eligible for + or redeem, details about your rewards balance, and other information that we collect or that you provide in + connection with your participation in the Site. +
  • +
  • + Your Communications with Us. We may collect personal information, such as your name, email + address, phone number, and details about whether or not you are developer when you contact us or request that we + contact you. +
  • +
  • + Surveys. We may contact you to participate in surveys. If you decide to participate, we may + collect personal information from you in connection with the survey. +
  • +
  • + Interactive Features. We and others who use the Site may collect personal information that you + submit or make available through our interactive features (e.g., forums, blogs, and social media pages). Any + information you provide using the public sharing functionality of the interactive features will be considered + “public.” +
  • +
  • + Conferences, Trade Shows, and Other Events. We may collect personal information from + individuals when we attend or host conferences, trade shows, and other events. +
  • +
+
B. Personal Information Collected Automatically
+

We may collect personal information automatically when you use or interact with the Site.

+
    +
  • + Automatic Collection of Personal Information. We may collect certain personal information + automatically when you interact with the Site, including through the Site’s digital properties or content. This + personal information may include, but is not limited to, your Internet protocol (IP) address, user settings, + cookie identifiers, other unique identifiers, browser or device information, location information (including + approximate location derived from IP address), and Internet service provider. We may also automatically collect + information regarding your use of the Site, including its digital properties or content, such as pages that you + visit, items that you search for via the Site’s digital properties, information about the links you click, the + frequency and duration of your activities, and other information about how you use the Site. +
  • +
  • + Cookie Notice (and Other Technologies). We, as well as third parties, may use cookies, pixel + tags, and other technologies (“Technologies”) to automatically collect information through your + use of the Site’s digital properties and content. +
  • +
  • + Cookies. Cookies are small text files placed in device browsers that store preferences and + facilitate and enhance your experience. +
  • +
  • + Pixel Tags/Web Beacons. A pixel tag (also known as a web beacon) is a piece of code embedded in + aspects of the Site that collects information about engagement with the Site’s digital properties or content. + The use of a pixel tag allows us to record, for example, that a user has visited, a particular web page or + clicked on a particular advertisement. We may also include web beacons in e-mails to understand whether messages + have been opened, acted on, or forwarded. +

    + See “Your Privacy Choices and Rights” below to understand your choices + regarding these Technologies. +

    +
  • +
+
C. Personal Information Collected from Third-Party Sources
+

+ We may collect personal information from other sources, including third-party services and publicly available + sources. Third-party services include the eligible platforms (e.g., social media networks) that have been + approved to participate in the Site and with whom you have a user account (“Providers”). +

+
D. hCaptcha
+

+ We use the hCaptcha security service ("hCaptcha"). hCaptcha is used to check whether data + submitted on the Site website (such as submitting a login or contact form) has been entered by a human or by an + automated program. For more information about hCaptcha’s privacy policy and terms of use, please visit the + following links: https://www.hcaptcha.com/privacy and + https://www.hcaptcha.com/terms +

+

4. HOW WE USE PERSONAL INFORMATION

+

+ We use personal information for a variety of business purposes, including to operate the Site, for administrative + purposes, and to provide you with marketing materials, as described below. +

+
A. Operate the Site
+

We use personal information to fulfill our contract with you and operate the Site, such as:

+
    +
  • Determining your eligibility for, and providing you with, rewards from the Site;
  • +
  • Managing your information;
  • +
  • Providing access to certain areas, functionalities, and features of the Site;
  • +
  • Answering requests for support; and
  • +
  • Communicating with you.
  • +
+
B. Administrative Purposes
+

We use personal information for various administrative purposes, such as:

+
    +
  • + Pursuing our legitimate interests such as direct marketing, research and development, network and information + security, and fraud prevention; +
  • +
  • + Detecting security incidents, protecting against malicious, deceptive, fraudulent or illegal activity, and + prosecuting those responsible for that activity; +
  • +
  • Carrying out analytics;
  • +
  • Measuring interest and engagement in the Site;
  • +
  • Improving, upgrading, or enhancing the Site;
  • +
  • Developing new products and services;
  • +
  • Creating de-identified and/or aggregated information.
  • +
  • Ensuring internal quality control and safety;
  • +
  • + Authenticating and verifying individual identities, including requests to exercise your rights under this + Privacy Notice; +
  • +
  • Debugging to identify and repair errors with the Site;
  • +
  • Auditing relating to interactions, transactions, and other compliance activities;
  • +
  • Sharing personal information with third parties as needed to provide the Site;
  • +
  • Enforcing our agreements and policies; and
  • +
  • Carrying out activities that are required to comply with our legal obligations.
  • +
+
C. Marketing
+

+ We may use personal information to provide you with marketing about the Frequency Network Foundation and/or the + Site. We may provide you with these materials as permitted by applicable law. +

+

+ If you have any questions about our marketing practices, you may contact us at any time as set forth in “Contact Us” below. +

+
D. With Your Consent
+

+ We may use personal information for other purposes that are clearly disclosed to you at the time you provide + personal information or with your consent. +

+
E. Other Purposes
+

We also use personal information for other purposes as requested by you or as permitted by applicable law.

+

5. HOW WE DISCLOSE PERSONAL INFORMATION

+

+ We disclose personal information to third parties for a variety of business purposes, including to operate the + Program, to protect us or others, or in the event of a major business transaction such as a merger, sale, or asset + transfer, as described below. +

+
A. Disclosures to Operate the Site
+

The categories of third parties with whom we may share your personal information are described below.

+
    +
  • + Third-Party Services You Share or Interact With. In connection with the Site, you may share + information or interact with third-party services (each a “Third-Party Service”). +

    + For example, if you join the Frequency Discord, Discord may collect any personal information you provide or + otherwise make available via that channel. +

    +

    + If you share information or interact with a Third-Party Service, the information collected by the Third-Party + Service will also be subject to the Third-Party Service’s privacy policy. +

    +
  • +
  • + Service Providers. We may disclose personal information to our third-party service providers + and vendors that assist us with the operation of the Site. This includes service providers and vendors that + provide us with technical services, operations, analytics, marketing services, IT support, hosting, customer + service, and related services. +
  • +
  • + Business Partners. We may share your personal information with business partners to provide you + with a product or service you have requested. We may also share your personal information with business partners + with whom we jointly offer products or services. +
  • +
  • Affiliates. We may share your personal information with our corporate affiliates.
  • +
+
B. Disclosures to Protect Us or Others
+

+ We may access, preserve, and disclose any information we store associated with you to external parties if we, in + good faith, believe doing so is required or appropriate to: comply with law enforcement or national security + requests and legal process, such as a court order or subpoena; protect your, our, or others’ rights, property, or + safety; enforce our policies or contracts; collect amounts owed to us; or assist with an investigation or + prosecution of suspected or actual illegal activity. +

+
C. Disclosure in the Event of Merger, Sale, or Other Asset Transfers
+

+ If we are involved in a merger, acquisition, financing, reorganization, bankruptcy, receivership, purchase or sale + of assets, transition of service to another provider, or other similar corporate transaction, your personal + information may be disclosed, sold, or transferred as part of such a transaction. +

+

6. YOUR PRIVACY CHOICES AND RIGHTS

+

+ Your Privacy Choices. The privacy choices you may have about your personal information are + determined by applicable law and are described below. +

+
    +
  • + Email Communications. If you receive an unwanted email from us, you can use the unsubscribe + link found at the bottom of the email to opt out of receiving future emails. Note that you will continue to + receive transaction-related emails. We may also send you certain non-promotional communications regarding us and + the Site, and you will not be able to opt out of those communications (e.g., communications regarding the Site + or updates to this Privacy Notice). +
  • +
  • + “Do Not Track. Do Not Track (“DNT”) is a privacy preference + that users can set in certain web browsers. Please note that we do not respond to or honor DNT signals or + similar mechanisms transmitted by web browsers. +
  • +
  • + Cookies. You may stop or restrict the placement of Technologies on your device or remove them + by adjusting your preferences as your browser or device permits. However, if you adjust your preferences, the + digital properties that we operate in connection with the Site may not work properly. +

    Please note you must separately opt out in each browser and on each device.

    +
  • +
+ +

+ Your Privacy Rights. In accordance with applicable law, you may have the right to: +

+
    +
  • + Request Access to and Portability of Personal Information about you, including: (i) obtaining access + to or a copy of your personal information; and (ii) receiving an electronic copy of personal information that you + have provided to us, or asking us to send that information to another company in a structured, commonly used, and + machine-readable format (the “right of data portability”); +
  • +
  • + Request Correction of your personal information where it is inaccurate or incomplete; +
  • +
  • + Request Deletion of your personal information; +
  • +
  • + Request Restriction of or Object to our Processing of your personal information; and +
  • +
  • + Withdraw your Consent to our processing of your personal information. Please note that your withdrawal + will only take effect for future processing, and will not affect the lawfulness of processing before the withdrawal. +
  • +
+

+ If you would like to exercise any of these rights, please contact us as set forth in “Contact Us” below. We will + process such requests in accordance with applicable laws. +

+

+ If your personal information is subject to the applicable data protection laws of the European Economic Area or + Switzerland you have the right to lodge a complaint with the competent supervisory authority if you believe our + processing of your personal information violates applicable law. +

+ +

7. INTERNATIONAL TRANSFERS OF PERSONAL INFORMATION

+

+ All personal information processed by us may be transferred, processed, and stored anywhere in the world, + including, but not limited to, the United States or other countries, which may have data protection laws that are + different from the laws where you live. These countries may or may not have adequate data protection laws as + defined by the data protection authority in your country. +

+

+ If we transfer personal information which originates in the European Economic Area and/or Switzerland to a country + that has not been found to provide an adequate level of protection under applicable data protection laws, one of + the safeguards we may use to support such transfer is the EU Standard Contractual Clauses. +

+

+ For more information about the safeguards we use for international transfers of your personal information, please + contact us as set forth below. +

+

8. RETENTION OF PERSONAL INFORMATION

+

+ We store the personal information we collect as described in this Privacy Notice for as long as you participate in + the Site, or as necessary to fulfill the purpose(s) for which it was collected, operate the Site, resolve + disputes, establish legal defenses, conduct audits, pursue legitimate business purposes, enforce our agreements, + and comply with applicable laws. +

+

+ To determine the appropriate retention period for personal information, we may consider applicable legal + requirements, the amount, nature, and sensitivity of the personal information, certain risk factors, the purposes + for which we process your personal information, and whether we can achieve those purposes through other means. +

+

9. SUPPLEMENTAL NOTICE FOR EU GDPR

+

+ This Supplemental Notice for EU GDPR only applies to our processing of personal information that is subject to the + EU GDPR. +

+

+ The Frequency Network Foundation’s processing of your personal information may be supported by one or more of the + following legal bases: +

+
    +
  • + Performance of a Contract: The Frequency Network Foundation may need to process your personal + information to perform our contract with you. +
  • +
  • + Legitimate Interest: The Frequency Network Foundation may process your personal information to + further its legitimate interests, but only where our interests are not overridden by your interests or + fundamental rights and freedoms. +
  • +
  • + Consent: In some cases, the Frequency Network Foundation may also rely on your consent to + process your personal information. +
  • +
  • + Compliance with our Legal Obligations: The Frequency Network Foundation may process your + personal information to comply with our legal obligations. +
  • +
+

10. CHILDREN’S INFORMATION

+

+ The Site is not directed to children under 13 (or other age as required by local law outside the United States), + and we do not knowingly collect personal information from children. +

+

+ If you are a parent or guardian and believe your child has uploaded personal information to our site without your + consent, you may contact us as described in “Contact Us” below. If we become + aware that a child has provided us with personal information in violation of applicable law, we will delete any + personal information we have collected, unless we have a legal obligation to keep it, and terminate the child’s + account, if applicable. +

+

11. THIRD-PARTY WEBSITES/APPLICATIONS

+

+ The Site may contain links to other websites/applications and other websites/applications may reference or link to + our Site. These third-party services are not controlled by us. We encourage our users to read the privacy policies + of each website and application with which they interact. We do not endorse, screen, or approve, and are not + responsible for, the privacy practices or content of such other websites or applications. Providing personal + information to third-party websites or applications is at your own risk. +

+

12. CONTACT US

+

+ The Frequency Network Foundation is the controller of the personal information we process under this Privacy + Notice. +

+

+ If you have any questions about our privacy practices or this Privacy Notice, or to exercise your rights as + detailed in this Privacy Notice, please contact us at: privacy@frequency.xyz. +

+
+
+ + diff --git a/src/style/app.css b/src/style/app.css index db0f6253..acc8e8a9 100644 --- a/src/style/app.css +++ b/src/style/app.css @@ -14,6 +14,12 @@ @layer components { /* Typeography */ + .title-16 { + @apply font-title leading-[1] tracking-wider sm:text-[16px] md:text-[16px] lg:text-[16px]; + } + .title-50 { + @apply font-title leading-[1] tracking-wider sm:text-[40px] md:text-[44px] lg:text-[44px]; + } .title-75 { @apply font-title leading-[1] tracking-wide sm:text-[40px] md:text-[55px] lg:text-75; } @@ -33,13 +39,17 @@ } .paragraph-spacing-right { - @apply sm:pl-[90px] md:pl-[140px] lg:pl-[140px] lg:pr-0; + @apply sm:pl-[70px] md:pl-[140px] lg:pl-[140px] lg:pr-0; } .paragraph-spacing-left { @apply sm:pr-[100px] md:pr-[140px] lg:pl-0 lg:pr-[140px]; } + .svg-100 > svg { + @apply w-full; + } + /* Underline on hover animation */ .underline-on-hover { @apply relative block cursor-pointer overflow-hidden px-0 py-1; diff --git a/tailwind.config.js b/tailwind.config.js index 0390de4f..156bc4b2 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -25,6 +25,8 @@ export default { indigo: '#5E69FF', darkIndigo: '#445BC3', rose: '#A06B87', + red: '#EB5757', + gray: '#C8CDD0', }, width: { page: `${MAX_PAGE_WIDTH}px`, @@ -62,5 +64,5 @@ export default { horizontal: { raw: '(min-height: 700px) and (min-width: 1300px)' }, }, }, - safelist: ['after:bg-navy', 'after:bg-cream'], + safelist: ['after:bg-navy', 'after:bg-cream', 'invalid:border-red'], }; diff --git a/tests/test.ts b/tests/test.ts index e73b7a82..7cf32410 100644 --- a/tests/test.ts +++ b/tests/test.ts @@ -2,5 +2,15 @@ import { expect, test } from '@playwright/test'; test('index page has expected content', async ({ page }) => { await page.goto('/'); - await expect(page.getByText('Build at a higher Frequency')).toBeDefined(); + expect(page.getByText('Build at a higher Frequency')).toBeDefined(); +}); + +test('index page has a popout', async ({ page }) => { + await page.goto('/'); + const popoutButton = page.getByText('Get Notified'); + expect(popoutButton).toBeDefined(); + + await popoutButton.click(); + + expect(page.getByText("Interested in Frequency's ecosystem?")).toBeDefined(); });