diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 000000000..54cbf97cd --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,35 @@ +name: CD Pipeline + +on: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 + + - name: Login to Amazon ECR + run: aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 471112786669.dkr.ecr.us-east-1.amazonaws.com + + - name: Build and Push Docker image for multiple platforms + run: | + export DOCKER_CLI_EXPERIMENTAL=enabled + docker buildx create --use --name mybuilder + docker buildx build --platform linux/amd64,linux/arm64 -t 471112786669.dkr.ecr.us-east-1.amazonaws.com/socialites-app01:latest --push . + docker buildx rm mybuilder + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..b9a03e8fc --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,55 @@ +name: CI Pipeline + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + + services: + postgres: + image: postgres:13 + ports: + - 5432:5432 + env: + POSTGRES_DB: test_db + POSTGRES_USER: test_user + POSTGRES_PASSWORD: test_password + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Cache Maven dependencies + uses: actions/cache@v2 + with: + path: ~/.m2 + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Build with Maven + env: + DB_USERNAME: test_user + DB_PASSWORD: test_password + SPRING_PROFILES_ACTIVE: test + run: mvn clean install -X --debug + + - name: Test with Maven + env: + DB_USERNAME: test_user + DB_PASSWORD: test_password + SPRING_PROFILES_ACTIVE: test + run: | + mvn test -X --debug diff --git a/.gitignore b/.gitignore index c64b53754..24f0b3eab 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ dependency-reduced-pom.xml .factorypath .project .settings/ +AWSCLIV2.pkg diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..6ce45d27c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,33 @@ +# Stage 1: Build stage with Maven +FROM maven:3.8.4-openjdk-8 AS build +WORKDIR /app +COPY pom.xml . +RUN mvn dependency:go-offline +COPY src src +RUN mvn clean package -DskipTests + +# Stage 2: Production-ready stage with Alpine OpenJDK +FROM openjdk:8-jdk-alpine + +# Create a non-root user +RUN addgroup -S spring && adduser -S spring -G spring + +# Set the working directory +WORKDIR /app + +# Copy the JAR file from the build stage to the image +COPY --from=build /app/target/*.jar app.jar + +# Copy application properties +COPY src/main/resources/application.properties /app/config/application.properties +COPY src/main/resources/application-dev.properties /app/config/application-dev.properties + +# Change ownership of the application JAR +RUN chown -R spring:spring /app + +# Switch to the non-root user +USER spring:spring + +# Define the command to run your application +ENTRYPOINT ["java", "-jar", "app.jar"] + diff --git a/README.md b/README.md index 07505175c..cf35f0ed2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# Acebook - -This is a java/springboot project to be developed on. There's a video tour of the application [here](https://youtu.be/L1Zi9WOJ6xg) but you should read through these docs first. +# Socialites The application uses: - `maven` to build the project @@ -17,90 +15,9 @@ Below, you'll find specific learning objectives for each tool. - Fork and clone this repository to your machine - Open the codebase in an IDE like InteliJ or VSCode -- Create a new Postgres database called `acebook_springboot_development` +- Create a new Postgres database called `socialites_springboot_development` - Install Maven `brew install maven` - Build the app and start the server, using the Maven command `mvn spring-boot:run` > The database migrations will run automatically at this point -- Visit `http://localhost:8080/users/new` to sign up - -## Running the tests - -- Install chromedriver using `brew install chromedriver` -- Start the server in a terminal session `mvn spring-boot:run` -- Open a new terminal session and navigate to the Acebook directory -- Run your tests in the second terminal session with `mvn test` - -> All the tests should pass. If one or more fail, read the next section. - -## Common Setup Issues - -### The application is not running - -For the feature tests to execute properly, you'll need to have the server running in one terminal session and then use a second terminal session to run the tests. - -### Chromedriver is in the wrong place - -Selenium uses Chromedriver to interact with the Chrome browser. If you're on a Mac, Chromedriver needs to be in `/usr/local/bin`. You can find out where it is like this `which chromedriver`. If it's in the wrong place, move it using `mv`. - -### Chromedriver can't be opened - -Your Mac might refuse to open Chromedriver because it's from an unidentified developer. If you see a popup at that point, dismiss it by selecting `Cancel`, then go to `System Preferences`, `Security and Privacy`, `General`. You should see a message telling you that Chromedriver was blocked and, if so, there will be an `Open Anyway` button. Click that and then re-try your tests. - -## Existing features - -This app already has a few basic features -* A user can sign up at `/users/new` -* A signed up user can sign in at `/login` -* A signed in user can create posts at `/posts` -* A signed in user can sign out at `/logout` - -## Design - -This app uses the repository pattern. The repository pattern separates the business logic of models from the responsibility of connecting to the database and making queries. Take a look in the `src/main/java/repository` and you'll find `PostRepository` which generates and executes queries to Create, Read, Update and Delete (CRUD) posts. Depending on what you've built in the past, it might or might not feel familiar to you. - -## Initial learning goals - -You don't need an in-depth knowledge of each dependency listed above. Once you can tick off these learning goals, -you're ready to dive in. It's assumed that you can already TDD the Takeaway Challenge, or something of similar -complexity, in Java. It's OK if you need to pause here with Acebook and learn how to do that now :) - -### Maven -- [ ] I can explain what pom.xml is for -- [ ] I can start the app using Maven - -### Thymeleaf -- [ ] I can explain the code in `posts/index.html` -- [ ] I can plan a new template that could be used for editing a post - -### Flyway -- [ ] I can explain what a migration is -- [ ] I can explain when migrations are run -- [ ] I can explain the code in the two migration files in this directory `/db/migration/` -- [ ] I can explain the naming convention for flyway migration files - -### Selenium -- [ ] I can explain the code in `SignUpTest.java` -- [ ] I can write a new feature test for unsuccessful sign up - -### Faker -- [ ] I can explain what Faker does -- [ ] I can explain why it's useful - -### JUnit4 -- [ ] I can explain the code in `PostTest.java` -- [ ] I could add more test cases to `PostTest.java` - -### The repository pattern -- [ ] I can explain the repository pattern - -### SpringBoot -- [ ] I can diagram how this SpringBoot application handles `GET "/posts"` - -### Spring Security -- [ ] I can explain how this app is secured - -## Resources - - -* [Some great videos on Spring Security](https://www.youtube.com/watch?v=sm-8qfMWEV8&list=PLqq-6Pq4lTTYTEooakHchTGglSvkZAjnE). Don't watch them all, but do watch the first couple if you want an overview. +- Visit `http://eventwave.events/register` to sign up diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..4836df601 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4496 @@ +{ + "name": "socialites", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "socialites", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@relume_io/relume-tailwind": "^0.2.0", + "@relume_io/relume-ui": "^0.2.2", + "autoprefixer": "^10.4.19" + }, + "devDependencies": { + "postcss-cli": "^11.0.0", + "tailwindcss": "^3.4.4" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", + "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz", + "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collapsible": "1.0.3", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.4.tgz", + "integrity": "sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-use-size": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", + "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", + "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz", + "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", + "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.0.tgz", + "integrity": "sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", + "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", + "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", + "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", + "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", + "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, + "node_modules/@relume_io/relume-tailwind": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@relume_io/relume-tailwind/-/relume-tailwind-0.2.0.tgz", + "integrity": "sha512-b/E81Qosd+9U7Vvs8pUV0eq5vibV1ckl6fo9KoscungqJzp0cBkMJfUnP6xlxCnWR2CVq5f+0vuTdyhu/GBHpw==" + }, + "node_modules/@relume_io/relume-ui": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@relume_io/relume-ui/-/relume-ui-0.2.2.tgz", + "integrity": "sha512-AxOmFuVqmXqTp4vRf/qnGZgcTRU8YWCLnoybL8vH4DiGBnRuE0xQp7+u5iaOx+v38dsPr7XPPN6jwsQhNGSt1w==", + "dependencies": { + "@radix-ui/react-accordion": "1.1.2", + "@radix-ui/react-checkbox": "1.0.4", + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-label": "2.0.2", + "@radix-ui/react-radio-group": "^1.1.3", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "1.0.4", + "@relume_io/relume-tailwind": "0.2.0", + "class-variance-authority": "0.7.0", + "clsx": "2.1.0", + "embla-carousel-react": "^8.0.0", + "framer-motion": "^11.0.18", + "react-icons": "5.0.1", + "tailwind-merge": "2.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.808", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.808.tgz", + "integrity": "sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==" + }, + "node_modules/embla-carousel": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.1.5.tgz", + "integrity": "sha512-R6xTf7cNdR2UTNM6/yUPZlJFRmZSogMiRjJ5vXHO65II5MoUlrVYUAP0fHQei/py82Vf15lj+WI+QdhnzBxA2g==" + }, + "node_modules/embla-carousel-react": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.1.5.tgz", + "integrity": "sha512-xFmfxgJd7mpWDHQ4iyK1Qs+5BTTwu4bkn+mSROKiUH9nKpPHTeilQ+rpeQDCHRrAPeshD67aBk0/p6FxWxXsng==", + "dependencies": { + "embla-carousel": "8.1.5", + "embla-carousel-reactive-utils": "8.1.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.1.5.tgz", + "integrity": "sha512-76uZTrSaEGGta+qpiGkMFlLK0I7N04TdjZ2obrBhyggYIFDWlxk1CriIEmt2lisLNsa1IYXM85kr863JoCMSyg==", + "peerDependencies": { + "embla-carousel": "8.1.5" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "11.2.11", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.2.11.tgz", + "integrity": "sha512-n+ozoEzgJu/2h9NoQMokF+CwNqIRVyuRC4RwMPwklfrrTjbVV32k9uBIgqYAwn7Jfpt5LuDVCtT57MWz1FbaLw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.0.tgz", + "integrity": "sha512-xMITAI7M0u1yolVcXJ9XTZiO9aO49mcoKQy6pCDFdMh9kGqhzLVpWxeD/32M/QBmkhcGypZFFOLNLmIW4Pg4RA==", + "dev": true, + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^11.0.0", + "get-stdin": "^9.0.0", + "globby": "^14.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-icons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", + "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.2.tgz", + "integrity": "sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==", + "dependencies": { + "@babel/runtime": "^7.24.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..cbb35a7b6 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "socialites", + "version": "1.0.0", + "description": "The application uses: - `maven` to build the project - `thymeleaf` for templating - `flyway` to manage `postgres` db migrations - `selenium` for feature testing - `faker` to generate fake names for testing - `junit4` for unit testing - `spring-security` for authentication and user management", + "main": "index.js", + "dependencies": { + "@relume_io/relume-tailwind": "^0.2.0", + "@relume_io/relume-ui": "^0.2.2", + "autoprefixer": "^10.4.19" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build:css": "tailwindcss -i ./src/main/resources/static/styles/input.css -o ./src/main/resources/static/styles/output.css --watch" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "postcss-cli": "^11.0.0", + "tailwindcss": "^3.4.4" + } +} diff --git a/pom.xml b/pom.xml index 261744b50..d32195901 100644 --- a/pom.xml +++ b/pom.xml @@ -9,23 +9,15 @@ 1.0-SNAPSHOT - 1.8 - 1.8 + 1.8 + 2.6.2 - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.springframework.boot spring-boot-starter-parent - 2.1.1.RELEASE + 2.6.2 + @@ -36,45 +28,90 @@ + org.springframework.boot - spring-boot-starter + spring-boot-starter-web - - org.springframework.boot - spring-boot-starter-security - - + org.springframework.boot - spring-boot-starter-thymeleaf + spring-boot-starter-security - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 + org.springframework.boot + spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-data-jpa + + software.amazon.awssdk + s3 + 2.20.25 + + + software.amazon.awssdk + netty-nio-client + 2.20.25 + + + io.github.cdimascio + java-dotenv + 5.2.2 + + org.springframework.boot spring-boot-starter-data-rest + + org.springframework.boot + spring-boot-starter-oauth2-client + + + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 + + + org.springframework.boot spring-boot-devtools + runtime + + + + + com.h2database + h2 + runtime + + + org.postgresql + postgresql + + + org.flywaydb + flyway-core + + org.projectlombok lombok - 1.18.30 + 1.18.30 provided - com.h2database - h2 - runtime + javax.xml.bind + jaxb-api + 2.2.11 + + org.springframework.boot spring-boot-starter-test @@ -91,20 +128,42 @@ 0.15 test + + - javax.xml.bind - jaxb-api - 2.2.11 + org.asynchttpclient + async-http-client + 2.12.3 - org.postgresql - postgresql - - - org.flywaydb - flyway-core + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 - + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + + + + + diff --git a/src/main/java/com/makersacademy/acebook/SecurityConfiguration.java b/src/main/java/com/makersacademy/acebook/SecurityConfiguration.java deleted file mode 100644 index a6829646e..000000000 --- a/src/main/java/com/makersacademy/acebook/SecurityConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.makersacademy.acebook; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.crypto.password.NoOpPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - -import javax.sql.DataSource; - -@EnableWebSecurity -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { - - @Autowired - DataSource dataSource; - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.jdbcAuthentication() - .dataSource(dataSource); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/posts").hasRole("USER") - .antMatchers("/users").permitAll() - .and().formLogin(); - } - - @Bean - public PasswordEncoder getPasswordEncoder() { - return NoOpPasswordEncoder.getInstance(); - } -} diff --git a/src/main/java/com/makersacademy/acebook/config/CustomPasswordEncoder.java b/src/main/java/com/makersacademy/acebook/config/CustomPasswordEncoder.java new file mode 100644 index 000000000..9875a3d00 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/config/CustomPasswordEncoder.java @@ -0,0 +1,20 @@ +package com.makersacademy.acebook.config; + +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.NoOpPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +public class CustomPasswordEncoder implements PasswordEncoder { + private final PasswordEncoder bcryptEncoder = new BCryptPasswordEncoder(); + private final PasswordEncoder noopEncoder = NoOpPasswordEncoder.getInstance(); + + @Override + public String encode(CharSequence rawPassword) { + return bcryptEncoder.encode(rawPassword); + } + + @Override + public boolean matches(CharSequence rawPassword, String encodedPassword) { + return bcryptEncoder.matches(rawPassword, encodedPassword); + } +} diff --git a/src/main/java/com/makersacademy/acebook/config/S3Config.java b/src/main/java/com/makersacademy/acebook/config/S3Config.java new file mode 100644 index 000000000..37abfad7d --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/config/S3Config.java @@ -0,0 +1,19 @@ +package com.makersacademy.acebook.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; + +@Configuration +public class S3Config { + + @Bean + public S3Client s3Client() { + return S3Client.builder() + .region(Region.US_EAST_1) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + } +} diff --git a/src/main/java/com/makersacademy/acebook/config/SecurityConfig.java b/src/main/java/com/makersacademy/acebook/config/SecurityConfig.java new file mode 100644 index 000000000..fbed26032 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/config/SecurityConfig.java @@ -0,0 +1,71 @@ +package com.makersacademy.acebook.config; + +import com.makersacademy.acebook.service.CustomOAuth2UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.client.oidc.web.logout.OidcClientInitiatedLogoutSuccessHandler; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.web.SecurityFilterChain; + +@EnableWebSecurity + + +@Configuration +public class SecurityConfig { + + @Autowired + private CustomOAuth2UserService customOAuth2UserService; +// for google logout + @Autowired + private ClientRegistrationRepository clientRegistrationRepository; + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + OidcClientInitiatedLogoutSuccessHandler oidcLogoutSuccessHandler = new OidcClientInitiatedLogoutSuccessHandler(clientRegistrationRepository); + oidcLogoutSuccessHandler.setPostLogoutRedirectUri("{baseUrl}/login?logout"); + + http + .cors().and() + .authorizeRequests(authorizeRequests -> + authorizeRequests + .antMatchers("/", "/login", "/register","/images/**", "/users","/error/**", "/styles/**", "/search", "/events", "/oauth2/**", "/assets/**","/events/details/**","/events/third-party-events", "/templates/**").permitAll() + .anyRequest().authenticated() + ) + .formLogin(formLogin -> + formLogin + .loginPage("/login") + .defaultSuccessUrl("/ ", true) + .permitAll() + ) + .oauth2Login(oauth2Login -> + oauth2Login + .loginPage("/login") + .userInfoEndpoint(userInfoEndpoint -> + userInfoEndpoint.userService(customOAuth2UserService) + ) + .defaultSuccessUrl("/ ", true) + ) + .logout(logout -> + logout + .logoutUrl("/logout") + .logoutSuccessHandler(oidcLogoutSuccessHandler) // Ensure both OAuth2 and form logins are handled + .permitAll() + + + ); + + return http.build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new CustomPasswordEncoder(); + } +} + + + diff --git a/src/main/java/com/makersacademy/acebook/config/WebConfig.java b/src/main/java/com/makersacademy/acebook/config/WebConfig.java new file mode 100644 index 000000000..2cd58ae01 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/config/WebConfig.java @@ -0,0 +1,25 @@ +package com.makersacademy.acebook.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig { + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("https://qxvdpmwpb4.us-east-1.awsapprunner.com", + "https://eventwave.events") + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true); + } + }; + } +} diff --git a/src/main/java/com/makersacademy/acebook/controller/AttendeesController.java b/src/main/java/com/makersacademy/acebook/controller/AttendeesController.java new file mode 100644 index 000000000..cc8b5abaf --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/controller/AttendeesController.java @@ -0,0 +1,24 @@ +package com.makersacademy.acebook.controller; + +import com.makersacademy.acebook.model.Attendee; +import com.makersacademy.acebook.service.AttendeesService; +import net.minidev.json.JSONUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.servlet.view.RedirectView; + +@Controller +public class AttendeesController { + + @Autowired + private AttendeesService attendeesService; + + @PostMapping("/events/attend/{eventId}") + public RedirectView createAttendee(@PathVariable Long eventId, Authentication authentication, Attendee attendee) { + attendeesService.save(attendee, eventId, authentication); + return new RedirectView("/"); + } +} diff --git a/src/main/java/com/makersacademy/acebook/controller/CustomErrorController.java b/src/main/java/com/makersacademy/acebook/controller/CustomErrorController.java new file mode 100644 index 000000000..ade6dee6b --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/controller/CustomErrorController.java @@ -0,0 +1,23 @@ +package com.makersacademy.acebook.controller; + +import org.springframework.boot.web.servlet.error.ErrorController; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpServletRequest; + +@Controller +public class CustomErrorController implements ErrorController { + + @RequestMapping("/error") + public String handleError(HttpServletRequest request, Model model) { + Object status = request.getAttribute("javax.servlet.error.status_code"); + Object message = request.getAttribute("javax.servlet.error.message"); + + model.addAttribute("status", status); + model.addAttribute("message", message); + + return "error"; + } +} diff --git a/src/main/java/com/makersacademy/acebook/controller/EventsController.java b/src/main/java/com/makersacademy/acebook/controller/EventsController.java new file mode 100644 index 000000000..b4d509065 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/controller/EventsController.java @@ -0,0 +1,101 @@ +package com.makersacademy.acebook.controller; + +import com.makersacademy.acebook.model.Comment; +import com.makersacademy.acebook.model.Event; +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.repository.CommentsRepository; +import com.makersacademy.acebook.repository.EventRepository; +import com.makersacademy.acebook.repository.UserRepository; +import com.makersacademy.acebook.service.CommentService; +import com.makersacademy.acebook.service.EventService; +import com.makersacademy.acebook.service.S3Service; +import com.makersacademy.acebook.service.ThirdPartyEventService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.view.RedirectView; + +import java.io.IOException; +import java.util.Date; +import java.util.Optional; + +@Controller +public class EventsController { + + @Autowired + EventRepository eventRepository; + + @Autowired + CommentsRepository commentsRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private CommentService commentService; + + @Autowired + private ThirdPartyEventService thirdPartyEventService; + + @Autowired + private EventService eventService; + + @Autowired + private S3Service s3Service; + + @GetMapping("/events/new") + public String addEvent(Model model) { + Iterable events = eventRepository.findAll(); + model.addAttribute("events", events); + model.addAttribute("event", new Event()); + return "events/new"; + } + + @PostMapping("/events/new") + public RedirectView create(@ModelAttribute Event event, + Authentication authentication, + @RequestParam("image") MultipartFile image) { + User currentUser = userRepository.findByUsername(authentication.getName()); + event.setCreatedAt(new Date()); + event.setUser(currentUser); + try { + eventService.savePost(event, image); + } catch (IOException e) { + e.printStackTrace(); + return new RedirectView("/"); + } + + eventRepository.save(event); + return new RedirectView("/"); + } + + @GetMapping("/events/details/{eventId}") + public String showEventDetails(@PathVariable Long eventId, Model model) { + + // Fetch comments for event + Iterable comments = commentsRepository.findByEventIdOrderByCreatedAtDesc(eventId); + model.addAttribute("comments", comments); + model.addAttribute("comment", new Comment()); + + // Fetch the event details from the repository + Optional optionalEvent = eventRepository.findById(eventId); + + if (optionalEvent.isPresent()) { + Event event = optionalEvent.get(); + model.addAttribute("event", event); + return "events/details"; + } else { + // Handle the case where the event is not found + return "redirect:/error"; + } + } + + @PostMapping("/events/details/{eventId}/comments/new") + public RedirectView createComment(@PathVariable Long eventId, Comment comment, Authentication authentication) { + commentService.save(comment, eventId, authentication); + return new RedirectView("/events/details/{eventId}"); + } +} diff --git a/src/main/java/com/makersacademy/acebook/controller/LandingPageController.java b/src/main/java/com/makersacademy/acebook/controller/LandingPageController.java new file mode 100644 index 000000000..d5050ad39 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/controller/LandingPageController.java @@ -0,0 +1,91 @@ +package com.makersacademy.acebook.controller; + +import com.makersacademy.acebook.model.Attendee; +import com.makersacademy.acebook.model.Event; +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.repository.AttendeesRepository; +import com.makersacademy.acebook.repository.EventRepository; +import com.makersacademy.acebook.repository.UserRepository; +import com.makersacademy.acebook.service.AttendeesService; +import com.makersacademy.acebook.service.SearchService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.view.RedirectView; + +import java.util.Date; +import java.util.List; + +@CrossOrigin +@Controller +public class LandingPageController { + + @Autowired + private UserRepository userRepository; + + @Autowired + private EventRepository eventRepository; + + @Autowired + private SearchService searchService; + + @Autowired + private AttendeesService attendeesService; + + @Autowired + private AttendeesRepository attendeesRepository; + + @RequestMapping(value = "/") + public RedirectView index() { + return new RedirectView("/landingpage"); + } + + @GetMapping("/") + public String userEvents(Model model, + @AuthenticationPrincipal Object principal, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date minScheduledDate, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date maxScheduledDate, + @RequestParam(required = false) String keyword) { + String username; + if (principal instanceof UserDetails) { + username = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + username = ((OAuth2User) principal).getAttribute("name"); + } else { + username = "User"; + } + + model.addAttribute("name", username); + + List events; + if (keyword != null && !keyword.isEmpty()) { + events = searchService.searchEvents(keyword); + } else if (minScheduledDate != null && maxScheduledDate != null) { + events = eventRepository.findByScheduledDateBetween(minScheduledDate, maxScheduledDate); + } else { + events = eventRepository.findAllByOrderByScheduledDateDesc(); + } + + User user = userRepository.findByUsername(username); + for (Event event: events) { + event.setAttendees(attendeesRepository.countByEvent(event)); + List userAttendees = attendeesRepository.findByUserAndEvent(user, event); + event.setUserAttending(!userAttendees.isEmpty()); + } + + List users = userRepository.findAll(); + model.addAttribute("users", users); + model.addAttribute("events", events); + model.addAttribute("event", new Event()); + + return "landingpage"; + } +} \ No newline at end of file diff --git a/src/main/java/com/makersacademy/acebook/controller/LoginController.java b/src/main/java/com/makersacademy/acebook/controller/LoginController.java new file mode 100644 index 000000000..940803670 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/controller/LoginController.java @@ -0,0 +1,18 @@ +package com.makersacademy.acebook.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class LoginController { + + @GetMapping("/login") + public String login() { + return "login"; + } + + @GetMapping("/loginSuccess") + public String loginSuccess() { + return "redirect:/"; + } +} diff --git a/src/main/java/com/makersacademy/acebook/controller/HomeController.java b/src/main/java/com/makersacademy/acebook/controller/LogoutController.java similarity index 53% rename from src/main/java/com/makersacademy/acebook/controller/HomeController.java rename to src/main/java/com/makersacademy/acebook/controller/LogoutController.java index 2036ec7e0..bd1d531f3 100644 --- a/src/main/java/com/makersacademy/acebook/controller/HomeController.java +++ b/src/main/java/com/makersacademy/acebook/controller/LogoutController.java @@ -1,13 +1,14 @@ package com.makersacademy.acebook.controller; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.view.RedirectView; @Controller -public class HomeController { - @RequestMapping(value = "/") - public RedirectView index() { - return new RedirectView("/posts"); - } +public class LogoutController { + @PostMapping("/logout") + public RedirectView logout() { + return new RedirectView("/login"); + } } diff --git a/src/main/java/com/makersacademy/acebook/controller/PostsController.java b/src/main/java/com/makersacademy/acebook/controller/PostsController.java deleted file mode 100644 index 57a7e5f4d..000000000 --- a/src/main/java/com/makersacademy/acebook/controller/PostsController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.makersacademy.acebook.controller; - -import com.makersacademy.acebook.model.Post; -import com.makersacademy.acebook.repository.PostRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.view.RedirectView; - -import java.util.List; - -@Controller -public class PostsController { - - @Autowired - PostRepository repository; - - @GetMapping("/posts") - public String index(Model model) { - Iterable posts = repository.findAll(); - model.addAttribute("posts", posts); - model.addAttribute("post", new Post()); - return "posts/index"; - } - - @PostMapping("/posts") - public RedirectView create(@ModelAttribute Post post) { - repository.save(post); - return new RedirectView("/posts"); - } -} diff --git a/src/main/java/com/makersacademy/acebook/controller/RegistrationController.java b/src/main/java/com/makersacademy/acebook/controller/RegistrationController.java new file mode 100644 index 000000000..d6318d352 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/controller/RegistrationController.java @@ -0,0 +1,37 @@ +package com.makersacademy.acebook.controller; + +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@Controller +public class RegistrationController { + + @Autowired + private UserService userService; + + @GetMapping("/register") + public String showRegistrationForm(Model model) { + model.addAttribute("user", new User()); + return "register"; + } + + @PostMapping("/register") + public String registerUser(User user, RedirectAttributes redirectAttributes) { + try { + userService.save(user); + redirectAttributes.addFlashAttribute("message", "User registered successfully"); + return "redirect:/login"; // Redirect to login after successful registration + } catch (IllegalArgumentException e) { + redirectAttributes.addFlashAttribute("error", e.getMessage()); + return "redirect:/register"; // Redirect back to register page if there is an error + } + } +} diff --git a/src/main/java/com/makersacademy/acebook/controller/ThirdPartyEventController.java b/src/main/java/com/makersacademy/acebook/controller/ThirdPartyEventController.java new file mode 100644 index 000000000..32fe98f98 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/controller/ThirdPartyEventController.java @@ -0,0 +1,54 @@ +package com.makersacademy.acebook.controller; + +import com.makersacademy.acebook.model.Event; +import com.makersacademy.acebook.model.ThirdPartyEvent; +import com.makersacademy.acebook.service.ThirdPartyEventService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Date; +import java.util.List; +import java.util.concurrent.ExecutionException; + +@Controller + +public class ThirdPartyEventController { + + @Autowired + private ThirdPartyEventService thirdPartyEventService; + + @GetMapping("/events/third-party-events") + public String getDefaultTPEvents(Model model) { + try { + List thirdPartyEvents = thirdPartyEventService.getDefaultTPEvents().get(); + model.addAttribute("thirdPartyEvents", thirdPartyEvents); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + // model.addAttribute("thirdPartyEvents", List.of()); + } + return "events/third-party-events"; + } + + @GetMapping("/events/third-party-events/search") + public String searchTPEvents(Model model, @AuthenticationPrincipal Object principal, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date minScheduledDate, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date maxScheduledDate) { + + + try { + List thirdPartyEvents = thirdPartyEventService.searchTPEvents(minScheduledDate, maxScheduledDate).get(); + model.addAttribute("thirdPartyEvents", thirdPartyEvents); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + // model.addAttribute("thirdPartyEvents", List.of()); + } + return "events/third-party-events"; + } +} diff --git a/src/main/java/com/makersacademy/acebook/controller/UserController.java b/src/main/java/com/makersacademy/acebook/controller/UserController.java new file mode 100644 index 000000000..a4898a585 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/controller/UserController.java @@ -0,0 +1,254 @@ +package com.makersacademy.acebook.controller; + +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@Controller +public class UserController { + + @Autowired + private UserService userService; + + + @GetMapping("/account") + public String accountPage(@AuthenticationPrincipal Object principal, Model model) { + User user = null; +// boolean isAuthenticated = false; + + + if (principal instanceof UserDetails) { + UserDetails currentUser = (UserDetails) principal; + user = userService.findByUsername(currentUser.getUsername()); +// isAuthenticated = true; + + } else if (principal instanceof OAuth2User) { + OAuth2User oauthUser = (OAuth2User) principal; + String email = oauthUser.getAttribute("email"); + user = userService.findByEmail(email); +// isAuthenticated = true; + + } + + if (user != null) { + model.addAttribute("user", user); +// model.addAttribute("isAuthenticated", isAuthenticated); + + return "account"; + } else { + return "redirect:/login"; + } + } + + @PostMapping("/account") + public String updateAccount(@AuthenticationPrincipal Object principal, User updatedUser, RedirectAttributes redirectAttributes) { + User user = null; + + if (principal instanceof UserDetails) { + UserDetails currentUser = (UserDetails) principal; + user = userService.findByUsername(currentUser.getUsername()); + + } else if (principal instanceof OAuth2User) { + OAuth2User oauthUser = (OAuth2User) principal; + String email = oauthUser.getAttribute("email"); + user = userService.findByEmail(email); + } + + if (user == null) { + redirectAttributes.addFlashAttribute("error", "User not authenticated."); + return "redirect:/login"; + } + + // Update username if provided and different + if (updatedUser.getUsername() != null && !updatedUser.getUsername().isEmpty() && !updatedUser.getUsername().equals(user.getUsername())) { + if (userService.findByUsername(updatedUser.getUsername()) != null) { + redirectAttributes.addFlashAttribute("error", "Username already exists. Please choose another one."); + return "redirect:/account"; + } + user.setUsername(updatedUser.getUsername()); + } + + // Update email if provided and different + if (updatedUser.getEmail() != null && !updatedUser.getEmail().isEmpty() && !updatedUser.getEmail().equals(user.getEmail())) { + if (userService.findByEmail(updatedUser.getEmail()) != null) { + redirectAttributes.addFlashAttribute("error", "Email already exists. Please choose another one."); + return "redirect:/account"; + } + user.setEmail(updatedUser.getEmail()); + } + + // Update other fields + user.setLanguage(updatedUser.getLanguage()); + user.setCity(updatedUser.getCity()); + + try { + userService.update(user); + redirectAttributes.addFlashAttribute("message", "Account updated successfully!"); + } catch (IllegalArgumentException e) { + redirectAttributes.addFlashAttribute("error", e.getMessage()); + } + + return "redirect:/account"; + } + + @GetMapping("/account/password") + public String passwordPage(@AuthenticationPrincipal Object principal, RedirectAttributes redirectAttributes, Model model) { + User user = null; + + if (principal instanceof UserDetails) { + UserDetails currentUser = (UserDetails) principal; + user = userService.findByUsername(currentUser.getUsername()); + + } else if (principal instanceof OAuth2User) { + OAuth2User oauthUser = (OAuth2User) principal; + String email = oauthUser.getAttribute("email"); + user = userService.findByEmail(email); + } + + if (user == null) { + redirectAttributes.addFlashAttribute("error", "User not authenticated."); + return "redirect:/login"; + } + + if (user.getPassword() == null || user.getPassword().isEmpty()) { + redirectAttributes.addFlashAttribute("error", "You cannot change your password because your account does not have a password set."); + return "redirect:/account"; + } + + model.addAttribute("user", user); + return "updatePassword"; + } + + @PostMapping("/account/password") + public String changePassword(@AuthenticationPrincipal Object principal, String newPassword, String confirmPassword, RedirectAttributes redirectAttributes) { + User user = null; + + if (principal instanceof UserDetails) { + UserDetails currentUser = (UserDetails) principal; + user = userService.findByUsername(currentUser.getUsername()); + + } else if (principal instanceof OAuth2User) { + OAuth2User oauthUser = (OAuth2User) principal; + String email = oauthUser.getAttribute("email"); + user = userService.findByEmail(email); + } + + if (user == null) { + redirectAttributes.addFlashAttribute("error", "User not authenticated."); + return "redirect:/login"; + } + + if (user.getPassword() == null || user.getPassword().isEmpty()) { + redirectAttributes.addFlashAttribute("error", "You cannot change your password because your account does not have a password set."); + return "redirect:/account"; + } + + if (!newPassword.equals(confirmPassword)) { + redirectAttributes.addFlashAttribute("error", "Passwords do not match."); + return "redirect:/account/password"; + } + + userService.changePassword(user, newPassword); + redirectAttributes.addFlashAttribute("message", "Password changed successfully!"); + return "redirect:/account"; + } + + @GetMapping("/account/login/oauth2/code/google") + public String handleGoogleLogin(OAuth2AuthenticationToken token, RedirectAttributes redirectAttributes) { + OAuth2User oauthUser = token.getPrincipal(); + String email = oauthUser.getAttribute("email"); + User user = userService.findByEmail(email); + + if (user == null) { + user = new User(); + user.setUsername(email); + user.setEmail(email); + user.setEnabled(true); + userService.save(user); + } + + redirectAttributes.addFlashAttribute("message", "Logged in with Google successfully!"); + return ""; + } +} + +// @Controller +// @RequestMapping("/account") +// public class UserController { +// @Autowired +// private UserService userService; + + +// @GetMapping +// public String accountPage(@AuthenticationPrincipal Object principal, Model model) { +// User user = null; +// // boolean isAuthenticated = false; + + +// if (principal instanceof UserDetails) { +// UserDetails currentUser = (UserDetails) principal; +// user = userService.findByUsername(currentUser.getUsername()); +// // isAuthenticated = true; + +// } else if (principal instanceof OAuth2User) { +// OAuth2User oauthUser = (OAuth2User) principal; +// String email = oauthUser.getAttribute("email"); +// user = userService.findByEmail(email); +// // isAuthenticated = true; + +// } + +// if (user != null) { +// model.addAttribute("user", user); +// // model.addAttribute("isAuthenticated", isAuthenticated); + +// return "/account"; +// } else { +// return "redirect:/login"; +// } +// } + +// @PostMapping +// public String updateAccount(@AuthenticationPrincipal UserDetails currentUser, User updatedUser, RedirectAttributes redirectAttributes) { +// User user = userService.findByUsername(currentUser.getUsername()); +// user.setUsername(updatedUser.getUsername()); +// if (!updatedUser.getPassword().isEmpty()) { +// user.setPassword(updatedUser.getPassword()); // The password will be encoded in the service +// } +// user.setEmail(updatedUser.getEmail()); +// user.setLanguage(updatedUser.getLanguage()); +// user.setCity(updatedUser.getCity()); +// userService.save(user); +// redirectAttributes.addFlashAttribute("message", "Account updated successfully!"); + +// return "redirect:/account"; +// } + +// @GetMapping("/login/oauth2/code/google") +// public String handleGoogleLogin(OAuth2AuthenticationToken token, RedirectAttributes redirectAttributes) { +// OAuth2User oauthUser = token.getPrincipal(); +// String email = oauthUser.getAttribute("email"); +// User user = userService.findByEmail(email); + +// if (user == null) { +// user = new User(); +// user.setUsername(email); +// user.setEmail(email); +// user.setEnabled(true); +// userService.save(user); +// } + +// redirectAttributes.addFlashAttribute("message", "Logged in with Google successfully!"); +// return "events/new"; +// } +// } diff --git a/src/main/java/com/makersacademy/acebook/controller/UsersController.java b/src/main/java/com/makersacademy/acebook/controller/UsersController.java deleted file mode 100644 index 3c46bf0a1..000000000 --- a/src/main/java/com/makersacademy/acebook/controller/UsersController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.makersacademy.acebook.controller; - -import com.makersacademy.acebook.model.Authority; -import com.makersacademy.acebook.model.User; -import com.makersacademy.acebook.repository.AuthoritiesRepository; -import com.makersacademy.acebook.repository.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.servlet.view.RedirectView; - -@Controller -public class UsersController { - - @Autowired - UserRepository userRepository; - @Autowired - AuthoritiesRepository authoritiesRepository; - - @GetMapping("/users/new") - public String signup(Model model) { - model.addAttribute("user", new User()); - return "users/new"; - } - - @PostMapping("/users") - public RedirectView signup(@ModelAttribute User user) { - userRepository.save(user); - Authority authority = new Authority(user.getUsername(), "ROLE_USER"); - authoritiesRepository.save(authority); - return new RedirectView("/login"); - } -} diff --git a/src/main/java/com/makersacademy/acebook/model/Attendee.java b/src/main/java/com/makersacademy/acebook/model/Attendee.java new file mode 100644 index 000000000..d1c6a1095 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/model/Attendee.java @@ -0,0 +1,32 @@ +package com.makersacademy.acebook.model; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; + +@Data +@Entity +@Table(name = "ATTENDEES", + uniqueConstraints = { + @UniqueConstraint(columnNames = + {"user_id", "event_id"}) + }) +public class Attendee { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Setter + @Getter + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Setter + @Getter + @ManyToOne + @JoinColumn(name = "event_id", nullable = false) + private Event event; +} diff --git a/src/main/java/com/makersacademy/acebook/model/Comment.java b/src/main/java/com/makersacademy/acebook/model/Comment.java new file mode 100644 index 000000000..3d05f4058 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/model/Comment.java @@ -0,0 +1,61 @@ +package com.makersacademy.acebook.model; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +@Data +@Entity +@Table(name = "COMMENTS") +public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Setter + @Getter + private String content; + + @Setter + @Getter + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createdAt; + + @Setter + @Getter + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Setter + @Getter + @ManyToOne + @JoinColumn(name = "event_id", nullable = false) + private Event event; + + + private static final DateTimeFormatter INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm"); + + public Comment () { + } + + public String getFormattedCreatedAt() { + return formatDateTime(String.valueOf(createdAt)); + } + + private String formatDateTime(String dateTime) { + if (dateTime != null && !dateTime.isEmpty()) { + LocalDateTime localDateTime = LocalDateTime.parse(dateTime, INPUT_FORMATTER); + return localDateTime.format(OUTPUT_FORMATTER); + } + return null; + } +} + diff --git a/src/main/java/com/makersacademy/acebook/model/Event.java b/src/main/java/com/makersacademy/acebook/model/Event.java new file mode 100644 index 000000000..f8abc6957 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/model/Event.java @@ -0,0 +1,66 @@ +package com.makersacademy.acebook.model; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.time.LocalDateTime; +import java.util.Date; + +@Data +@Entity +@Table(name = "EVENTS") +public class Event { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Setter + @Getter + private String title; + + @Setter + @Getter + private String description; + + @Setter + @Getter + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date scheduledDate; + + @Setter + @Getter + private String scheduledStartTime; + + @Setter + @Getter + private String scheduledEndTime; + + @Setter + @Getter + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createdAt; + + @Setter + @Getter + private String location; + + @Setter + @Getter + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Setter + @Getter + private String eventImageUrl; + + @javax.persistence.Transient + private Long attendees; + + @javax.persistence.Transient + private Boolean userAttending; +} diff --git a/src/main/java/com/makersacademy/acebook/model/Post.java b/src/main/java/com/makersacademy/acebook/model/Post.java deleted file mode 100644 index 0098de1b3..000000000 --- a/src/main/java/com/makersacademy/acebook/model/Post.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.makersacademy.acebook.model; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.GenerationType; - -import lombok.Data; - -@Data -@Entity -@Table(name = "POSTS") -public class Post { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String content; - - public Post() {} - - public Post(String content) { - this.content = content; - } - public String getContent() { return this.content; } - public void setContent(String content) { this.content = content; } - -} diff --git a/src/main/java/com/makersacademy/acebook/model/ThirdPartyEvent.java b/src/main/java/com/makersacademy/acebook/model/ThirdPartyEvent.java new file mode 100644 index 000000000..16fa53d18 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/model/ThirdPartyEvent.java @@ -0,0 +1,50 @@ +package com.makersacademy.acebook.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@JsonIgnoreProperties(ignoreUnknown = true) + +@Data +public class ThirdPartyEvent { + + @JsonProperty("event_id") + private String eventId; + private String name; + private String link; + private String description; + + @JsonProperty("start_time") + private String startTime; + @JsonProperty("end_time") + private String endTime; + private ThirdPartyVenue venue; + private String thumbnail; + + + private static final DateTimeFormatter INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm"); + + public ThirdPartyEvent () { + } + + public String getFormattedStartTime() { + return formatDateTime(startTime); + } + + public String getFormattedEndTime() { + return formatDateTime(endTime); + } + + private String formatDateTime(String dateTime) { + if (dateTime != null && !dateTime.isEmpty()) { + LocalDateTime localDateTime = LocalDateTime.parse(dateTime, INPUT_FORMATTER); + return localDateTime.format(OUTPUT_FORMATTER); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/makersacademy/acebook/model/ThirdPartyVenue.java b/src/main/java/com/makersacademy/acebook/model/ThirdPartyVenue.java new file mode 100644 index 000000000..911bbb6d7 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/model/ThirdPartyVenue.java @@ -0,0 +1,14 @@ +package com.makersacademy.acebook.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.HashMap; + +@JsonIgnoreProperties(ignoreUnknown = true) + +@Data + +public class ThirdPartyVenue { + private String full_address; +} diff --git a/src/main/java/com/makersacademy/acebook/model/User.java b/src/main/java/com/makersacademy/acebook/model/User.java index df2a0edf1..5b90400fb 100644 --- a/src/main/java/com/makersacademy/acebook/model/User.java +++ b/src/main/java/com/makersacademy/acebook/model/User.java @@ -1,26 +1,49 @@ package com.makersacademy.acebook.model; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.GenerationType; - +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; import static java.lang.Boolean.TRUE; @Data +@AllArgsConstructor @Entity @Table(name = "USERS") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + + @Getter + @Setter private String username; - private String password; + + @Getter + @Setter + private String password; // This can be null for Google users + private boolean enabled; + @Getter + @Setter + private String email; + + @Getter + @Setter + private String profilePictureUrl; + + @Getter + @Setter + private String language; + + @Getter + @Setter + private String city; + public User() { this.enabled = TRUE; } @@ -31,14 +54,13 @@ public User(String username, String password) { this.enabled = TRUE; } - public User(String username, String password, boolean enabled) { + public User(String username, String password, String email, boolean enabled) { this.username = username; this.password = password; + this.email = email; + this.enabled = enabled; } - public String getUsername() { return this.username; } - public String getPassword() { return this.password; } - public void setUsername(String username) { this.username = username; } - public void setPassword(String password) { this.password = password; } + } diff --git a/src/main/java/com/makersacademy/acebook/repository/AttendeesRepository.java b/src/main/java/com/makersacademy/acebook/repository/AttendeesRepository.java new file mode 100644 index 000000000..80a7b703b --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/repository/AttendeesRepository.java @@ -0,0 +1,14 @@ +package com.makersacademy.acebook.repository; + +import com.makersacademy.acebook.model.Attendee; +import com.makersacademy.acebook.model.Event; +import com.makersacademy.acebook.model.User; +import org.springframework.data.repository.CrudRepository; + +import java.util.List; + +public interface AttendeesRepository extends CrudRepository { + public Long countByEvent (Event event); + // Modify this method to return a List of attendees + List findByUserAndEvent(User user, Event event); +} diff --git a/src/main/java/com/makersacademy/acebook/repository/CommentsRepository.java b/src/main/java/com/makersacademy/acebook/repository/CommentsRepository.java new file mode 100644 index 000000000..3d11d4787 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/repository/CommentsRepository.java @@ -0,0 +1,8 @@ +package com.makersacademy.acebook.repository; + +import com.makersacademy.acebook.model.Comment; +import org.springframework.data.repository.CrudRepository; + +public interface CommentsRepository extends CrudRepository { + Iterable findByEventIdOrderByCreatedAtDesc(Long eventId); +} diff --git a/src/main/java/com/makersacademy/acebook/repository/EventRepository.java b/src/main/java/com/makersacademy/acebook/repository/EventRepository.java new file mode 100644 index 000000000..77dfa854f --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/repository/EventRepository.java @@ -0,0 +1,21 @@ +package com.makersacademy.acebook.repository; + +import com.makersacademy.acebook.model.Event; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; + +import java.util.Date; +import java.util.List; + +public interface EventRepository extends CrudRepository { + + + + // Method to find events by a specific scheduledDate + List findByScheduledDateBetween(Date minScheduledDate, Date maxScheduledDate); + // Searching term + @Query("SELECT e FROM Event e WHERE LOWER(e.title) LIKE LOWER(CONCAT('%', :keyword, '%')) OR LOWER(e.user.username) LIKE LOWER(CONCAT('%', :keyword, '%')) OR LOWER(e.location) LIKE LOWER(CONCAT('%', :keyword, '%'))") + List searchEventsByTitleOrUsernameOrLocation(@Param("keyword") String keyword); + // Method to fetch all events ordered by scheduledDate in descending order + List findAllByOrderByScheduledDateDesc();} diff --git a/src/main/java/com/makersacademy/acebook/repository/PostRepository.java b/src/main/java/com/makersacademy/acebook/repository/PostRepository.java deleted file mode 100644 index d435e0ce1..000000000 --- a/src/main/java/com/makersacademy/acebook/repository/PostRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.makersacademy.acebook.repository; - -import com.makersacademy.acebook.model.Post; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.repository.CrudRepository; - -public interface PostRepository extends CrudRepository { - -} diff --git a/src/main/java/com/makersacademy/acebook/repository/UserRepository.java b/src/main/java/com/makersacademy/acebook/repository/UserRepository.java index 2cccc950f..e466a452f 100644 --- a/src/main/java/com/makersacademy/acebook/repository/UserRepository.java +++ b/src/main/java/com/makersacademy/acebook/repository/UserRepository.java @@ -1,8 +1,13 @@ package com.makersacademy.acebook.repository; import com.makersacademy.acebook.model.User; -import org.springframework.data.repository.CrudRepository; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface UserRepository extends CrudRepository { +@Repository +public interface UserRepository extends JpaRepository { + User findByUsername(String username); + User findIdByUsername(String name); + User findByEmail(String email); } diff --git a/src/main/java/com/makersacademy/acebook/service/AttendeesService.java b/src/main/java/com/makersacademy/acebook/service/AttendeesService.java new file mode 100644 index 000000000..9b4ba2740 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/service/AttendeesService.java @@ -0,0 +1,38 @@ +package com.makersacademy.acebook.service; + +import com.makersacademy.acebook.model.Attendee; +import com.makersacademy.acebook.model.Event; +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.repository.AttendeesRepository; +import com.makersacademy.acebook.repository.EventRepository; +import com.makersacademy.acebook.repository.UserRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.ModelAttribute; +import java.util.Optional; + +@Service +public class AttendeesService { + + @Autowired + private AttendeesRepository attendeesRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private EventRepository eventRepository; + + public void save(@ModelAttribute Attendee attendee, Long eventId, Authentication authentication) { + User currentUser = userRepository.findByUsername(authentication.getName()); + Optional optionalEvent = eventRepository.findById(eventId); + if (optionalEvent.isPresent()) { + Event event = optionalEvent.get(); + attendee.setUser(currentUser); + attendee.setEvent(event); + attendeesRepository.save(attendee); + } + } +} diff --git a/src/main/java/com/makersacademy/acebook/service/CommentService.java b/src/main/java/com/makersacademy/acebook/service/CommentService.java new file mode 100644 index 000000000..c4f629802 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/service/CommentService.java @@ -0,0 +1,60 @@ +package com.makersacademy.acebook.service; + +import com.makersacademy.acebook.model.Comment; +import com.makersacademy.acebook.model.Event; +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.repository.CommentsRepository; +import com.makersacademy.acebook.repository.EventRepository; +import com.makersacademy.acebook.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.servlet.view.RedirectView; + +import java.util.Date; +import java.util.Optional; + +@Service +public class CommentService { + + @Autowired + private CommentsRepository commentsRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private EventRepository eventRepository; + + public void save(@ModelAttribute Comment comment, Long eventId, Authentication authentication) { + User currentUser = userRepository.findByUsername(authentication.getName()); + Optional optionalEvent = eventRepository.findById(eventId); + if (optionalEvent.isPresent()) { + Event event = optionalEvent.get(); + comment.setCreatedAt(new Date()); + comment.setUser(currentUser); + comment.setEvent(event); + commentsRepository.save(comment); + } + } + +// public void createComment (@ModelAttribute Comment comment, Authentication authentication) { +// User currentUser = userRepository.findByUsername(authentication.getName()); +// comment.setCreatedAt(new Date()); +// comment.setUser(currentUser); +// commentsRepository.save(comment); +// } + +// public Comment createComment(String content, java.sql.Timestamp createdAt, Long userId, Long eventId) { +// Comment comment = Comment.builder() +// .content(content) +// .createdAt(createdAt) +// .userId(userId) +// .eventId(eventId) +// .build(); +// +// return Comment; +// } +} \ No newline at end of file diff --git a/src/main/java/com/makersacademy/acebook/service/CustomOAuth2UserService.java b/src/main/java/com/makersacademy/acebook/service/CustomOAuth2UserService.java new file mode 100644 index 000000000..6b3637903 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/service/CustomOAuth2UserService.java @@ -0,0 +1,124 @@ +/* +package com.makersacademy.acebook.service; + +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.user.DefaultOAuth2User; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.transaction.Transactional; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +@Service +public class CustomOAuth2UserService extends DefaultOAuth2UserService { + + private static final Logger logger = LoggerFactory.getLogger(CustomOAuth2UserService.class); + + @Autowired + private UserRepository userRepository; + + @Override + @Transactional + public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { + OAuth2User oAuth2User = super.loadUser(userRequest); + + Map attributes = oAuth2User.getAttributes(); + String email = (String) attributes.get("email"); + + logger.info("OAuth2 user attributes: {}", attributes); + + if (email == null) { + logger.error("Email not found from OAuth2 provider"); + throw new OAuth2AuthenticationException("Email not found from OAuth2 provider"); + } + + // Save or update user information in the database + User user = userRepository.findByEmail(email); + if (user == null) { + logger.info("Creating new user with email: {}", email); + user = new User(); + user.setEmail(email); + user.setUsername((String) attributes.get("name")); + user.setProfilePictureUrl((String) attributes.get("picture")); + userRepository.save(user); + logger.info("New user created with email: {}", email); + } else { + logger.info("Updating existing user with email: {}", email); + user.setUsername((String) attributes.get("name")); + user.setProfilePictureUrl((String) attributes.get("picture")); + userRepository.save(user); + logger.info("Existing user updated with email: {}", email); + } + + Set mappedAuthorities = new HashSet<>(); + mappedAuthorities.add(new SimpleGrantedAuthority("ROLE_USER")); + + return new DefaultOAuth2User(mappedAuthorities, oAuth2User.getAttributes(), "email"); + } +} +*/ + +package com.makersacademy.acebook.service; + +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.user.DefaultOAuth2User; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.logging.Logger; + +@Service +public class CustomOAuth2UserService extends DefaultOAuth2UserService { + + @Autowired + private UserRepository userRepository; + + @Override + public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { + OAuth2User oAuth2User = super.loadUser(userRequest); + + Map attributes = oAuth2User.getAttributes(); + String email = (String) attributes.get("email"); + + // Save or update user information in the database + User user = userRepository.findByEmail(email); + if (user == null) { + user = new User(); + user.setEmail(email); + user.setUsername((String) attributes.get("name")); + user.setProfilePictureUrl((String) attributes.get("picture")); + userRepository.save(user); // Ensure user is saved here + } + + Set mappedAuthorities = new HashSet<>(); + mappedAuthorities.add(new SimpleGrantedAuthority("ROLE_USER")); + + return new DefaultOAuth2User(mappedAuthorities, oAuth2User.getAttributes(), "name"); + } +} + + + + diff --git a/src/main/java/com/makersacademy/acebook/service/EventService.java b/src/main/java/com/makersacademy/acebook/service/EventService.java new file mode 100644 index 000000000..d96e5e4e9 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/service/EventService.java @@ -0,0 +1,65 @@ +package com.makersacademy.acebook.service; + +import com.makersacademy.acebook.model.Event; +import com.makersacademy.acebook.repository.EventRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; + +import javax.transaction.Transactional; +import java.io.IOException; + +@Service +public class EventService { + + @Autowired + private EventRepository eventRepository; + + @Autowired + private S3Service s3Service; + + @Autowired + private final S3Client s3Client; + private final S3Presigner s3Presigner; + private final String bucketName; + + @Autowired + public EventService( + @Value("${aws.region}") String region, + @Value("${aws.accessKeyId}") String accessKeyId, + @Value("${aws.secretAccessKey}") String secretAccessKey, + @Value("${aws.s3.bucket.name}") String bucketName) { + + this.bucketName = bucketName; + AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKeyId, secretAccessKey); + + this.s3Client = S3Client.builder() + .region(Region.of(region)) + .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) + .build(); + + this.s3Presigner = S3Presigner.builder() + .region(Region.of(region)) + .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) + .build(); + } + + @Transactional + public void savePost(Event event, MultipartFile image) throws IOException { + if (!image.isEmpty()) { + String imageUrl = s3Service.saveImage(image); + event.setEventImageUrl(imageUrl); + } + eventRepository.save(event); + } +} + diff --git a/src/main/java/com/makersacademy/acebook/service/S3Service.java b/src/main/java/com/makersacademy/acebook/service/S3Service.java new file mode 100644 index 000000000..6f64b76b6 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/service/S3Service.java @@ -0,0 +1,71 @@ +package com.makersacademy.acebook.service; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +@Service +public class S3Service { + + private final S3Client s3Client; + private final S3Presigner s3Presigner; + private final String bucketName; + + public S3Service( + @Value("${aws.region}") String region, + @Value("${aws.accessKeyId}") String accessKeyId, + @Value("${aws.secretAccessKey}") String secretAccessKey, + @Value("${aws.s3.bucket.name}") String bucketName) { + + this.bucketName = bucketName; + + AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKeyId, secretAccessKey); + + this.s3Client = S3Client.builder() + .region(Region.of(region)) + .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) + .build(); + + this.s3Presigner = S3Presigner.builder() + .region(Region.of(region)) + .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) + .build(); + } + + public String uploadFile(MultipartFile file, String folder) throws IOException { + String filename = folder + "/" + System.currentTimeMillis() + "_" + file.getOriginalFilename(); + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .key(filename) + .build(); + Map metadata = new HashMap<>(); + metadata.put("Content-Type", file.getContentType()); + PutObjectResponse response = s3Client.putObject(putObjectRequest, + software.amazon.awssdk.core.sync.RequestBody.fromBytes(file.getBytes())); + GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder() + .getObjectRequest(r -> r.bucket(bucketName).key(filename)) + .signatureDuration(java.time.Duration.ofDays(7)) + .build(); + return s3Presigner.presignGetObject(getObjectPresignRequest).url().toString(); + } + + public String saveProfilePicture(MultipartFile image) throws IOException { + return uploadFile(image, "profile_pictures"); + } + + public String saveImage(MultipartFile image) throws IOException { + return uploadFile(image, "post_images"); + } +} diff --git a/src/main/java/com/makersacademy/acebook/service/SearchService.java b/src/main/java/com/makersacademy/acebook/service/SearchService.java new file mode 100644 index 000000000..606b67090 --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/service/SearchService.java @@ -0,0 +1,30 @@ +package com.makersacademy.acebook.service; + +import com.makersacademy.acebook.model.Event; +import com.makersacademy.acebook.repository.EventRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +@Service +public class SearchService { + + @Autowired + private EventRepository eventRepository; + + public List searchEvents(String keyword) { + return eventRepository.searchEventsByTitleOrUsernameOrLocation(keyword); + } +// CrudRepository.findAll() method returns an Iterable, but our method signature expects a List +// convert the Iterable to a Stream, then collect it into a List + public List getAllEvents() { + Iterable iterable = eventRepository.findAll(); + return StreamSupport.stream(iterable.spliterator(), false) + .collect(Collectors.toList()); +} + + +} diff --git a/src/main/java/com/makersacademy/acebook/service/ThirdPartyEventService.java b/src/main/java/com/makersacademy/acebook/service/ThirdPartyEventService.java new file mode 100644 index 000000000..a8cd6e2bf --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/service/ThirdPartyEventService.java @@ -0,0 +1,87 @@ +package com.makersacademy.acebook.service; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.makersacademy.acebook.model.ThirdPartyEvent; +import org.asynchttpclient.AsyncHttpClient; +import org.asynchttpclient.DefaultAsyncHttpClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +@Service +public class ThirdPartyEventService { + + @Value("${API_KEY}") + private String apiKey; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + public CompletableFuture> getDefaultTPEvents() { + + AsyncHttpClient client = new DefaultAsyncHttpClient(); + + return client.prepare("GET", "https://real-time-events-search.p.rapidapi.com/search-events?query=Newcastle%2C%20UK&is_virtual=false&start=0" ) + .setHeader("x-rapidapi-key", apiKey) + .setHeader("x-rapidapi-host", "real-time-events-search.p.rapidapi.com") + .execute() + .toCompletableFuture() + .thenApply(response -> { + try { + JsonNode rootNode = objectMapper.readTree(response.getResponseBody()); + JsonNode innerNode = rootNode.get("data"); + return objectMapper.convertValue(innerNode, new TypeReference>() {}); + } catch (Exception e) { + throw new RuntimeException("Failed to parse JSON", e); + } + }) + .whenComplete((response, throwable) -> { + try { + client.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + + public CompletableFuture> searchTPEvents(Date minScheduledDate, Date maxScheduledDate) { + + AsyncHttpClient client = new DefaultAsyncHttpClient(); + + String pattern = "yyyy-MM-dd"; + DateFormat df = new SimpleDateFormat(pattern); + String stringMinScheduledDate = df.format(minScheduledDate); + String stringMaxScheduledDate = df.format(maxScheduledDate); + String URL = "https://real-time-events-search.p.rapidapi.com/search-events?query=Newcastle%2CUK%20" + stringMinScheduledDate + "%20to%20" + stringMaxScheduledDate + "&date=any&is_virtual=false&start=0"; + + return client.prepare("GET", "https://real-time-events-search.p.rapidapi.com/search-events?query=Newcastle%2CUK%20" + stringMinScheduledDate + "%20to%20" + stringMaxScheduledDate + "&date=any&is_virtual=false&start=0") + .setHeader("x-rapidapi-key", apiKey) + .setHeader("x-rapidapi-host", "real-time-events-search.p.rapidapi.com") + .execute() + .toCompletableFuture() + .thenApply(response -> { + try { + JsonNode rootNode = objectMapper.readTree(response.getResponseBody()); + JsonNode innerNode = rootNode.get("data"); + return objectMapper.convertValue(innerNode, new TypeReference>() {}); + } catch (Exception e) { + throw new RuntimeException("Failed to parse JSON", e); + } + }) + .whenComplete((response, throwable) -> { + try { + client.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } +} diff --git a/src/main/java/com/makersacademy/acebook/service/UserService.java b/src/main/java/com/makersacademy/acebook/service/UserService.java new file mode 100644 index 000000000..fcca2632b --- /dev/null +++ b/src/main/java/com/makersacademy/acebook/service/UserService.java @@ -0,0 +1,145 @@ +package com.makersacademy.acebook.service; + +import com.makersacademy.acebook.model.User; +import com.makersacademy.acebook.repository.UserRepository; +import org.hibernate.exception.ConstraintViolationException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Service +public class UserService implements UserDetailsService { + + private static final Logger logger = LoggerFactory.getLogger(UserService.class); + + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + + @Autowired + public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + } + + public void save(User user) { + validateUser(user, false); + if (userRepository.findByUsername(user.getUsername()) != null) { + throw new IllegalArgumentException("Username already exists"); + } + user.setPassword(passwordEncoder.encode(user.getPassword())); + try { + userRepository.save(user); + } catch (DataIntegrityViolationException e) { + handleDataIntegrityViolationException(e); + } + } + + public void update(User user) { + User existingUser = userRepository.findById(user.getId()).orElseThrow(() -> new IllegalArgumentException("User not found")); + + // Log details for debugging + logger.debug("Existing user details: {}", existingUser); + logger.debug("Input user details: {}", user); + + // Handle empty inputs + if (user.getUsername() != null && user.getUsername().isEmpty()) { + user.setUsername(null); + } + if (user.getEmail() != null && user.getEmail().isEmpty()) { + user.setEmail(null); + } + + // Validate user before applying changes + validateUser(user, true); + + // Update username if changed and valid + if (user.getUsername() != null && !user.getUsername().equals(existingUser.getUsername())) { + if (userRepository.findByUsername(user.getUsername()) != null) { + throw new IllegalArgumentException("Username already exists"); + } + existingUser.setUsername(user.getUsername()); + } + + // Update email if changed and valid + if (user.getEmail() != null && !user.getEmail().equals(existingUser.getEmail())) { + if (userRepository.findByEmail(user.getEmail()) != null) { + throw new IllegalArgumentException("Email already exists"); + } + existingUser.setEmail(user.getEmail()); + } + + // Update other modifiable fields + if (user.getLanguage() != null) { + existingUser.setLanguage(user.getLanguage()); + } + if (user.getCity() != null) { + existingUser.setCity(user.getCity()); + } + + // Save the updated user back to the repository + try { + userRepository.save(existingUser); + } catch (DataIntegrityViolationException e) { + handleDataIntegrityViolationException(e); + } + } + + public void changePassword(User user, String newPassword) { + user.setPassword(passwordEncoder.encode(newPassword)); + userRepository.save(user); + } + + public User findByUsername(String username) { + return userRepository.findByUsername(username); + } + + public User findByEmail(String email) { + return userRepository.findByEmail(email); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userRepository.findByUsername(username); + if (user == null) { + throw new UsernameNotFoundException("User not found"); + } + return org.springframework.security.core.userdetails.User + .withUsername(user.getUsername()) + .password(user.getPassword() != null ? user.getPassword() : "") // Handle null password + .roles("USER") + .build(); + } + + private void validateUser(User user, boolean isUpdate) { + // Validate username + if (user.getUsername() != null && user.getUsername().length() > 50) { + throw new IllegalArgumentException("Username exceeds maximum allowed length of 50 characters"); + } + } + + private void handleDataIntegrityViolationException(DataIntegrityViolationException e) { + Throwable rootCause = getRootCause(e); + if (rootCause.getMessage().contains("users_username_key")) { + throw new IllegalArgumentException("Username already exists"); + } else if (rootCause.getMessage().contains("users_email_key")) { + throw new IllegalArgumentException("Email already exists. Please choose another one."); + } else { + throw e; + } + } + + private Throwable getRootCause(Throwable throwable) { + Throwable cause = throwable.getCause(); + if (cause != null) { + return getRootCause(cause); + } else { + return throwable; + } + } +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 436755df9..c5210908d 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,6 +1,19 @@ -spring.datasource.url=jdbc:postgresql://localhost:5432/acebook_springboot_development -spring.datasource.username= -spring.datasource.password= +spring.datasource.url=jdbc:postgresql://socialites01.czyiqc0ga4tn.us-east-1.rds.amazonaws.com:5432/socialites_springboot_development_01 +spring.datasource.username=${DB_USERNAME} +spring.datasource.password=${DB_PASSWORD} flyway.baseline-on-migrate=true -spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false +spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect +spring.security.oauth2.client.registration.google.client-id=${GOOGLE_ID} +spring.security.oauth2.client.registration.google.client-secret=${GOOGLE_SECRET} +spring.security.oauth2.client.registration.google.scope=profile, email +spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/google +spring.security.oauth2.client.registration.google.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.google.client-name=Google +API_KEY = ${API_KEY} + +aws.accessKeyId=${AWS_ACCESS_KEY_ID} +aws.secretAccessKey=${AWS_SECRET_ACCESS_KEY} +aws.region=${AWS_REGION} +aws.s3.bucket.name=${AWS_S3_BUCKET_NAME} + diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 865b41e1c..a14b48cc5 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,4 +1,4 @@ -spring.datasource.url=jdbc:postgresql://localhost:5432/acebook_springboot_test +spring.datasource.url=jdbc:postgresql://localhost:5432/socialites_springboot_test spring.datasource.username= spring.datasource.password= flyway.baseline-on-migrate=true diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c7ad09d6d..738d32e3c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1,37 @@ +#spring.profiles.active=dev +#spring.data.rest.base-path=/api +#spring.datasource.platform=postgres +#spring.jpa.hibernate.ddl-auto=validate +#spring.security.oauth2.client.registration.google.client-id=${GOOGLE_ID} +#spring.security.oauth2.client.registration.google.client-secret=${GOOGLE_SECRET} +#spring.datasource.url=jdbc:postgresql://socialites.czyiqc0ga4tn.us-east-1.rds.amazonaws.com:5432/socialites_springboot_development +#spring.datasource.username=${DB_USERNAME} +#spring.datasource.password=${DB_PASSWORD} +#spring.security.oauth2.client.registration.google.scope=openid, profile, email +#spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth +#spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token +#spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo +#spring.security.oauth2.client.provider.google.user-name-attribute=sub + spring.profiles.active=dev spring.data.rest.base-path=/api spring.datasource.platform=postgres spring.jpa.hibernate.ddl-auto=validate -logging.level.org.springframework.web: DEBUG +spring.security.oauth2.client.registration.google.client-id=${GOOGLE_ID} +spring.security.oauth2.client.registration.google.client-secret=${GOOGLE_SECRET} +spring.security.oauth2.client.registration.google.scope=profile, email +spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth +spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token +spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo +spring.security.oauth2.client.provider.google.user-name-attribute=sub +spring.datasource.url=jdbc:postgresql://socialites01.czyiqc0ga4tn.us-east-1.rds.amazonaws.com:5432/socialites_springboot_development_01 +spring.datasource.username=${DB_USERNAME} +spring.datasource.password=${DB_PASSWORD} +flyway.baseline-on-migrate=true +spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect +API_KEY = ${API_KEY} +aws.accessKeyId=${AWS_ACCESS_KEY_ID} +aws.secretAccessKey=${AWS_SECRET_ACCESS_KEY} +aws.region=${AWS_REGION} +aws.s3.bucket.name=${AWS_S3_BUCKET_NAME} diff --git a/src/main/resources/db/migration/V10__add_location_to_events.sql b/src/main/resources/db/migration/V10__add_location_to_events.sql new file mode 100644 index 000000000..9df37dbab --- /dev/null +++ b/src/main/resources/db/migration/V10__add_location_to_events.sql @@ -0,0 +1,2 @@ +ALTER TABLE events +ADD COLUMN location VARCHAR(250); \ No newline at end of file diff --git a/src/main/resources/db/migration/V11__add_language_to_users.sql b/src/main/resources/db/migration/V11__add_language_to_users.sql new file mode 100644 index 000000000..35f09470d --- /dev/null +++ b/src/main/resources/db/migration/V11__add_language_to_users.sql @@ -0,0 +1,2 @@ +ALTER TABLE users +ADD COLUMN language VARCHAR(250); \ No newline at end of file diff --git a/src/main/resources/db/migration/V12__add_city_to_users.sql b/src/main/resources/db/migration/V12__add_city_to_users.sql new file mode 100644 index 000000000..08d49b2a0 --- /dev/null +++ b/src/main/resources/db/migration/V12__add_city_to_users.sql @@ -0,0 +1,2 @@ +ALTER TABLE users +ADD COLUMN city VARCHAR(250); \ No newline at end of file diff --git a/src/main/resources/db/migration/V13__add_event_image.sql b/src/main/resources/db/migration/V13__add_event_image.sql new file mode 100644 index 000000000..20091d5ab --- /dev/null +++ b/src/main/resources/db/migration/V13__add_event_image.sql @@ -0,0 +1,2 @@ +ALTER TABLE events +ADD COLUMN event_image_url VARCHAR(2048); \ No newline at end of file diff --git a/src/main/resources/db/migration/V14__password_in_users_can_be_null.sql b/src/main/resources/db/migration/V14__password_in_users_can_be_null.sql new file mode 100644 index 000000000..d19c670e9 --- /dev/null +++ b/src/main/resources/db/migration/V14__password_in_users_can_be_null.sql @@ -0,0 +1,8 @@ +ALTER TABLE users ALTER COLUMN password DROP NOT NULL; + + + + + + + diff --git a/src/main/resources/db/migration/V15__alter_length_of_pasword.sql b/src/main/resources/db/migration/V15__alter_length_of_pasword.sql new file mode 100644 index 000000000..e6a2dd3ef --- /dev/null +++ b/src/main/resources/db/migration/V15__alter_length_of_pasword.sql @@ -0,0 +1,2 @@ +ALTER TABLE users +ALTER COLUMN password TYPE character varying(255); \ No newline at end of file diff --git a/src/main/resources/db/migration/V1__init.sql b/src/main/resources/db/migration/V1__init.sql index c00a8f9cc..c46da895a 100644 --- a/src/main/resources/db/migration/V1__init.sql +++ b/src/main/resources/db/migration/V1__init.sql @@ -1,6 +1,9 @@ -DROP TABLE IF EXISTS posts; +DROP TABLE IF EXISTS events; -CREATE TABLE posts ( +CREATE TABLE events ( id bigserial PRIMARY KEY, - content varchar(250) NOT NULL + title varchar(250) NOT NULL, + description varchar(250) NOT NULL, + scheduled_date timestamp NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ); diff --git a/src/main/resources/db/migration/V3__add_fk_user_id_to_events_table.sql b/src/main/resources/db/migration/V3__add_fk_user_id_to_events_table.sql new file mode 100644 index 000000000..a1584a097 --- /dev/null +++ b/src/main/resources/db/migration/V3__add_fk_user_id_to_events_table.sql @@ -0,0 +1,4 @@ +ALTER TABLE events ADD COLUMN user_id BIGINT; + +ALTER TABLE events ADD CONSTRAINT fk_user +FOREIGN KEY (user_id) REFERENCES users(id); diff --git a/src/main/resources/db/migration/V4__create_comments_table.sql b/src/main/resources/db/migration/V4__create_comments_table.sql new file mode 100644 index 000000000..9eb8fffcb --- /dev/null +++ b/src/main/resources/db/migration/V4__create_comments_table.sql @@ -0,0 +1,11 @@ +DROP TABLE IF EXISTS comments; + +CREATE TABLE comments ( + id bigserial PRIMARY KEY, + content text NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + user_id BIGINT NOT NULL, + constraint fk_comments_users foreign key(user_id) references users(id), + event_id BIGINT NOT NULL, + constraint fk_comments_events foreign key(event_id) references events(id) +); \ No newline at end of file diff --git a/src/main/resources/db/migration/V5__add_email_to_users_table.sql b/src/main/resources/db/migration/V5__add_email_to_users_table.sql new file mode 100644 index 000000000..4ad20feab --- /dev/null +++ b/src/main/resources/db/migration/V5__add_email_to_users_table.sql @@ -0,0 +1 @@ +ALTER TABLE users ADD COLUMN email varchar(250) unique NOT NULL; \ No newline at end of file diff --git a/src/main/resources/db/migration/V6__add_imageurl_to_users_table.sql b/src/main/resources/db/migration/V6__add_imageurl_to_users_table.sql new file mode 100644 index 000000000..85cac07b2 --- /dev/null +++ b/src/main/resources/db/migration/V6__add_imageurl_to_users_table.sql @@ -0,0 +1 @@ +ALTER TABLE users ADD COLUMN profile_picture_url VARCHAR(2048); \ No newline at end of file diff --git a/src/main/resources/db/migration/V7__create_attendees_table.sql b/src/main/resources/db/migration/V7__create_attendees_table.sql new file mode 100644 index 000000000..acffec95c --- /dev/null +++ b/src/main/resources/db/migration/V7__create_attendees_table.sql @@ -0,0 +1,9 @@ +DROP TABLE IF EXISTS attendees; + +CREATE TABLE attendees ( + id bigserial PRIMARY KEY, + user_id BIGINT NOT NULL, + CONSTRAINT fk_attendees_users FOREIGN KEY(user_id) REFERENCES users(id), + event_id BIGINT NOT NULL, + CONSTRAINT fk_attendees_events FOREIGN KEY(event_id) REFERENCES events(id) +); diff --git a/src/main/resources/db/migration/V8__add_time_to_events.sql b/src/main/resources/db/migration/V8__add_time_to_events.sql new file mode 100644 index 000000000..278894b46 --- /dev/null +++ b/src/main/resources/db/migration/V8__add_time_to_events.sql @@ -0,0 +1,2 @@ +ALTER TABLE events +ADD COLUMN scheduled_start_time VARCHAR(250) NOT NULL; \ No newline at end of file diff --git a/src/main/resources/db/migration/V9__add_end_time_to_events.sql b/src/main/resources/db/migration/V9__add_end_time_to_events.sql new file mode 100644 index 000000000..4967e242b --- /dev/null +++ b/src/main/resources/db/migration/V9__add_end_time_to_events.sql @@ -0,0 +1,2 @@ +ALTER TABLE events +ADD COLUMN scheduled_end_time VARCHAR(250); \ No newline at end of file diff --git a/src/main/resources/static/assets/Adobe_Preview.jpeg b/src/main/resources/static/assets/Adobe_Preview.jpeg new file mode 100644 index 000000000..1094789bb Binary files /dev/null and b/src/main/resources/static/assets/Adobe_Preview.jpeg differ diff --git a/src/main/resources/static/assets/groupPhoto.png b/src/main/resources/static/assets/groupPhoto.png new file mode 100644 index 000000000..7112b9615 Binary files /dev/null and b/src/main/resources/static/assets/groupPhoto.png differ diff --git a/src/main/resources/static/assets/theme.js b/src/main/resources/static/assets/theme.js new file mode 100644 index 000000000..a333995b6 --- /dev/null +++ b/src/main/resources/static/assets/theme.js @@ -0,0 +1,42 @@ +// theme.js +(function() { + const root = document.documentElement; + + function setTheme(newTheme) { + window.__theme = newTheme; + root.classList.remove("dark", "light"); + root.classList.add(newTheme); + } + + var preferredTheme = "system"; + var darkQuery = window.matchMedia('(prefers-color-scheme: dark)'); + setTheme(preferredTheme === "system" ? (darkQuery.matches ? 'dark' : 'light') : preferredTheme); +})(); + +// https://gist.github.com/paulirish/1579671 +(function() { + var lastTime = 0; + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = window['webkitRequestAnimationFrame']; + window.cancelAnimationFrame = window['webkitCancelAnimationFrame'] || window['webkitCancelRequestAnimationFrame']; + } + + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function(callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function() { + callback(currTime + timeToCall); + }, + timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + } + + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = function(id) { + clearTimeout(id); + }; + } +}()); \ No newline at end of file diff --git a/src/main/resources/static/images/default_image.jpeg b/src/main/resources/static/images/default_image.jpeg new file mode 100644 index 000000000..a603cf4bc Binary files /dev/null and b/src/main/resources/static/images/default_image.jpeg differ diff --git a/src/main/resources/static/images/logo.png b/src/main/resources/static/images/logo.png new file mode 100644 index 000000000..28d143521 Binary files /dev/null and b/src/main/resources/static/images/logo.png differ diff --git a/src/main/resources/static/styles/details-layout.css b/src/main/resources/static/styles/details-layout.css new file mode 100644 index 000000000..f67a68d64 --- /dev/null +++ b/src/main/resources/static/styles/details-layout.css @@ -0,0 +1,1657 @@ +/*------------ v extracted styles put back in v -------------*/ +/* Styles for div.jsx-707526616 */ +div.jsx-707526616 { + margin: -4px 0; +} + +/* Styles for .link.jsx-707526616 a */ +.link.jsx-707526616 a { + color: var(--nav-link-color); + display: flex; + align-items: center; + gap: 0.25rem; +} + +.link.jsx-707526616 a:hover { + color: var(--nav-link-hover-color); +} + +/* Styles for .link.jsx-707526616 .icon.jsx-707526616 */ +.link.jsx-707526616 .icon.jsx-707526616 { + transition: transform var(--transition-duration) var(--transition-fn); + transform: translateY(1px); +} + +.link.jsx-707526616 a:hover .icon { + transform: translateX(1px) translateY(0); +} + +/* Styles for .nav-wrapper.jsx-638904466 */ +.nav-wrapper.jsx-638904466 { + width: 100%; + background-color: var(--nav-bg-color); +} + +.nav-wrapper.sticky.jsx-638904466 { + position: fixed; + border-bottom: 1px solid var(--opacity-0); + z-index: 10; + backdrop-filter: var(--backdrop-blur); +} + +.nav-wrapper.sticky.show-divider.jsx-638904466 { + border-bottom: 1px solid var(--divider-color); +} + +/* Styles for .background.jsx-638904466 */ +.background.jsx-638904466 { + pointer-events: none; + position: fixed; + width: 100%; + height: 180px; + z-index: 1; + opacity: 0; +} + +.background.mounted.jsx-638904466 { + opacity: 1; +} + +/* Styles for .blur.jsx-638904466 */ +.blur.jsx-638904466 { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 3.5rem; + mask: linear-gradient(to top, transparent 0%, black 100%); + backdrop-filter: var(--backdrop-blur); + z-index: 2; +} + +/* Styles for nav.jsx-638904466 */ +nav.jsx-638904466 { + position: relative; + width: 100%; + padding: var(--nav-padding); + z-index: 200; +} + +nav.jsx-638904466 .logo-wrapper { + position: relative; + z-index: 1; +} + +/* Styles for .logo.jsx-638904466 */ +.logo.jsx-638904466 { + margin: 0 -4px; + padding: 4px; + padding-right: 10px; + color: var(--nav-link-color); +} + +@media (max-width: 650px) { + .logo.jsx-638904466 { + padding-right: 6px; + } +} + +@media (max-width: 450px) { + .logo.jsx-638904466 { + padding-right: 4px; + } +} + +.logo.jsx-638904466:hover { + color: var(--nav-link-hover-color); +} + +.logo.jsx-638904466 svg { + width: 20px; + height: 20px; +} + +.logo.wordmark.jsx-638904466 { + padding: 6px 4px; +} + +.logo.wordmark.jsx-638904466 svg { + width: auto; + height: 16px; +} + +/* Styles for .center-and-right.jsx-638904466 */ +.center-and-right.jsx-638904466 { + display: flex; + justify-content: space-between; + align-items: center; + flex: 1; + --side-width: calc((100% - var(--max-width)) / 2); + max-width: calc(var(--max-width) + var(--side-width)); + min-width: 0; +} + +/* Styles for .center-wrapper.jsx-638904466 a */ +.center-wrapper.jsx-638904466 a { + color: var(--nav-link-color); + font-weight: var(--font-weight-medium); +} + +.center-wrapper.jsx-638904466 a:hover { + color: var(--nav-link-hover-color); +} + +.center-wrapper.jsx-638904466 a.selected { + color: var(--nav-link-hover-color); +} + +/* Styles for .right-wrapper.jsx-638904466 */ +.right-wrapper.jsx-638904466 { + display: flex; + align-items: center; + gap: 1rem; +} + +.right-wrapper.jsx-638904466 .time { + color: var(--nav-link-color); +} + +@media (max-width: 650px) { + .right-wrapper.jsx-638904466 { + gap: 0.875rem; + } + + .right-wrapper.jsx-638904466 .time { + display: none; + } +} + +/* Styles for .flex-column.jsx-1380439751 */ +.flex-column.jsx-1380439751 { + gap: 0.75rem; +} + +.flex-column.jsx-1380439751 .title { + color: var(--primary-color); +} + +.flex-column.jsx-1380439751 .title svg { + transition: var(--transition); + margin-left: 1px; + color: var(--tertiary-color-alpha); + flex-shrink: 0; +} + +@media (hover: hover) { + .flex-column.jsx-1380439751 .title:hover { + color: var(--brand-active-color); + } + + .flex-column.jsx-1380439751 .title:hover svg { + transform: translateX(2px); + } +} + +.flex-column.jsx-1380439751 .calendar-links { + margin-top: -0.5rem; +} + +.flex-column.jsx-1380439751 .calendar-links:last-child { + margin-bottom: -0.25rem; +} + +/* Styles for .desc.expandable.jsx-1380439751 */ +.desc.expandable.jsx-1380439751 { + position: relative; +} + +.desc.expandable.jsx-1380439751 .inner.jsx-1380439751 { + max-height: 4.25rem; + overflow: hidden; + mask: linear-gradient(to top, transparent 10%, black 60%); +} + +.desc.expandable.jsx-1380439751 .expand-button { + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%) translateY(-2px); + box-shadow: var(--shadow-xs); + backdrop-filter: var(--backdrop-blur); + opacity: 0; +} + +.desc.expandable.jsx-1380439751:hover .expand-button { + opacity: 1; + transform: translateX(-50%); +} + +.desc.expandable.expanded.jsx-1380439751 .inner.jsx-1380439751 { + max-height: 1000px; + mask: none; +} + +.desc.expandable.expanded.jsx-1380439751 .expand-button { + opacity: 0; + pointer-events: none; +} + +/* Styles for .title-label.jsx-2770533236 */ +.title-label.jsx-2770533236 { + font-weight: var(--font-weight-medium); + font-family: var(--title-font); +} + +/* Styles for .info-row.jsx-3783920370 */ +.info-row.jsx-3783920370 { + gap: 0.75rem; +} + +.info-row.jsx-3783920370 .icon.jsx-3783920370 { + width: 1.75rem; + height: 1.75rem; + background-color: var(--opacity-light); + color: var(--opacity-48); + flex-shrink: 0; +} + +/* Styles for .row-container */ +.row-container { + border-radius: var(--border-radius); + margin: -0.5rem; + padding: 0.5rem; +} + +/* Styles for .sessions */ +.sessions { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); + gap: 0.5rem; +} + +/* Styles for .session-pill */ +.session-pill { + border-radius: var(--border-radius); + display: flex; + flex-direction: column; + align-items: center; + padding: 0.5rem; + background-color: var(--faint-gray); +} + +/* Styles for .date */ +.date { + text-transform: uppercase; +} + +/* Styles for .flex */ +.flex { + align-items: end; + flex-wrap: wrap; + padding-bottom: 0.75rem; + border-bottom: 1px solid var(--divider-color); +} + +/* Styles for .inline */ +.inline { + display: inline; +} + +/* Styles for .crypto-footer svg */ +.crypto-footer svg { + width: 0.875rem; + height: 0.875rem; +} + +/* Styles for .lux-collapse */ +.lux-collapse.shown { + filter: none !important; +} + +/* Styles for .flex-column */ +.flex-column { + gap: 0.875rem; +} + +/* Styles for .icon */ +.icon { + width: 1.125rem; + height: 1.125rem; + border-radius: var(--small-border-radius); + overflow: hidden; +} + +/* Styles for .icon img */ +.icon img { + width: 100%; + height: 100%; + object-fit: cover; + transform: scale(1.25); + transform-origin: center; +} + +/* Styles for .featured-pill */ +.featured-pill { + display: inline-flex; + align-items: center; + padding: 0.25rem 0.375rem 0.25rem; + margin-left: -1px; + margin-bottom: 0.5rem; + border-radius: var(--border-radius); + background-color: var(--opacity-light); + backdrop-filter: var(--backdrop-blur); +} + +/* Styles for .featured-pill div */ +.featured-pill div { + color: var(--opacity-48); +} + +/* Styles for .name */ +.name { + color: var(--primary-color); + max-width: 150px; +} + +.featured-pill:hover { + background-color: var(--opacity-second-light); +} + +.featured-pill:hover .chevron { + color: var(--primary-color); + transform: translateX(1px); +} + +/* Styles for .lightbox-wrapper */ +.lightbox-wrapper { + max-width: 100%; + display: flex; + justify-content: center; + margin-bottom: 1.5rem; +} + +/* Styles for .lightbox-wrapper:last-child */ +.lightbox-wrapper:last-child { + margin-bottom: 0; +} + +/* Styles for .highlightable-image-wrapper */ +.highlightable-image-wrapper { + width: 100%; + position: relative; +} + +/* Styles for .highlightable-image */ +.highlightable-image { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + border-radius: var(--border-radius); + overflow: hidden; + object-fit: contain; +} + +/* Styles for .event-about-card */ +.event-about-card h1, +.event-about-card h2, +.event-about-card h3, +.event-about-card h4, +.event-about-card h5, +.event-about-card h6 { + font-family: var(--title-font); +} + +.event-about-card a { + border-bottom: 1px solid var(--brand-pale-bg-color); +} + +.event-about-card a:hover { + border-bottom-color: var(--brand-active-color); +} + +/* Styles for .chevron */ +.chevron { + opacity: 0.5; + transform: translateY(0.5px); +} + +div:hover .chevron { + opacity: 1; + transform: translateX(2px) translateY(0.5px); +} + +@media (max-width: 450px) { + .chevron { + transform: none; + } + + div:hover .chevron { + transform: translateX(2px); + } +} + +/* Styles for .event-page-content-wrapper */ +.event-page-content-wrapper { + display: flex; + align-items: start; + gap: 2rem; + padding: 1rem; + --gap: 1.5rem; +} + +.event-page-content-wrapper .event-page-left, +.event-page-content-wrapper .event-page-right, +.event-page-content-wrapper .event-page-mobile-only, +.event-page-content-wrapper .event-page-desktop-only { + display: flex; + flex-direction: column; + gap: var(--gap); + min-width: 0; +} + +.event-page-content-wrapper .event-page-mobile-only { + display: none; +} + +.event-page-content-wrapper .cover-image { + border-radius: var(--large-border-radius); +} + +@media (max-width: 820px) { + .event-page-content-wrapper { + gap: 1.5rem; + --gap: 1.25rem; + } +} + +@media (max-width: 650px) { + .event-page-content-wrapper { + display: block; + } + + .event-page-content-wrapper .event-page-mobile-only { + display: flex; + } + + .event-page-content-wrapper .event-page-desktop-only { + display: none; + } +} + +@media (max-width: 450px) { + .event-page-content-wrapper { + padding-top: 0; + } +} + +.event-page-left { + width: 330px; +} + +@media (max-width: 1000px) { + .event-page-left { + width: 300px; + } +} + +@media (max-width: 820px) { + .event-page-left { + width: 280px; + } +} + +@media (max-width: 650px) { + .event-page-left { + width: 100%; + max-width: 400px; + margin: auto; + } +} + +@media (max-width: 450px) { + .event-page-left { + max-width: 100%; + } +} + +@media (max-width: 650px) { + .event-page-right { + margin-top: 2rem; + } +} + +@media (max-width: 450px) { + .event-page-right { + margin-top: 1.25rem; + } +} +/*------------ ^ extracted styles put back in ^ -------------*/ + +/* Styles for .img-aspect-ratio */ +.img-aspect-ratio.jsx-4068354093 { + width: 100%; + background-color: var(--opacity-light); + overflow: hidden; + position: relative; +} + +.img-aspect-ratio.jsx-4068354093 img.jsx-4068354093 { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +/* Styles for .cover-with-glow */ +.cover-with-glow.jsx-875171497 { + position: relative; +} + +.cover-with-glow.jsx-875171497 .cover-image { + border-radius: var(--card-border-radius); +} + +.cover-with-glow.jsx-875171497 .cover-image-under { + position: absolute; + top: 1rem; + opacity: 0.35; + -webkit-filter: blur(24px); + filter: blur(24px); + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.theme-root.dark .cover-with-glow .cover-image-under { + opacity: 0.05; +} + +/* Styles for .social-link */ +.social-link.jsx-2703338562 a { + color: var(--tertiary-color-alpha); + padding: 0.375rem; + display: block; +} + +.social-link.jsx-2703338562 a:hover { + color: var(--primary-color); +} + +.social-link.large.jsx-2703338562 a { + padding: 0.5rem; +} + +.social-link.large.jsx-2703338562 svg { + width: 1.125rem; + height: 1.125rem; +} + +l + +.title-label.jsx-4155675949 { + font-weight: var(--font-weight-medium); + font-family: var(--title-font); +} + +/* Styles for .avatar-wrapper */ +.avatar-wrapper.jsx-172621494 .avatar.jsx-172621494 { + width: 1.5rem; + height: 1.5rem; + border-radius: 1000px; + background-position: center; + background-size: cover; + background-color: var(--white); + position: relative; +} + +.avatar-wrapper.square.jsx-172621494 .avatar.jsx-172621494 { + border-radius: var(--border-radius); +} + +.avatar-wrapper.small.square.jsx-172621494 .avatar.jsx-172621494 { + border-radius: var(--small-border-radius); +} + +.avatar-wrapper.jsx-172621494 .missing-0.jsx-172621494 { + background: linear-gradient(120deg, #ff5f6d, #ffc371); +} + +.avatar-wrapper.jsx-172621494 .missing-1.jsx-172621494 { + background: linear-gradient(120deg, #4ca1af, #c4e0e5); +} + +.avatar-wrapper.jsx-172621494 .missing-2.jsx-172621494 { + background: linear-gradient(120deg, #4568dc, #b06ab3); +} + +.avatar-wrapper.jsx-172621494 .missing-3.jsx-172621494 { + background: linear-gradient(120deg, #7b4397, #dc2430); +} + +.avatar-wrapper.jsx-172621494 .missing-4.jsx-172621494 { + background: linear-gradient(120deg, #56ab2f, #a8e063); +} + +.avatar-wrapper.jsx-172621494 .missing-5.jsx-172621494 { + background: linear-gradient(120deg, #ee9ca7, #ffdde1); +} + +.avatar-wrapper.jsx-172621494 .missing-6.jsx-172621494 { + background: linear-gradient(120deg, #2193b0, #6dd5ed); +} + +/* Styles for .hosts */ +.hosts.jsx-591752197 { + gap: 0.75rem; + --secondary-button-link-color: var(--opacity-32); +} + +.hosts.jsx-591752197 .host-row { + overflow: hidden; + color: inherit; +} + +/* Styles for .heads */ +.heads.jsx-1374597121 .head.jsx-1374597121 { + position: relative; +} + +.heads.jsx-1374597121 .tooltip.jsx-1374597121 { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.heads.jsx-1374597121 .head.jsx-1374597121:not(:last-child) .tooltip.jsx-1374597121 { + right: calc((1 - var(--cutout-avatar-percentage-visible) - var(--head-margin-percentage)) * var(--size)); +} + +.heads.jsx-1374597121 .head:not(:first-child) { + margin-left: calc(-1 * (1 - var(--cutout-avatar-percentage-visible) - var(--head-margin-percentage)) * var(--size)); +} + +.heads.jsx-1374597121 .head.jsx-1374597121:not(:last-child) .avatar-wrapper { + -webkit-mask-image: url('data:image/svg+xml,'), url('data:image/svg+xml,'); + mask-image: url('data:image/svg+xml,'), url('data:image/svg+xml,'); + -webkit-mask-size: 100% 100%; + mask-size: 100% 100%; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-composite: source-out; + -webkit-mask-composite: subtract; + mask-composite: subtract; +} + +.heads.jsx-1374597121 .remaining-count.jsx-1374597121 { + border-radius: var(--size); + height: var(--size); + padding: 0 calc(var(--size) / 6); + min-width: var(--size); + font-size: calc(var(--size) / 2); + background-color: var(--opacity-light); +} + +/* Styles for .guests-button */ +.guests-button.jsx-2911588165:hover .guests-string.jsx-2911588165 { + color: var(--primary-color); +} + +/* Styles for .avatar-wrapper */ +.avatar-wrapper.jsx-4070717398 .avatar.jsx-4070717398 { + width: 1.125rem; + height: 1.125rem; + border-radius: 1000px; + background-position: center; + background-size: cover; + background-color: var(--white); + position: relative; +} + +.avatar-wrapper.square.jsx-4070717398 .avatar.jsx-4070717398 { + border-radius: var(--border-radius); +} + +.avatar-wrapper.small.square.jsx-4070717398 .avatar.jsx-4070717398 { + border-radius: var(--small-border-radius); +} + +.avatar-wrapper.jsx-4070717398 .missing-0.jsx-4070717398 { + background: linear-gradient(120deg, #ff5f6d, #ffc371); +} + +.avatar-wrapper.jsx-4070717398 .missing-1.jsx-4070717398 { + background: linear-gradient(120deg, #4ca1af, #c4e0e5); +} + +.avatar-wrapper.jsx-4070717398 .missing-2.jsx-4070717398 { + background: linear-gradient(120deg, #4568dc, #b06ab3); +} + +.avatar-wrapper.jsx-4070717398 .missing-3.jsx-4070717398 { + background: linear-gradient(120deg, #7b4397, #dc2430); +} + +.avatar-wrapper.jsx-4070717398 .missing-4.jsx-4070717398 { + background: linear-gradient(120deg, #56ab2f, #a8e063); +} + +.avatar-wrapper.jsx-4070717398 .missing-5.jsx-4070717398 { + background: linear-gradient(120deg, #ee9ca7, #ffdde1); +} + +.avatar-wrapper.jsx-4070717398 .missing-6.jsx-4070717398 { + background: linear-gradient(120deg, #2193b0, #6dd5ed); +} + +/* Media queries and responsive design for .icon-container */ +@media (max-width: 450px) { + div.jsx-1290421626 { + font-size: var(--font-size-sm); + } +/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. */ + .icon-container.jsx-2370077516 { + width: 2.25rem; + height: 2.25rem; + } + + .icon-container.jsx-2370077516 svg { + width: 1.125rem; + height: 1.125rem + } + + + .icon-row.jsx-2370077516 { + gap: 0.75rem; + } + + + .title.jsx-2370077516 { + font-size: var(--font-size-sm); + } + + .desc.jsx-2370077516 { + font-size: var(--font-size-xs); + } +/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. */ + .icon-container.jsx-2370077516 { + width: 2.5rem; + height: 2.5rem; + border: 1px solid var(--divider-color); + color: var(--tint-color); + margin: 0.125rem 0; + } + + .icon-container.jsx-2370077516 svg { + width: 1.25rem; + height: 1.25rem; + } + + .title.jsx-2370077516 { + color: var(--primary-color); + font-family: var(--title-font); + font-weight: var(--font-weight-medium); + } + + .desc.jsx-2370077516 { + color: var(--tint-color); + font-size: var(--font-size-sm); + margin-top: 1px; + } +} + +/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +/* Styles for .shimmer-wrapper and .calendar-card */ +.shimmer-wrapper.jsx-390902270 { + padding: 1px 0; +} + + +.calendar-card.jsx-390902270 { + width: 100%; +} + +.month.jsx-390902270 { + background: var(--opacity-8); + height: 0.75rem; + width: 100%; +} + +.day.jsx-390902270 { + width: 1.25rem; + height: 0.5rem; + margin-top: 0.5rem; + margin-bottom: 0; +} +/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. */ +@media (max-width: 450px) { + .day.jsx-390902270 { + margin-top: 0.375rem; + } +} + +.title.jsx-390902270 { + width: 10rem; + height: 0.75rem; + margin-bottom: 0.5rem; +} + +.desc.jsx-390902270 { + width: 6rem; + height: 0.625rem; + margin-bottom: 0; +} + +/* Styles for .top-card-content */ +.top-card-content.jsx-140261309 { + padding: var(--card-content-padding); +} + +.top-card-content.jsx-140261309 .hosts { + display: none; + margin-bottom: 1.25rem; +} + +@media (max-width: 650px) { + .top-card-content.jsx-140261309 .hosts { + display: inherit; + } +} + +.title-wrapper.jsx-140261309 { + margin-bottom: 1rem; +} + +@media (max-width: 650px) { + .title-wrapper.jsx-140261309 { + margin-bottom: 0.375rem; + } +} + +.title.jsx-140261309 { + font-size: 3rem; + font-family: var(--title-font); + line-height: var(--reduced-title-line-height); + word-break: break-word; +} + +.title.long.jsx-140261309 { + font-size: 2.375rem; +} + +@media (max-width: 1000px) { + .title.jsx-140261309 { + font-size: 2.5rem; + } + + .title.long.jsx-140261309 { + font-size: 2rem; + line-height: var(--title-line-height); + } +} + +@media (max-width: 820px) { + .title.jsx-140261309 { + font-size: 2.25rem; + } + + .title.long.jsx-140261309 { + font-size: 1.75rem; + } +} + +@media (max-width: 650px) { + .title.jsx-140261309 { + font-size: 2rem; + line-height: var(--title-line-height); + } + + .title.long.jsx-140261309 { + font-size: 1.5rem; + } +} + +@media (max-width: 450px) { + .title.jsx-140261309 { + font-size: 1.75rem; + } +} + +.meta.jsx-140261309 { + margin-top: 1.25rem; + gap: 0.75rem; +} + +@media (max-width: 650px) { + .meta.jsx-140261309 { + margin-top: 0.75rem; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + + .meta.jsx-140261309 .row-container { + min-width: 50%; + max-width: 100%; + } +} + +@media (max-width: 450px) { + .meta.jsx-140261309 { + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + margin-top: 0.5rem; + } +} + +/* Styles for .header */ +.header.jsx-1541537765 { + background-color: var(--opacity-light); + margin: calc(-0.75rem + 1px) calc(-1rem + 1px); + padding: calc(0.5rem - 1px) calc(1rem - 1px); + margin-bottom: 0.75rem; + border-top-right-radius: calc(var(--card-border-radius) - 2px); + border-top-left-radius: calc(var(--card-border-radius) - 2px); +} + +/* Styles for .content */ +.content.jsx-3830652295 { + gap: 0.75rem; +} + +/* Styles for .base-11-card */ +.base-11-card.jsx-1082455594 { + padding: 0.75rem 1rem; + background-color: var(--one-to-one-card-bg-color); + border: 1px solid var(--one-to-one-card-border-color); + border-radius: var(--card-border-radius); + -webkit-backdrop-filter: var(--card-backdrop-filter); + backdrop-filter: var(--card-backdrop-filter); + box-shadow: var(--one-to-one-card-shadow); +} + +/* Styles for #__next */ +#__next { + position: relative; + z-index: 1; +} + +.img-unknown-aspect-ratio.jsx-2091483040 { + max-width: 100%; + height: auto; +} + +/* Styles for .event-theme.tinted .gmaps */ +.event-theme.tinted .gmaps.jsx-2999812480 { + position: relative; + --border-radius: var(--card-border-radius); +} + +.event-theme.tinted .gmaps.jsx-2999812480 iframe { + -webkit-filter: none; + filter: none; +} + +.event-theme.tinted .gmaps.jsx-2999812480:after { + content: " "; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: var(--brand-color); + mix-blend-mode: soft-light; + z-index: 0; + pointer-events: none; + border-radius: var(--border-radius); + opacity: 0.5; +} + +/* Styles for .event-page-content-wrapper */ +.event-page-content-wrapper { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: start; + gap: 2rem; + padding: 1rem; + --gap: 1.5rem; +} + +.event-page-content-wrapper .event-page-left, +.event-page-content-wrapper .event-page-right, +.event-page-content-wrapper .event-page-mobile-only, +.event-page-content-wrapper .event-page-desktop-only { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + gap: var(--gap); + min-width: 0; +} + +.event-page-content-wrapper .event-page-mobile-only { + display: none; +} + +.event-page-content-wrapper .cover-image { + border-radius: var(--large-border-radius); +} + +@media (max-width: 820px) { + .event-page-content-wrapper { + gap: 1.5rem; + --gap: 1.25rem; + } +} + +@media (max-width: 650px) { + .event-page-content-wrapper { + display: block; + } + + .event-page-content-wrapper .event-page-mobile-only { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + } + + .event-page-content-wrapper .event-page-desktop-only { + display: none; + } +} + +@media (max-width: 450px) { + .event-page-content-wrapper { + padding-top: 0; + } +} + +.event-page-left { + width: 330px; +} + +@media (max-width: 1000px) { + .event-page-left { + width: 300px; + } +} + +@media (max-width: 820px) { + .event-page-left { + width: 280px; + } +} + +@media (max-width: 650px) { + .event-page-left { + width: 100%; + max-width: 400px; + margin: auto; + } +} + +@media (max-width: 450px) { + .event-page-left { + max-width: 100%; + } +} + +@media (max-width: 650px) { + .event-page-right { + margin-top: 2rem; + } +} + +@media (max-width: 450px) { + .event-page-right { + margin-top: 1.25rem; + } +} + +/* Styles for .links and .icons */ +.links.jsx-715640837 a { + display: inline-block; +} + +.icons.jsx-4254674824 { + white-space: nowrap; + margin: 0 -0.625rem; +} + +.icons.jsx-4254674824 a.flex-center { + padding: 0.625rem; +} + +@media (max-width: 450px) { + .icons.jsx-4254674824 { + margin: 0 -0.5625rem; + } + + .icons.jsx-4254674824 a.flex-center { + padding: 0.5625rem; + padding-top: 0.625rem; + } +} + +/* Styles for .zm-container and .global-footer-content */ +.zm-container.jsx-2433045019 { + padding-top: 4rem; + font-size: var(--font-size-sm); + color: var(--tertiary-color-alpha); +} + +.zm-container.jsx-2433045019 svg { + width: 1rem; +} + +@media (max-width: 820px) { + .zm-container.jsx-2433045019 { + padding-bottom: 1rem; + } +} + +.global-footer-content.jsx-2433045019 { + border-top: 1px solid var(--divider-color); + margin: 1rem 1rem 0 1rem; + padding-top: 1rem; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.global-footer-content.jsx-2433045019 .left-wrapper.jsx-2433045019 { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.global-footer-content.jsx-2433045019 a { + color: var(--tertiary-color-alpha); + -webkit-transition: var(--transition); + transition: var(--transition); + padding: 0.5rem; +} + +.global-footer-content.jsx-2433045019 a:hover { + color: var(--secondary-color-alpha); + -webkit-text-decoration: none; + text-decoration: none; +} + +.global-footer-content.jsx-2433045019 a.logo { + margin-left: -0.5rem; + padding-right: 0.75rem; + margin-top: -0.5rem; + padding-top: 1rem; +} + +.create-event.jsx-2433045019 { + text-align: center; + padding: 1rem; + padding-bottom: 0; + margin-bottom: -0.5rem; + background: linear-gradient(45deg, #6e2fe3, #0cabf7, #e27417, #1f6f05); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + mix-blend-mode: multiply; + -webkit-filter: saturate(1.75); + filter: saturate(1.75); +} + +.create-event.jsx-2433045019:hover { + -webkit-filter: contrast(2); + filter: contrast(2); +} + +.theme-root.dark .create-event.jsx-2433045019 { + mix-blend-mode: screen; +} + +.mobile.jsx-2433045019 { + display: none; +} + +@media (max-width: 650px) { + .global-footer-content.jsx-2433045019 a.logo { + padding-right: 0.5rem; + } + + .global-footer-content.jsx-2433045019 .links a { + padding: 0.5rem 0.375rem; + } + + .global-footer-content.jsx-2433045019 .icons.jsx-2433045019 { + margin-right: -0.5625rem; + } + + .global-footer-content.jsx-2433045019 .icons.jsx-2433045019 a { + padding: 0.5625rem; + padding-top: 0.625rem; + } +} + +@media (max-width: 450px) { + .global-footer-content.jsx-2433045019 .left-wrapper.jsx-2433045019 { + display: block; + } + + .global-footer-content.jsx-2433045019 .links { + margin-left: -0.375rem; + } + + .global-footer-content.jsx-2433045019 .icons { + position: absolute; + right: 1rem; + } + + .global-footer-content.jsx-2433045019 .mobile.jsx-2433045019 { + display: inherit; + margin-left: 1px; + } + + .global-footer-content.jsx-2433045019 .mobile.jsx-2433045019 svg { + width: auto; + } + + .global-footer-content.jsx-2433045019 .desktop.jsx-2433045019 { + display: none; + } + + .create-event.jsx-2433045019 { + text-align: left; + padding-top: 0.25rem; + } +} + +/* Styles for .event-theme and related animations */ +.event-theme.jsx-118873129 { + --card-padding: 1rem; + color: var(--primary-color); +} + +@-webkit-keyframes fadeIn-jsx-118873129 { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes fadeIn-jsx-118873129 { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.event-theme.jsx-118873129 .gradient-bg.animate { + -webkit-animation: fadeIn-jsx-118873129 ease 2s; + animation: fadeIn-jsx-118873129 ease 2s; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-animation-fill-mode: forwards; + animation-fill-mode: forwards; +} + +.page-container.jsx-118873129 { + min-height: 100vh; + min-height: 100dvh; + position: relative; + background: transparent; +} + +.background.jsx-118873129, +.background-glow.jsx-118873129, +.background-overlay.jsx-118873129 { + position: fixed; + z-index: 0; + pointer-events: none; + width: 100%; + height: 100vh; + height: 100dvh; +} + +.background-overlay2.jsx-118873129, +.background-overlay3.jsx-118873129, +.background-overlay4.jsx-118873129 { + position: fixed; + z-index: 0; + pointer-events: none; +} + +.full-page.jsx-118873129 .background.jsx-118873129, +.full-page.jsx-118873129 .background-glow.jsx-118873129, +.full-page.jsx-118873129 .background-overlay.jsx-118873129 { + top: 0; + left: 0; +} + +.background.jsx-118873129 { + background: var(--page-bg); +} + +.theme-root.dark .one-to-one.legacy.jsx-118873129 .background.jsx-118873129 { + background: var(--card-bg-color); +} + +/* Styles for .tint-root */ +.theme-root:not(.dark) .tint-root.jsx-2729982995:not(.dark), + .tint-root.light.jsx-2729982995 { + --pale-brand: #c13b4121; + --gray-100-base-rgb: 11, 11, 11; + --black-base-rgb: 70, 0, 0; + --pale-gray: #95959521; + --darker-pale-gray: #95959545; + --faint-gray: #95959514; + --half-gray: #b4b4b499; + --gray-5: #fcfcfc; + --gray-5-transparent: #fcfcfc00; + --gray-5-translucent: #fcfcfc40; + --gray-5-thick-translucent: #fcfcfccc; + --gray-10: #f5f5f5; + --gray-10-transparent: #f5f5f500; + --gray-10-translucent: #f5f5f540; + --gray-10-thick-translucent: #f5f5f5cc; + --gray-20: #ebebeb; + --gray-20-transparent: #ebebeb00; + --gray-20-translucent: #ebebeb40; + --gray-20-thick-translucent: #ebebebcc; + --gray-30: #e1e1e1; + --gray-30-transparent: #e1e1e100; + --gray-30-translucent: #e1e1e140; + --gray-30-thick-translucent: #e1e1e1cc; + --gray-40: #d4d4d4; + --gray-40-transparent: #d4d4d400; + --gray-40-translucent: #d4d4d440; + --gray-40-thick-translucent: #d4d4d4cc; + --gray-50: #b4b4b4; + --gray-50-transparent: #b4b4b400; + --gray-50-translucent: #b4b4b440; + --gray-50-thick-translucent: #b4b4b4cc; + --gray-60: #959595; + --gray-60-transparent: #95959500; + --gray-60-translucent: #95959540; + --gray-60-thick-translucent: #959595cc; + --gray-70: #757474; + --gray-70-transparent: #75747400; + --gray-70-translucent: #75747440; + --gray-70-thick-translucent: #757474cc; + --gray-80: #555555; + --gray-80-transparent: #55555500; + --gray-80-translucent: #55555540; + --gray-80-thick-translucent: #555555cc; + --gray-90: #2e2e2e; + --gray-90-transparent: #2e2e2e00; + --gray-90-translucent: #2e2e2e40; + --gray-90-thick-translucent: #2e2e2ecc; + --gray-100: #0b0b0b; + --gray-100-transparent: #0b0b0b00; + --gray-100-translucent: #0b0b0b40; + --gray-100-thick-translucent: #0b0b0bcc; + --brand-5: #fffaf9; + --brand-5-transparent: #fffaf900; + --brand-5-translucent: #fffaf940; + --brand-5-thick-translucent: #fffaf9cc; + --brand-10: #ffefed; + --brand-10-transparent: #ffefed00; + --brand-10-translucent: #ffefed40; + --brand-10-thick-translucent: #ffefedcc; + --brand-20: #ffe4e2; + --brand-20-transparent: #ffe4e200; + --brand-20-translucent: #ffe4e240; + --brand-20-thick-translucent: #ffe4e2cc; + --brand-30: #ffb8b4; + --brand-30-transparent: #ffb8b400; + --brand-30-translucent: #ffb8b440; + --brand-30-thick-translucent: #ffb8b4cc; + --brand-40: #d26d6b; + --brand-40-transparent: #d26d6b00; + --brand-40-translucent: #d26d6b40; + --brand-40-thick-translucent: #d26d6bcc; + --brand-50: #c13b41; + --brand-50-transparent: #c13b4100; + --brand-50-translucent: #c13b4140; + --brand-50-thick-translucent: #c13b41cc; + --brand-60: #a93438; + --brand-60-transparent: #a9343800; + --brand-60-translucent: #a9343840; + --brand-60-thick-translucent: #a93438cc; + --brand-70: #7e2126; + --brand-70-transparent: #7e212600; + --brand-70-translucent: #7e212640; + --brand-70-thick-translucent: #7e2126cc; + --brand-80: #501819; + --brand-80-transparent: #50181900; + --brand-80-translucent: #50181940; + --brand-80-thick-translucent: #501819cc; + --brand-90: #260d0d; + --brand-90-transparent: #260d0d00; + --brand-90-translucent: #260d0d40; + --brand-90-thick-translucent: #260d0dcc; + --brand-100: #1c0d0c; + --brand-100-transparent: #1c0d0c00; + --brand-100-translucent: #1c0d0c40; + --brand-100-thick-translucent: #1c0d0ccc; + --brand-color-high-contrast: #964847; + --brand-color-high-contrast-active: #bf0022; + --brand-pale-bg-color-high-contrast: #96484721; + --opacity-0: #7e212600; + --opacity-4: #7e21260a; + --opacity-8: #7e212614; + --opacity-16: #7e212629; + --opacity-24: #7e21263d; + --opacity-32: #7e212652; + --opacity-48: #7e21267a; + --opacity-64: #7e2126a3; + --opacity-80: #7e2126cc; + --light-button-color: var(--secondary-color-alpha); + --brand-color: #c13b41; + --brand-active-color: #a93438; + --nav-bg-color: #ffefed; + --brand-pale-bg-color: #c13b4121; + --tint-color: #7e2126cc; + --primary-or-tinted-color: #7e2126; + --opacity-light: #5018190a; + --hover-bg-color: var(--opacity-light); + --meta-color: unset; + } + +.theme-root.dark .tint-root.jsx-2729982995:not(.light), + .tint-root.dark.jsx-2729982995 { + --pale-brand: #a6383b21; + --gray-100-base-rgb: 38, 35, 35; + --black-base-rgb: 48, 0, 2; + --pale-gray: #98949421; + --darker-pale-gray: #98949445; + --faint-gray: #98949414; + --half-gray: #a19d9d99; + --gray-5: #f8f4f4; + --gray-5-transparent: #f8f4f400; + --gray-5-translucent: #f8f4f440; + --gray-5-thick-translucent: #f8f4f4cc; + --gray-10: #eeeaea; + --gray-10-transparent: #eeeaea00; + --gray-10-translucent: #eeeaea40; + --gray-10-thick-translucent: #eeeaeacc; + --gray-20: #e4e0e0; + --gray-20-transparent: #e4e0e000; + --gray-20-translucent: #e4e0e040; + --gray-20-thick-translucent: #e4e0e0cc; + --gray-30: #d7d3d3; + --gray-30-transparent: #d7d3d300; + --gray-30-translucent: #d7d3d340; + --gray-30-thick-translucent: #d7d3d3cc; + --gray-40: #b7b3b3; + --gray-40-transparent: #b7b3b300; + --gray-40-translucent: #b7b3b340; + --gray-40-thick-translucent: #b7b3b3cc; + --gray-50: #a19d9d; + --gray-50-transparent: #a19d9d00; + --gray-50-translucent: #a19d9d40; + --gray-50-thick-translucent: #a19d9dcc; + --gray-60: #989494; + --gray-60-transparent: #98949400; + --gray-60-translucent: #98949440; + --gray-60-thick-translucent: #989494cc; + --gray-70: #777373; + --gray-70-transparent: #77737300; + --gray-70-translucent: #77737340; + --gray-70-thick-translucent: #777373cc; + --gray-80: #585454; + --gray-80-transparent: #58545400; + --gray-80-translucent: #58545440; + --gray-80-thick-translucent: #585454cc; + --gray-90: #302d2d; + --gray-90-transparent: #302d2d00; + --gray-90-translucent: #302d2d40; + --gray-90-thick-translucent: #302d2dcc; + --gray-100: #262323; + --gray-100-transparent: #26232300; + --gray-100-translucent: #26232340; + --gray-100-thick-translucent: #262323cc; + --brand-5: #fef2f1; + --brand-5-transparent: #fef2f100; + --brand-5-translucent: #fef2f140; + --brand-5-thick-translucent: #fef2f1cc; + --brand-10: #fde9e8; + --brand-10-transparent: #fde9e800; + --brand-10-translucent: #fde9e840; + --brand-10-thick-translucent: #fde9e8cc; + --brand-20: #eec1bf; + --brand-20-transparent: #eec1bf00; + --brand-20-translucent: #eec1bf40; + --brand-20-thick-translucent: #eec1bfcc; + --brand-30: #dd6363; + --brand-30-transparent: #dd636300; + --brand-30-translucent: #dd636340; + --brand-30-thick-translucent: #dd6363cc; + --brand-40: #d24c4f; + --brand-40-transparent: #d24c4f00; + --brand-40-translucent: #d24c4f40; + --brand-40-thick-translucent: #d24c4fcc; + --brand-50: #a6383b; + --brand-50-transparent: #a6383b00; + --brand-50-translucent: #a6383b40; + --brand-50-thick-translucent: #a6383bcc; + --brand-60: #7b2528; + --brand-60-transparent: #7b252800; + --brand-60-translucent: #7b252840; + --brand-60-thick-translucent: #7b2528cc; + --brand-70: #501819; + --brand-70-transparent: #50181900; + --brand-70-translucent: #50181940; + --brand-70-thick-translucent: #501819cc; + --brand-80: #331918; + --brand-80-transparent: #33191800; + --brand-80-translucent: #33191840; + --brand-80-thick-translucent: #331918cc; + --brand-90: #201111; + --brand-90-transparent: #20111100; + --brand-90-translucent: #20111140; + --brand-90-thick-translucent: #201111cc; + --brand-100: #151010; + --brand-100-transparent: #15101000; + --brand-100-translucent: #15101040; + --brand-100-thick-translucent: #151010cc; + --brand-color-high-contrast: #ffd2ce; + --brand-color-high-contrast-active: #ffadab; + --brand-pale-bg-color-high-contrast: #ffd2ce21; + --elevated-on-secondary-bg-color: var(--gray-80-translucent); + --brand-color: #d24c4f; + --nav-bg-color: #201111; + --brand-active-color: #dd6363; + --brand-pale-bg-color: #d26d6b21; + --tint-color: var(--secondary-color-alpha); + --primary-or-tinted-color: var(--primary-color); + --meta-color: unset; + } + +/* Styles for .page-wrapper */ +.page-wrapper.jsx-889557764 { + min-height: 100vh; + min-height: 100dvh; + padding-bottom: 4rem; + background-color: var(--page-bg-color); +} + +.page-wrapper.no-bottom-padding.jsx-889557764 { + padding-bottom: 0; +} + +.page-content.sticky-topnav.jsx-889557764 { + padding-top: calc(3.25rem + 1px); +} + + + +/* Styles for the calendar container */ +.icon-container.jsx-2370077516 { + width: 2.25rem; + height: 2.25rem; + border: 1px solid rgba(255, 255, 255, 0.1); /* Outline stroke */ + border-radius: 4px; /* Slight rounding of corners */ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.1); /* Slight background tint */ + padding: 4px; +} + +/* Styles for the month */ +.month.jsx-2109047166 { + font-size: 0.75rem; + color: rgba(255, 255, 255, 0.6); /* Lighter color for the month */ + width: 100%; + text-align: center; + background: rgba(0, 0, 0, 0.2); /* Slightly darker background */ + border-bottom: 1px solid rgba(255, 255, 255, 0.1); /* Divider line */ +} + +/* Styles for the day */ +.day.jsx-2109047166 { + font-size: 1.25rem; + color: #fff; /* Bright color for the day */ + width: 100%; + text-align: center; + line-height: 2.25rem; /* Centering the day number */ +} + +/* Styles for the title */ +.title.jsx-2370077516 { + font-size: 1.25rem; + font-weight: 700; + color: #fff; /* Bright color for the title */ +} + +/* Styles for the description */ +.desc.jsx-2370077516 { + color: rgba(255, 255, 255, 0.6); /* Lighter color for the description */ + font-size: 1rem; + margin-top: 1px; +} + diff --git a/src/main/resources/static/styles/details.css b/src/main/resources/static/styles/details.css new file mode 100644 index 000000000..f6d369ce8 --- /dev/null +++ b/src/main/resources/static/styles/details.css @@ -0,0 +1,6414 @@ +body { + --max-width: 820px; + --max-width-wide-page: 960px; + --max-width-extra-wide-page: 1080px; + --horizontal-padding: 1rem; + --small-border-radius: 0.25rem; + --border-radius: 0.5rem; + --large-border-radius: 1rem; + --modal-border-radius: var(--large-border-radius); + --card-border-radius: 0.75rem; + --content-card-vertical-padding: 1rem; + --content-card-horizontal-padding: 1.125rem; + --event-row-padding: 0.75rem 1rem; + --event-row-leading-padding: 1rem; + --event-row-margin: 0; + --event-row-border-radius: 0; + --chat-z-index: 900; + --overlay-z-index: 1000; + --base-list-row-default-padding: 0.75rem 1rem; + --base-list-divider-left-offset: 0 +} + +@media(max-width:450px) { + body { + --base-list-row-default-padding: 0.6875rem 0.875rem + } +} + +.theme-root, +.tint-root { + --white: #fff; + --gray-10: #f4f5f6; + --gray-20: #ebeced; + --gray-30: #dee0e2; + --gray-40: #d2d4d7; + --gray-50: #b3b5b7; + --gray-60: #939597; + --gray-70: #737577; + --gray-80: #535557; + --gray-90: #333537; + --gray-100: #212325; + --gray-100-base-rgb: 33, 35, 37; + --black-base-rgb: 19, 21, 23; + --black: rgb(var(--black-base-rgb)); + --pure-black: #000; + --white-transparent: #ffffff00; + --gray-10-transparent: #f4f5f600; + --gray-20-transparent: #ebeced00; + --gray-30-transparent: #dee0e200; + --gray-40-transparent: #d2d4d700; + --gray-50-transparent: #b3b5b700; + --gray-80-transparent: #53555700; + --gray-90-transparent: #33353700; + --gray-100-transparent: #21232500; + --black-transparent: rgba(var(--black-base-rgb), 0); + --gray-10-thick-translucent: #f4f5f6cc; + --gray-20-translucent: #eaecee40; + --gray-100-thick-translucent: #212325cc; + --white-translucent: #ffffff40; + --white-thick-translucent: #fffd; + --black-translucent: rgba(var(--black-base-rgb), 0.25); + --black-thick-translucent: rgba(var(--black-base-rgb), 0.8); + --darker-pale-gray: #93959744; + --pale-gray: #93959722; + --faint-gray: #93959711; + --pale-white: #fff2; + --half-white: #fff9; + --half-gray: #b3b5b799; + --half-black: #0009; + --cranberry-10: #fbe5eb; + --cranberry-20: #f7cbd8; + --cranberry-30: #ee98b1; + --cranberry-40: #e6658a; + --cranberry-50: #de3163; + --cranberry-60: #c22b57; + --cranberry-70: #8b1f3e; + --cranberry-80: #531225; + --pale-cranberry: #de316322; + --faint-cranberry: #de316311; + --barney-10: #f6e5f8; + --barney-20: #eecaf1; + --barney-30: #dd96e3; + --barney-40: #cc62d5; + --barney-50: #bb2dc7; + --barney-60: #a427ae; + --barney-70: #751c7c; + --barney-80: #46114b; + --pale-barney: #bb2dc722; + --faint-barney: #bb2dc711; + --purple-10: #e3defd; + --purple-20: #d4c4ff; + --purple-30: #b596ff; + --purple-40: #7b49ff; + --purple-50: #682fff; + --purple-60: #5b29df; + --purple-70: #4b23bf; + --purple-80: #2f1880; + --pale-purple: #682fff22; + --faint-purple: #682fff11; + --blue-10: #d4e5ff; + --blue-20: #b6d3ff; + --blue-30: #76adff; + --blue-40: #3787ff; + --blue-50: #325ffa; + --blue-60: #2c53db; + --blue-70: #1f3b9c; + --blue-80: #13245e; + --pale-blue: #325ffa22; + --faint-blue: #325ffa11; + --transparent-blue: #325ffa00; + --chat-blue: #287eff; + --pale-chat-blue: #287effcc; + --faint-chat-blue: #287eff55; + --green-10: #d4f2e1; + --green-20: #a3e4bf; + --green-30: #75d79e; + --green-40: #47c97e; + --green-50: #07a460; + --green-60: #078c53; + --green-70: #067847; + --green-80: #045030; + --darker-pale-green: #07a46044; + --pale-green: #07a46022; + --faint-green: #07a46011; + --yellow-10: #fff2cc; + --yellow-20: #ffecb2; + --yellow-30: #fde38f; + --yellow-40: #fbd85b; + --yellow-50: #facc28; + --yellow-60: #d19d20; + --yellow-70: #a56915; + --yellow-80: #7f3e11; + --pale-yellow: #d19d2022; + --faint-yellow: #d19d2011; + --orange-10: #ffecdb; + --orange-20: #ffcba0; + --orange-30: #ffb071; + --orange-40: #ff9641; + --orange-50: #ec660d; + --orange-60: #cf590b; + --orange-70: #b14d0a; + --orange-80: #763307; + --pale-orange: #ec660d22; + --faint-orange: #ec660d11; + --red-10: #ffe5e7; + --red-20: #ffc1c5; + --red-30: #ff838c; + --red-40: #ff5965; + --red-50: #e83b47; + --red-60: #cb343e; + --red-70: #98272f; + --red-80: #5b171b; + --pale-red: #e83b4722; + --faint-red: #e83b4711; + --half-red: #e83b4777; + --black-opacity-0: rgba(var(--black-base-rgb), 0); + --black-opacity-2: rgba(var(--black-base-rgb), 0.02); + --black-opacity-4: rgba(var(--black-base-rgb), 0.04); + --black-opacity-8: rgba(var(--black-base-rgb), 0.08); + --black-opacity-16: rgba(var(--black-base-rgb), 0.16); + --black-opacity-24: rgba(var(--black-base-rgb), 0.24); + --black-opacity-32: rgba(var(--black-base-rgb), 0.32); + --black-opacity-48: rgba(var(--black-base-rgb), 0.48); + --black-opacity-64: rgba(var(--black-base-rgb), 0.64); + --black-opacity-80: rgba(var(--black-base-rgb), 0.8); + --white-base-rgb: 255, 255, 255; + --white-opacity-0: rgba(var(--white-base-rgb), 0); + --white-opacity-2: rgba(var(--white-base-rgb), 0.02); + --white-opacity-4: rgba(var(--white-base-rgb), 0.04); + --white-opacity-8: rgba(var(--white-base-rgb), 0.08); + --white-opacity-16: rgba(var(--white-base-rgb), 0.16); + --white-opacity-24: rgba(var(--white-base-rgb), 0.24); + --white-opacity-32: rgba(var(--white-base-rgb), 0.32); + --white-opacity-48: rgba(var(--white-base-rgb), 0.48); + --white-opacity-64: rgba(var(--white-base-rgb), 0.64); + --white-opacity-80: rgba(var(--white-base-rgb), 0.8); + --default-gradient: linear-gradient(-45deg, #8a18a8, #ce2756 51.59%, #cf2a55 51.6%, #e7a90d 100.05%); + --pure-black-or-white: var(--pure-black); + --outline-color: -webkit-focus-ring-color +} + +.theme-root, +.theme-root.dark .tint-root.light, +.tint-root { + --gray: var(--gray-60); + --gray-active: var(--gray-70); + --gray-background: var(--gray-60); + --gray-background-active: var(--gray-70); + --barney: var(--barney-50); + --barney-active: var(--barney-60); + --barney-background: var(--barney-50); + --barney-background-active: var(--barney-60); + --blue: var(--blue-50); + --blue-active: var(--blue-60); + --blue-background: var(--blue-50); + --blue-background-active: var(--blue-60); + --cranberry: var(--cranberry-50); + --cranberry-active: var(--cranberry-60); + --cranberry-background: var(--cranberry-50); + --cranberry-background-active: var(--cranberry-60); + --green: var(--green-50); + --green-active: var(--green-60); + --green-background: var(--green-50); + --green-background-active: var(--green-60); + --orange: var(--orange-50); + --orange-active: var(--orange-60); + --orange-background: var(--orange-50); + --orange-background-active: var(--orange-60); + --purple: var(--purple-50); + --purple-active: var(--purple-60); + --purple-background: var(--purple-50); + --purple-background-active: var(--purple-60); + --red: var(--red-50); + --red-active: var(--red-60); + --red-background: var(--red-50); + --red-background-active: var(--red-60); + --yellow: var(--yellow-60); + --yellow-active: var(--yellow-70); + --yellow-background: var(--yellow-60); + --yellow-background-active: var(--yellow-70); + --brand-color: var(--cranberry); + --brand-active-color: var(--cranberry-active); + --brand-pale-bg-color: var(--pale-cranberry); + --success-color: var(--green-50); + --success-active-color: var(--green-60); + --success-pale-bg-color: var(--pale-green); + --error-color: var(--red-50); + --error-active-color: var(--red-60); + --error-pale-bg-color: var(--pale-red); + --warning-color: var(--yellow-60); + --warning-active-color: var(--yellow-70); + --warning-pale-bg-color: var(--pale-yellow); + --primary-color: var(--black); + --primary-color-rgb: var(--black-base-rgb); + --secondary-color: var(--gray-70); + --secondary-color-alpha: rgba(var(--black-base-rgb), 0.64); + --tertiary-color: var(--gray-50); + --tertiary-color-alpha: rgba(var(--black-base-rgb), 0.36); + --quaternary-color: var(--gray-30); + --quaternary-color-alpha: rgba(var(--black-base-rgb), 0.2); + --primary-or-tinted-color: var(--primary-color); + --primary-bg-color: var(--white); + --primary-bg-color-rgb: var(--white-base-rgb); + --primary-bg-color-translucent: var(--white-opacity-64); + --primary-bg-color-thick-translucent: var(--white-thick-translucent); + --primary-bg-color-transparent: var(--white-transparent); + --secondary-bg-color: var(--gray-10); + --secondary-bg-color-translucent: var(--gray-10-thick-translucent); + --secondary-bg-color-transparent: var(--gray-10-transparent); + --tertiary-bg-color: var(--gray-20); + --quaternary-bg-color: var(--gray-30); + --elevated-on-secondary-bg-color: var(--primary-bg-color); + --depressed-secondary-bg-color: var(--secondary-bg-color); + --elevated-primary-bg-color: var(--primary-bg-color); + --elevated-secondary-bg-color: var(--secondary-bg-color); + --elevated-tertiary-bg-color: var(--tertiary-bg-color); + --nav-bg-color: transparent; + --translucent-bg-color: #fff8; + --slight-translucent-bg-color: #fffd; + --translucent-elevated-bg-color: #fff8; + --slight-translucent-elevated-bg-color: #fffd; + --translucent-sheet-bg-color: var(--bg-opacity-48); + --primary-border-color: var(--gray-40); + --secondary-border-color: var(--gray-20); + --active-border-color: var(--black); + --opacity-0: var(--black-opacity-0); + --opacity-2: var(--black-opacity-2); + --opacity-4: var(--black-opacity-4); + --opacity-8: var(--black-opacity-8); + --opacity-16: var(--black-opacity-16); + --opacity-24: var(--black-opacity-24); + --opacity-32: var(--black-opacity-32); + --opacity-48: var(--black-opacity-48); + --opacity-64: var(--black-opacity-64); + --opacity-80: var(--black-opacity-80); + --opacity-light: var(--black-opacity-4); + --opacity-second-light: var(--black-opacity-8); + --bg-opacity-0: var(--white-opacity-0); + --bg-opacity-2: var(--white-opacity-2); + --bg-opacity-4: var(--white-opacity-4); + --bg-opacity-8: var(--white-opacity-8); + --bg-opacity-16: var(--white-opacity-16); + --bg-opacity-24: var(--white-opacity-24); + --bg-opacity-32: var(--white-opacity-32); + --bg-opacity-48: var(--white-opacity-48); + --bg-opacity-64: var(--white-opacity-64); + --bg-opacity-80: var(--white-opacity-80); + --bg-opacity-light: var(--white-opacity-4); + --primary-divider-color: var(--gray-90); + --secondary-divider-color: var(--gray-50); + --tertiary-divider-color: var(--opacity-8); + --primary-divider-color-transparent: var(--gray-90-transparent); + --secondary-divider-color-transparent: var(--gray-50-transparent); + --tertiary-divider-color-transparent: var(--opacity-0); + --overlay-color: var(--half-gray); + --divider-color: var(--tertiary-divider-color); + --gradient-divider: linear-gradient(to right, var(--tertiary-divider-color-transparent), var(--tertiary-divider-color) 50%, var(--tertiary-divider-color-transparent)); + --hover-bg-color: var(--pale-gray); + --disabled-bg-color: var(--gray-20); + --disabled-bg-color-translucent: var(--gray-20-translucent); + --toast-default-color: var(--primary-bg-color); + --unread-badge-bg-color: var(--red-50); + --unread-badge-border-color: var(--bg-opacity-16); + --map-tooltip-shadow: 0 6px 16px rgba(30, 53, 77, .5); + --map-tooltip-bg-color: #fff9; + --banner-color: var(--secondary-color); + --banner-bg-color: var(--opacity-light); + --banner-border-color: var(--divider-color); + --event-calendar-border-color: var(--tertiary-bg-color); + --event-calendar-bg-color: var(--primary-bg-color); + --event-calendar-month-color: var(--tertiary-color-alpha); + --event-calendar-month-bg-color: var(--tertiary-bg-color) +} + +.theme-root .tint-root.dark, +.theme-root.dark, +.theme-root.dark .tint-root { + --gray: var(--gray-40); + --gray-active: var(--gray-50); + --barney: var(--barney-40); + --barney-active: var(--barney-50); + --blue: var(--blue-40); + --blue-active: var(--blue-50); + --cranberry: var(--cranberry-40); + --cranberry-active: var(--cranberry-50); + --green: var(--green-40); + --green-active: var(--green-50); + --orange: var(--orange-40); + --orange-active: var(--orange-50); + --purple: var(--purple-30); + --purple-active: var(--purple-40); + --red: var(--red-40); + --red-active: var(--red-50); + --yellow: var(--yellow-40); + --yellow-active: var(--yellow-50); + --brand-color: var(--cranberry); + --brand-active-color: var(--cranberry-active); + --default-gradient: linear-gradient(-45deg, #d118ff, #f32861 51.59%, #f8245d 51.6%, #ffbe19 100.05%); + --success-color: var(--green-50); + --success-active-color: var(--green-60); + --error-color: var(--red-50); + --error-active-color: var(--red-60); + --warning-color: var(--yellow-50); + --warning-active-color: var(--yellow-60); + --primary-color: var(--white); + --primary-color-rgb: var(--white-base-rgb); + --secondary-color: var(--gray-40); + --secondary-color-alpha: hsla(0, 0%, 100%, .79); + --tertiary-color: var(--gray-60); + --tertiary-color-alpha: hsla(0, 0%, 100%, .5); + --quaternary-color: var(--gray-80); + --quaternary-color-alpha: hsla(0, 0%, 100%, .32); + --primary-bg-color: var(--black); + --primary-bg-color-rgb: var(--black-base-rgb); + --primary-bg-color-thick-translucent: var(--black-thick-translucent); + --primary-bg-color-translucent: var(--black-opacity-64); + --primary-bg-color-transparent: var(--black-transparent); + --secondary-bg-color: var(--gray-100); + --secondary-bg-color-translucent: var(--gray-100-thick-translucent); + --secondary-bg-color-transparent: var(--gray-100-transparent); + --tertiary-bg-color: var(--gray-90); + --quaternary-bg-color: var(--gray-80); + --elevated-on-secondary-bg-color: var(--opacity-4); + --depressed-secondary-bg-color: var(--primary-bg-color); + --elevated-primary-bg-color: var(--secondary-bg-color); + --elevated-secondary-bg-color: var(--tertiary-bg-color); + --elevated-tertiary-bg-color: var(--quaternary-bg-color); + --translucent-bg-color: rgba(var(--black-base-rgb), 0.53); + --slight-translucent-bg-color: rgba(var(--black-base-rgb), 0.8); + --translucent-elevated-bg-color: rgba(var(--gray-100-base-rgb), 0.53); + --slight-translucent-elevated-bg-color: rgba(var(--gray-100-base-rgb), 0.8); + --opacity-0: var(--white-opacity-0); + --opacity-2: var(--white-opacity-2); + --opacity-4: var(--white-opacity-4); + --opacity-8: var(--white-opacity-8); + --opacity-16: var(--white-opacity-16); + --opacity-24: var(--white-opacity-24); + --opacity-32: var(--white-opacity-32); + --opacity-48: var(--white-opacity-48); + --opacity-64: var(--white-opacity-64); + --opacity-80: var(--white-opacity-80); + --opacity-light: var(--white-opacity-8); + --opacity-second-light: var(--white-opacity-16); + --bg-opacity-0: var(--black-opacity-0); + --bg-opacity-2: var(--black-opacity-2); + --bg-opacity-4: var(--black-opacity-4); + --bg-opacity-8: var(--black-opacity-8); + --bg-opacity-16: var(--black-opacity-16); + --bg-opacity-24: var(--black-opacity-24); + --bg-opacity-32: var(--black-opacity-32); + --bg-opacity-48: var(--black-opacity-48); + --bg-opacity-64: var(--black-opacity-64); + --bg-opacity-80: var(--black-opacity-80); + --bg-opacity-light: var(--black-opacity-8); + --primary-border-color: var(--gray-60); + --secondary-border-color: var(--gray-90); + --active-border-color: var(--white); + --primary-divider-color: var(--gray-10); + --secondary-divider-color: var(--gray-60); + --tertiary-divider-color: var(--opacity-8); + --primary-divider-color-transparent: var(--gray-10-transparent); + --secondary-divider-color-transparent: var(--gray-60-transparent); + --tertiary-divider-color-transparent: var(--gray-100-transparent); + --overlay-color: var(--half-black); + --divider-color: var(--tertiary-divider-color); + --hover-bg-color: var(--pale-gray); + --disabled-bg-color: var(--gray-80); + --disabled-bg-color-translucent: var(--gray-80-translucent); + --pure-black-or-white: var(--white); + --unread-badge-bg-color: var(--red-40); + --map-tooltip-shadow: 0 6px 16px rgba(0, 0, 0, .5); + --map-tooltip-bg-color: #0009 +} + +.variant-color-green { + --variant-color: var(--green); + --variant-color-pale: var(--pale-green); + --variant-color-faint: var(--faint-green); + --variant-color-active: var(--green-active); + --variant-color-bg: var(--green-background); + --variant-color-bg-active: var(--green-background-active) +} + +.variant-color-barney { + --variant-color: var(--barney); + --variant-color-pale: var(--pale-barney); + --variant-color-faint: var(--faint-barney); + --variant-color-active: var(--barney-active); + --variant-color-bg: var(--barney-background); + --variant-color-bg-active: var(--barney-background-active) +} + +.variant-color-red { + --variant-color: var(--red); + --variant-color-pale: var(--pale-red); + --variant-color-faint: var(--faint-red); + --variant-color-active: var(--red-active); + --variant-color-bg: var(--red-background); + --variant-color-bg-active: var(--red-background-active) +} + +.variant-color-cranberry { + --variant-color: var(--cranberry); + --variant-color-pale: var(--pale-cranberry); + --variant-color-faint: var(--faint-cranberry); + --variant-color-active: var(--cranberry-active); + --variant-color-bg: var(--cranberry-background); + --variant-color-bg-active: var(--cranberry-background-active) +} + +.variant-color-yellow { + --variant-color: var(--yellow); + --variant-color-pale: var(--pale-yellow); + --variant-color-faint: var(--faint-yellow); + --variant-color-active: var(--yellow-active); + --variant-color-bg: var(--yellow-background); + --variant-color-bg-active: var(--yellow-background-active) +} + +.variant-color-orange { + --variant-color: var(--orange); + --variant-color-pale: var(--pale-orange); + --variant-color-faint: var(--faint-orange); + --variant-color-active: var(--orange-active); + --variant-color-bg: var(--orange-background); + --variant-color-bg-active: var(--orange-background-active) +} + +.variant-color-purple { + --variant-color: var(--purple); + --variant-color-pale: var(--pale-purple); + --variant-color-faint: var(--faint-purple); + --variant-color-active: var(--purple-active); + --variant-color-bg: var(--purple-background); + --variant-color-bg-active: var(--purple-background-active) +} + +.variant-color-blue { + --variant-color: var(--blue); + --variant-color-pale: var(--pale-blue); + --variant-color-faint: var(--faint-blue); + --variant-color-active: var(--blue-active); + --variant-color-bg: var(--blue-background); + --variant-color-bg-active: var(--blue-background-active) +} + +.variant-color-warning { + --variant-color: var(--yellow); + --variant-color-pale: var(--pale-yellow); + --variant-color-faint: var(--faint-yellow); + --variant-color-active: var(--yellow-active); + --variant-color-bg: var(--yellow-background); + --variant-color-bg-active: var(--yellow-background-active) +} + +.variant-color-error { + --variant-color: var(--red); + --variant-color-pale: var(--pale-red); + --variant-color-faint: var(--faint-red); + --variant-color-active: var(--red-active); + --variant-color-bg: var(--red-background); + --variant-color-bg-active: var(--red-background-active) +} + +.variant-color-success { + --variant-color: var(--green); + --variant-color-pale: var(--pale-green); + --variant-color-faint: var(--faint-green); + --variant-color-active: var(--green-active); + --variant-color-bg: var(--green-background); + --variant-color-bg-active: var(--green-background-active) +} + +.variant-color-gray { + --variant-color: var(--gray); + --variant-color-pale: var(--pale-gray); + --variant-color-faint: var(--faint-gray); + --variant-color-active: var(--gray-active); + --variant-color-bg: var(--gray-background); + --variant-color-bg-active: var(--gray-background-active) +} + +.theme-root { + --ig-gradient: linear-gradient(45deg, #f09433, #e6683c 25%, #dc2743 50%, #cc2366 75%, #bc1888); + --tiktok-gradient: linear-gradient(45deg, #68c9d0, #ef1c51); + --discord-fg-color: #5865f2; + --discord-bg-color: #5865f2; + --discord-active-fg-color: #2738f3; + --discord-active-bg-color: #2738f3; + --discord-contrast-color: #fff; + --ethereum-fg-color: #954fff; + --ethereum-bg-color: #954fff; + --ethereum-active-fg-color: #60f; + --ethereum-active-bg-color: #60f; + --ethereum-contrast-color: #fff; + --glow-fg-color: #de3163; + --glow-bg-color: #de3163; + --glow-active-fg-color: #c22b57; + --glow-active-bg-color: #c22b57; + --glow-contrast-color: #fff; + --google-fg-color: #4285f4; + --google-bg-color: #4285f4; + --google-active-fg-color: #0d6aff; + --google-active-bg-color: #0d6aff; + --google-contrast-color: #fff; + --slack-fg-color: #7a2d83; + --slack-bg-color: #7a2d83; + --slack-active-fg-color: #650070; + --slack-active-bg-color: #650070; + --slack-contrast-color: #fff; + --twitter-fg-color: #1da1f2; + --twitter-bg-color: #1da1f2; + --twitter-active-fg-color: #08d; + --twitter-active-bg-color: #08d; + --twitter-contrast-color: #fff; + --solana-fg-color: #00c070; + --solana-bg-color: #00c070; + --solana-active-fg-color: #00814b; + --solana-active-bg-color: #00814b; + --solana-contrast-color: #fff; + --youtube-fg-color: red; + --youtube-bg-color: red; + --youtube-active-fg-color: #be0000; + --youtube-active-bg-color: #be0000; + --youtube-contrast-color: #fff; + --zoom-fg-color: #2d8cff; + --zoom-bg-color: #2d8cff; + --zoom-active-fg-color: #006cf0; + --zoom-active-bg-color: #006cf0; + --zoom-contrast-color: #fff; + --microsoft-fg-color: #00a4ef; + --microsoft-bg-color: #00a4ef; + --microsoft-active-fg-color: #0083bf; + --microsoft-active-bg-color: #0083bf; + --microsoft-contrast-color: #fff +} + +.theme-root.dark { + --discord-fg-color: #7883fd; + --discord-active-fg-color: #98a0ff; + --ethereum-fg-color: #a66bff; + --ethereum-active-fg-color: #b583ff; + --glow-fg-color: #e66288; + --glow-active-fg-color: #ee98b1; + --google-fg-color: #6ca4ff; + --google-active-fg-color: #a9c9ff; + --slack-fg-color: #00de82; + --slack-active-fg-color: #14fe9d; + --twitter-fg-color: #1da1f2; + --twitter-active-fg-color: #4ebbff; + --youtube-fg-color: #ff3a3a; + --youtube-active-fg-color: #f66; + --zoom-fg-color: #4d9dff; + --zoom-active-fg-color: #6aadff; + --microsoft-fg-color: #1ab7ff; + --microsoft-active-fg-color: #33bfff +} + +*, +:after, +:before { + box-sizing: border-box +} + +.theme-root { + font-family: var(--font); + line-height: var(--default-line-height) +} + +body.scroll-locked { + overflow: hidden +} + +.button-reset { + all: unset +} + +.button-reset:focus, +.button-reset:focus-visible { + outline-offset: 1; + outline: var(--outline-color) auto 1px +} + +a { + text-decoration: none +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: var(--title-line-height); + font-weight: var(--font-weight-bold); + margin-top: 0; + margin-bottom: 1rem +} + +h3 { + font-size: var(--font-size-lg) +} + +p { + margin-top: 0 +} + +figure { + margin: 0 +} + +img, +svg { + vertical-align: middle +} + +button { + background-color: transparent; + border: 1px solid transparent; + line-height: var(--default-line-height); + font-size: inherit +} + +button:disabled { + opacity: .5 +} + +button:focus:not(:focus-visible) { + outline: 0 +} + +button, +input, +select, +textarea { + margin: 0; + font-family: inherit +} + +[role=button] { + cursor: pointer +} + +select { + word-wrap: normal +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled), +button:not(:disabled) { + cursor: pointer +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + padding: 0; + border-style: none +} + +input, +textarea { + font-size: inherit +} + +textarea { + resize: vertical +} + +img:-moz-loading { + visibility: hidden +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button +} + +th { + text-align: left +} + +hr { + border-style: solid; + border-color: var(--divider-color); + border-width: 0 0 1px +} + +code { + word-wrap: break-word +} + +code, +pre { + font-size: 87.5% +} + +pre { + overflow: auto; + -webkit-overflow-scrolling: touch +} + +iframe { + border: none +} + +.border-all { + border: 1px solid var(--divider-color) +} + +.border-top { + border-top: 1px solid var(--divider-color) +} + +.border-left { + border-left: 1px solid var(--divider-color) +} + +.border-right { + border-right: 1px solid var(--divider-color) +} + +.border-bottom { + border-bottom: 1px solid var(--divider-color) +} + +.zm-container { + max-width: var(--max-width); + margin: 0 auto +} + +.align-center { + text-align: center +} + +.align-right { + text-align: right +} + +.strikethrough { + text-decoration: line-through +} + +.mono, +code, +pre { + font-family: var(--mono-font) +} + +.rounded { + border-radius: var(--border-radius) +} + +.overflow-auto { + overflow: auto; + -webkit-overflow-scrolling: touch +} + +.overflow-hidden { + overflow: hidden +} + +svg { + width: 1rem; + height: 1rem +} + +.with-svg { + display: inline-flex; + align-items: center; + justify-content: center +} + +.with-svg svg { + height: 1rem +} + +.with-svg.svg-left svg { + margin-right: .5rem +} + +.with-svg.svg-right svg { + margin-left: .5rem +} + +.well { + background-color: var(--opacity-light); + border-radius: var(--border-radius); + padding: 1rem 1.25rem +} + +.empty-wrapper { + padding: 3rem; + text-align: center +} + +.empty-wrapper .empty-icon-wrapper { + display: inline-flex; + background-color: var(--brand-pale-bg-color); + border-radius: 150px; + margin: 1rem 0 2rem; + width: 90px; + height: 90px; + align-items: center; + justify-content: space-around +} + +.empty-wrapper .empty-icon-wrapper svg { + width: 3rem; + height: 3rem; + color: var(--brand-color) +} + +.empty-wrapper .action-btn { + display: inline-flex +} + +.a, +a { + color: var(--brand-color); + cursor: pointer; + transition: color var(--transition-duration) var(--transition-fn) +} + +.a:hover, +a:hover { + text-decoration: none; + color: var(--brand-active-color) +} + +.a.text-primary, +a.text-primary { + color: var(--primary-color) +} + +.a.text-primary:hover, +a.text-primary:hover { + color: var(--brand-active-color) +} + +@media(max-width:650px) { + .empty-wrapper { + padding: 2rem + } + .empty-wrapper .empty-icon-wrapper { + margin: 1rem 0 1.5rem; + width: 80px; + height: 80px + } + .empty-wrapper .empty-icon-wrapper svg { + width: 2.5rem; + height: 2.5rem + } + .empty-wrapper h4 { + font-size: 1.25rem + } +} + +@media(max-width:450px) { + .empty-wrapper { + padding: 1rem 1rem 1.5rem; + font-size: var(--font-size-sm) + } + .empty-wrapper .empty-icon-wrapper { + margin-top: 1rem + } + .empty-wrapper h4 { + font-size: 1.1rem + } +} + +.mirror-content { + word-break: break-word +} + +.mirror-content h1 { + font-size: 1.5rem; + margin-top: 2rem; + margin-bottom: 1.5rem; + font-weight: var(--font-weight-bold) +} + +.mirror-content h2 { + font-size: 1.25rem; + margin-top: 1.5rem; + margin-bottom: 1rem; + font-weight: var(--font-weight-bold) +} + +.mirror-content .add-block-menu:first-child+h1, +.mirror-content .add-block-menu:first-child+h2, +.mirror-content h1:first-child, +.mirror-content h2:first-child { + margin-top: 0 +} + +.mirror-content blockquote { + -webkit-margin-start: 2px; + margin-inline-start: 2px; + -webkit-margin-end: 0; + margin-inline-end: 0; + border-left: 2px solid var(--opacity-8); + padding: 0 1rem +} + +.mirror-content pre { + padding: 1rem; + border-radius: var(--border-radius); + background-color: var(--secondary-bg-color) +} + +.mirror-content .image { + display: block; + max-width: 100%; + max-height: 25rem; + margin: 1rem auto +} + +.mirror-content .attachment-link:hover { + background-color: var(--opacity-16, #f1f3f5) !important +} + +.mirror-content ol, +.mirror-content p, +.mirror-content ul { + margin-bottom: 1.25rem +} + +.mirror-content ol, +.mirror-content ul { + -webkit-padding-start: 2rem; + padding-inline-start: 2rem +} + +.mirror-content :last-child, +.mirror-content li p { + margin-bottom: 0 +} + +.mirror-content hr { + margin: 0 0 1.25rem; + border-bottom: 1px solid var(--divider-color) +} + +.mirror-content u { + -webkit-text-decoration-color: var(--opacity-second-light); + text-decoration-color: var(--opacity-second-light) +} + +.mirror-content .variable { + color: var(--brand-color); + background-color: var(--brand-pale-bg-color); + border-radius: var(--small-border-radius); + padding: 0 .25rem +} + +.bg-primary { + background-color: var(--primary-bg-color) +} + +.bg-primary-elevated { + background-color: var(--elevated-primary-bg-color) +} + +.bg-hover { + transition: background-color var(--transition-duration) var(--transition-fn) +} + +.bg-hover:hover { + background-color: var(--hover-bg-color) +} + +.bg-secondary { + background-color: var(--secondary-bg-color) +} + +.bg-tertiary { + background-color: var(--tertiary-bg-color) +} + +.hidden { + display: none +} + +.opacity-0 { + opacity: 0 +} + +.card-bg-color { + background: var(--card-bg-color) +} + +.flex { + display: flex +} + +.flex-baseline, +.flex-baseline-center { + display: flex; + align-items: baseline +} + +.flex-baseline-center { + justify-content: center +} + +.flex-center, +.flex-center-center { + display: flex; + align-items: center +} + +.flex-center-center { + justify-content: center +} + +.flex-shrink-0 { + flex-shrink: 0 +} + +.flex-start { + display: flex; + align-items: flex-start +} + +.flex-end { + display: flex; + align-items: flex-end +} + +.flex-wrap { + display: flex; + flex-wrap: wrap +} + +.flex-column { + display: flex; + flex-direction: column +} + +.flex-row-reverse { + display: flex; + flex-direction: row-reverse +} + +.flex-column-reverse { + display: flex; + flex-direction: column-reverse +} + +.flex-1 { + flex: 1 1 +} + +.justify-center { + display: flex; + justify-content: center +} + +.justify-start { + display: flex; + justify-content: flex-start +} + +.justify-end { + display: flex; + justify-content: flex-end +} + +.align-items-flex-end { + display: flex; + align-items: flex-end +} + +.align-self-center { + align-self: center +} + +.spread { + display: flex; + justify-content: space-between +} + +.stretch { + align-items: stretch +} + +.space-around { + display: flex; + justify-content: space-around +} + +.full-width { + width: 100% +} + +.full-height { + min-height: 100% +} + +.min-width-0 { + min-width: 0 +} + +.min-height-0 { + min-height: 0 +} + +.max-height-100 { + max-height: 100% +} + +.force-full-height { + height: 100% +} + +.inline { + display: inline +} + +.inline-block { + display: inline-block +} + +.block { + display: block +} + +.flex-inline { + display: inline-flex +} + +.relative { + position: relative +} + +.m-0 { + margin: 0 !important +} + +.mt-0, +.my-0 { + margin-top: 0 !important +} + +.mr-0, +.mx-0 { + margin-right: 0 !important +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important +} + +.ml-0, +.mx-0 { + margin-left: 0 !important +} + +.m-1 { + margin: .25rem !important +} + +.mt-1, +.my-1 { + margin-top: .25rem !important +} + +.mr-1, +.mx-1 { + margin-right: .25rem !important +} + +.mb-1, +.my-1 { + margin-bottom: .25rem !important +} + +.ml-1, +.mx-1 { + margin-left: .25rem !important +} + +.m-2 { + margin: .5rem !important +} + +.mt-2, +.my-2 { + margin-top: .5rem !important +} + +.mr-2, +.mx-2 { + margin-right: .5rem !important +} + +.mb-2, +.my-2 { + margin-bottom: .5rem !important +} + +.ml-2, +.mx-2 { + margin-left: .5rem !important +} + +.m-25 { + margin: .75rem !important +} + +.mt-25, +.my-25 { + margin-top: .75rem !important +} + +.mr-25, +.mx-25 { + margin-right: .75rem !important +} + +.mb-25, +.my-25 { + margin-bottom: .75rem !important +} + +.ml-25, +.mx-25 { + margin-left: .75rem !important +} + +.m-3 { + margin: 1rem !important +} + +.mt-3, +.my-3 { + margin-top: 1rem !important +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important +} + +.m-4 { + margin: 1.5rem !important +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important +} + +.m-5 { + margin: 3rem !important +} + +.mt-5, +.my-5 { + margin-top: 3rem !important +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important +} + +.p-0 { + padding: 0 !important +} + +.pt-0, +.py-0 { + padding-top: 0 !important +} + +.pr-0, +.px-0 { + padding-right: 0 !important +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important +} + +.pl-0, +.px-0 { + padding-left: 0 !important +} + +.p-1 { + padding: .25rem !important +} + +.pt-1, +.py-1 { + padding-top: .25rem !important +} + +.pr-1, +.px-1 { + padding-right: .25rem !important +} + +.pb-1, +.py-1 { + padding-bottom: .25rem !important +} + +.pl-1, +.px-1 { + padding-left: .25rem !important +} + +.p-2 { + padding: .5rem !important +} + +.pt-2, +.py-2 { + padding-top: .5rem !important +} + +.pr-2, +.px-2 { + padding-right: .5rem !important +} + +.pb-2, +.py-2 { + padding-bottom: .5rem !important +} + +.pl-2, +.px-2 { + padding-left: .5rem !important +} + +.p-25 { + padding: .75rem !important +} + +.pt-25, +.py-25 { + padding-top: .75rem !important +} + +.pr-25, +.px-25 { + padding-right: .75rem !important +} + +.pb-25, +.py-25 { + padding-bottom: .75rem !important +} + +.pl-25, +.px-25 { + padding-left: .75rem !important +} + +.p-3 { + padding: 1rem !important +} + +.pt-3, +.py-3 { + padding-top: 1rem !important +} + +.pr-3, +.px-3 { + padding-right: 1rem !important +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important +} + +.pl-3, +.px-3 { + padding-left: 1rem !important +} + +.p-4 { + padding: 1.5rem !important +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important +} + +.p-5 { + padding: 3rem !important +} + +.pt-5, +.py-5 { + padding-top: 3rem !important +} + +.pr-5, +.px-5 { + padding-right: 3rem !important +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important +} + +.pl-5, +.px-5 { + padding-left: 3rem !important +} + +.cgap-0 { + column-gap: 0 +} + +.cgap-1 { + column-gap: .25rem +} + +.cgap-2 { + column-gap: .5rem +} + +.cgap-25 { + column-gap: .75rem +} + +.cgap-3 { + column-gap: 1rem +} + +.cgap-4 { + column-gap: 1.5rem +} + +.cgap-5 { + column-gap: 3rem +} + +.rgap-0 { + row-gap: 0 +} + +.rgap-1 { + row-gap: .25rem +} + +.rgap-2 { + row-gap: .5rem +} + +.rgap-25 { + row-gap: .75rem +} + +.rgap-3 { + row-gap: 1rem +} + +.rgap-4 { + row-gap: 1.5rem +} + +.rgap-5 { + row-gap: 3rem +} + +.gap-0 { + gap: 0 +} + +.gap-1 { + gap: .25rem +} + +.gap-2 { + gap: .5rem +} + +.gap-25 { + gap: .75rem +} + +.gap-3 { + gap: 1rem +} + +.gap-4 { + gap: 1.5rem +} + +.gap-5 { + gap: 3rem +} + +.theme-root { + --font: -apple-system, BlinkMacSystemFont, Inter, Roboto, Segoe UI, Helvetica Neue, Arial, Noto Sans, sans-serif; + --mono-font: "SF Mono", menlo, monaco, consolas, "Courier New", Courier, monospace; + --default-line-height: 1.5; + --reduced-line-height: 1.3; + --title-line-height: 1.2; + --reduced-title-line-height: 1.15; + --font-weight-light: 300; + --font-weight-regular: 400; + --font-weight-medium: 500; + --font-weight-bold: 600; + --font-size-xxxl: 1.5rem; + --font-size-xxl: 1.375rem; + --font-size-xl: 1.25rem; + --font-size-lg: 1.125rem; + --font-size-md: 1rem; + --font-size-sm: 0.875rem; + --font-size-xs: 0.8125rem; + --font-size-xxs: 0.75rem; + --font-size-xxxs: 0.625rem; + --section-title-font-size: var(--font-size-xl); + --section-subtitle-font-size: var(--font-size-md); + --small-section-title-font-size: var(--font-size-lg); + --small-section-subtitle-font-size: var(--font-size-sm) +} + +@media(max-width:450px) { + .theme-root { + --section-title-font-size: var(--font-size-lg); + --section-subtitle-font-size: var(--font-size-sm); + --small-section-title-font-size: var(--font-size-md); + --small-section-subtitle-font-size: var(--font-size-xs) + } +} + +.text-primary { + color: var(--primary-color) +} + +.text-secondary { + color: var(--secondary-color) +} + +.text-secondary-alpha { + color: var(--secondary-color-alpha) +} + +.text-tertiary { + color: var(--tertiary-color) +} + +.text-tertiary-alpha { + color: var(--tertiary-color-alpha) +} + +.text-success { + color: var(--success-color) +} + +.text-warning { + color: var(--warning-color) +} + +.text-error { + color: var(--error-color) +} + +.fs-xxxl { + font-size: var(--font-size-xxxl) +} + +.fs-xxl { + font-size: var(--font-size-xxl) +} + +.fs-xl { + font-size: var(--font-size-xl) +} + +.fs-lg { + font-size: var(--font-size-lg) +} + +.fs-md { + font-size: var(--font-size-md) +} + +.fs-sm { + font-size: var(--font-size-sm) +} + +.fs-xs { + font-size: var(--font-size-xs) +} + +.fs-xxs { + font-size: var(--font-size-xxs) +} + +.fs-xxxs { + font-size: var(--font-size-xxxs) +} + +.reduced-line-height { + line-height: var(--reduced-line-height) +} + +.line-height-1 { + line-height: 1 +} + +.text-uppercase { + text-transform: uppercase +} + +.b, +b, +strong { + font-weight: var(--font-weight-bold) +} + +.text-ellipses { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.break-word { + overflow-wrap: break-word +} + +.break-all { + word-break: break-all +} + +.nowrap { + white-space: nowrap +} + +.pre-line { + white-space: pre-line +} + +.whitespace-pre { + white-space: pre +} + +.fw-regular { + font-weight: var(--font-weight-regular) +} + +.fw-medium { + font-weight: var(--font-weight-medium) +} + +.fw-bold { + font-weight: var(--font-weight-bold) +} + +.text-center { + text-align: center +} + +.text-left { + text-align: left +} + +.text-right { + text-align: right +} + +.mono-number { + font-feature-settings: "tnum"; + font-variant-numeric: tabular-nums +} + +.high-legibility { + font-feature-settings: "ss06" on +} + +.text-datetime { + font-feature-settings: "ss01" on, "ss02" on +} + +.text-cranberry { + color: var(--cranberry) +} + +.text-white { + color: var(--white) +} + +.text-gray { + color: var(--gray) +} + +.text-barney { + color: var(--barney) +} + +.text-red { + color: var(--red) +} + +.text-green { + color: var(--green) +} + +.text-blue { + color: var(--blue) +} + +.text-purple { + color: var(--purple) +} + +.text-yellow { + color: var(--yellow) +} + +.text-orange { + color: var(--orange) +} + +.text-brand { + color: var(--brand-color) +} + +.lux-line-clamp { + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis +} + +svg { + display: block +} + +.svg-xs svg, +svg.svg-xs { + width: var(--font-size-xs); + height: var(--font-size-xs) +} + +.svg-sm svg, +svg.svg-sm { + width: var(--font-size-sm); + height: var(--font-size-sm) +} + +.svg-lg svg, +svg.svg-lg { + width: var(--font-size-lg); + height: var(--font-size-lg) +} + +.svg-xl svg, +svg.svg-xl { + width: var(--font-size-xl); + height: var(--font-size-xl) +} + +.svg-15rem svg, +svg.svg-15rem { + width: 1.5rem; + height: 1.5rem +} + +.svg-2rem svg, +svg.svg-2rem { + width: 2rem; + height: 2rem +} + +.theme-root { + --transition-duration: 0.3s; + --fast-transition-duration: 0.2s; + --slow-transition-duration: 0.6s; + --transition-fn: cubic-bezier(0.4, 0, 0.2, 1); + --bounce-transition-fn: cubic-bezier(0.54, 1.12, 0.38, 1.11); + --transition: all var(--transition-duration) var(--transition-fn); + --bounce-transition: all var(--transition-duration) var(--bounce-transition-fn); + --fast-transition: all var(--fast-transition-duration) var(--transition-fn); + --slow-transition: all var(--slow-transition-duration) var(--transition-fn) +} + +@keyframes shake { + 0% { + transform: translate(1px, 1px) + } + 10% { + transform: translate(-1px, -2px) + } + 20% { + transform: translate(-3px) + } + 30% { + transform: translate(3px, 2px) + } + 40% { + transform: translate(1px, -1px) + } + 50% { + transform: translate(-1px, 2px) + } + 60% { + transform: translate(-3px, 1px) + } + 70% { + transform: translate(3px, 1px) + } + 80% { + transform: translate(-1px, -1px) + } + 90% { + transform: translate(1px, 2px) + } + to { + transform: translate(1px, -2px) + } +} + +.theme-root .shake { + animation: shake .2s; + animation-iteration-count: infinite +} + +@keyframes pulsate-color { + 50% { + color: #fff; + background-color: var(--orange) + } +} + +.theme-root .pulsate-2 { + animation: pulsate-color 2.25s; + animation-iteration-count: 2 +} + +.btn { + font-weight: var(--font-weight-medium); + border-radius: var(--border-radius) +} + +.btn-sm.with-svg svg { + width: var(--font-size-sm); + height: var(--font-size-sm) +} + +.btn-sm.with-svg.svg-left svg { + margin-right: .25rem +} + +.btn-sm.with-svg.svg-right svg { + margin-left: .25rem +} + +.btn-a, +.btn-link { + color: var(--brand-color); + cursor: pointer +} + +.btn-a:active, +.btn-a:focus, +.btn-a:hover, +.btn-link:active, +.btn-link:focus, +.btn-link:hover { + text-decoration: none; + color: var(--brand-active-color) +} + +.btn-a { + font-size: inherit; + vertical-align: inherit; + font-weight: inherit; + line-height: inherit; + border: 0; + padding: 0; + display: inline-block +} + +.btn-link-gray { + color: var(--tertiary-color) +} + +.btn-link-gray:hover { + color: var(--secondary-color) +} + +.theme-root, +.tint-root { + --chat-main-button-color: var(--primary-bg-color); + --chat-main-button-bg-color: var(--opacity-80); + --chat-main-button-bg-hover-color: var(--primary-color); + --chat-main-button-bg-active-color: var(--primary-color); + --chat-box-shadow: var(--light-shadow-sm); + --chat-conversation-head-bg-hover-color: var(--opacity-8); + --chat-conversation-head-bg-active-color: var(--opacity-8); + --chat-conversation-head-active-ring-color: var(--active-border-color); + --chat-get-support-bg-color: var(--translucent-bg-color); + --chat-intercom-bg-color: var(--black); + --chat-session-time-margin: 0.5rem 0.25rem 0.25rem; + --chat-message-margin-bottom: 0.5rem; + --chat-message-margin-bottom-same-author: 2px; + --chat-message-padding-inner: 0.75rem; + --chat-message-padding-outer: 2.5rem; + --chat-message-avatar-size: 24px; + --chat-message-avatar-margin-right: 0.5rem; + --chat-message-bubble-padding-horizontal: 0.75rem; + --chat-message-bubble-padding-vertical: 0.5rem; + --chat-message-bubble-line-height: 1.4; + --chat-message-bubble-border-radius: calc((1rem * var(--chat-message-bubble-line-height) + 2 * var(--chat-message-bubble-padding-vertical)) / 2); + --chat-message-bubble-emoji-font-size: 3.5rem; + --chat-message-bubble-emoji-line-height: 1.3; + --chat-message-bubble-emoji-letter-spacing: 0.5rem; + --chat-message-bubble-me-bg-color: var(--chat-blue); + --chat-message-bubble-me-color: var(--white); + --chat-message-bubble-other-bg-color: var(--opacity-4); + --chat-message-bubble-other-color: var(--primary-color); + --chat-message-image-background: var(--modal-bg-color); + --chat-message-read-indicator-margin-right: var(--chat-message-padding-inner); + --chat-button-color: var(--brand-button-color, var(--white)); + --chat-window-background: var(--bg-opacity-64) +} + +.theme-root.dark, +.theme-root.dark .tint-root { + --chat-main-button-color: var(--opacity-80); + --chat-main-button-bg-color: var(--bg-opacity-48); + --chat-main-button-bg-hover-color: var(--opacity-16); + --chat-main-button-bg-active-color: var(--primary-color); + --chat-box-shadow: var(--light-shadow-lg); + --chat-message-bubble-me-bg-color: var(--chat-blue); + --chat-message-bubble-other-bg-color: var(--opacity-8); + --chat-window-background: var(--bg-opacity-48); + --chat-intercom-bg-color: var(--gray-90) +} + +.form-control::placeholder, +.with-placeholder::placeholder { + color: var(--placeholder-color); + opacity: 1 +} + +.form-control:-ms-input-placeholder, +.with-placeholder:-ms-input-placeholder { + color: var(--placeholder-color) +} + +.form-control::-ms-input-placeholder, +.with-placeholder::-ms-input-placeholder { + color: var(--placeholder-color) +} + +.form-control:-moz-focusring, +.with-placeholder:-moz-focusring { + text-shadow: none +} + +.invalid+.invalid-feedback { + display: inherit +} + +.disabled, +.no-pointer { + pointer-events: none +} + +.disabled { + opacity: .5 +} + +.theme-root, +.tint-root { + --modal-header-footer-padding: 0.75rem 1.25rem; + --modal-vertical-padding: 1rem; + --modal-horizontal-padding: 1.25rem; + --modal-padding: var(--modal-vertical-padding) var(--modal-horizontal-padding); + --modal-header-bg-color: var(--elevated-secondary-bg-color); + --modal-bg-color: var(--slight-translucent-elevated-bg-color); + --menu-bg-color: var(--slight-translucent-elevated-bg-color); + --menu-inverted-bg-color: var(--primary-color); + --menu-inverted-border-color: var(--bg-opacity-light); + --menu-header-color: var(--tertiary-color-alpha); + --menu-item-color: var(--primary-color); + --menu-item-secondary-color: var(--tertiary-color-alpha); + --menu-item-hover-color: var(--primary-color); + --menu-item-hover-bg-color: var(--hover-bg-color); + --menu-item-icon-color: var(--tertiary-color-alpha); + --menu-item-icon-hover-color: var(--tertiary-color-alpha); + --menu-search-bg-color: var(--slight-translucent-elevated-bg-color); + --menu-search-divider-color: var(--divider-color); + --menu-no-result-color: var(--tertiary-color-alpha); + --menu-border-color: var(--opacity-light) +} + +.theme-root { + --light-shadow-xs: 0 1px 4px rgba(0, 0, 0, .1); + --light-shadow-sm: 0 0.7px 2.7px rgba(0, 0, 0, .02), 0 1.7px 6.9px rgba(0, 0, 0, .03), 0 3.5px 14.2px rgba(0, 0, 0, .04), 0 7.3px 29.2px rgba(0, 0, 0, .05), 0 20px 80px rgba(0, 0, 0, .06); + --light-shadow: 0 1.6px 2.7px rgba(0, 0, 0, .02), 0 4.2px 6.9px rgba(0, 0, 0, .03), 0 8.5px 14.2px rgba(0, 0, 0, .04), 0 17.5px 29.2px rgba(0, 0, 0, .05), 0 48px 80px rgba(0, 0, 0, .06); + --light-shadow-lg: 0 3.3px 2.7px rgba(0, 0, 0, .03), 0 8.3px 6.9px rgba(0, 0, 0, .04), 0 17px 14.2px rgba(0, 0, 0, .05), 0 35px 29.2px rgba(0, 0, 0, .06), 0 96px 80px rgba(0, 0, 0, .07); + --light-shadow-xl: 0 4.5px 2.7px rgba(0, 0, 0, .04), 0 11.3px 6.9px rgba(0, 0, 0, .06), 0 23px 14.2px rgba(0, 0, 0, .08), 0 47.5px 29.2px rgba(0, 0, 0, .1), 0 130px 80px rgba(0, 0, 0, .14); + --medium-shadow-xs: 0 1px 4px rgba(0, 0, 0, .15); + --medium-shadow-sm: 0 0.7px 2.7px rgba(0, 0, 0, .1), 0 1.7px 6.9px rgba(0, 0, 0, .13), 0 3.5px 14.2px rgba(0, 0, 0, .17), 0 7.3px 29.2px rgba(0, 0, 0, .22); + --medium-shadow: 0 1.6px 2.7px rgba(0, 0, 0, .1), 0 4.2px 6.9px rgba(0, 0, 0, .13), 0 8.5px 14.2px rgba(0, 0, 0, .17), 0 17.5px 29.2px rgba(0, 0, 0, .22); + --medium-shadow-lg: 0 3.3px 2.7px rgba(0, 0, 0, .1), 0 8.3px 6.9px rgba(0, 0, 0, .13), 0 17px 14.2px rgba(0, 0, 0, .17), 0 35px 29.2px rgba(0, 0, 0, .22); + --medium-shadow-xl: 0 4.5px 2.7px rgba(0, 0, 0, .1), 0 11.3px 6.9px rgba(0, 0, 0, .13), 0 23px 14.2px rgba(0, 0, 0, .17), 0 47.5px 29.2px rgba(0, 0, 0, .22); + --shadow-xs: var(--light-shadow-xs); + --shadow-sm: var(--light-shadow-sm); + --shadow: var(--light-shadow); + --shadow-lg: var(--light-shadow-lg); + --shadow-xl: var(--light-shadow-xl); + --shadow-modal: 0 0 0 1px var(--opacity-8), var(--shadow-lg), 0px -4px 4px 0px rgba(0, 0, 0, .04) inset; + --backdrop-blur: blur(16px); + --high-legibility-backdrop-blur: blur(24px) contrast(50%) brightness(130%) +} + +.theme-root.dark { + --shadow-xs: 0 1px 4px rgba(0, 0, 0, .25); + --shadow-sm: 0 0.7px 2.7px rgba(0, 0, 0, .25), 0 1.7px 6.9px rgba(0, 0, 0, .3), 0 3.5px 14.2px rgba(0, 0, 0, .35), 0 7.3px 29.2px rgba(0, 0, 0, .4); + --shadow: 0 1.6px 2.7px rgba(0, 0, 0, .25), 0 4.2px 6.9px rgba(0, 0, 0, .3), 0 8.5px 14.2px rgba(0, 0, 0, .35), 0 17.5px 29.2px rgba(0, 0, 0, .4); + --shadow-lg: 0 3.3px 2.7px rgba(0, 0, 0, .3), 0 8.3px 6.9px rgba(0, 0, 0, .3), 0 17px 14.2px rgba(0, 0, 0, .35), 0 35px 29.2px rgba(0, 0, 0, .4); + --shadow-xl: 0 4.5px 2.7px rgba(0, 0, 0, .3), 0 11.3px 6.9px rgba(0, 0, 0, .3), 0 23px 14.2px rgba(0, 0, 0, .35), 0 47.5px 29.2px rgba(0, 0, 0, .4); + --high-legibility-backdrop-blur: blur(24px) contrast(50%) brightness(70%) +} + +.theme-root, +.tint-root { + --shimmer-color: var(--pale-gray); + --shimmer-gradient: linear-gradient(to right, var(--pale-gray) 8%, var(--faint-gray) 18%, var(--pale-gray) 33%) +} + +@keyframes shimmer { + 0% { + background-position: -568px 0 + } + to { + background-position: 568px 0 + } +} + +.shimmer, +.shimmer-wrapper, +.text-shimmer-wrapper { + position: relative +} + +.shimmer { + animation-duration: 1.2s; + animation-fill-mode: forwards; + animation-iteration-count: infinite; + animation-name: shimmer; + animation-timing-function: linear; + background: var(--shimmer-color); + background: var(--shimmer-gradient); + background-size: 1200px 104px; + height: 1rem; + margin-bottom: .5rem +} + +.shimmer-round { + border-radius: var(--border-radius) +} + +.shimmer-circle { + border-radius: 100% +} + +.text-shimmer-wrapper { + --text-shimmer-text-ratio: 0.625; + --text-shimmer-padding-ratio: calc(1 - var(--text-shimmer-text-ratio)); + --text-shimmer-padding-vertical: calc(var(--text-shimmer-height) * var(--text-shimmer-padding-ratio) / 2); + padding-top: var(--text-shimmer-padding-vertical); + padding-bottom: var(--text-shimmer-padding-vertical) +} + +.text-shimmer-wrapper .shimmer { + height: calc(var(--text-shimmer-height)*var(--text-shimmer-text-ratio)); + margin-bottom: 0; + margin-top: 0 +} + +.theme-root, +.tint-root { + --rich-text-toolbar-button-color: var(--tertiary-color); + --rich-text-toolbar-button-hover-color: var(--primary-color); + --rich-text-toolbar-button-hover-bg-color: var(--hover-bg-color); + --rich-text-toolbar-button-active-color: var(--brand-color); + --rich-text-toolbar-button-active-hover-bg-color: var(--hover-bg-color); + --editor-selected-text-bg-color: var(--brand-pale-bg-color); + --editor-selected-node-border-color: var(--brand-pale-bg-color); + --editor-resize-control-color: var(--brand-color); + --table-header-color: var(--secondary-color); + --table-header-divider-color: var(--divider-color); + --table-divider-color: var(--divider-color); + --table-mobile-divider-color: var(--divider-color); + --table-hover-bg-color: var(--hover-bg-color); + --table-empty-color: var(--tertiary-color); + --table-expanded-row-bg-color: var(--secondary-bg-color) +} + +.mobile-only { + display: none +} + +@media(max-width:650px) { + .mobile-only { + display: block + } + .desktop-only { + display: none + } +} + +.inverted-filter, +.theme-root.dark .adaptive-inverted-filter { + filter: invert(.95) hue-rotate(180deg) +} + +.theme-root.dark .tint-root.light .adaptive-inverted-filter { + filter: none +} + +.theme-root, +.tint-root { + --input-horizontal-padding: 0.875rem; + --input-vertical-padding: 0.625rem; + --input-padding: var(--input-vertical-padding) var(--input-horizontal-padding); + --button-icon-only-padding: 0.625rem; + --button-icon-only-compact-padding: 0.4375rem; + --input-font-size: 1rem; + --input-label-font-size: 0.875rem; + --input-line-height: 1; + --input-element-gap: 0.5rem; + --input-border-thickness: 1px; + --input-height: calc(2.25rem + 2 * var(--input-border-thickness)); + --input-textarea-line-height: 1.5; + --input-textarea-vertical-padding: 0.375rem; + --input-textarea-padding: var(--input-textarea-vertical-padding) 0.75rem; + --naked-input-font-weight: var(--font-weight-regular); + --naked-input-line-height: var(--reduced-line-height); + --naked-input-hover-bg-color: var(--opacity-light); + --naked-input-hover-placeholder-color: var(--opacity-48); + --naked-input-padding: 0; + --naked-input-guidance-height: auto; + --small-input-padding: 0.4375rem 0.625rem; + --small-button-icon-only-padding: 0.4375rem; + --small-button-icon-only-compact-padding: 0.3125rem; + --small-input-font-size: 0.875rem; + --small-input-label-font-size: 0.75rem; + --small-input-element-gap: 0.375rem; + --small-input-height: calc(1.75rem + 2 * var(--input-border-thickness)); + --large-input-horizontal-padding: 1.125rem; + --large-input-vertical-padding: 0.75rem; + --large-input-padding: var(--large-input-vertical-padding) var(--large-input-horizontal-padding); + --large-button-icon-only-padding: 0.75rem; + --large-button-icon-only-compact-padding: 0.5rem; + --large-input-font-size: 1.125rem; + --large-input-label-font-size: 1rem; + --large-input-element-gap: 0.625rem; + --large-input-height: calc(2.625rem + 2 * var(--input-border-thickness)); + --large-input-textarea-vertical-padding: 0.425rem; + --large-input-textarea-padding: var(--large-input-textarea-vertical-padding) 1rem; + --dot-size: 0.5rem; + --small-dot-size: 0.375rem; + --large-dot-size: 0.625rem; + --segment-color: var(--tertiary-color-alpha); + --segment-hover-color: var(--primary-color); + --segment-gap: 0.25rem; + --segment-padding: 0.25rem 0.75rem; + --segment-icon-gap: 0.375rem; + --small-segment-gap: 0.125rem; + --small-segment-padding: 0.25rem 0.5rem; + --small-segment-font-size: 0.8rem; + --segment-selected-color: var(--primary-color); + --segment-divider-color: var(--tertiary-divider-color); + --segment-slider-bg-color: var(--primary-bg-color); + --segment-bg-color: var(--opacity-light); + --toggle-width: 2.375rem; + --toggle-height: 1.5rem; + --toggle-gap: 0.125rem; + --large-toggle-width: 2.75rem; + --large-toggle-height: 1.75rem; + --large-toggle-gap: 0.125rem +} + +.theme-root, +.theme-root.dark .tint-root.light, +.tint-root { + --input-color: var(--primary-color); + --input-bg-color: var(--primary-bg-color); + --input-hover-bg-color: var(--primary-bg-color); + --input-box-shadow: none; + --input-border-color: var(--secondary-border-color); + --input-border: var(--input-border-thickness) solid var(--input-border-color); + --input-disabled-color: var(--tertiary-color-alpha); + --input-hover-box-shadow: none; + --input-hover-border-color: var(--tertiary-color-alpha); + --input-focus-bg-color: var(--primary-bg-color); + --input-focus-box-shadow: none; + --input-focus-border-color: var(--primary-color); + --input-accessory-text-color: var(--secondary-color-alpha); + --input-accessory-text-bg-color: var(--opacity-light); + --solid-input-bg-color: var(--opacity-4); + --solid-input-border-color: var(--opacity-0); + --solid-input-hover-bg-color: var(--opacity-8); + --disabled-background-color: var(--secondary-bg-color); + --placeholder-color: var(--opacity-32); + --error-placeholder-color: var(--half-red); + --tagged-input-item-bg-color: var(--secondary-bg-color); + --primary-button-color: var(--white); + --primary-button-bg-color: var(--gray-90); + --primary-button-hover-bg-color: var(--gray-80); + --primary-button-link-color: var(--gray-80); + --primary-button-hover-link-color: var(--gray-90); + --secondary-button-color: var(--white); + --secondary-button-bg-color: var(--gray-60); + --secondary-button-hover-bg-color: var(--gray-70); + --secondary-button-link-color: var(--tertiary-color-alpha); + --secondary-button-hover-link-color: var(--secondary-color-alpha); + --brand-button-color: var(--white); + --brand-button-bg-color: var(--brand-color); + --brand-button-hover-bg-color: var(--brand-active-color); + --brand-button-link-color: var(--brand-color); + --brand-button-hover-link-color: var(--brand-active-color); + --success-button-color: var(--white); + --success-button-bg-color: var(--success-color); + --success-button-hover-bg-color: var(--success-active-color); + --success-button-link-color: var(--success-color); + --success-button-hover-link-color: var(--success-active-color); + --error-button-color: var(--white); + --error-button-bg-color: var(--error-color); + --error-button-hover-bg-color: var(--error-active-color); + --error-button-link-color: var(--error-color); + --error-button-hover-link-color: var(--error-active-color); + --light-button-color: var(--opacity-64); + --light-button-bg-color: var(--opacity-light); + --light-button-hover-color: var(--primary-bg-color); + --light-button-hover-bg-color: var(--opacity-64); + --light-button-hover-border-color: var(--opacity-0); + --rich-button-bg-color: var(--opacity-light); + --checkbox-border-color: var(--input-border-color); + --checkbox-box-shadow: none; + --checkbox-bg-color: var(--input-bg-color); + --checkbox-check-color: var(--primary-bg-color); + --checkbox-checked-bg-color: var(--primary-color); + --checkbox-hover-border-color: var(--secondary-color); + --select-menu-border-color: var(--border-color); + --select-menu-hover-color: var(--hover-bg-color); + --select-menu-focus-color: var(--tertiary-bg-color); + --select-menu-selected-color: var(--brand-color); + --toggle-bg-color: var(--opacity-16); + --toggle-disabled-bg-color: var(--opacity-light); + --toggle-active-bg-color: var(--primary-color); + --toggle-active-disabled-bg-color: var(--tertiary-color); + --toggle-success-active-bg-color: var(--success-color); + --toggle-success-active-disabled-bg-color: var(--darker-pale-green) +} + +.theme-root input, +.theme-root.dark .tint-root.light input, +.tint-root input { + color-scheme: light +} + +.theme-root.dark, +.theme-root.dark .tint-root, +.theme-root.light .tint-root.dark { + --primary-button-color: var(--black); + --primary-button-bg-color: var(--white); + --primary-button-hover-bg-color: var(--gray-20); + --primary-button-link-color: var(--gray-20); + --primary-button-hover-link-color: var(--white); + --secondary-button-bg-color: var(--gray-70); + --secondary-button-hover-bg-color: var(--gray-80); + --success-button-bg-color: var(--green-50); + --success-button-hover-bg-color: var(--green-60); + --success-button-link-color: var(--green-50); + --success-button-hover-link-color: var(--green-40); + --error-button-bg-color: var(--red-50); + --error-button-hover-bg-color: var(--red-60); + --error-button-link-color: var(--red-50); + --error-button-hover-link-color: var(--red-40); + --segment-slider-bg-color: var(--pale-white); + --toggle-bg-color: var(--white-translucent); + --toggle-active-bg-color: var(--success-color); + --toggle-active-disabled-bg-color: var(--green-70); + --toggle-success-active-disabled-bg-color: var(--green-70) +} + +.theme-root.dark .tint-root input, +.theme-root.dark input, +.theme-root.light .tint-root.dark input { + color-scheme: dark +} + +.highlight-label:focus-within .lux-input-label { + color: var(--input-focus-border-color) +} + +.highlight-label.error .lux-input-label { + color: var(--error-color) +} + +.luma-input { + transition: var(--transition); + color: var(--input-color); + line-height: var(--input-line-height); + border-radius: var(--border-radius); + overflow: hidden; + border: 1px solid var(--input-border-color); + background-color: var(--input-bg-color); + height: var(--input-height); + padding: var(--input-padding); + font-size: var(--input-font-size); + width: 100%; + background-image: -webkit-linear-gradient(hsla(0, 0%, 100%, 0), hsla(0, 0%, 100%, 0)) +} + +.luma-input:not(:disabled):hover { + border-color: var(--input-hover-border-color); + background-color: var(--input-hover-bg-color) +} + +.luma-input:disabled { + background-color: var(--disabled-background-color); + cursor: not-allowed +} + +.luma-input:focus, +.luma-input:focus:hover { + background-color: var(--input-focus-bg-color); + border-color: var(--input-focus-border-color); + outline: 0 +} + +.luma-input::placeholder { + color: var(--placeholder-color); + opacity: 1 +} + +.luma-input:-ms-input-placeholder { + color: var(--placeholder-color) +} + +.luma-input::-ms-input-placeholder { + color: var(--placeholder-color) +} + +.luma-input:-moz-focusring { + text-shadow: none +} + +.lux-input-wrapper { + max-width: var(--input-max-width, auto) +} + +.lux-input-wrapper .inner-wrapper { + display: inline-block; + width: 100% +} + +.lux-input-wrapper:focus-within .lux-input-label { + color: var(--input-focus-border-color) +} + +.lux-input-wrapper:focus-within:not(.error) .helper-text { + color: var(--input-focus-border-color); + border-color: var(--input-focus-border-color) +} + +.lux-input-wrapper .helper-text { + transition: var(--transition); + font-size: var(--input-label-font-size) +} + +.lux-input-wrapper.error .helper-text, +.lux-input-wrapper.error .lux-input-label, +.lux-input-wrapper.error .lux-input-label:hover { + color: var(--error-color); + border-color: var(--error-color) +} + +.lux-input-wrapper.error .luma-input, +.lux-input-wrapper.error .luma-input:focus, +.lux-input-wrapper.error .luma-input:focus:hover, +.lux-input-wrapper.error .luma-input:hover { + border-color: var(--error-color) +} + +.lux-input-wrapper .helper-text { + color: var(--tertiary-color); + max-height: 0; + overflow: hidden; + opacity: 0 +} + +.lux-input-wrapper.error .helper-text.show, +.lux-input-wrapper:focus-within .helper-text.show { + padding-top: .5rem; + max-height: 50px; + opacity: 1 +} + +.lux-input-wrapper.error .helper-text.show { + border-color: var(--error-color) +} + +.theme-root { + --tiny-pill-padding: 0.25rem 0.4375rem; + --tiny-pill-delete-margin: -0.25rem -0.5rem -0.25rem -0.1875rem; + --tiny-pill-font-size: 0.75rem; + --tiny-pill-element-gap: 0.1875rem; + --small-pill-padding: 0.3125rem 0.5625rem; + --small-pill-delete-margin: -0.3125rem -0.625rem -0.3125rem -0.25rem; + --small-pill-font-size: 0.875rem; + --small-pill-element-gap: 0.25rem; + --medium-pill-padding: 0.4375rem 0.75rem; + --medium-pill-delete-margin: -0.4375rem -0.875rem -0.4375rem -0.5rem; + --medium-pill-font-size: 1rem; + --medium-pill-element-gap: 0.3125rem +} + +.react-select-container .react-select__control, +.react-select__menu-portal .react-select__control { + transition: var(--transition); + border: 1px solid var(--input-border-color); + color: var(--primary-color); + background-color: var(--input-bg-color); + border-radius: var(--border-radius) +} + +.react-select-container .react-select__control .react-select__value-container, +.react-select__menu-portal .react-select__control .react-select__value-container { + cursor: text +} + +.react-select-container .react-select__control .react-select__indicator-separator, +.react-select__menu-portal .react-select__control .react-select__indicator-separator { + background-color: var(--input-border-color) +} + +.react-select-container .react-select__control .react-select__input, +.react-select__menu-portal .react-select__control .react-select__input { + color: var(--primary-color) !important +} + +.react-select-container .react-select__control .react-select__indicator, +.react-select__menu-portal .react-select__control .react-select__indicator { + color: var(--input-border-color) +} + +.react-select-container .react-select__control .react-select__multi-value__label, +.react-select-container .react-select__control .react-select__single-value, +.react-select__menu-portal .react-select__control .react-select__multi-value__label, +.react-select__menu-portal .react-select__control .react-select__single-value { + color: var(--primary-color) +} + +.react-select-container .react-select__control .react-select__multi-value, +.react-select__menu-portal .react-select__control .react-select__multi-value { + background-color: var(--tagged-input-item-bg-color) +} + +.react-select-container .react-select__control .react-select__placeholder, +.react-select__menu-portal .react-select__control .react-select__placeholder { + color: var(--placeholder-color) +} + +.react-select-container .react-select__control .react-select__clear-indicator, +.react-select-container .react-select__control .react-select__multi-value__remove, +.react-select__menu-portal .react-select__control .react-select__clear-indicator, +.react-select__menu-portal .react-select__control .react-select__multi-value__remove { + transition: var(--transition); + cursor: pointer +} + +.react-select-container .react-select__control .react-select__multi-value__label, +.react-select__menu-portal .react-select__control .react-select__multi-value__label { + padding: .25rem .5rem +} + +.react-select-container .react-select__control .react-select__multi-value__remove, +.react-select__menu-portal .react-select__control .react-select__multi-value__remove { + color: var(--secondary-color) +} + +.react-select-container .react-select__control .react-select__multi-value__remove:hover, +.react-select__menu-portal .react-select__control .react-select__multi-value__remove:hover { + color: var(--error-color); + background-color: var(--pale-red) +} + +.react-select-container .react-select__control:hover, +.react-select__menu-portal .react-select__control:hover { + border-color: var(--input-hover-border-color); + box-shadow: var(--input-hover-box-shadow) +} + +.react-select-container .react-select__control:hover .react-select__indicator, +.react-select__menu-portal .react-select__control:hover .react-select__indicator { + color: var(--input-hover-border-color) +} + +.react-select-container .react-select__control .react-select__clear-indicator:hover, +.react-select__menu-portal .react-select__control .react-select__clear-indicator:hover { + color: var(--error-color) +} + +.react-select-container .react-select__control.react-select__control--is-focused, +.react-select-container .react-select__control.react-select__control--is-focused:hover, +.react-select__menu-portal .react-select__control.react-select__control--is-focused, +.react-select__menu-portal .react-select__control.react-select__control--is-focused:hover { + border-color: var(--input-focus-border-color); + box-shadow: var(--input-focus-box-shadow) +} + +.react-select-container .react-select__menu, +.react-select__menu-portal .react-select__menu { + z-index: 2; + border: 1px solid var(--select-menu-border-color); + box-shadow: var(--shadow-sm); + background-color: var(--menu-bg-color); + overflow: hidden; + border-radius: var(--border-radius); + -webkit-backdrop-filter: blur(16px); + backdrop-filter: blur(16px) +} + +.react-select-container .react-select__option, +.react-select__menu-portal .react-select__option { + font-size: var(--font-size-sm) +} + +.react-select-container .react-select__option--is-focused, +.react-select__menu-portal .react-select__option--is-focused { + background-color: var(--select-menu-hover-color) +} + +.react-select-container .react-select__option:active, +.react-select__menu-portal .react-select__option:active { + background-color: var(--select-menu-focus-color) +} + +.react-select-container .react-select__option--is-selected, +.react-select-container .react-select__option--is-selected:active, +.react-select__menu-portal .react-select__option--is-selected, +.react-select__menu-portal .react-select__option--is-selected:active { + background-color: var(--select-menu-selected-color) +} + +.react-select-container.rounded .react-select__control, +.react-select-container.rounded .react-select__multi-value, +.react-select__menu-portal.rounded .react-select__control, +.react-select__menu-portal.rounded .react-select__multi-value { + border-radius: 1000px +} + +.react-select--is-disabled { + cursor: not-allowed +} + +.react-select--is-disabled .react-select__control { + background-color: var(--disabled-background-color) +} + +.react-select--is-disabled .react-select__value-container .react-select__single-value { + color: var(--secondary-color) +} + +.not-searchable .react-select-container .react-select__control .react-select__value-container { + cursor: pointer +} + +.dropdown-wrapper.invalid .react-select-container .react-select__control { + border-color: var(--error-color) +} + +.dropzone-wrapper { + height: 100%; + width: 100%; + position: relative; + padding: 1.5rem; + background-color: var(--opacity-4); + border-radius: var(--border-radius); + border: 1px dashed var(--divider-color); + cursor: pointer; + text-align: center; + display: flex; + flex-direction: column; + justify-content: center +} + +.dropzone-wrapper:hover { + background-color: var(--opacity-8) +} + +.dropzone-wrapper.active .label, +.dropzone-wrapper.active .sublabel, +.dropzone-wrapper.active svg, +.dropzone-wrapper.dragging .label, +.dropzone-wrapper.dragging .sublabel, +.dropzone-wrapper.dragging svg { + color: #fff +} + +.dropzone-wrapper.dragging { + background: var(--success-color) +} + +.dropzone-wrapper.active { + background: var(--warning-color) +} + +.dropzone-wrapper.loading { + animation: pulse 1s ease infinite alternate +} + +.dropzone-wrapper svg { + width: 2rem; + height: 2rem; + transition: var(--transition); + color: var(--secondary-color-alpha) +} + +.dropzone-wrapper svg+.label { + margin-top: 1rem +} + +@keyframes pulse { + 0% { + opacity: .8 + } + to { + opacity: 1 + } +} + +.theme-root, +.theme-root.dark .tint-root.light, +.tint-root { + --page-bg-color: var(--secondary-bg-color); + --page-bg-color-translucent: var(--secondary-bg-color-translucent); + --card-bg-color: var(--white-opacity-80); + --card-border-color: #fff; + --card-hover-border-color: var(--black-opacity-16); + --card-hover-shadow: 0px 28px 17px rgba(0, 0, 0, .005), 0px 12px 12px rgba(0, 0, 0, .01), 0px 3px 7px rgba(0, 0, 0, .01), 0px 0px 0px rgba(0, 0, 0, .01); + --table-border-color: var(--divider-color); + --rich-button-bg-color: var(--card-bg-color); + --rich-button-border-color: var(--card-border-color); + --nav-item-color: var(--primary-color); + --nav-item-hover-color: var(--primary-color); + --nav-item-hover-bg-color: var(--tertiary-bg-color); + --nav-item-selected-color: var(--brand-color); + --nav-link-color: var(--tertiary-color-alpha); + --nav-link-hover-color: var(--primary-color); + --nav-vertical-padding: 0.75rem; + --nav-horizontal-padding: 1rem; + --nav-padding: var(--nav-vertical-padding) var(--nav-horizontal-padding); + --page-header-tab-color: var(--tertiary-color-alpha); + --page-header-tab-color-hover: var(--secondary-color-alpha); + --page-header-tab-color-selected: var(--primary-color); + --tab-item-color: var(--secondary-color); + --tab-item-hover-color: var(--primary-color); + --tab-item-selected-color: var(--brand-color); + --tabbar-side-offset: 1rem +} + +.theme-root .tint-root.dark, +.theme-root.dark, +.theme-root.dark .tint-root { + --page-bg-color: var(--primary-bg-color); + --page-bg-color-translucent: var(--primary-bg-color-translucent); + --card-bg-color: var(--white-opacity-4); + --card-border-color: var(--white-opacity-4); + --card-hover-border-color: var(--white-opacity-16); + --card-hover-shadow: 0px 28px 17px rgba(0, 0, 0, .01), 0px 12px 12px rgba(0, 0, 0, .02), 0px 3px 7px rgba(0, 0, 0, .02), 0px 0px 0px rgba(0, 0, 0, .02); + --rich-button-bg-color: rgba(34, 36, 37, .8); + --rich-button-border-color: var(--white-opacity-8) +} + +.section-title-wrapper .section-title-row { + margin-bottom: 1.25rem +} + +.section-title-wrapper.small .section-title-row { + margin-bottom: 1rem +} + +.section-title-wrapper h2 { + font-size: var(--section-title-font-size); + font-weight: var(--font-weight-bold); + color: var(--primary-color); + margin-bottom: 0 +} + +.section-title-wrapper.small h2 { + font-size: var(--small-section-title-font-size) +} + +.section-title-wrapper .right-element { + margin: -.25rem 0 +} + +.section-title-wrapper .section-subtitle { + margin-top: -.875rem; + margin-bottom: 1.25rem; + color: var(--secondary-color); + font-size: var(--section-subtitle-font-size) +} + +.section-title-wrapper.small .section-subtitle { + font-size: var(--small-section-subtitle-font-size); + margin-top: -.5rem; + margin-bottom: 1rem +} + +.can-divide+.with-divider { + margin-top: 2rem; + padding-top: 2rem; + border-top: 1px solid var(--divider-color) +} + +@media(max-width:450px) { + .can-divide+.with-divider { + margin-top: 1.5rem; + padding-top: 1.5rem + } +} + +.can-divide.small+.with-divider.small { + margin-top: 1.25rem; + padding-top: 1.25rem; + border-top: 1px solid var(--divider-color) +} + +.theme-root { + --timeline-title-width: 7rem; + --timeline-column-gap: 4rem; + --timeline-section-gap: 0; + --timeline-single-column-line-left-padding: 0.25rem; + --timeline-single-column-line-width: 1.5rem; + --timeline-sticky-header-offset: 1rem +} + +.simple-drop-zone-container { + position: relative; + width: max-content; + max-width: 100% +} + +.simple-drop-zone-container .drop-zone { + height: var(--size); + width: var(--size); + max-width: 100%; + background-color: var(--tertiary-bg-color); + cursor: pointer; + transition: var(--transition); + background-size: cover +} + +.simple-drop-zone-container .drop-zone.rectangle, +.simple-drop-zone-container .drop-zone.square, +.simple-drop-zone-container .drop-zone.wide-rectangle { + border-radius: var(--border-radius) +} + +.simple-drop-zone-container .drop-zone.rectangle { + width: calc(var(--size)*2) +} + +.simple-drop-zone-container .drop-zone.wide-rectangle { + width: calc(var(--size)*5) +} + +.simple-drop-zone-container .drop-zone.circle { + border-radius: 999px +} + +.simple-drop-zone-container .drop-zone.active { + background-color: var(--success-color) +} + +.simple-drop-zone-container .drop-zone.contain { + background-position: 50%; + background-size: contain; + background-repeat: no-repeat +} + +.simple-drop-zone-container .image-icon { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + color: var(--opacity-16) +} + +.simple-drop-zone-container .image-icon svg { + width: calc(var(--size)*.5); + height: calc(var(--size)*.5) +} + +.simple-drop-zone-container .has-image .image-icon { + display: none +} + +.cover-image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + background-color: var(--highlight-image-background-color--normal); + font-family: var(--font-family); + /* Include other relevant styles */ +} + +.simple-drop-zone-container .icon { + position: absolute; + bottom: -2px; + right: -2px; + height: 2rem; + width: 2rem; + border-radius: var(--border-radius); + background-color: var(--primary-color); + border: 2px solid var(--primary-bg-color); + display: flex; + place-items: center; + transition: var(--transition); + color: var(--primary-bg-color) +} + +.simple-drop-zone-container .icon svg { + margin: 0 auto; + stroke-width: 3 +} + +.simple-drop-zone-container .drop-zone.active .icon, +.simple-drop-zone-container .drop-zone:hover .icon { + background-color: var(--brand-color); + color: #fff +} + +.simple-drop-zone-container .drop-zone.active.has-image .icon { + background-color: var(--success-color) +} + +.simple-drop-zone-container .remove-button { + position: absolute; + top: .25rem; + right: .25rem +} + +.simple-drop-zone-container .remove-button .luma-button { + --padding: 0.1rem; + --height: 1.2rem +} + +.simple-drop-zone-container .remove-button .luma-button svg { + stroke-width: 3 +} + +.ProseMirror { + position: relative; + word-wrap: break-word; + white-space: pre-wrap; + white-space: break-spaces; + font-variant-ligatures: none; + font-feature-settings: "liga" 0, none +} + +.ProseMirror pre { + white-space: pre-wrap +} + +.ProseMirror li { + position: relative +} + +.ProseMirror-hideselection ::selection { + background: transparent +} + +.ProseMirror-hideselection ::-moz-selection { + background: transparent +} + +.ProseMirror-hideselection { + caret-color: transparent +} + +.ProseMirror-selectednode { + outline: 2px solid #8cf +} + +li.ProseMirror-selectednode { + outline: none +} + +li.ProseMirror-selectednode:after { + content: ""; + position: absolute; + left: -32px; + right: -2px; + top: -2px; + bottom: -2px; + border: 2px solid #8cf; + pointer-events: none +} + +img.ProseMirror-separator { + display: inline !important; + border: none !important; + margin: 0 !important +} + +.lux-button-switcher { + overflow: hidden; + border-radius: var(--border-radius); + background-color: var(--segment-bg-color); + padding: var(--segment-gap) +} + +.lux-button-switcher.round, +.lux-button-switcher.round .slider { + border-radius: 100px +} + +.lux-button-switcher .segments { + display: grid; + grid-template-columns: repeat(var(--option-length), minmax(0, 1fr)); + position: relative +} + +.lux-button-switcher .segment { + padding: var(--segment-padding); + position: relative; + color: var(--segment-color); + border-radius: 0; + justify-content: center +} + +.lux-button-switcher .segment:after { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: calc(var(--border-radius)/1.25); + outline: 2px solid transparent; + transition: var(--transition); + z-index: 10 +} + +.lux-button-switcher .segment:focus-visible { + outline: none +} + +.lux-button-switcher .segment:focus-visible:after { + outline: 2px solid var(--outline-color) +} + +.lux-button-switcher .segment:hover { + color: var(--segment-hover-color) +} + +.lux-button-switcher .segment .icon:not(:last-child) svg { + margin-right: var(--segment-icon-gap) +} + +.lux-button-switcher .segment:not(:first-child):before { + transition: var(--transition); + position: absolute; + top: 4px; + bottom: 4px; + left: 0; + content: ""; + border-left: 1px solid var(--segment-divider-color); + z-index: 0 +} + +.lux-button-switcher .segment.nodivider:not(:first-child):before { + opacity: 0 +} + +.lux-button-switcher .segment * { + z-index: 2; + position: relative +} + +.lux-button-switcher .segment.selected { + color: var(--segment-selected-color) +} + +.lux-button-switcher.round .segment:after { + border-radius: 100px +} + +.lux-button-switcher .segment.selected:focus-visible+.slider { + outline: 1px solid var(--primary-color) +} + +.lux-button-switcher .slider { + pointer-events: none; + background-color: var(--segment-slider-bg-color); + border-radius: calc(var(--border-radius)/1.25); + width: calc(100%/var(--option-length)); + box-shadow: var(--shadow-xs); + position: absolute; + height: 100%; + z-index: 1 +} + +.lux-button-switcher.always { + padding: var(--small-segment-gap) +} + +.lux-button-switcher.always .segment { + font-size: var(--small-segment-font-size); + padding: var(--small-segment-padding) +} + +.lux-button-switcher.always .segment svg { + width: var(--small-segment-font-size); + height: var(--small-segment-font-size) +} + +@media(max-width:650px) { + .lux-button-switcher.small { + padding: var(--small-segment-gap) + } + .lux-button-switcher.small .segment { + font-size: var(--small-segment-font-size); + padding: var(--small-segment-padding) + } + .lux-button-switcher.small .segment svg { + width: var(--small-segment-font-size); + height: var(--small-segment-font-size) + } + .lux-button-switcher.hide-icons-small .icon { + display: none + } +} + +@media(max-width:450px) { + .lux-button-switcher.tiny { + padding: var(--small-segment-gap) + } + .lux-button-switcher.tiny .segment { + font-size: var(--small-segment-font-size); + padding: var(--small-segment-padding) + } + .lux-button-switcher.tiny .segment svg { + width: var(--small-segment-font-size); + height: var(--small-segment-font-size) + } + .lux-button-switcher.hide-icons-tiny .icon { + display: none + } +} + +.luma-button { + font-weight: var(--font-weight-medium); + border-radius: var(--border-radius); + position: relative; + white-space: nowrap; + justify-content: center; + outline-offset: .125rem; + outline: 2px solid transparent; + max-width: 100%; + min-width: 0; + --padding: var(--input-padding); + --size: var(--input-font-size); + --gap: var(--input-element-gap); + --height: var(--input-height); + font-size: var(--size); + padding: var(--padding); + height: var(--height); + width: -moz-fit-content; + width: fit-content +} + +.luma-button.round { + border-radius: calc(var(--input-height)/2) +} + +.luma-button.icon-only, +.luma-button.icon-only-compact { + flex-shrink: 0 +} + +.luma-button.icon-only { + --padding: var(--button-icon-only-padding) +} + +.luma-button.icon-only-compact { + --padding: var(--button-icon-only-compact-padding); + --height: auto +} + +.luma-button:disabled { + cursor: not-allowed +} + +.luma-button.small { + --padding: var(--small-input-padding); + --size: var(--small-input-font-size); + --gap: var(--small-input-element-gap); + --height: var(--small-input-height) +} + +.luma-button.small.round { + border-radius: calc(var(--small-input-height)/2) +} + +.luma-button.small.icon-only { + --padding: var(--small-button-icon-only-padding) +} + +.luma-button.small.icon-only-compact { + --padding: var(--small-button-icon-only-compact-padding); + --height: auto +} + +.luma-button.large { + --padding: var(--large-input-padding); + --size: var(--large-input-font-size); + --gap: var(--large-input-element-gap); + --height: var(--large-input-height) +} + +.luma-button.large.round { + border-radius: calc(var(--large-input-height)/2) +} + +.luma-button.large.icon-only { + --padding: var(--large-button-icon-only-padding) +} + +.luma-button.large.icon-only-compact { + --padding: var(--large-button-icon-only-compact-padding); + --height: auto +} + +.luma-button.full-width { + width: 100% +} + +.luma-button svg { + width: var(--size); + height: var(--size); + flex-shrink: 0 +} + +.luma-button svg:not(.spinner) { + stroke-width: 2.5 +} + +.luma-button .label { + line-height: 1; + margin: -4px 0; + padding: 4px 0; + overflow: hidden; + text-overflow: ellipsis +} + +.luma-button.no-icon.loading .label { + opacity: 0 +} + +.luma-button.no-icon.loading svg { + position: absolute; + left: calc(50% - .5*var(--size)) +} + +.luma-button.icon-left svg { + margin-right: var(--gap) +} + +.luma-button.icon-right svg { + margin-left: var(--gap) +} + +.luma-button.link { + padding: 0; + height: auto; + border: none; + border-radius: 0; + outline-offset: .375rem +} + +.luma-button.link svg { + width: calc(var(--size)/1.1); + height: calc(var(--size)/1.1) +} + +.luma-button:focus-visible.primary { + outline: var(--primary-button-bg-color) solid 2px +} + +.luma-button:focus-visible.secondary { + outline: var(--secondary-button-bg-color) solid 2px +} + +.luma-button:focus-visible.brand { + outline: var(--brand-button-bg-color) solid 2px +} + +.luma-button:focus-visible.success { + outline: var(--success-button-bg-color) solid 2px +} + +.luma-button:focus-visible.error { + outline: var(--error-button-bg-color) solid 2px +} + +.luma-button:focus-visible.light { + outline: var(--secondary-button-bg-color) solid 2px +} + +.luma-button:focus-visible.discord { + outline: var(--discord-fg-color) solid 2px +} + +.luma-button:focus-visible.ethereum { + outline: var(--ethereum-fg-color) solid 2px +} + +.luma-button:focus-visible.glow { + outline: var(--glow-fg-color) solid 2px +} + +.luma-button:focus-visible.google { + outline: var(--google-fg-color) solid 2px +} + +.luma-button:focus-visible.slack { + outline: var(--slack-fg-color) solid 2px +} + +.luma-button:focus-visible.twitter { + outline: var(--twitter-fg-color) solid 2px +} + +.luma-button:focus-visible.solana { + outline: var(--solana-fg-color) solid 2px +} + +.luma-button:focus-visible.youtube { + outline: var(--youtube-fg-color) solid 2px +} + +.luma-button:focus-visible.zoom { + outline: var(--zoom-fg-color) solid 2px +} + +.luma-button:focus-visible.microsoft { + outline: var(--microsoft-fg-color) solid 2px +} + +.luma-button:focus-visible.luma-color { + outline: var(--variant-color) solid 2px +} + +.luma-button.outline { + background-color: transparent +} + +.luma-button.outline.primary { + color: var(--primary-button-bg-color) +} + +.luma-button.outline.secondary { + color: var(--secondary-button-bg-color) +} + +.luma-button.outline.brand { + color: var(--brand-button-bg-color) +} + +.luma-button.outline.success { + color: var(--success-button-bg-color) +} + +.luma-button.outline.error { + color: var(--error-button-bg-color) +} + +.luma-button.outline.light { + color: var(--light-button-color); + border-color: var(--light-button-color) +} + +.luma-button.outline.discord { + color: var(--discord-fg-color) +} + +.luma-button.outline.ethereum { + color: var(--ethereum-fg-color) +} + +.luma-button.outline.glow { + color: var(--glow-fg-color) +} + +.luma-button.outline.google { + color: var(--google-fg-color) +} + +.luma-button.outline.slack { + color: var(--slack-fg-color) +} + +.luma-button.outline.solana { + color: var(--solana-fg-color) +} + +.luma-button.outline.twitter { + color: var(--twitter-fg-color) +} + +.luma-button.outline.youtube { + color: var(--youtube-fg-color) +} + +.luma-button.outline.zoom { + color: var(--zoom-fg-color) +} + +.luma-button.outline.microsoft { + color: var(--microsoft-fg-color) +} + +.luma-button.outline.luma-color { + color: var(--variant-color) +} + +.luma-button.link, +.luma-button.naked { + background-color: transparent +} + +.luma-button.link.primary, +.luma-button.naked.primary { + color: var(--primary-button-link-color) +} + +.luma-button.link.secondary, +.luma-button.naked.secondary { + color: var(--secondary-button-link-color) +} + +.luma-button.link.brand, +.luma-button.naked.brand { + color: var(--brand-button-link-color) +} + +.luma-button.link.success, +.luma-button.naked.success { + color: var(--success-button-link-color) +} + +.luma-button.link.error, +.luma-button.naked.error { + color: var(--error-button-link-color) +} + +.luma-button.link.light, +.luma-button.naked.light { + color: var(--light-button-color) +} + +.luma-button.link.discord, +.luma-button.naked.discord { + color: var(--discord-fg-color) +} + +.luma-button.link.ethereum, +.luma-button.naked.ethereum { + color: var(--ethereum-fg-color) +} + +.luma-button.link.glow, +.luma-button.naked.glow { + color: var(--glow-fg-color) +} + +.luma-button.link.google, +.luma-button.naked.google { + color: var(--google-fg-color) +} + +.luma-button.link.slack, +.luma-button.naked.slack { + color: var(--slack-fg-color) +} + +.luma-button.link.solana, +.luma-button.naked.solana { + color: var(--solana-fg-color) +} + +.luma-button.link.twitter, +.luma-button.naked.twitter { + color: var(--twitter-fg-color) +} + +.luma-button.link.youtube, +.luma-button.naked.youtube { + color: var(--youtube-fg-color) +} + +.luma-button.link.zoom, +.luma-button.naked.zoom { + color: var(--zoom-fg-color) +} + +.luma-button.link.microsoft, +.luma-button.naked.microsoft { + color: var(--microsoft-fg-color) +} + +.luma-button.link.luma-color, +.luma-button.naked.luma-color { + color: var(--variant-color) +} + +.luma-button.naked, +.luma-button.outline, +.luma-button.solid { + border: var(--input-border-thickness) solid +} + +.luma-button.naked { + border-color: transparent !important +} + +.luma-button.primary { + border-color: var(--primary-button-bg-color) +} + +.luma-button.primary.solid { + color: var(--primary-button-color); + background-color: var(--primary-button-bg-color) +} + +@media(hover:hover) { + .luma-button.primary:not(.link):not(:disabled):hover { + color: var(--primary-button-color); + background-color: var(--primary-button-hover-bg-color); + border-color: var(--primary-button-hover-bg-color) + } + .luma-button.primary.link:not(:disabled):hover { + color: var(--primary-button-hover-link-color) + } +} + +.luma-button.secondary { + border-color: var(--secondary-button-bg-color) +} + +.luma-button.secondary.solid { + color: var(--secondary-button-color); + background-color: var(--secondary-button-bg-color) +} + +@media(hover:hover) { + .luma-button.secondary:not(.link):not(:disabled):hover { + color: var(--secondary-button-color); + background-color: var(--secondary-button-hover-bg-color); + border-color: var(--secondary-button-hover-bg-color) + } + .luma-button.secondary.link:not(:disabled):hover { + color: var(--secondary-button-hover-link-color) + } +} + +.luma-button.brand { + border-color: var(--brand-button-bg-color) +} + +.luma-button.brand.solid { + color: var(--brand-button-color); + background-color: var(--brand-button-bg-color) +} + +@media(hover:hover) { + .luma-button.brand:not(.link):not(:disabled):hover { + color: var(--brand-button-color); + background-color: var(--brand-button-hover-bg-color); + border-color: var(--brand-button-hover-bg-color) + } + .luma-button.brand.link:not(:disabled):hover { + color: var(--brand-button-hover-link-color) + } +} + +.luma-button.success { + border-color: var(--success-button-bg-color) +} + +.luma-button.success.solid { + color: var(--success-button-color); + background-color: var(--success-button-bg-color) +} + +@media(hover:hover) { + .luma-button.success:not(.link):not(:disabled):hover { + color: var(--success-button-color); + background-color: var(--success-button-hover-bg-color); + border-color: var(--success-button-hover-bg-color) + } + .luma-button.success.link:not(:disabled):hover { + color: var(--success-button-hover-link-color) + } +} + +.luma-button.error { + border-color: var(--error-button-bg-color) +} + +.luma-button.error.solid { + color: var(--error-button-color); + background-color: var(--error-button-bg-color) +} + +@media(hover:hover) { + .luma-button.error:not(.link):not(:disabled):hover { + color: var(--error-button-color); + background-color: var(--error-button-hover-bg-color); + border-color: var(--error-button-hover-bg-color) + } + .luma-button.error.link:not(:disabled):hover { + color: var(--error-button-hover-link-color) + } +} + +.luma-button.light { + border-color: transparent +} + +.luma-button.light.solid { + color: var(--light-button-color); + background-color: var(--light-button-bg-color) +} + +@media(hover:hover) { + .luma-button.light:not(.link):not(:disabled):hover { + color: var(--light-button-hover-color); + background-color: var(--light-button-hover-bg-color); + border-color: var(--light-button-hover-border-color) + } + .luma-button.light.link:not(:disabled):hover { + color: var(--light-button-hover-bg-color) + } +} + +.luma-button.light.focused:not(.link):not(:disabled) { + color: var(--light-button-hover-color); + background-color: var(--light-button-hover-bg-color); + border-color: var(--light-button-hover-border-color) +} + +.luma-button.light.active:not(.link):not(:disabled) { + border-color: var(--opacity-64); + background-color: transparent; + color: var(--opacity-64) +} + +.luma-button.light.active.focused { + border-color: var(--opacity-80); + color: var(--opacity-80) +} + +@media(hover:hover) { + .luma-button.light.active:hover:not(.link):not(:disabled) { + border-color: var(--opacity-80); + color: var(--opacity-80) + } +} + +.luma-button.discord { + border-color: var(--discord-bg-color) +} + +.luma-button.discord.solid { + color: var(--discord-contrast-color); + background-color: var(--discord-bg-color) +} + +.luma-button.discord.outline { + border-color: var(--discord-fg-color) +} + +@media(hover:hover) { + .luma-button.discord:not(.link):not(:disabled):hover { + color: var(--discord-contrast-color); + background-color: var(--discord-active-bg-color); + border-color: var(--discord-active-bg-color) + } + .luma-button.discord.link:not(:disabled):hover { + color: var(--discord-active-fg-color) + } +} + +.luma-button.ethereum { + border-color: var(--ethereum-bg-color) +} + +.luma-button.ethereum.solid { + color: var(--ethereum-contrast-color); + background-color: var(--ethereum-bg-color) +} + +.luma-button.ethereum.outline { + border-color: var(--ethereum-fg-color) +} + +@media(hover:hover) { + .luma-button.ethereum:not(.link):not(:disabled):hover { + color: var(--ethereum-contrast-color); + background-color: var(--ethereum-active-bg-color); + border-color: var(--ethereum-active-bg-color) + } + .luma-button.ethereum.link:not(:disabled):hover { + color: var(--ethereum-active-fg-color) + } +} + +.luma-button.glow { + border-color: var(--glow-bg-color) +} + +.luma-button.glow.solid { + color: var(--glow-contrast-color); + background-color: var(--glow-bg-color) +} + +.luma-button.glow.outline { + border-color: var(--glow-fg-color) +} + +@media(hover:hover) { + .luma-button.glow:not(.link):not(:disabled):hover { + color: var(--glow-contrast-color); + background-color: var(--glow-active-bg-color); + border-color: var(--glow-active-bg-color) + } + .luma-button.glow.link:not(:disabled):hover { + color: var(--glow-active-fg-color) + } +} + +.luma-button.google { + border-color: var(--google-bg-color) +} + +.luma-button.google.solid { + color: var(--google-contrast-color); + background-color: var(--google-bg-color) +} + +.luma-button.google.outline { + border-color: var(--google-fg-color) +} + +@media(hover:hover) { + .luma-button.google:not(.link):not(:disabled):hover { + color: var(--google-contrast-color); + background-color: var(--google-active-bg-color); + border-color: var(--google-active-bg-color) + } + .luma-button.google.link:not(:disabled):hover { + color: var(--google-active-fg-color) + } +} + +.luma-button.slack { + border-color: var(--slack-bg-color) +} + +.luma-button.slack.solid { + color: var(--slack-contrast-color); + background-color: var(--slack-bg-color) +} + +.luma-button.slack.outline { + border-color: var(--slack-fg-color) +} + +@media(hover:hover) { + .luma-button.slack:not(.link):not(:disabled):hover { + color: var(--slack-contrast-color); + background-color: var(--slack-active-bg-color); + border-color: var(--slack-active-bg-color) + } + .luma-button.slack.link:not(:disabled):hover { + color: var(--slack-active-fg-color) + } +} + +.luma-button.solana { + border-color: var(--solana-bg-color) +} + +.luma-button.solana.solid { + color: var(--solana-contrast-color); + background-color: var(--solana-bg-color) +} + +.luma-button.solana.outline { + border-color: var(--solana-fg-color) +} + +@media(hover:hover) { + .luma-button.solana:not(.link):not(:disabled):hover { + color: var(--solana-contrast-color); + background-color: var(--solana-active-bg-color); + border-color: var(--solana-active-bg-color) + } + .luma-button.solana.link:not(:disabled):hover { + color: var(--solana-active-fg-color) + } +} + +.luma-button.twitter { + border-color: var(--twitter-bg-color) +} + +.luma-button.twitter.solid { + color: var(--twitter-contrast-color); + background-color: var(--twitter-bg-color) +} + +.luma-button.twitter.outline { + border-color: var(--twitter-fg-color) +} + +@media(hover:hover) { + .luma-button.twitter:not(.link):not(:disabled):hover { + color: var(--twitter-contrast-color); + background-color: var(--twitter-active-bg-color); + border-color: var(--twitter-active-bg-color) + } + .luma-button.twitter.link:not(:disabled):hover { + color: var(--twitter-active-fg-color) + } +} + +.luma-button.youtube { + border-color: var(--youtube-bg-color) +} + +.luma-button.youtube.solid { + color: var(--youtube-contrast-color); + background-color: var(--youtube-bg-color) +} + +.luma-button.youtube.outline { + border-color: var(--youtube-fg-color) +} + +@media(hover:hover) { + .luma-button.youtube:not(.link):not(:disabled):hover { + color: var(--youtube-contrast-color); + background-color: var(--youtube-active-bg-color); + border-color: var(--youtube-active-bg-color) + } + .luma-button.youtube.link:not(:disabled):hover { + color: var(--youtube-active-fg-color) + } +} + +.luma-button.zoom { + border-color: var(--zoom-bg-color) +} + +.luma-button.zoom.solid { + color: var(--zoom-contrast-color); + background-color: var(--zoom-bg-color) +} + +.luma-button.zoom.outline { + border-color: var(--zoom-fg-color) +} + +@media(hover:hover) { + .luma-button.zoom:not(.link):not(:disabled):hover { + color: var(--zoom-contrast-color); + background-color: var(--zoom-active-bg-color); + border-color: var(--zoom-active-bg-color) + } + .luma-button.zoom.link:not(:disabled):hover { + color: var(--zoom-active-fg-color) + } +} + +.luma-button.microsoft { + border-color: var(--microsoft-bg-color) +} + +.luma-button.microsoft.solid { + color: var(--microsoft-contrast-color); + background-color: var(--microsoft-bg-color) +} + +.luma-button.microsoft.outline { + border-color: var(--microsoft-fg-color) +} + +@media(hover:hover) { + .luma-button.microsoft:not(.link):not(:disabled):hover { + color: var(--microsoft-contrast-color); + background-color: var(--microsoft-active-bg-color); + border-color: var(--microsoft-active-bg-color) + } + .luma-button.microsoft.link:not(:disabled):hover { + color: var(--microsoft-active-fg-color) + } +} + +.luma-button.luma-color.solid { + color: var(--variant-color); + background-color: var(--variant-color-pale); + border-color: var(--variant-color-pale) +} + +.luma-button.luma-color.outline { + border-color: var(--variant-color) +} + +@media(hover:hover) { + .luma-button.luma-color:not(:disabled):hover { + border-color: var(--variant-color) + } + .luma-button.luma-color.naked:not(:disabled):hover, + .luma-button.luma-color.outline:not(:disabled):hover { + color: #fff; + background-color: var(--variant-color) + } + .luma-button.luma-color.link:not(:disabled):hover { + color: var(--variant-color-active) + } +} + +.lux-checkbox { + position: relative; + cursor: pointer; + font-size: 1rem; + line-height: 1.25rem; + clear: both; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center +} + +.lux-checkbox label { + margin-bottom: 0 +} + +.lux-checkbox .text-label { + flex: 1 1; + cursor: pointer; + line-height: 1.5 +} + +.lux-checkbox .checkbox-text { + margin-left: .25rem; + word-break: break-word +} + +.lux-checkbox .checkbox-title { + font-size: var(--font-size-md); + margin-bottom: 1px; + margin-left: .25rem +} + +.lux-checkbox .checkbox-desc { + font-size: var(--font-size-sm); + margin-left: .25rem +} + +@media(max-width:450px) { + .lux-checkbox .checkbox-desc { + font-size: var(--font-size-xs) + } +} + +.lux-checkbox .checkbox-icon { + display: block; + position: relative; + margin-right: .5rem; + font-size: .5rem; + line-height: 1.25rem; + height: 1.25rem; + width: 1.25rem; + clear: both +} + +.lux-checkbox .checkbox-icon .input { + opacity: 0; + cursor: pointer +} + +.lux-checkbox .checkbox-icon .checkbox-display, +.lux-checkbox .checkbox-icon .input { + position: absolute; + top: 0; + left: 0; + height: 1.25rem; + width: 1.25rem +} + +.lux-checkbox .checkbox-icon .checkbox-display { + cursor: pointer; + transition: var(--fast-transition); + transition-property: border-color; + border-radius: .375rem; + background-color: var(--checkbox-bg-color); + border: .125rem solid var(--checkbox-border-color); + box-shadow: var(--checkbox-box-shadow); + padding: .25rem +} + +.lux-checkbox .checkbox-icon .checkbox-display svg { + transition: var(--fast-transition); + width: .75rem; + height: .75rem; + opacity: 0; + transform-origin: center; + transform: scale(.5) rotate(-45deg); + color: var(--checkbox-check-color) +} + +.lux-checkbox .checkbox-icon input:checked~.checkbox-display { + border: none; + background-color: var(--checkbox-checked-bg-color) +} + +.lux-checkbox .checkbox-icon input:checked~.checkbox-display svg { + opacity: 1; + transform: none +} + +.lux-checkbox:hover .checkbox-icon .checkbox-display { + border-color: var(--checkbox-hover-border-color) +} + +.lux-checkbox.danger .checkbox-display svg { + color: #fff +} + +.lux-checkbox.danger label { + color: var(--error-color) +} + +.lux-checkbox.danger input:checked~.checkbox-display { + background-color: var(--error-color) +} + +.lux-checkbox.danger:hover .checkbox-icon .checkbox-display { + border-color: var(--error-color) +} + +.lux-code-block { + --code-block-bg-color: var(--elevated-primary-bg-color); + --code-block-selection-bg-color: var(--opacity-8); + --code-block-color: var(--primary-color) +} + +.theme-root .lux-code-block code[class*=language-], +.theme-root .lux-code-block pre[class*=language-] { + background: var(--code-block-bg-color); + color: var(--code-block-color); + font-family: var(--mono-font); + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + line-height: 1.5; + -webkit-hyphens: none; + hyphens: none +} + +.theme-root .lux-code-block pre[class*=language-] { + padding: .75rem 1rem; + margin: 0; + overflow: auto; + border-radius: var(--border-radius) +} + +.theme-root .lux-code-block :not(pre)>code[class*=language-] { + padding: .2rem .3rem; + border-radius: .3rem; + white-space: normal +} + +.theme-root .lux-code-block .token.cdata, +.theme-root .lux-code-block .token.comment, +.theme-root .lux-code-block .token.prolog { + color: #9fa0a6 +} + +.theme-root .lux-code-block .token.doctype, +.theme-root .lux-code-block .token.entity, +.theme-root .lux-code-block .token.punctuation { + color: #383942 +} + +.theme-root .lux-code-block .token.atrule, +.theme-root .lux-code-block .token.attr-name, +.theme-root .lux-code-block .token.boolean, +.theme-root .lux-code-block .token.class-name, +.theme-root .lux-code-block .token.constant, +.theme-root .lux-code-block .token.number { + color: #b66a00 +} + +.theme-root .lux-code-block .token.keyword { + color: #a625a4 +} + +.theme-root .lux-code-block .token.deleted, +.theme-root .lux-code-block .token.important, +.theme-root .lux-code-block .token.property, +.theme-root .lux-code-block .token.symbol, +.theme-root .lux-code-block .token.tag { + color: #e35549 +} + +.theme-root .lux-code-block .token.attr-value, +.theme-root .lux-code-block .token.attr-value>.token.punctuation, +.theme-root .lux-code-block .token.builtin, +.theme-root .lux-code-block .token.char, +.theme-root .lux-code-block .token.inserted, +.theme-root .lux-code-block .token.regex, +.theme-root .lux-code-block .token.selector, +.theme-root .lux-code-block .token.string { + color: #50a04f +} + +.theme-root .lux-code-block .token.function, +.theme-root .lux-code-block .token.operator, +.theme-root .lux-code-block .token.variable { + color: #4078f1 +} + +.theme-root .lux-code-block .token.url { + color: #0083bb +} + +.theme-root .lux-code-block .token.attr-value>.token.punctuation.attr-equals, +.theme-root .lux-code-block .token.special-attr>.token.attr-value>.token.value.css { + color: #383942 +} + +.theme-root .lux-code-block .language-css .token.selector { + color: #e35549 +} + +.theme-root .lux-code-block .language-css .token.property { + color: #383942 +} + +.theme-root .lux-code-block .language-css .token.function, +.theme-root .lux-code-block .language-css .token.url>.token.function { + color: #0083bb +} + +.theme-root .lux-code-block .language-css .token.url>.token.string.url { + color: #50a04f +} + +.theme-root .lux-code-block .language-css .token.atrule .token.rule, +.theme-root .lux-code-block .language-css .token.important, +.theme-root .lux-code-block .language-javascript .token.operator { + color: #a625a4 +} + +.theme-root .lux-code-block .language-javascript .token.template-string>.token.interpolation>.token.interpolation-punctuation.punctuation { + color: #c91142 +} + +.theme-root .lux-code-block .language-json .token.operator { + color: #383942 +} + +.theme-root .lux-code-block .language-json .token.null.keyword { + color: #b66a00 +} + +.theme-root .lux-code-block .language-markdown .token.url, +.theme-root .lux-code-block .language-markdown .token.url-reference.url>.token.string, +.theme-root .lux-code-block .language-markdown .token.url>.token.operator { + color: #383942 +} + +.theme-root .lux-code-block .language-markdown .token.url>.token.content { + color: #4078f1 +} + +.theme-root .lux-code-block .language-markdown .token.url-reference.url, +.theme-root .lux-code-block .language-markdown .token.url>.token.url { + color: #0083bb +} + +.theme-root .lux-code-block .language-markdown .token.blockquote.punctuation, +.theme-root .lux-code-block .language-markdown .token.hr.punctuation { + color: #9fa0a6; + font-style: italic +} + +.theme-root .lux-code-block .language-markdown .token.code-snippet { + color: #50a04f +} + +.theme-root .lux-code-block .language-markdown .token.bold .token.content { + color: #b66a00 +} + +.theme-root .lux-code-block .language-markdown .token.italic .token.content { + color: #a625a4 +} + +.theme-root .lux-code-block .language-markdown .token.list.punctuation, +.theme-root .lux-code-block .language-markdown .token.strike .token.content, +.theme-root .lux-code-block .language-markdown .token.strike .token.punctuation, +.theme-root .lux-code-block .language-markdown .token.title.important>.token.punctuation { + color: #e35549 +} + +.theme-root .lux-code-block .token.bold { + font-weight: 700 +} + +.theme-root .lux-code-block .token.comment, +.theme-root .lux-code-block .token.italic { + font-style: italic +} + +.theme-root .lux-code-block .token.entity { + cursor: help +} + +.theme-root .lux-code-block .token.namespace { + opacity: .8 +} + +.theme-root .lux-code-block .token.token.cr:before, +.theme-root .lux-code-block .token.token.lf:before, +.theme-root .lux-code-block .token.token.space:before, +.theme-root .lux-code-block .token.token.tab:not(:empty):before { + color: rgba(56, 58, 66, .2) +} + +.theme-root .lux-code-block .line-highlight.line-highlight { + background: rgba(56, 58, 66, .05) +} + +.theme-root .lux-code-block .line-highlight.line-highlight:before, +.theme-root .lux-code-block .line-highlight.line-highlight[data-end]:after { + background: #e5e5e5; + color: #383942; + padding: .1rem .6rem; + border-radius: .3rem; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, .2) +} + +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-1, +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-5, +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-9 { + color: #e35549 +} + +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-10, +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-2, +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-6 { + color: #50a04f +} + +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-11, +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-3, +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-7 { + color: #4078f1 +} + +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-12, +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-4, +.theme-root .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-8 { + color: #a625a4 +} + +.theme-root .lux-code-block .prism-previewer-gradient.prism-previewer-gradient div, +.theme-root .lux-code-block .prism-previewer.prism-previewer:before { + border-color: #f2f2f2 +} + +.theme-root .lux-code-block .prism-previewer-color.prism-previewer-color:before, +.theme-root .lux-code-block .prism-previewer-easing.prism-previewer-easing:before, +.theme-root .lux-code-block .prism-previewer-gradient.prism-previewer-gradient div { + border-radius: .3rem +} + +.theme-root .lux-code-block .prism-previewer.prism-previewer:after { + border-top-color: #f2f2f2 +} + +.theme-root .lux-code-block .prism-previewer-flipped.prism-previewer-flipped.after { + border-bottom-color: #f2f2f2 +} + +.theme-root .lux-code-block .prism-previewer-angle.prism-previewer-angle:before, +.theme-root .lux-code-block .prism-previewer-easing.prism-previewer-easing, +.theme-root .lux-code-block .prism-previewer-time.prism-previewer-time:before { + background: #fff +} + +.theme-root .lux-code-block .prism-previewer-angle.prism-previewer-angle circle, +.theme-root .lux-code-block .prism-previewer-time.prism-previewer-time circle { + stroke: #383942; + stroke-opacity: 1 +} + +.theme-root .lux-code-block .prism-previewer-easing.prism-previewer-easing circle, +.theme-root .lux-code-block .prism-previewer-easing.prism-previewer-easing line, +.theme-root .lux-code-block .prism-previewer-easing.prism-previewer-easing path { + stroke: #383942 +} + +.theme-root .lux-code-block .prism-previewer-easing.prism-previewer-easing circle { + fill: transparent +} + +.theme-root.dark .lux-code-block code[class*=language-], +.theme-root.dark .lux-code-block pre[class*=language-] { + text-shadow: 0 1px rgba(0, 0, 0, .3) +} + +.theme-root.dark .lux-code-block .token.cdata, +.theme-root.dark .lux-code-block .token.comment, +.theme-root.dark .lux-code-block .token.prolog { + color: #5b6270 +} + +.theme-root.dark .lux-code-block .token.doctype, +.theme-root.dark .lux-code-block .token.entity, +.theme-root.dark .lux-code-block .token.punctuation { + color: #aab1bf +} + +.theme-root.dark .lux-code-block .token.atrule, +.theme-root.dark .lux-code-block .token.attr-name, +.theme-root.dark .lux-code-block .token.boolean, +.theme-root.dark .lux-code-block .token.class-name, +.theme-root.dark .lux-code-block .token.constant, +.theme-root.dark .lux-code-block .token.number { + color: #d19965 +} + +.theme-root.dark .lux-code-block .token.keyword { + color: #c578dd +} + +.theme-root.dark .lux-code-block .token.deleted, +.theme-root.dark .lux-code-block .token.important, +.theme-root.dark .lux-code-block .token.property, +.theme-root.dark .lux-code-block .token.symbol, +.theme-root.dark .lux-code-block .token.tag { + color: #df6b75 +} + +.theme-root.dark .lux-code-block .token.attr-value, +.theme-root.dark .lux-code-block .token.attr-value>.token.punctuation, +.theme-root.dark .lux-code-block .token.builtin, +.theme-root.dark .lux-code-block .token.char, +.theme-root.dark .lux-code-block .token.inserted, +.theme-root.dark .lux-code-block .token.regex, +.theme-root.dark .lux-code-block .token.selector, +.theme-root.dark .lux-code-block .token.string { + color: #97c279 +} + +.theme-root.dark .lux-code-block .token.function, +.theme-root.dark .lux-code-block .token.operator, +.theme-root.dark .lux-code-block .token.variable { + color: #61afef +} + +.theme-root.dark .lux-code-block .token.url { + color: #56b5c2 +} + +.theme-root.dark .lux-code-block .token.attr-value>.token.punctuation.attr-equals, +.theme-root.dark .lux-code-block .token.special-attr>.token.attr-value>.token.value.css { + color: #aab1bf +} + +.theme-root.dark .lux-code-block .language-css .token.selector { + color: #df6b75 +} + +.theme-root.dark .lux-code-block .language-css .token.property { + color: #aab1bf +} + +.theme-root.dark .lux-code-block .language-css .token.function, +.theme-root.dark .lux-code-block .language-css .token.url>.token.function { + color: #56b5c2 +} + +.theme-root.dark .lux-code-block .language-css .token.url>.token.string.url { + color: #97c279 +} + +.theme-root.dark .lux-code-block .language-css .token.atrule .token.rule, +.theme-root.dark .lux-code-block .language-css .token.important, +.theme-root.dark .lux-code-block .language-javascript .token.operator { + color: #c578dd +} + +.theme-root.dark .lux-code-block .language-javascript .token.template-string>.token.interpolation>.token.interpolation-punctuation.punctuation { + color: #be5046 +} + +.theme-root.dark .lux-code-block .language-json .token.operator { + color: #aab1bf +} + +.theme-root.dark .lux-code-block .language-json .token.null.keyword { + color: #d19965 +} + +.theme-root.dark .lux-code-block .language-markdown .token.url, +.theme-root.dark .lux-code-block .language-markdown .token.url-reference.url>.token.string, +.theme-root.dark .lux-code-block .language-markdown .token.url>.token.operator { + color: #aab1bf +} + +.theme-root.dark .lux-code-block .language-markdown .token.url>.token.content { + color: #61afef +} + +.theme-root.dark .lux-code-block .language-markdown .token.url-reference.url, +.theme-root.dark .lux-code-block .language-markdown .token.url>.token.url { + color: #56b5c2 +} + +.theme-root.dark .lux-code-block .language-markdown .token.blockquote.punctuation, +.theme-root.dark .lux-code-block .language-markdown .token.hr.punctuation { + color: #5b6270 +} + +.theme-root.dark .lux-code-block .language-markdown .token.code-snippet { + color: #97c279 +} + +.theme-root.dark .lux-code-block .language-markdown .token.bold .token.content { + color: #d19965 +} + +.theme-root.dark .lux-code-block .language-markdown .token.italic .token.content { + color: #c578dd +} + +.theme-root.dark .lux-code-block .language-markdown .token.list.punctuation, +.theme-root.dark .lux-code-block .language-markdown .token.strike .token.content, +.theme-root.dark .lux-code-block .language-markdown .token.strike .token.punctuation, +.theme-root.dark .lux-code-block .language-markdown .token.title.important>.token.punctuation { + color: #df6b75 +} + +.theme-root.dark .lux-code-block .token.token.cr:before, +.theme-root.dark .lux-code-block .token.token.lf:before, +.theme-root.dark .lux-code-block .token.token.space:before, +.theme-root.dark .lux-code-block .token.token.tab:not(:empty):before { + color: rgba(171, 178, 191, .15) +} + +.theme-root.dark .lux-code-block .line-highlight.line-highlight { + background: rgba(153, 187, 255, .04) +} + +.theme-root.dark .lux-code-block .line-highlight.line-highlight:before, +.theme-root.dark .lux-code-block .line-highlight.line-highlight[data-end]:after { + background: #393f4a; + color: #aab1bf; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, .2) +} + +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-1, +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-5, +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-9 { + color: #df6b75 +} + +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-10, +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-2, +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-6 { + color: #97c279 +} + +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-11, +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-3, +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-7 { + color: #61afef +} + +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-12, +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-4, +.theme-root.dark .lux-code-block .rainbow-braces .token.token.punctuation.brace-level-8 { + color: #c578dd +} + +.theme-root.dark .lux-code-block .prism-previewer-gradient.prism-previewer-gradient div, +.theme-root.dark .lux-code-block .prism-previewer.prism-previewer:before { + border-color: #252830 +} + +.theme-root.dark .lux-code-block .prism-previewer.prism-previewer:after { + border-top-color: #252830 +} + +.theme-root.dark .lux-code-block .prism-previewer-flipped.prism-previewer-flipped.after { + border-bottom-color: #252830 +} + +.theme-root.dark .lux-code-block .prism-previewer-angle.prism-previewer-angle:before, +.theme-root.dark .lux-code-block .prism-previewer-easing.prism-previewer-easing, +.theme-root.dark .lux-code-block .prism-previewer-time.prism-previewer-time:before { + background: #30353f +} + +.theme-root.dark .lux-code-block .prism-previewer-angle.prism-previewer-angle circle, +.theme-root.dark .lux-code-block .prism-previewer-time.prism-previewer-time circle { + stroke: #aab1bf; + stroke-opacity: 1 +} + +.theme-root.dark .lux-code-block .prism-previewer-easing.prism-previewer-easing circle, +.theme-root.dark .lux-code-block .prism-previewer-easing.prism-previewer-easing line, +.theme-root.dark .lux-code-block .prism-previewer-easing.prism-previewer-easing path { + stroke: #aab1bf +} + +.lux-empty-state { + text-align: center; + margin-top: 4rem +} + +.lux-empty-state.large h3 { + font-size: var(--font-size-xxxl); + font-weight: var(--font-weight-medium) +} + +@media(max-width:450px) { + .lux-empty-state.large h3 { + font-size: var(--font-size-lg); + font-weight: var(--font-weight-bold) + } +} + +.lux-empty-state .icon.regular svg { + width: 4rem; + height: 4rem; + color: var(--tertiary-color-alpha) +} + +.lux-empty-state .icon.square-illustration svg { + width: 4rem; + height: 4rem +} + +.lux-empty-state .icon.illustration svg { + shape-rendering: crispEdges; + width: 250px; + height: auto +} + +@media(max-width:450px) { + .lux-empty-state .icon.illustration svg { + width: 200px + } +} + +.lux-empty-state .icon.round { + width: 4rem; + height: 4rem; + background-color: var(--secondary-bg-color); + border-radius: 50%; + overflow: hidden +} + +.lux-empty-state .icon.round svg { + width: 2rem; + height: 2rem; + color: var(--quaternary-bg-color) +} + +.lux-empty-state .desc { + padding-left: 3rem; + padding-right: 3rem +} + +@media(max-width:650px) { + .lux-empty-state .desc { + padding-left: 1rem; + padding-right: 1rem + } +} + +.lux-empty-state img { + max-width: 250px +} + +@media(max-width:450px) { + .lux-empty-state img { + max-width: 200px + } +} + +.lux-input-label { + display: block; + margin-bottom: .375rem; + font-weight: var(--font-weight-medium); + color: var(--secondary-color-alpha); + transition: var(--transition) +} + +.lux-input-label.clickable { + cursor: pointer +} + +.lux-input-label.clickable:hover, +.lux-input-label.focused { + color: var(--input-focus-border-color) +} + +.lux-input-label.no-margin { + margin-bottom: 0 +} + +.lux-input-label.medium { + font-size: var(--input-label-font-size) +} + +.lux-input-label.large { + font-size: var(--large-input-label-font-size) +} + +.lux-input-wrapper .accessory-text { + line-height: var(--input-line-height); + color: var(--input-accessory-text-color); + background-color: var(--input-accessory-text-bg-color); + border: 1px solid var(--input-border-color); + border-radius: var(--border-radius) +} + +.lux-input-wrapper.accessory-left .accessory-text { + border-right: 0; + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important +} + +.lux-input-wrapper.accessory-left .luma-input { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important +} + +.lux-input-wrapper.accessory-right .accessory-text { + border-left: 0; + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important +} + +.lux-input-wrapper.accessory-right .luma-input { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important +} + +.lux-input-wrapper.solid .luma-input { + background-color: var(--solid-input-bg-color); + border-color: var(--solid-input-border-color) +} + +.lux-input-wrapper.solid .luma-input:hover { + background-color: var(--solid-input-hover-bg-color) +} + +.lux-input-wrapper.solid .luma-input:focus { + background-color: var(--input-focus-bg-color); + border-color: var(--input-focus-border-color) +} + +.lux-input-wrapper.solid .accessory-text { + border-color: var(--solid-input-bg-color); + background-color: var(--primary-bg-color) +} + +.lux-input-wrapper textarea.luma-input { + vertical-align: top; + line-height: var(--input-textarea-line-height) +} + +.lux-input-wrapper.medium .accessory-text, +.lux-input-wrapper.medium .luma-input { + font-size: var(--input-font-size); + height: var(--input-height); + padding: var(--input-padding) +} + +.lux-input-wrapper.medium textarea.luma-input { + padding: var(--input-textarea-padding); + scroll-padding-block: var(--input-textarea-vertical-padding) +} + +.lux-input-wrapper.medium.round .accessory-text, +.lux-input-wrapper.medium.round .luma-input { + border-radius: calc(var(--input-height)/2) +} + +.lux-input-wrapper.large .helper-text { + font-size: var(--large-input-label-font-size) +} + +.lux-input-wrapper.large .accessory-text, +.lux-input-wrapper.large .luma-input { + font-size: var(--large-input-font-size); + height: var(--large-input-height); + padding: var(--large-input-padding) +} + +.lux-input-wrapper.large textarea.luma-input { + padding: var(--large-input-textarea-padding); + scroll-padding-block: var(--large-input-textarea-vertical-padding) +} + +.lux-input-wrapper.large.round .accessory-text, +.lux-input-wrapper.large.round .luma-input { + border-radius: calc(var(--large-input-height)/2) +} + +.lux-input-wrapper .input-inner-wrapper { + position: relative +} + +.lux-input-wrapper .luma-input.align-right { + text-align: right +} + +.lux-input-wrapper .luma-input.monospace { + font-family: var(--mono-font) +} + +.lux-input-wrapper .clear-button { + position: absolute; + right: 0; + bottom: 50%; + transform: translateY(50%); + padding: var(--input-vertical-padding) .6875rem; + color: var(--opacity-32) +} + +.lux-input-wrapper .clear-button.with-indicator { + right: 1.5rem +} + +.lux-input-wrapper .clear-button:not(.shown) { + pointer-events: none; + opacity: 0 +} + +.lux-input-wrapper .clear-button:hover { + color: var(--primary-color) +} + +.lux-input-wrapper .clear-button.invisible { + pointer-events: none; + opacity: 0 +} + +.lux-input-wrapper .clear-button svg { + width: 1rem; + height: 1rem +} + +.lux-input-wrapper .luma-input.align-right~.clear-button.with-indicator { + right: 0 +} + +.lux-input-wrapper .indicator { + position: absolute; + right: .75rem; + bottom: 50%; + transform: translateY(50%); + color: var(--warning-color); + transition: opacity var(--transition-duration) var(--transition-fn); + width: 1rem; + height: 1rem; + opacity: 1 +} + +.lux-input-wrapper .indicator.invisible { + pointer-events: none; + opacity: 0 +} + +.lux-input-wrapper .indicator svg { + stroke-width: 3px +} + +.lux-input-wrapper .indicator.success { + color: var(--success-color) +} + +.lux-input-wrapper .indicator.error { + color: var(--error-color) +} + +.lux-input-wrapper .indicator.custom { + color: var(--input-indicator-color, var(--opacity-32)) +} + +.lux-input-wrapper .luma-input:not(.align-right).has-indicator { + padding-right: 2.25rem +} + +.lux-input-wrapper .luma-input:not(.align-right).clearable { + padding-right: 2.5rem +} + +.lux-input-wrapper .luma-input:not(.align-right).clearable.has-indicator { + padding-right: 4rem +} + +.lux-input-wrapper .luma-input.align-right.has-indicator { + padding-left: 2.25rem +} + +.lux-input-wrapper .luma-input.align-right.has-indicator~.indicator { + right: auto; + left: .75rem +} + +.lux-input-wrapper .luma-input.align-right.clearable { + padding-right: 2.5rem +} + +.lux-input-wrapper input:disabled, +.lux-input-wrapper textarea:disabled { + background-color: var(--disabled-background-color) +} + +.lux-input-wrapper .input-inner-wrapper.large .indicator, +.lux-input-wrapper .input-inner-wrapper.large .indicator svg { + width: var(--large-input-font-size); + height: var(--large-input-font-size) +} + +.lux-input-wrapper .input-inner-wrapper.large .luma-input.has-indicator:not(.align-right) { + padding-right: 2.5rem +} + +.lux-input-wrapper .input-inner-wrapper.large .luma-input.align-right.has-indicator { + padding-left: 2.5rem +} + +textarea.luma-input { + transition: var(--transition), height 0s +} + +.luma-input.luma-input-scrollable { + overflow: auto +} + +.lux-menu-trigger-wrapper { + display: inline-flex; + min-width: 0 +} + +.lux-menu { + --lux-menu-horizontal-padding: 0.25rem; + position: relative; + border-radius: var(--border-radius); + outline: 1px solid var(--menu-border-color); + max-height: inherit; + background-color: var(--menu-bg-color) +} + +.lux-menu-divider { + height: 1px; + background-color: var(--divider-color); + margin: .25rem calc(-1*var(--lux-menu-horizontal-padding)); + width: calc(100% + 2*var(--lux-menu-horizontal-padding)) +} + +.lux-menu-arrow { + position: absolute; + -webkit-clip-path: polygon(100% 0, 0 0, 50% 100%); + clip-path: polygon(100% 0, 0 0, 50% 100%); + width: 10px; + height: 5px; + background-color: var(--menu-bg-color); + -webkit-backdrop-filter: blur(16px); + backdrop-filter: blur(16px) +} + +.lux-menu-arrow:not(.flipped) { + transform: rotate(180deg) +} + +.lux-menu-wrapper { + z-index: 1001; + border-radius: var(--border-radius); + -webkit-backdrop-filter: blur(16px); + backdrop-filter: blur(16px) +} + +@media(hover:none) { + .lux-menu-wrapper.hover { + display: none + } +} + +.lux-menu-wrapper.inverted { + --menu-bg-color: var(--menu-inverted-bg-color); + --menu-border-color: var(--menu-inverted-border-color) +} + +.lux-menu-content:not(.full) { + min-width: 120px; + max-width: 260px +} + +.lux-menu-content.full { + width: var(--trigger-width) +} + +.lux-menu-search-wrapper { + position: -webkit-sticky; + position: sticky; + top: 0; + background-color: var(--menu-search-bg-color); + border-bottom: 1px solid var(--menu-search-divider-color); + z-index: 2; + -webkit-backdrop-filter: blur(16px); + backdrop-filter: blur(16px); + border-top-left-radius: var(--border-radius); + border-top-right-radius: var(--border-radius) +} + +.lux-menu-search-wrapper:last-child { + border-bottom-color: var(--opacity-0) +} + +.lux-menu-search-wrapper input { + background-color: transparent; + border: 0; + padding: .375rem .75rem; + outline: 0; + width: 100%; + color: var(--input-color) +} + +.lux-menu-content .rows { + padding: .25rem var(--lux-menu-horizontal-padding) +} + +.lux-menu-content .create-row, +.lux-menu-content .no-result { + font-size: var(--font-size-sm); + padding: .375rem .5rem; + border-radius: var(--small-border-radius) +} + +.lux-menu-content .no-result { + color: var(--menu-no-result-color) +} + +.lux-menu-content .create-row { + cursor: pointer +} + +.lux-menu-content .create-row .icon { + margin-right: .625rem; + width: 1rem; + height: 1rem; + color: var(--menu-item-icon-color) +} + +.lux-menu-content .create-row .icon :global(svg) { + width: 1rem; + height: 1rem +} + +.lux-menu-content .create-row span { + font-weight: var(--font-weight-medium) +} + +.lux-menu-content .create-row.selected { + color: var(--menu-item-hover-color); + background-color: var(--menu-item-hover-bg-color) +} + +.lux-menu-content .create-row.selected .icon { + color: var(--menu-item-icon-hover-color) +} + +.lux-menu-header { + padding: .25rem .5rem; + color: var(--menu-header-color); + font-size: var(--font-size-xs) +} + +.lux-menu-item { + padding: .375rem .5rem; + color: var(--menu-item-color); + font-size: var(--font-size-sm); + border-radius: var(--small-border-radius); + cursor: pointer; + position: relative; + z-index: 1 +} + +.lux-menu-item.focused { + color: var(--menu-item-hover-color); + background-color: var(--menu-item-hover-bg-color) +} + +.lux-menu-item.focused .lux-menu-icon { + color: var(--menu-item-icon-hover-color) +} + +.lux-menu-item.focused .lux-menu-right-text { + color: var(--menu-item-hover-color) +} + +.lux-menu-item .icon-text { + min-width: 0 +} + +.lux-menu-item .menu-icon { + margin-right: .625rem; + width: 1rem; + height: 1rem; + color: var(--menu-item-icon-color); + justify-content: center; + opacity: 1 +} + +.lux-menu-item .menu-icon :global(svg) { + width: 1rem; + height: 1rem +} + +.lux-menu-item:not(.selected):not(.has-icon) .menu-icon { + opacity: 0 +} + +.lux-menu-item .menu-text { + min-width: 0 +} + +.lux-menu-item .menu-text .title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.lux-menu-item .menu-text .desc { + overflow-wrap: break-word +} + +.lux-menu-item .menu-right-text { + white-space: nowrap; + color: var(--menu-item-secondary-color); + margin-left: 1rem; + align-self: baseline +} + +.lux-menu-item .menu-checkmark { + width: 1rem +} + +.lux-menu-item .menu-checkmark.left { + margin-right: .625rem +} + +.lux-menu-item .menu-checkmark.right { + margin-left: .625rem +} + +.lux-menu-item .menu-checkmark svg path { + stroke-width: 2 +} + +.lux-naked-input { + transition: var(--transition), height 0s; + color: var(--input-color); + line-height: var(--naked-input-line-height); + overflow: hidden; + border: none; + background-color: transparent; + padding: var(--naked-input-padding); + font-size: var(--input-font-size); + font-weight: var(--naked-input-font-weight); + width: 100%; + background-image: -webkit-linear-gradient(hsla(0, 0%, 100%, 0), hsla(0, 0%, 100%, 0)) +} + +.lux-naked-input:not(.mounted) { + height: var(--naked-input-guidance-height) +} + +.lux-naked-input.padded { + --naked-input-padding: var(--input-padding); + border-radius: var(--border-radius) +} + +.lux-naked-input.padded:not(:disabled):hover { + background-color: var(--naked-input-hover-bg-color) +} + +.lux-naked-input.bordered { + --naked-input-padding: var(--input-vertical-padding) 0; + border-bottom: 1px solid var(--input-border-color) +} + +.lux-naked-input.bordered:not(:disabled):hover { + border-color: var(--input-hover-border-color) +} + +.lux-naked-input.bordered:focus, +.lux-naked-input.bordered:focus:hover { + border-color: var(--input-focus-border-color) +} + +.lux-naked-input.invalid { + color: var(--error-color); + background-color: var(--error-pale-bg-color) +} + +.lux-naked-input.invalid.bordered { + border-color: var(--error-color) +} + +.lux-naked-input.invalid::placeholder { + color: var(--error-placeholder-color) !important +} + +.lux-naked-input:disabled { + cursor: not-allowed +} + +.lux-naked-input:focus, +.lux-naked-input:focus:hover { + outline: 0 +} + +.lux-naked-input::placeholder { + color: var(--placeholder-color); + opacity: 1 +} + +.lux-naked-input:not(.padded):not(.bordered)::placeholder { + transition: color var(--transition-duration) var(--transition-fn) +} + +.lux-naked-input:not(.padded):not(.bordered):focus::placeholder, +.lux-naked-input:not(.padded):not(.bordered):hover::placeholder { + color: var(--naked-input-hover-placeholder-color) +} + +.lux-naked-input:-moz-focusring { + text-shadow: none +} + +.lux-modal-root { + position: relative; + z-index: 1 +} + +.lux-modal-header { + padding: var(--modal-header-footer-padding); + background-color: var(--modal-header-bg-color); + border-bottom: 1px solid var(--divider-color) +} + +.lux-modal-header .title { + color: var(--primary-color); + font-size: 1.1rem; + font-weight: var(--font-weight-bold) +} + +.lux-modal-header .close { + padding: 0; + border: 0; + border-radius: 100px; + background-color: var(--secondary-color); + color: var(--modal-bg-color); + width: 1.25rem; + height: 1.25rem; + opacity: .75 +} + +.lux-modal-header .close:hover { + opacity: 1 +} + +@media(max-width:450px) { + .lux-modal-header { + background-color: var(--modal-header-bg-color) + } +} + +.lux-modal { + overflow: hidden; + display: flex; + flex-direction: column; + position: relative; + width: 480px; + max-height: 75vh; + border-radius: var(--modal-border-radius); + box-shadow: var(--shadow-modal); + background-color: var(--modal-bg-color); + -webkit-backdrop-filter: var(--backdrop-blur); + backdrop-filter: var(--backdrop-blur); + --rich-button-border-color: var(--opacity-light) +} + +.lux-modal.lux-alert { + width: 340px; + --input-border-color: var(--opacity-8); + --input-bg-color: var(--bg-opacity-64) +} + +.lux-modal.big { + outline: 1px solid var(--opacity-light); + border-radius: var(--large-border-radius); + box-shadow: var(--shadow); + background-color: var(--modal-bg-color); + width: min(90vw, 800px); + -webkit-backdrop-filter: var(--backdrop-blur); + backdrop-filter: var(--backdrop-blur); + height: 80vh; + max-height: min(80vh, 1000px) +} + +@media(max-width:650px) { + .lux-modal.big { + height: 100vh; + max-height: 100vh + } +} + +.lux-modal.panel { + margin-top: .5rem; + margin-right: .5rem; + border-radius: var(--border-radius); + max-height: calc(100vh - 1rem); + max-height: calc(100dvh - 1rem); + height: calc(100vh - 1rem); + height: calc(100dvh - 1rem); + width: 550px +} + +.lux-modal.sheet { + width: 100%; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + bottom: 0; + background-color: var(--translucent-sheet-bg-color); + box-shadow: var(--light-shadow-xs); + padding-bottom: 200px; + margin-bottom: -200px +} + +@media(max-width:650px) { + .lux-modal:not(.lux-alert):not(.sheet) { + width: calc(100% - 40px); + max-width: 480px + } + .lux-modal.panel { + width: calc(450px - 1rem) + } + .lux-modal.big { + width: 100%; + height: 100%; + border-radius: 0; + max-width: 100%; + max-height: 100% + } +} + +@media(max-width:450px) { + .lux-modal:not(.compact):not(.lux-alert):not(.sheet) { + width: 100%; + height: 100%; + border-radius: 0; + max-width: 100%; + max-height: 100% + } + .lux-modal.panel { + margin: 0; + max-height: 100vh; + max-height: 100dvh; + height: 100vh; + height: 100dvh + } + .lux-modal.compact, + .lux-modal.lux-alert { + margin-top: 10vh + } + .lux-modal.lux-alert { + width: calc(100% - 40px); + max-width: 340px + } +} + +.lux-modal .lux-modal-body { + width: 100%; + padding: var(--modal-padding) +} + +.lux-modal.panel .lux-modal-body { + flex: 1 1 +} + +.lux-modal .lux-modal-footer { + border-top: 1px solid var(--divider-color); + background-color: var(--primary-bg-color); + width: 100%; + padding: var(--modal-header-footer-padding) +} + +.theme-root .tint-root.dark .lux-modal, +.theme-root.dark .lux-modal, +.theme-root.dark .tint-root .lux-modal { + --rich-button-bg-color: rgba(40, 42, 43, .8) +} + +.lux-backdrop { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: var(--overlay-color); + z-index: 1000; + -webkit-backdrop-filter: grayscale(.3); + backdrop-filter: grayscale(.3) +} + +.lux-backdrop.glass { + background-color: var(--primary-bg-color-thick-translucent); + -webkit-backdrop-filter: var(--high-legibility-backdrop-blur); + backdrop-filter: var(--high-legibility-backdrop-blur) +} + +.lux-backdrop.transparent { + background-color: transparent; + -webkit-backdrop-filter: grayscale(.1); + backdrop-filter: grayscale(.1) +} + +.lux-overlay { + position: fixed; + display: flex; + justify-content: center; + align-items: flex-start; + padding-top: 15vh; + width: 100%; + height: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: var(--overlay-z-index); + scrollbar-gutter: stable; + --overlay-content-padding: 0 +} + +.lux-overlay.panel { + padding-top: 0; + justify-content: end +} + +.lux-overlay.sheet { + align-items: end +} + +.lux-overlay.glass { + padding-top: 0; + align-items: center +} + +.lux-overlay.big { + padding-top: 5vh +} + +@media(max-width:650px) { + .lux-overlay.big { + padding-top: 0 + } +} + +@keyframes pop { + 50% { + transform-origin: center; + transform: scale(1.005) + } +} + +.lux-overlay.pop .lux-modal { + animation: pop .3s cubic-bezier(.4, 0, .2, 1) 1 +} + +@media(max-width:650px) { + .lux-overlay.cmdk { + padding: 2.5rem; + align-items: start + } + .lux-overlay.glass { + padding: 0; + align-items: start + } +} + +@media(max-width:450px) { + .lux-overlay { + padding-top: 0 + } + .lux-overlay.cmdk { + padding: 1.25rem + } + .lux-overlay.sheet { + padding-top: inherit + } +} + +.lux-radio { + position: relative; + cursor: pointer; + font-size: 1rem; + line-height: 1.25rem; + clear: both; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + gap: .75rem +} + +.lux-radio.radio-right { + flex-direction: row-reverse +} + +.lux-radio .text-label { + flex: 1 1 +} + +.lux-radio:has(input:focus-visible) .radio-icon { + outline: 2px solid var(--primary-color); + outline-offset: 2px; + border-radius: 100% +} + +.lux-radio .radio-icon { + display: block; + position: relative; + font-size: .5rem; + line-height: 1.25rem; + height: 1.25rem; + width: 1.25rem; + clear: both +} + +.lux-radio .radio-icon .input { + opacity: 0 +} + +.lux-radio .radio-icon .input, +.lux-radio .radio-icon .radio-display { + position: absolute; + top: 0; + left: 0; + height: 1.25rem; + width: 1.25rem +} + +.lux-radio .radio-icon .radio-display { + transition: var(--fast-transition); + border-radius: 100px; + background-color: var(--primary-bg-color); + border: .125rem solid var(--checkbox-border-color) +} + +.lux-radio .radio-icon .radio-display:after { + transition: var(--fast-transition); + position: absolute; + content: ""; + top: .375rem; + left: .375rem; + height: .5rem; + width: .5rem; + opacity: 0 +} + +.lux-radio .radio-icon input:checked~.radio-display { + border: none; + background-color: var(--primary-color) +} + +.lux-radio .radio-icon input:checked~.radio-display:after { + opacity: 1; + border-radius: 100px; + background-color: var(--primary-bg-color) +} + +.lux-radio:hover .radio-display { + border-color: var(--secondary-color) +} + +.lux-spinner { + animation: rotator 1.5s linear infinite +} + +@keyframes rotator { + 0% { + transform: rotate(0deg) + } + to { + transform: rotate(270deg) + } +} + +.lux-spinner .path { + stroke-dasharray: 175; + stroke-dashoffset: 0; + transform-origin: center; + animation: dash 1.5s ease-in-out infinite +} + +@keyframes dash { + 0% { + stroke-dashoffset: 175 + } + 50% { + stroke-dashoffset: 43.75; + transform: rotate(135deg) + } + to { + stroke-dashoffset: 175; + transform: rotate(450deg) + } +} + +.lux-slider { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + height: var(--input-height); + outline: none; + background: none; + --track-height: 0.375rem; + --thumb-size: 1.25rem; + --track-left-color: var(--primary-color); + --track-active-color: var(--opacity-80); + --track-right-color: var(--opacity-light); + --thumb-color: var(--white); + --thumb-border-width: 1px; + --thumb-border-color: var(--black-opacity-8); + --thumb-active-border-color: var(--black-opacity-64); + --thumb-active-border-width: 2px +} + +.lux-slider.brand { + --track-left-color: var(--brand-color); + --thumb-active-border-color: var(--brand-color) +} + +.lux-slider::-webkit-slider-runnable-track { + width: 100%; + height: var(--track-height); + cursor: pointer; + background: var(--track-left-color); + border-radius: .25rem; + border: none; + -webkit-transition: background var(--transition-duration) var(--transition-fn); + transition: background var(--transition-duration) var(--transition-fn) +} + +.lux-slider::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + cursor: pointer; + height: var(--thumb-size); + width: var(--thumb-size); + border-radius: 100%; + margin-top: calc((var(--track-height) - var(--thumb-size))/2); + background-color: var(--thumb-color); + outline: var(--thumb-border-width) solid var(--thumb-border-color); + border: none; + box-shadow: var(--shadow-xs); + -webkit-transition-property: transform, box-shadow, outline; + transition-property: transform, box-shadow, outline; + transform-origin: center; + transition-duration: var(--transition-duration); + transition-timing-function: var(--transition-fn) +} + +.lux-slider::-webkit-slider-thumb:hover { + transform: scale(1.05); + box-shadow: var(--shadow); + outline: var(--thumb-active-border-width) solid var(--thumb-active-border-color) +} + +.lux-slider::-moz-range-thumb { + -moz-appearance: none; + appearance: none; + cursor: pointer; + height: var(--thumb-size); + width: var(--thumb-size); + border-radius: 100%; + margin-top: calc((var(--track-height) - var(--thumb-size))/2); + background-color: var(--thumb-color); + outline: var(--thumb-border-width) solid var(--thumb-border-color); + border: none; + box-shadow: var(--shadow-xs); + -moz-transition-property: transform, box-shadow, outline; + transition-property: transform, box-shadow, outline; + transform-origin: center; + transition-duration: var(--transition-duration); + transition-timing-function: var(--transition-fn) +} + +.lux-slider::-moz-range-thumb:hover { + transform: scale(1.05); + box-shadow: var(--shadow); + outline: var(--thumb-active-border-width) solid var(--thumb-active-border-color) +} + +.lux-slider::-moz-range-track { + width: 100%; + height: var(--track-height); + cursor: pointer; + background: var(--track-left-color); + border-radius: .25rem; + border: none; + -moz-transition: background var(--transition-duration) var(--transition-fn); + transition: background var(--transition-duration) var(--transition-fn); + background: var(--track-right-color) +} + +.lux-slider::-moz-range-progress { + height: var(--track-height); + border-radius: .25rem; + background: var(--track-left-color) +} + +.lux-toggle { + flex-shrink: 0; + position: relative; + display: inline-block; + margin-bottom: 0; + --total-width: var(--toggle-width); + --total-height: var(--toggle-height); + --slider-gap: var(--toggle-gap) +} + +.lux-toggle:focus-within { + outline: 2px solid var(--outline-color); + border-radius: calc(var(--total-height)/2) +} + +.lux-toggle input { + opacity: 0; + width: 0; + height: 0 +} + +.lux-toggle.large { + --total-width: var(--large-toggle-width); + --total-height: var(--large-toggle-height); + --slider-gap: var(--large-toggle-gap) +} + +.lux-toggle { + width: var(--total-width); + height: var(--total-height); + --slider-size: calc(var(--total-height) - 2 * var(--slider-gap)) +} + +.lux-toggle .slider { + transition: var(--transition); + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--toggle-bg-color); + border-radius: calc(var(--total-height)/2) +} + +.lux-toggle .slider:before { + transition: var(--transition); + position: absolute; + content: ""; + height: var(--slider-size); + width: var(--slider-size); + left: var(--slider-gap); + top: var(--slider-gap); + background-color: #fff; + border-radius: 100%; + box-shadow: var(--shadow-xs) +} + +.lux-toggle input:disabled+.slider { + cursor: not-allowed; + background-color: var(--toggle-disabled-bg-color) +} + +.lux-toggle input:checked+.slider { + background-color: var(--toggle-active-bg-color) +} + +.lux-toggle input:disabled:checked+.slider { + background-color: var(--toggle-active-disabled-bg-color) +} + +.lux-toggle.success input:checked+.slider { + background-color: var(--toggle-success-active-bg-color) +} + +.lux-toggle.success input:disabled:checked+.slider { + background-color: var(--toggle-success-active-disabled-bg-color) +} + +.lux-toggle.brand input:checked+.slider { + background-color: var(--brand-color) +} + +.lux-toggle.brand input:disabled:checked+.slider { + background-color: var(--brand-pale-bg-color) +} + +.lux-toggle input:checked+.slider:before { + transform: translateX(calc(var(--total-width) - var(--slider-size) - 2 * var(--slider-gap))) +} + +.event-theme { + --page-bg: var(--depressed-secondary-bg-color); + --translucent-overlay-bg-color: var(--elevated-secondary-bg-color); + --card-bg-color: var(--elevated-primary-bg-color); + --card-bg-color-opaque: var(--card-bg-color); + --card-backdrop-filter: none; + --card-shadow: none; + --one-to-one-card-shadow: var(--shadow-xs) +} + +.event-theme:not(.tinted) { + --tint-color: var(--secondary-color-alpha) +} + +.event-theme .text-tinted { + color: var(--tint-color) +} + +.theme-root .event-theme .btn.luma-button.light.solid { + -webkit-backdrop-filter: var(--backdrop-blur); + backdrop-filter: var(--backdrop-blur) +} + +.theme-root .event-theme .hover-brand-link:hover { + color: var(--brand-active-color) +} + +.theme-root .event-theme.high-contrast { + --brand-color: var(--brand-color-high-contrast); + --brand-active-color: var(--brand-color-high-contrast-active); + --brand-pale-bg-color: var(--brand-pale-bg-color-high-contrast) +} + +.theme-root .event-theme.tinted, +.theme-root.dark .tint-root.light .event-theme.tinted { + --page-bg: var(--meta-color, var(--brand-10, var(--depressed-secondary-bg-color))); + --primary-button-bg-color: var(--brand-50, var(--gray-90)); + --primary-button-hover-bg-color: var(--brand-40, var(--gray-80)) +} + +.theme-root .tint-root.light .event-theme, +.theme-root.light .event-theme { + --one-to-one-card-bg-color: var(--bg-opacity-32); + --one-to-one-card-border-color: var(--bg-opacity-16); + --one-to-one-card-shadow: var(--light-shadow-xs) +} + +.theme-root .tint-root.dark .event-theme, +.theme-root.dark .event-theme { + --one-to-one-card-bg-color: var(--opacity-4); + --one-to-one-card-border-color: var(--opacity-4) +} + +.theme-root .tint-root.dark .event-theme.shader-dark, +.theme-root.dark .event-theme.shader-dark { + --one-to-one-card-bg-color: var(--bg-opacity-16); + --one-to-one-card-border-color: var(--bg-opacity-8) +} + +.theme-root .tint-root.dark .event-theme.particles-champagne, +.theme-root.dark .event-theme.particles-champagne { + --one-to-one-card-bg-color: var(--bg-opacity-8); + --one-to-one-card-border-color: var(--bg-opacity-8); + --one-to-one-card-shadow: var(--light-shadow-xs) +} + +.theme-root .tint-root.dark .event-theme.tinted, +.theme-root.dark .event-theme.tinted { + --page-bg: var(--meta-color, var(--brand-80, var(--depressed-secondary-bg-color))); + --card-bg-color: var(--brand-70, var(--elevated-primary-bg-color)); + --primary-button-bg-color: var(--white); + --primary-button-hover-bg-color: var(--gray-20); + --primary-bg-color: var(--brand-80) +} + +.theme-root .event-theme.confetti, +.theme-root .event-theme.emoji { + --card-backdrop-filter: var(--backdrop-blur) +} + +.theme-root .tint-root.dark .event-theme.confetti.tinted, +.theme-root .tint-root.dark .event-theme.emoji.tinted, +.theme-root.dark .event-theme.confetti.tinted, +.theme-root.dark .event-theme.emoji.tinted { + --page-bg: var(--meta-color, var(--brand-70, var(--depressed-secondary-bg-color))); + --card-bg-color: var(--brand-60, var(--elevated-primary-bg-color)); + --primary-bg-color: var(--brand-70) +} + +.theme-root .event-theme.pattern, +.theme-root.dark .event-theme.pattern { + --card-bg-color: var(--bg-opacity-64); + --card-backdrop-filter: var(--backdrop-blur); + --card-shadow: 0px -4px 15px 0px hsla(0, 0%, 100%, .5) inset; + --lightest-color: var(--brand-5, var(--opacity-4)); + --lighter-color: var(--brand-10, var(--depressed-secondary-bg-color)); + --darker-color: var(--brand-20, var(--gray-20)) +} + +@media(max-width:650px) { + .theme-root .event-theme.pattern, + .theme-root.dark .event-theme.pattern { + --card-backdrop-filter: blur(2px) + } +} + +.theme-root .event-theme.shader, +.theme-root .event-theme.tinted.shader, +.theme-root .tint-root .event-theme.shader { + --card-bg-color: var(--bg-opacity-64); + --card-backdrop-filter: var(--backdrop-blur); + --card-shadow: 0px -4px 15px 0px hsla(0, 0%, 100%, .5) inset +} + +.theme-root.dark .event-theme.shader, +.theme-root.dark .event-theme.tinted.shader, +.theme-root.dark .tint-root .event-theme.shader { + --card-bg-color: var(--bg-opacity-48); + --card-backdrop-filter: var(--backdrop-blur); + --card-shadow: 0px -4px 15px 0px rgba(0, 0, 0, .1) inset +} + +.theme-root.dark { + --shadow-xs: var(--medium-shadow-xs); + --shadow-sm: var(--medium-shadow-sm); + --shadow: var(--medium-shadow); + --shadow-lg: var(--medium-shadow-lg); + --shadow-xl: var(--medium-shadow-xl) +} + +.theme-root .event-theme.tinted.warp, +.theme-root .event-theme.warp, +.theme-root .tint-root .event-theme.warp { + --card-bg-color: var(--bg-opacity-48); + --card-backdrop-filter: var(--backdrop-blur); + --card-shadow: 0px -4px 15px 0px rgba(0, 0, 0, .1) inset +} + +.theme-root .event-theme.tinted.warp .ticket-type-btn.selected:not(:disabled), +.theme-root .event-theme.tinted.warp .ticket-type-btn.selected:not(:disabled):hover, +.theme-root .event-theme.warp .ticket-type-btn.selected:not(:disabled), +.theme-root .event-theme.warp .ticket-type-btn.selected:not(:disabled):hover, +.theme-root .tint-root .event-theme.warp .ticket-type-btn.selected:not(:disabled), +.theme-root .tint-root .event-theme.warp .ticket-type-btn.selected:not(:disabled):hover { + background-color: var(--opacity-16); + border-color: var(--opacity-32) +} + +figure.preview .event-theme.pattern { + --card-bg-color: #fff !important +} + +figure.preview .event-theme .background { + height: 100% +} + +.pattern-zigzag, +.theme-root .event-theme.zigzag .background { + background-image: linear-gradient(135deg, var(--lighter-color) 25%, transparent 25%), linear-gradient(225deg, var(--lighter-color) 25%, transparent 25%), linear-gradient(45deg, var(--lighter-color) 25%, transparent 25%), linear-gradient(315deg, var(--lighter-color) 25%, var(--darker-color) 25%); + background-position: 32px 0, 32px 0, 0 0, 0 0; + background-size: 64px 64px; + background-repeat: repeat +} + +.pattern-plus, +.theme-root .event-theme.plus .background { + background-color: var(--lighter-color); + background: radial-gradient(circle, transparent 20%, var(--lighter-color) 20%, var(--lighter-color) 80%, transparent 80%, transparent), radial-gradient(circle, transparent 20%, var(--lighter-color) 20%, var(--lighter-color) 80%, transparent 80%, transparent) 50px 50px, linear-gradient(var(--darker-color) 4px, transparent 4px) 0 -2px, linear-gradient(90deg, var(--darker-color) 4px, var(--lighter-color) 4px) -2px 0; + background-size: 100px 100px, 100px 100px, 50px 50px, 50px 50px +} + +.pattern-wave, +.theme-root .event-theme.wave .background { + background: radial-gradient(circle at top left, transparent 25%, var(--darker-color) 25.5%, var(--darker-color) 36%, transparent 37%, transparent 100%), radial-gradient(circle at bottom right, transparent 34%, var(--darker-color) 34.5%, var(--darker-color) 45.5%, transparent 46%, transparent 100%); + background-size: 50px 50px; + background-color: var(--lighter-color) +} + +.pattern-polkadot, +.theme-root .event-theme.polkadot .background { + background: radial-gradient(circle, var(--darker-color) 10%, transparent 12%), radial-gradient(circle at bottom left, var(--darker-color) 5%, transparent 7%), radial-gradient(circle at bottom right, var(--darker-color) 5%, transparent 7%), radial-gradient(circle at top left, var(--darker-color) 5%, transparent 7%), radial-gradient(circle at top right, var(--darker-color) 5%, transparent 7%); + background-size: 50px 50px; + background-color: var(--lighter-color) +} + +.pattern-cross, +.theme-root .event-theme.cross .background { + background: repeating-linear-gradient(transparent, transparent 8px, var(--lightest-color) 8px, var(--lightest-color) 12px, transparent 12px, transparent 16px, var(--lightest-color) 12px, var(--lightest-color) 32px, transparent 32px, transparent 36px, var(--lightest-color) 36px, var(--lightest-color) 40px, transparent 40px, transparent 64px), repeating-linear-gradient(90deg, transparent, transparent 8px, var(--lightest-color) 8px, var(--lightest-color) 12px, transparent 12px, transparent 16px, var(--lightest-color) 12px, var(--lightest-color) 32px, transparent 32px, transparent 36px, var(--lightest-color) 36px, var(--lightest-color) 40px, transparent 40px, transparent 64px), var(--lightest-color); + background-blend-mode: multiply; + background-color: var(--lightest-color) +} + +.pattern-hypnotic, +.theme-root .event-theme.hypnotic .background { + background: radial-gradient(50% 50% at 100% 0, var(--darker-color) 0, var(--darker-color) 5%, var(--lighter-color) 6%, var(--lighter-color) 15%, var(--darker-color) 16%, var(--darker-color) 25%, var(--lighter-color) 26%, var(--lighter-color) 35%, var(--darker-color) 36%, var(--darker-color) 45%, var(--lighter-color) 46%, var(--lighter-color) 55%, var(--darker-color) 56%, var(--darker-color) 65%, var(--lighter-color) 66%, var(--lighter-color) 75%, var(--darker-color) 76%, var(--darker-color) 85%, var(--lighter-color) 86%, var(--lighter-color) 95%, transparent 96%), radial-gradient(50% 50% at 0 100%, var(--darker-color) 0, var(--darker-color) 5%, var(--lighter-color) 6%, var(--lighter-color) 15%, var(--darker-color) 16%, var(--darker-color) 25%, var(--lighter-color) 26%, var(--lighter-color) 35%, var(--darker-color) 36%, var(--darker-color) 45%, var(--lighter-color) 46%, var(--lighter-color) 55%, var(--darker-color) 56%, var(--darker-color) 65%, var(--lighter-color) 66%, var(--lighter-color) 75%, var(--darker-color) 76%, var(--darker-color) 85%, var(--lighter-color) 86%, var(--lighter-color) 95%, transparent 96%), radial-gradient(closest-side at 50% 50%, var(--darker-color) 0, var(--darker-color) 5%, var(--lighter-color) 6%, var(--lighter-color) 15%, var(--darker-color) 16%, var(--darker-color) 25%, var(--lighter-color) 26%, var(--lighter-color) 35%, var(--darker-color) 36%, var(--darker-color) 45%, var(--lighter-color) 46%, var(--lighter-color) 55%, var(--darker-color) 56%, var(--darker-color) 65%, var(--lighter-color) 66%, var(--lighter-color) 75%, var(--darker-color) 76%, var(--darker-color) 85%, var(--lighter-color) 86%, var(--lighter-color) 95%, transparent 96%), radial-gradient(closest-side at 50% 50%, var(--darker-color) 0, var(--darker-color) 5%, var(--lighter-color) 6%, var(--lighter-color) 15%, var(--darker-color) 16%, var(--darker-color) 25%, var(--lighter-color) 26%, var(--lighter-color) 35%, var(--darker-color) 36%, var(--darker-color) 45%, var(--lighter-color) 46%, var(--lighter-color) 55%, var(--darker-color) 56%, var(--darker-color) 65%, var(--lighter-color) 66%, var(--lighter-color) 75%, var(--darker-color) 76%, var(--darker-color) 85%, var(--lighter-color) 86%, var(--lighter-color) 95%, transparent 96%) 32px 32px; + background-size: 64px 64px; + background-color: var(--lighter-color) +} + +.theme-root .event-theme.halloween, +.theme-root .event-theme.holiday, +.theme-root .event-theme.tinted.halloween, +.theme-root .event-theme.tinted.holiday, +.theme-root.dark .event-theme.halloween, +.theme-root.dark .event-theme.holiday, +.theme-root.dark .event-theme.tinted.halloween, +.theme-root.dark .event-theme.tinted.holiday { + --card-bg-color: var(--bg-opacity-32); + --card-backdrop-filter: var(--backdrop-blur); + --card-shadow: 0px -4px 15px 0px rgba(0, 0, 0, .1) inset; + --one-to-one-card-shadow: 0 1px 4px rgba(0, 0, 0, .05) +} + +.theme-root .event-theme.halloween .background, +.theme-root .event-theme.tinted.halloween .background { + background-size: 320px +} + +.theme-root .event-theme.pumpkin .background { + background-image: url(https://images.lumacdn.com/themes/halloween/pumpkin.png); + filter: brightness(.9) +} + +.theme-root .event-theme.candy .background { + background-image: url(https://images.lumacdn.com/themes/halloween/candy.png) +} + +.theme-root .event-theme.skull .background { + background-image: url(https://images.lumacdn.com/themes/halloween/skull.png) +} + +.theme-root .event-theme.coffin .background { + background-image: url(https://images.lumacdn.com/themes/halloween/coffin.png) +} + +.theme-root .event-theme.ghost .background { + background-image: url(https://images.lumacdn.com/themes/halloween/ghost.png) +} + +.theme-root .event-theme.bones .background { + background-image: url(https://images.lumacdn.com/themes/halloween/bones.png) +} + +.theme-root .event-theme.holiday-pie .background-overlay { + background-image: url(https://images.lumacdn.com/themes/holiday/pie.jpg); + opacity: .06; + mix-blend-mode: luminosity +} + +.theme-root .event-theme.holiday-pie .background-glow { + background: radial-gradient(80% 80% at 30% 15%, #e18d21 0, #9b4714 65%) +} + +@media(max-width:650px) { + .theme-root .event-theme.holiday-pie .background-glow { + background: radial-gradient(100% 100% at 25% 25%, #e18d21 0, #9b4714 65%) + } +} + +.theme-root .event-theme.holiday-foliage .background-overlay { + background-image: url(https://images.lumacdn.com/themes/holiday/foliage.jpg); + opacity: .06; + mix-blend-mode: luminosity; + background-size: cover +} + +.theme-root .event-theme.holiday-foliage .background-glow { + background: linear-gradient(180deg, #948162 6%, rgba(128, 101, 72, .9) 35%, rgba(126, 113, 22, .9) 50%) +} + +.theme-root .event-theme.holiday-turkey .background-overlay { + background-image: url(https://images.lumacdn.com/themes/holiday/turkey-bg.jpg); + background-size: 297px +} + +.theme-root .event-theme.holiday-snow .background-glow { + background: linear-gradient(180deg, #07243a 4.62%, #005587 97.11%) +} + +.theme-root .event-theme.holiday-snow .background-overlay { + background-image: url(https://images.lumacdn.com/themes/holiday/snow-top.png); + background-size: 1201px; + background-repeat: repeat-x; + background-position: top; + top: -30px !important; + z-index: 100 +} + +.theme-root .event-theme.holiday-snow .background-overlay2 { + background-image: url(https://images.lumacdn.com/themes/holiday/snow-bg.png); + background-size: 1804px; + background-repeat: repeat-x; + background-position: top; + top: 0; + left: 0; + right: 0; + bottom: 0; + mix-blend-mode: soft-light +} + +.theme-root .event-theme.holiday-snow .background-overlay3, +.theme-root .event-theme.holiday-snow .background-overlay4 { + background-repeat: no-repeat; + mix-blend-mode: soft-light; + opacity: .7 +} + +.theme-root .event-theme.holiday-snow .background-overlay3 { + background-image: url(https://images.lumacdn.com/themes/holiday/snow-left.png); + bottom: 0; + left: -280px; + width: 100%; + height: 716px; + background-size: 568px; + background-position: 0 100% +} + +.theme-root .event-theme.holiday-snow .background-overlay4 { + background-image: url(https://images.lumacdn.com/themes/holiday/snow-right.png); + bottom: 0; + right: -320px; + width: 100%; + height: 568px; + background-size: 616px; + background-position: 100% 100% +} + +@media(max-width:800px) { + .theme-root .event-theme.holiday-snow .background-overlay3 { + left: -180px; + background-size: 350px + } + .theme-root .event-theme.holiday-snow .background-overlay4 { + right: -200px; + background-size: 500px + } +} + +@media(max-width:650px) { + .theme-root .event-theme.holiday-snow .background-overlay { + background-position: 0 0 + } + .theme-root .event-theme.holiday-snow .background-overlay2 { + background-size: 1200px + } + .theme-root .event-theme.holiday-snow .background-overlay3 { + display: none + } + .theme-root .event-theme.holiday-snow .background-overlay4 { + left: 0; + right: 0; + background-position: bottom + } +} + +.theme-root .event-theme.holiday-santa .background-overlay { + background-image: url(https://images.lumacdn.com/themes/holiday/santa.jpg); + opacity: .08; + mix-blend-mode: lighten +} + +.theme-root .event-theme.holiday-santa .background-glow { + background: linear-gradient(180deg, #e03f42, #428195 35%, #1c8737 80%) +} + +.theme-root .event-theme.holiday-sweater .background-glow { + background: linear-gradient(180deg, #195f26, #002f00 95%) +} + +.theme-root .event-theme.holiday-sweater .background-overlay, +.theme-root .event-theme.holiday-sweater .background-overlay2, +.theme-root .event-theme.holiday-sweater .background-overlay3, +.theme-root .event-theme.holiday-sweater .background-overlay4 { + mix-blend-mode: soft-light +} + +.theme-root .event-theme.holiday-sweater .background-overlay { + background-image: url(https://images.lumacdn.com/themes/holiday/sweater-top.png); + background-size: 276px; + height: 152px; + width: 100% +} + +.theme-root .event-theme.holiday-sweater .background-overlay2 { + background-image: url(https://images.lumacdn.com/themes/holiday/sweater-middle.png); + background-position: top; + background-size: 1208px; + background-repeat: repeat-x; + top: 225px; + height: 240px; + width: 100% +} + +.theme-root .event-theme.holiday-sweater .background-overlay3, +.theme-root .event-theme.holiday-sweater .background-overlay4 { + background-image: url(https://images.lumacdn.com/themes/holiday/sweater-bottom.png); + background-size: 207px; + bottom: 2rem; + height: 201px; + width: 207px +} + +.theme-root .event-theme.holiday-sweater .background-overlay3 { + transform: scaleX(-1); + left: -50px +} + +.theme-root .event-theme.holiday-sweater .background-overlay4 { + right: -50px +} + +@media(max-width:800px) { + .theme-root .event-theme.holiday-sweater .background-overlay { + top: -50px !important + } + .theme-root .event-theme.holiday-sweater .background-overlay2 { + background-size: 1000px + } +} + +@media(max-height:800px) { + .theme-root .event-theme.holiday-sweater .background-overlay { + top: -50px !important + } + .theme-root .event-theme.holiday-sweater .background-overlay2 { + top: 200px; + background-size: 1000px + } +} + +@media(max-width:650px) { + .theme-root .event-theme.holiday-sweater .background-overlay2 { + top: 180px; + background-size: 800px + } + .theme-root .event-theme.holiday-sweater .background-overlay3, + .theme-root .event-theme.holiday-sweater .background-overlay4 { + background-size: 150px; + height: 150px; + width: 150px + } +} + +.theme-root .event-theme.holiday-hanukkah .background-overlay { + background-image: url(https://images.lumacdn.com/themes/holiday/hanukkah.jpg); + opacity: .1; + mix-blend-mode: luminosity +} + +.theme-root .event-theme.holiday-hanukkah .background-glow { + background: radial-gradient(100% 100% at 30% 15%, rgba(255, 197, 24, .6) 0, #06738e 65%) +} + +@media(max-width:650px) { + .theme-root .event-theme.holiday-hanukkah .background-glow { + background: radial-gradient(100% 100% at 25% 25%, rgba(255, 197, 24, .6) 0, #06738e 65%) + } +} + +.theme-root .event-theme.holiday-diwali .background-glow { + background: radial-gradient(184% 87% at 55% 30%, #320b68 27%, #41045a 100%) +} + +.theme-root .event-theme.holiday-diwali .background-overlay, +.theme-root .event-theme.holiday-diwali .background-overlay2, +.theme-root .event-theme.holiday-diwali .background-overlay3, +.theme-root .event-theme.holiday-diwali .background-overlay4 { + mix-blend-mode: luminosity; + background-size: contain; + background-repeat: no-repeat; + opacity: .6 +} + +.theme-root .event-theme.holiday-diwali .background-overlay { + background-image: url(https://images.lumacdn.com/themes/holiday/diwali-1.png); + width: 160px; + top: 2rem !important; + left: 2rem !important +} + +.theme-root .event-theme.holiday-diwali .background-overlay2 { + background-image: url(https://images.lumacdn.com/themes/holiday/diwali-2.png); + width: 180px; + height: 100%; + top: 2rem; + right: 2rem +} + +.theme-root .event-theme.holiday-diwali .background-overlay3, +.theme-root .event-theme.holiday-diwali .background-overlay4 { + background-image: url(https://images.lumacdn.com/themes/holiday/diwali-3.png); + width: 240px; + height: 240px; + background-position: 0 100%; + bottom: 0 +} + +.theme-root .event-theme.holiday-diwali .background-overlay3 { + left: 0 +} + +.theme-root .event-theme.holiday-diwali .background-overlay4 { + transform: scaleX(-1); + right: 0 +} + +@media(max-width:800px) { + .theme-root .event-theme.holiday-diwali .background-overlay { + width: 120px; + left: 1.5rem !important + } + .theme-root .event-theme.holiday-diwali .background-overlay2 { + width: 130px; + right: 1rem + } + .theme-root .event-theme.holiday-diwali .background-overlay3, + .theme-root .event-theme.holiday-diwali .background-overlay4 { + width: 180px; + height: 180px + } +} + +@media(max-width:650px) { + .theme-root .event-theme.holiday-diwali .background-overlay { + top: .5rem !important; + width: 100px + } + .theme-root .event-theme.holiday-diwali .background-overlay2 { + top: .5rem; + width: 110px + } + .theme-root .event-theme.holiday-diwali .background-overlay3, + .theme-root .event-theme.holiday-diwali .background-overlay4 { + width: 160px; + height: 160px + } +} + +@media(max-height:500px) { + .theme-root .event-theme.holiday-diwali .background-overlay3, + .theme-root .event-theme.holiday-diwali .background-overlay4 { + display: none + } +} + +body, +html { + width: 100%; + height: 100%; + margin: 0; + scrollbar-gutter: stable +} + +@media screen and (max-device-width:480px) { + body { + -webkit-text-size-adjust: 100% + } +} + +.theme-root { + color: var(--primary-color); + background-color: var(--primary-bg-color) +} + +.theme-root.light { + color-scheme: light +} + +.theme-root.dark { + color-scheme: dark +} + +pre { + color: var(--primary-color) +} + +.wide-page-wrapper, +.wide-page-wrapper+footer { + --max-width: var(--max-width-wide-page) +} + +.animated, +.btn, +.collapsing, +a { + transition: var(--transition) +} + +.btn { + transition: var(--transition), outline 0s +} + +.btn:focus { + box-shadow: none +} + +textarea { + resize: none +} + +.collapse:not(.show) { + display: none !important +} + +input::-webkit-inner-spin-button, +input::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0 +} + +input[type=number] { + -moz-appearance: textfield +} + +.cursor-pointer { + cursor: pointer +} + +.cursor-grab { + cursor: -webkit-grab; + cursor: grab +} + +.cursor-copy { + cursor: copy +} + +.noselect { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.rounded-border { + border-radius: var(--border-radius); + border: 1px solid var(--divider-color); + overflow: hidden +} + +svg.walletconnect-qrcode__image { + width: inherit; + height: inherit +} \ No newline at end of file diff --git a/src/main/resources/static/styles/input.css b/src/main/resources/static/styles/input.css new file mode 100644 index 000000000..a90f0749c --- /dev/null +++ b/src/main/resources/static/styles/input.css @@ -0,0 +1,4 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + diff --git a/src/main/resources/static/styles/login.css b/src/main/resources/static/styles/login.css new file mode 100644 index 000000000..9a319300a --- /dev/null +++ b/src/main/resources/static/styles/login.css @@ -0,0 +1,154 @@ +@import url("https://fonts.googleapis.com/css?family=Roboto:400,400i,700"); + +* { + margin: 0; + padding: 0; + font-family: Roboto, sans-serif; + box-sizing: border-box; +} + +body { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin-top: 80px; +} + +.container { + margin-top: 80px; + + background-color: #F5F5F5; + padding: 20px 20px 20px 0; + border-radius: 25px; + display: flex; +} + +.wrapper { + display: flex; + justify-content: center; + align-items: center; + width: 450px; +} + +form { + display: flex; + flex-direction: column; + width: 250px; + justify-content: space-around; +} + +.main-img { + background-image: url('https://images.unsplash.com/photo-1605106250963-ffda6d2a4b32?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=580&q=80'); + background-size: cover; + width: 300px; + height: 500px; + border-radius: 25px; +} + +h1 { + color: #2b2684; + margin-bottom: 20px; +} + +.wrapper p { + font-size: 0.75rem; + color: #2b2684; + margin-bottom: 40px; +} + +.pass-icon { + display: flex; + position: relative; + width: 250px; +} + +#email, #password { + height: 40px; + width: 250px; + border-radius: 15px; + padding-left: 15px; + border: 1px solid #2b2684; + margin-bottom: 25px; + position: relative; +} + +label { + margin-bottom: 5px; + color: #2b2684; + font-weight: bold; +} + +.pass-icon img { + width: 25px; + position: absolute; + align-self: center; + top: 27%; + right: 0; + margin-right: 10px; + filter: opacity(0.3); +} + +a { + text-decoration: none; + color: #2b2684; + font-size: 0.75rem; + text-align: right; + margin-right: 15px; +} + +#password { + margin-bottom: 10px; +} + +#login-btn { + margin: 20px 0; + height: 40px; + border-radius: 15px; + border: none; + background-color: #2b2684; + color: white; + font-size: 1rem; + font-weight: 600; + transition: 0.5s; +} + +span { + text-align: center; + position: relative; +} + +.or { + width: 250px; + display: flex; + justify-content: space-between; + align-content: center; + color: #2b2684; + margin-bottom: 20px; + font-size: 0.8rem; +} + +.or hr { + width: 40%; + height: 1px; + background-color: #2b2684; + border: none; + align-self: center; +} + +.google-btn { + height: 40px; + border: 1px solid #2b2684; + border-radius: 15px; + font-weight: bold; + display: flex; + align-items:center; + justify-content: center; + background-color: white; + margin-bottom: 20px; + color: #2b2684; + transition: 0.5s; +} + +.google-btn svg { + width: 20px; diff --git a/src/main/resources/static/main.css b/src/main/resources/static/styles/main.css similarity index 100% rename from src/main/resources/static/main.css rename to src/main/resources/static/styles/main.css diff --git a/src/main/resources/static/styles/nav.css b/src/main/resources/static/styles/nav.css new file mode 100644 index 000000000..9eec069c5 --- /dev/null +++ b/src/main/resources/static/styles/nav.css @@ -0,0 +1,22 @@ +/* src/main/resources/static/css/nav.css */ + +/* Custom styles for the navbar */ +.navbar { + background-color: #f8f9fa; +} + +.navbar-brand { + font-size: 1.5rem; + font-weight: bold; +} + +.nav-item .nav-link { + font-size: 1rem; +} + +.form-control { + margin-right: 10px; + +.d-flex .form-control { + width: auto; +} diff --git a/src/main/resources/static/styles/output.css b/src/main/resources/static/styles/output.css new file mode 100644 index 000000000..7252e9f82 --- /dev/null +++ b/src/main/resources/static/styles/output.css @@ -0,0 +1,1918 @@ +/* +! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.pointer-events-none { + pointer-events: none; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-0 { + inset: 0px; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.inset-y-0 { + top: 0px; + bottom: 0px; +} + +.-bottom-12 { + bottom: -3rem; +} + +.-top-12 { + top: -3rem; +} + +.bottom-0 { + bottom: 0px; +} + +.left-0 { + left: 0px; +} + +.left-1\/2 { + left: 50%; +} + +.left-2 { + left: 0.5rem; +} + +.left-3 { + left: 0.75rem; +} + +.right-0 { + right: 0px; +} + +.right-3 { + right: 0.75rem; +} + +.right-4 { + right: 1rem; +} + +.top-0 { + top: 0px; +} + +.top-1\/2 { + top: 50%; +} + +.top-4 { + top: 1rem; +} + +.z-30 { + z-index: 30; +} + +.z-40 { + z-index: 40; +} + +.z-50 { + z-index: 50; +} + +.z-\[1000\] { + z-index: 1000; +} + +.z-\[500\] { + z-index: 500; +} + +.m-2 { + margin: 0.5rem; +} + +.-mx-1 { + margin-left: -0.25rem; + margin-right: -0.25rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} + +.-ml-4 { + margin-left: -1rem; +} + +.-mt-4 { + margin-top: -1rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.ml-auto { + margin-left: auto; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.block { + display: block; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.aspect-square { + aspect-ratio: 1 / 1; +} + +.size-1 { + width: 0.25rem; + height: 0.25rem; +} + +.size-1\.5 { + width: 0.375rem; + height: 0.375rem; +} + +.size-10 { + width: 2.5rem; + height: 2.5rem; +} + +.size-14 { + width: 3.5rem; + height: 3.5rem; +} + +.size-2 { + width: 0.5rem; + height: 0.5rem; +} + +.size-3 { + width: 0.75rem; + height: 0.75rem; +} + +.size-3\.5 { + width: 0.875rem; + height: 0.875rem; +} + +.size-4 { + width: 1rem; + height: 1rem; +} + +.size-5 { + width: 1.25rem; + height: 1.25rem; +} + +.size-6 { + width: 1.5rem; + height: 1.5rem; +} + +.size-7 { + width: 1.75rem; + height: 1.75rem; +} + +.size-8 { + width: 2rem; + height: 2rem; +} + +.size-9 { + width: 2.25rem; + height: 2.25rem; +} + +.size-\[1\.125rem\] { + width: 1.125rem; + height: 1.125rem; +} + +.size-full { + width: 100%; + height: 100%; +} + +.h-12 { + height: 3rem; +} + +.h-20 { + height: 5rem; +} + +.h-4 { + height: 1rem; +} + +.h-48 { + height: 12rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-9 { + height: 2.25rem; +} + +.h-\[var\(--radix-select-trigger-height\)\] { + height: var(--radix-select-trigger-height); +} + +.h-full { + height: 100%; +} + +.h-px { + height: 1px; +} + +.max-h-96 { + max-height: 24rem; +} + +.min-h-11 { + min-height: 2.75rem; +} + +.w-10 { + width: 2.5rem; +} + +.w-4 { + width: 1rem; +} + +.w-9 { + width: 2.25rem; +} + +.w-\[90\%\] { + width: 90%; +} + +.w-full { + width: 100%; +} + +.min-w-0 { + min-width: 0px; +} + +.min-w-32 { + min-width: 8rem; +} + +.min-w-\[8rem\] { + min-width: 8rem; +} + +.min-w-\[var\(--radix-select-trigger-width\)\] { + min-width: var(--radix-select-trigger-width); +} + +.flex-1 { + flex: 1 1 0%; +} + +.shrink-0 { + flex-shrink: 0; +} + +.grow-0 { + flex-grow: 0; +} + +.basis-full { + flex-basis: 100%; +} + +.table-fixed { + table-layout: fixed; +} + +.caption-bottom { + caption-side: bottom; +} + +.-translate-x-1\/2 { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-1 { + --tw-translate-y: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-1\/2 { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-180 { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-90 { + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.cursor-default { + cursor: default; +} + +.cursor-pointer { + cursor: pointer; +} + +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.flex-col { + flex-direction: column; +} + +.flex-col-reverse { + flex-direction: column-reverse; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-1\.5 { + gap: 0.375rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-1\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.375rem * var(--tw-space-y-reverse)); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-scroll { + overflow: scroll; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.break-words { + overflow-wrap: break-word; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.border { + border-width: 1px; +} + +.border-0 { + border-width: 0px; +} + +.border-2 { + border-width: 2px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-l { + border-left-width: 1px; +} + +.border-r { + border-right-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-none { + border-style: none; +} + +.border-border-alternative { + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity)); +} + +.border-border-primary { + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity)); +} + +.border-transparent { + border-color: transparent; +} + +.bg-background-alternative { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-background-primary { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-background-secondary { + --tw-bg-opacity: 1; + background-color: rgb(238 238 238 / var(--tw-bg-opacity)); +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-black\/25 { + background-color: rgb(0 0 0 / 0.25); +} + +.bg-neutral-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-transparent { + background-color: transparent; +} + +.fill-current { + fill: currentColor; +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.p-0 { + padding: 0px; +} + +.p-1 { + padding: 0.25rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.px-8 { + padding-left: 2rem; + padding-right: 2rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.pb-28 { + padding-bottom: 7rem; +} + +.pb-5 { + padding-bottom: 1.25rem; +} + +.pl-3 { + padding-left: 0.75rem; +} + +.pl-4 { + padding-left: 1rem; +} + +.pl-8 { + padding-left: 2rem; +} + +.pl-\[2\.75rem\] { + padding-left: 2.75rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.pr-3 { + padding-right: 0.75rem; +} + +.pr-\[2\.75rem\] { + padding-right: 2.75rem; +} + +.pt-16 { + padding-top: 4rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.align-middle { + vertical-align: middle; +} + +.text-10xl { + font-size: 3.5rem; + line-height: 1.2; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 1.4; +} + +.text-4xl { + font-size: 2rem; + line-height: 1.3; +} + +.text-6xl { + font-size: 2.5rem; + line-height: 1.2; +} + +.text-base { + font-size: 1rem; + line-height: 1.5; +} + +.text-lg { + font-size: 1.25rem; + line-height: 1.5; +} + +.text-md { + font-size: 1.125rem; + line-height: 1.5; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.5; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1.5; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.leading-none { + line-height: 1; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.tracking-widest { + letter-spacing: 0.1em; +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +.text-current { + color: currentColor; +} + +.text-text-alternative { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-text-primary { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +.text-text-secondary { + --tw-text-opacity: 1; + color: rgb(170 170 170 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.underline { + text-decoration-line: underline; +} + +.opacity-50 { + opacity: 0.5; +} + +.opacity-60 { + opacity: 0.6; +} + +.outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.ring-0 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-offset-white { + --tw-ring-offset-color: #fff; +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-200 { + transition-duration: 200ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +.ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +@keyframes enter { + from { + opacity: var(--tw-enter-opacity, 1); + transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0)); + } +} + +@keyframes exit { + to { + opacity: var(--tw-exit-opacity, 1); + transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0)); + } +} + +.fade-in-0 { + --tw-enter-opacity: 0; +} + +.slide-in-from-bottom { + --tw-enter-translate-y: 100%; +} + +.slide-in-from-top { + --tw-enter-translate-y: -100%; +} + +.duration-200 { + animation-duration: 200ms; +} + +.duration-300 { + animation-duration: 300ms; +} + +.ease-in-out { + animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.file\:border-0::file-selector-button { + border-width: 0px; +} + +.file\:bg-transparent::file-selector-button { + background-color: transparent; +} + +.file\:text-sm::file-selector-button { + font-size: 0.875rem; + line-height: 1.5; +} + +.file\:font-medium::file-selector-button { + font-weight: 500; +} + +.placeholder\:text-neutral::-moz-placeholder { + --tw-text-opacity: 1; + color: rgb(102 102 102 / var(--tw-text-opacity)); +} + +.placeholder\:text-neutral::placeholder { + --tw-text-opacity: 1; + color: rgb(102 102 102 / var(--tw-text-opacity)); +} + +.first\:border-t:first-child { + border-top-width: 1px; +} + +.focus\:bg-background-secondary:focus { + --tw-bg-opacity: 1; + background-color: rgb(238 238 238 / var(--tw-bg-opacity)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus-visible\:outline-none:focus-visible { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus-visible\:ring-2:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus-visible\:ring-border-primary:focus-visible { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); +} + +.focus-visible\:ring-offset-2:focus-visible { + --tw-ring-offset-width: 2px; +} + +.disabled\:pointer-events-none:disabled { + pointer-events: none; +} + +.disabled\:cursor-not-allowed:disabled { + cursor: not-allowed; +} + +.disabled\:opacity-50:disabled { + opacity: 0.5; +} + +.peer:disabled ~ .peer-disabled\:cursor-not-allowed { + cursor: not-allowed; +} + +.peer:disabled ~ .peer-disabled\:opacity-70 { + opacity: 0.7; +} + +.data-\[disabled\]\:pointer-events-none[data-disabled] { + pointer-events: none; +} + +.data-\[side\=bottom\]\:translate-y-1[data-side=bottom] { + --tw-translate-y: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[side\=left\]\:-translate-x-1[data-side=left] { + --tw-translate-x: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[side\=right\]\:translate-x-1[data-side=right] { + --tw-translate-x: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[side\=top\]\:-translate-y-1[data-side=top] { + --tw-translate-y: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[state\=checked\]\:translate-x-\[18px\][data-state=checked] { + --tw-translate-x: 18px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[state\=unchecked\]\:translate-x-0\.5[data-state=unchecked] { + --tw-translate-x: 0.125rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +@keyframes accordion-up { + from { + height: var(--radix-accordion-content-height); + } + + to { + height: 0px; + } +} + +.data-\[state\=closed\]\:animate-accordion-up[data-state=closed] { + animation: accordion-up 0.2s ease-out; +} + +@keyframes accordion-down { + from { + height: 0px; + } + + to { + height: var(--radix-accordion-content-height); + } +} + +.data-\[state\=open\]\:animate-accordion-down[data-state=open] { + animation: accordion-down 0.2s ease-out; +} + +.data-\[state\=active\]\:bg-background-alternative[data-state=active] { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.data-\[state\=checked\]\:bg-background-alternative[data-state=checked] { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.data-\[state\=indeterminate\]\:bg-background-primary[data-state=indeterminate] { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.data-\[state\=open\]\:bg-background-secondary[data-state=open] { + --tw-bg-opacity: 1; + background-color: rgb(238 238 238 / var(--tw-bg-opacity)); +} + +.data-\[state\=unchecked\]\:bg-\[\#c6c6c6\][data-state=unchecked] { + --tw-bg-opacity: 1; + background-color: rgb(198 198 198 / var(--tw-bg-opacity)); +} + +.data-\[state\=active\]\:text-text-alternative[data-state=active] { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.data-\[state\=checked\]\:text-text-alternative[data-state=checked] { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.data-\[state\=indeterminate\]\:text-text-primary[data-state=indeterminate] { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +.data-\[disabled\]\:opacity-50[data-disabled] { + opacity: 0.5; +} + +.data-\[state\=closed\]\:duration-700[data-state=closed] { + transition-duration: 700ms; +} + +.data-\[state\=open\]\:duration-300[data-state=open] { + transition-duration: 300ms; +} + +.data-\[state\=open\]\:duration-700[data-state=open] { + transition-duration: 700ms; +} + +.data-\[state\=open\]\:animate-in[data-state=open] { + animation-name: enter; + animation-duration: 150ms; + --tw-enter-opacity: initial; + --tw-enter-scale: initial; + --tw-enter-rotate: initial; + --tw-enter-translate-x: initial; + --tw-enter-translate-y: initial; +} + +.data-\[state\=closed\]\:animate-out[data-state=closed] { + animation-name: exit; + animation-duration: 150ms; + --tw-exit-opacity: initial; + --tw-exit-scale: initial; + --tw-exit-rotate: initial; + --tw-exit-translate-x: initial; + --tw-exit-translate-y: initial; +} + +.data-\[state\=closed\]\:fade-out-0[data-state=closed] { + --tw-exit-opacity: 0; +} + +.data-\[state\=open\]\:fade-in-0[data-state=open] { + --tw-enter-opacity: 0; +} + +.data-\[state\=closed\]\:zoom-out-95[data-state=closed] { + --tw-exit-scale: .95; +} + +.data-\[state\=open\]\:zoom-in-95[data-state=open] { + --tw-enter-scale: .95; +} + +.data-\[side\=bottom\]\:slide-in-from-bottom-1\/2[data-side=bottom] { + --tw-enter-translate-y: 50%; +} + +.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom] { + --tw-enter-translate-y: -0.5rem; +} + +.data-\[side\=left\]\:slide-in-from-right-1[data-side=left] { + --tw-enter-translate-x: 0.25rem; +} + +.data-\[side\=left\]\:slide-in-from-right-2[data-side=left] { + --tw-enter-translate-x: 0.5rem; +} + +.data-\[side\=right\]\:slide-in-from-left-1[data-side=right] { + --tw-enter-translate-x: -0.25rem; +} + +.data-\[side\=right\]\:slide-in-from-left-2[data-side=right] { + --tw-enter-translate-x: -0.5rem; +} + +.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top] { + --tw-enter-translate-y: 0.5rem; +} + +.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed] { + --tw-exit-translate-y: 100%; +} + +.data-\[state\=closed\]\:slide-out-to-left[data-state=closed] { + --tw-exit-translate-x: -100%; +} + +.data-\[state\=closed\]\:slide-out-to-right[data-state=closed] { + --tw-exit-translate-x: 100%; +} + +.data-\[state\=closed\]\:slide-out-to-top[data-state=closed] { + --tw-exit-translate-y: -100%; +} + +.data-\[state\=open\]\:slide-in-from-bottom[data-state=open] { + --tw-enter-translate-y: 100%; +} + +.data-\[state\=open\]\:slide-in-from-left[data-state=open] { + --tw-enter-translate-x: -100%; +} + +.data-\[state\=open\]\:slide-in-from-right[data-state=open] { + --tw-enter-translate-x: 100%; +} + +.data-\[state\=open\]\:slide-in-from-top[data-state=open] { + --tw-enter-translate-y: -100%; +} + +.data-\[state\=closed\]\:duration-700[data-state=closed] { + animation-duration: 700ms; +} + +.data-\[state\=open\]\:duration-300[data-state=open] { + animation-duration: 300ms; +} + +.data-\[state\=open\]\:duration-700[data-state=open] { + animation-duration: 700ms; +} + +@media (min-width: 480px) { + .sm\:flex-row { + flex-direction: row; + } + + .sm\:justify-end { + justify-content: flex-end; + } + + .sm\:gap-2 { + gap: 0.5rem; + } + + .sm\:space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\:text-left { + text-align: left; + } +} + +@media (min-width: 768px) { + .md\:mb-6 { + margin-bottom: 1.5rem; + } + + .md\:size-8 { + width: 2rem; + height: 2rem; + } + + .md\:w-\[80\%\] { + width: 80%; + } + + .md\:px-12 { + padding-left: 3rem; + padding-right: 3rem; + } + + .md\:py-16 { + padding-top: 4rem; + padding-bottom: 4rem; + } + + .md\:text-9xl { + font-size: 3.25rem; + line-height: 1.2; + } + + .md\:text-md { + font-size: 1.125rem; + line-height: 1.5; + } +} + +@media (min-width: 992px) { + .lg\:block { + display: block; + } + + .lg\:hidden { + display: none; + } + + .lg\:w-full { + width: 100%; + } + + .lg\:max-w-\[40rem\] { + max-width: 40rem; + } + + .lg\:px-16 { + padding-left: 4rem; + padding-right: 4rem; + } + + .lg\:py-20 { + padding-top: 5rem; + padding-bottom: 5rem; + } + + .lg\:text-10xl { + font-size: 3.5rem; + line-height: 1.2; + } +} + +.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]) { + padding-right: 0px; +} + +.\[\&\>span\]\:line-clamp-1>span { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} + +.\[\&\>svg\]\:size-4>svg { + width: 1rem; + height: 1rem; +} + +.\[\&\>tr\]\:last\:border-b-0:last-child>tr { + border-bottom-width: 0px; +} + +.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&_tr\]\:border-l-0 tr { + border-left-width: 0px; +} + +.\[\&_tr\]\:border-r-0 tr { + border-right-width: 0px; +} + +.\[\&_tr\]\:border-t tr { + border-top-width: 1px; +} \ No newline at end of file diff --git a/src/main/resources/static/styles/register.css b/src/main/resources/static/styles/register.css new file mode 100644 index 000000000..2af79f740 --- /dev/null +++ b/src/main/resources/static/styles/register.css @@ -0,0 +1,84 @@ +@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,600'); + +* { + box-sizing: border-box; +} + +body { + font-family: 'Open Sans', sans-serif; + background: url('https://images.unsplash.com/photo-1561579890-3ace74d8e378?w=800&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8MjJ8fGdyb3VwJTIweW9nYXxlbnwwfHwwfHx8MA%3D%3D') no-repeat center center fixed; /* Replace with your image URL */ + background-size: cover; + + background-color: #f8f9fa; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; +} + +.container { + width: 100%; + max-width: 400px; + padding: 20px; + background-color: #ffffff; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.form-signup { + display: flex; + flex-direction: column; +} + +.form-signup h2 { + margin-bottom: 20px; + font-weight: 600; + color: #333333; + text-align: center; +} + +.form-group { + margin-bottom: 15px; +} + +.form-group label { + display: block; + margin-bottom: 5px; + font-weight: 600; + color: #555555; +} + +.form-group input { + width: 100%; + padding: 10px; + border: 1px solid #cccccc; + border-radius: 4px; + font-size: 16px; +} + +.form-group input:focus { + border-color: #007bff; + outline: none; +} + +.btn { + padding: 10px; + border: none; + border-radius: 4px; + background-color: #007bff; + color: white; + font-size: 16px; + cursor: pointer; + transition: background-color 0.3s; +} + +.btn:hover { + background-color: #0056b3; +} + +.error { + margin-top: 15px; + color: red; + text-align: center; +} diff --git a/src/main/resources/templates/account.html b/src/main/resources/templates/account.html new file mode 100644 index 000000000..6ac7918d3 --- /dev/null +++ b/src/main/resources/templates/account.html @@ -0,0 +1,58 @@ + + + + Account Page + + + + +
+
+

Account Information

+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + Change Password + +
+
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html new file mode 100644 index 000000000..75fd795e4 --- /dev/null +++ b/src/main/resources/templates/error.html @@ -0,0 +1,21 @@ + + + + + Error + + + +
+

Error Page

+
+ Error: + +
+
+ Message: + +
+
+ + diff --git a/src/main/resources/templates/events/details.html b/src/main/resources/templates/events/details.html new file mode 100644 index 000000000..20fdac8de --- /dev/null +++ b/src/main/resources/templates/events/details.html @@ -0,0 +1,268 @@ + + + + + Event + + + + + + + + + + +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
Cover Image for London Credit and Risk Dinner with Oscilar & TWIF
+
Cover Image for London Credit and Risk Dinner with Oscilar & TWIF
+
+
+
+
+ +
+
+ +
+
+
63 Going
+
+
+
+
+
+
+
+
+
+
+
+
+

London Credit and Risk Dinner with Oscilar & TWIF

+
+
+ +
+
+
+
+
+
Jun
+
26
+
+
+
+
Wednesday, June 26
+
6:00 PM - 8:30 PM
+
+
+
+
+
+
+ +
+
+
+
+
Smith & Wollensky
+
+
Newcastle, England
+
+
+
+
+
+
+
+
+
Registration
+
+
+
+
+
Welcome! To join the event, please register below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
About Event
+
+
+
+
+
Location
+
+
+
+
+
+
+ +
+
+
63 Going
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/events/details.txt b/src/main/resources/templates/events/details.txt new file mode 100644 index 000000000..092613d88 --- /dev/null +++ b/src/main/resources/templates/events/details.txt @@ -0,0 +1,1325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
Cover Image for London Credit and Risk Dinner with Oscilar & TWIF
+
Cover Image for London Credit and Risk Dinner with Oscilar & TWIF
+
+
+
+
+ +
+
+ +
+
+
63 Going
+
+
+
+
+
+
+
+
+
+
+
+
+

London Credit and Risk Dinner with Oscilar & TWIF

+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
Smith & Wollensky
+
+
Newcastle, England
+
+
+
+
+
+
+
+
+
Registration
+
+
+
+
+
Welcome! To join the event, please register below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
About Event
+
+
+
+
+
Location
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/events/events.html b/src/main/resources/templates/events/events.html new file mode 100644 index 000000000..b23d5eb1e --- /dev/null +++ b/src/main/resources/templates/events/events.html @@ -0,0 +1,42 @@ + + + + User-Hosted Events + + + + + + +
+ +

Welcome, User!

+

You have successfully logged in.

+
+ +
+
+ + + + +
+ + + + + + + + + + diff --git a/src/main/resources/templates/events/new.html b/src/main/resources/templates/events/new.html new file mode 100644 index 000000000..9c4a4865d --- /dev/null +++ b/src/main/resources/templates/events/new.html @@ -0,0 +1,454 @@ + + + + Multi-Step Form + + + + + +
+
+ +
+ +
+
+
+
1
+
+
2
+
+
3
+
+
+
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+ +

or drag and drop

+
+

PNG, JPG, GIF up to 10MB

+
+
+
+ +
+ + +
+
+ + + + + + +
+
+ + +
+ Step Image +
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/events/third-party-events.html b/src/main/resources/templates/events/third-party-events.html new file mode 100644 index 000000000..a9db1713e --- /dev/null +++ b/src/main/resources/templates/events/third-party-events.html @@ -0,0 +1,86 @@ + + + + + Events + + + + + +
+

Events

+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+

No events data available.

+
+
+
+
+
+ eventThumbnail +
+

+
+ Description: + + + +
+

Start Time:

+

End Time:

+

Address:

+
+ + Event Link + + +
+
+
+
+
+ + + + + diff --git a/src/main/resources/templates/fragments/footer.html b/src/main/resources/templates/fragments/footer.html new file mode 100644 index 000000000..4c3777043 --- /dev/null +++ b/src/main/resources/templates/fragments/footer.html @@ -0,0 +1,11 @@ + + + + + + +
+ © 2024 My Ethan - Daisy - Umi - Rachel - Makini +
+ + diff --git a/src/main/resources/templates/fragments/loyout.html b/src/main/resources/templates/fragments/loyout.html new file mode 100644 index 000000000..5725b633d --- /dev/null +++ b/src/main/resources/templates/fragments/loyout.html @@ -0,0 +1,15 @@ + + + + My Website + + + + + + +
+ + +
+ +
+
+ + + + + + diff --git a/src/main/resources/templates/landingpage.html b/src/main/resources/templates/landingpage.html new file mode 100644 index 000000000..22d5aba3b --- /dev/null +++ b/src/main/resources/templates/landingpage.html @@ -0,0 +1,130 @@ + + + + Website-Hosted Events + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+ +
+ +
+

Events

+ +
+ + + diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 000000000..f21c118c1 --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,49 @@ + + + + + Login + + + + + + + + + + +
+
+
+
+

Login

+
+ + +
+
+ + +
+ Forgot password? + +
+
+ or +
+
+ + + Sign in with Google + +
+

Don't have an account?

+ Register +
+
+
+
+ + + diff --git a/src/main/resources/templates/posts/index.html b/src/main/resources/templates/posts/index.html deleted file mode 100644 index 4eb260155..000000000 --- a/src/main/resources/templates/posts/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Acebook - - - - -

Posts

- -
- Signed in as -
- -
-

Content:

-

-
- -
    -
  • -
- - - diff --git a/src/main/resources/templates/register.html b/src/main/resources/templates/register.html new file mode 100644 index 000000000..9488a5091 --- /dev/null +++ b/src/main/resources/templates/register.html @@ -0,0 +1,45 @@ + + + + Register + + + + + + + + + + + +
+ +
+ + + diff --git a/src/main/resources/templates/updatePassword.html b/src/main/resources/templates/updatePassword.html new file mode 100644 index 000000000..658c501f3 --- /dev/null +++ b/src/main/resources/templates/updatePassword.html @@ -0,0 +1,46 @@ + + + + Change Password + + + + +
+
+

Change Password

+ + +
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+
+ + + + diff --git a/src/main/resources/templates/users/new.html b/src/main/resources/templates/users/new.html deleted file mode 100644 index 2d763f396..000000000 --- a/src/main/resources/templates/users/new.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - Signup - - -
-

Username:

-

Password:

-

-
- - \ No newline at end of file diff --git a/src/test/java/SignUpTest.java b/src/test/java/SignUpTest.java deleted file mode 100644 index b0e16955b..000000000 --- a/src/test/java/SignUpTest.java +++ /dev/null @@ -1,43 +0,0 @@ -import com.github.javafaker.Faker; -import com.makersacademy.acebook.Application; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.chrome.ChromeDriver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) -public class SignUpTest { - - WebDriver driver; - Faker faker; - - @Before - public void setup() { - System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver"); - driver = new ChromeDriver(); - faker = new Faker(); - } - - @After - public void tearDown() { - driver.close(); - } - - @Test - public void successfulSignUpRedirectsToSignIn() { - driver.get("http://localhost:8080/users/new"); - driver.findElement(By.id("username")).sendKeys(faker.name().firstName()); - driver.findElement(By.id("password")).sendKeys("password"); - driver.findElement(By.id("submit")).click(); - String title = driver.getTitle(); - Assert.assertEquals("Please sign in", title); - } -} diff --git a/src/test/java/com/makersacademy/acebook/model/PostTest.java b/src/test/java/com/makersacademy/acebook/model/PostTest.java index 732aafc6e..e26c28869 100644 --- a/src/test/java/com/makersacademy/acebook/model/PostTest.java +++ b/src/test/java/com/makersacademy/acebook/model/PostTest.java @@ -1,3 +1,5 @@ + +/* package com.makersacademy.acebook.model; import static org.hamcrest.CoreMatchers.containsString; @@ -7,7 +9,7 @@ public class PostTest { - private Post post = new Post("hello"); + private Event post = new Event("hello"); @Test public void postHasContent() { @@ -15,3 +17,4 @@ public void postHasContent() { } } +*/ \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 000000000..09da2ada9 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,20 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: 'class', // Enable class-based dark mode + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + "./node_modules/@relume_io/relume-ui/dist/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + backgroundImage: { + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + }, + }, + }, + presets: [require("@relume_io/relume-tailwind")], + plugins: [], +};