From 71697daf312773fcbe33ebb75c173f9b73dfc054 Mon Sep 17 00:00:00 2001 From: Abhijay Singh Date: Thu, 20 Nov 2025 01:11:33 +0530 Subject: [PATCH 1/2] add scroll to top button --- .../site/assets/scss/_scroll-to-top.scss | 119 +++ .../site/assets/scss/main-custom.scss | 1 + landing-pages/site/data/integrations.json | 853 +++++++++++++++++- .../site/layouts/partials/footer.html | 5 + landing-pages/src/index.js | 1 + landing-pages/src/js/scrollToTop.js | 53 ++ landing-pages/yarn.lock | 332 +++---- 7 files changed, 1206 insertions(+), 158 deletions(-) create mode 100644 landing-pages/site/assets/scss/_scroll-to-top.scss create mode 100644 landing-pages/src/js/scrollToTop.js diff --git a/landing-pages/site/assets/scss/_scroll-to-top.scss b/landing-pages/site/assets/scss/_scroll-to-top.scss new file mode 100644 index 00000000000..1764af0d08a --- /dev/null +++ b/landing-pages/site/assets/scss/_scroll-to-top.scss @@ -0,0 +1,119 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.scroll-to-top { + position: fixed; + bottom: 30px; + left: 20px; + width: 50px; + height: 50px; + background: linear-gradient(135deg, #007bff, #0056b3); + color: white; + border: none; + border-radius: 50%; + cursor: pointer; + opacity: 0; + visibility: hidden; + transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 4px 20px rgba(0, 123, 255, 0.4); + + &:hover { + transform: translateY(-4px) scale(1.1); + box-shadow: 0 8px 30px rgba(0, 123, 255, 0.6); + background: linear-gradient(135deg, #0056b3, #004085); + } + + &:active { + transform: translateY(-2px) scale(1.05); + transition: all 0.1s ease; + } + + &:focus { + outline: 2px solid #007bff; + outline-offset: 3px; + box-shadow: 0 0 0 5px rgba(0, 123, 255, 0.2); + } + + .scroll-to-top__arrow { + display: block; + width: 0; + height: 0; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 8px solid white; + margin: 0 auto; + transition: transform 0.3s ease; + } + + &:hover .scroll-to-top__arrow { + transform: translateY(-1px); + } + + &.visible { + opacity: 1; + visibility: visible; + animation: fadeInUp 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94); + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +// Responsive design +@media (max-width: 768px) { + .scroll-to-top { + width: 45px; + height: 45px; + bottom: 15px; + right: 15px; + + .scroll-to-top__arrow { + border-left-width: 5px; + border-right-width: 5px; + border-bottom-width: 7px; + } + } +} + +@media (max-width: 480px) { + .scroll-to-top { + width: 40px; + height: 40px; + bottom: 10px; + right: 10px; + + .scroll-to-top__arrow { + border-left-width: 4px; + border-right-width: 4px; + border-bottom-width: 6px; + } + } +} diff --git a/landing-pages/site/assets/scss/main-custom.scss b/landing-pages/site/assets/scss/main-custom.scss index fb5887e204c..9ffbd322149 100644 --- a/landing-pages/site/assets/scss/main-custom.scss +++ b/landing-pages/site/assets/scss/main-custom.scss @@ -57,3 +57,4 @@ @import "survey"; @import "testimonial"; @import "suggest-change"; +@import "scroll-to-top"; diff --git a/landing-pages/site/data/integrations.json b/landing-pages/site/data/integrations.json index a6a2daf80ba..153f62cb945 120000 --- a/landing-pages/site/data/integrations.json +++ b/landing-pages/site/data/integrations.json @@ -1 +1,852 @@ -../static/integrations.json \ No newline at end of file +[ + { + "name": "Airbyte", + "logo": "/integration-logos/airbyte/Airbyte.png", + "url": "/docs/apache-airflow-providers-airbyte/stable/operators/airbyte.html" + }, + { + "name": "Alibaba Cloud OSS", + "logo": "/integration-logos/alibaba/cloud/alibabacloud-oss.png", + "url": "/docs/apache-airflow-providers-alibaba/stable/operators/oss.html" + }, + { + "name": "Amazon Athena", + "logo": "/integration-logos/aws/Amazon-Athena_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/athena.html" + }, + { + "name": "Amazon CloudFormation", + "logo": "/integration-logos/aws/AWS-CloudFormation_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/cloudformation.html" + }, + { + "name": "Amazon CloudWatch Logs", + "logo": "/integration-logos/aws/Amazon-CloudWatch_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "Amazon DataSync", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/datasync.html" + }, + { + "name": "Amazon DynamoDB", + "logo": "/integration-logos/aws/Amazon-DynamoDB_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "Amazon EC2", + "logo": "/integration-logos/aws/Amazon-EC2_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/ec2.html" + }, + { + "name": "Amazon ECS", + "logo": "/integration-logos/aws/Amazon-Elastic-Container-Service_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "Amazon Elastic Kubernetes Service (EKS)", + "logo": "/integration-logos/aws/Amazon-Elastic-Kubernetes-Service_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/eks.html" + }, + { + "name": "Amazon ElastiCache", + "logo": "/integration-logos/aws/Amazon-ElastiCache_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "Amazon EMR", + "logo": "/integration-logos/aws/Amazon-EMR_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/emr.html" + }, + { + "name": "Amazon EMR on EKS", + "logo": "/integration-logos/aws/Amazon-EMR_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/emr_eks.html" + }, + { + "name": "Amazon Glacier", + "logo": "/integration-logos/aws/Amazon-S3-Glacier_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/glacier.html" + }, + { + "name": "Amazon Kinesis Data Firehose", + "logo": "/integration-logos/aws/Amazon-Kinesis-Data-Firehose_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "Amazon QuickSight", + "logo": "/integration-logos/aws/Amazon-Quicksight_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/quicksight.html" + }, + { + "name": "Amazon RDS", + "logo": "/integration-logos/aws/Amazon-RDS_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/rds.html" + }, + { + "name": "Amazon Redshift", + "logo": "/integration-logos/aws/Amazon-Redshift_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/redshift_sql.html" + }, + { + "name": "Amazon Redshift Data", + "logo": "/integration-logos/aws/Amazon-Redshift_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/redshift_data.html" + }, + { + "name": "Amazon SageMaker", + "logo": "/integration-logos/aws/Amazon-SageMaker_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/sagemaker.html" + }, + { + "name": "Amazon SecretsManager", + "logo": "/integration-logos/aws/AWS-Secrets-Manager_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "Amazon Simple Email Service (SES)", + "logo": "/integration-logos/aws/Amazon-Simple-Email-Service-SES_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/ecs.html" + }, + { + "name": "Amazon Simple Notification Service (SNS)", + "logo": "/integration-logos/aws/Amazon-Simple-Notification-Service-SNS_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/sns.html" + }, + { + "name": "Amazon Simple Queue Service (SQS)", + "logo": "/integration-logos/aws/Amazon-Simple-Queue-Service-SQS_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/sqs.html" + }, + { + "name": "Amazon Simple Storage Service (S3)", + "logo": "/integration-logos/aws/Amazon-Simple-Storage-Service-S3_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/s3.html" + }, + { + "name": "Amazon Web Services", + "logo": "/integration-logos/aws/AWS-Cloud-alt_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "Apache Beam", + "url": "/docs/apache-airflow-providers-apache-beam/stable/operators.html" + }, + { + "name": "Apache Cassandra", + "logo": "/integration-logos/apache/cassandra-3.png", + "url": "/docs/apache-airflow-providers-apache-cassandra/stable/operators.html" + }, + { + "name": "Apache Drill", + "logo": "/integration-logos/apache/drill.png", + "url": "/docs/apache-airflow-providers-apache-drill/stable/operators.html" + }, + { + "name": "Apache Druid", + "logo": "/integration-logos/apache/druid-1.png", + "url": "/docs/apache-airflow-providers-apache-druid/stable/operators.html" + }, + { + "name": "Apache Hive", + "logo": "/integration-logos/apache/hive.png", + "url": "/docs/apache-airflow-providers-apache-hive/stable/operators.html" + }, + { + "name": "Apache Kylin", + "logo": "/integration-logos/apache/kylin.png", + "url": "/docs/apache-airflow-providers-apache-kylin/stable/index.html" + }, + { + "name": "Apache Livy", + "logo": "/integration-logos/apache/Livy.png", + "url": "/docs/apache-airflow-providers-apache-livy/stable/operators.html" + }, + { + "name": "Apache Pig", + "logo": "/integration-logos/apache/pig.png", + "url": "/docs/apache-airflow-providers-apache-pig/stable/operators.html" + }, + { + "name": "Apache Pinot", + "logo": "/integration-logos/apache/pinot.png", + "url": "/docs/apache-airflow-providers-apache-pinot/stable/index.html" + }, + { + "name": "Apache Spark", + "logo": "/integration-logos/apache/spark.png", + "url": "/docs/apache-airflow-providers-apache-spark/stable/operators.html" + }, + { + "name": "Apache Sqoop", + "logo": "/integration-logos/apache/sqoop.png", + "url": "/docs/apache-airflow-providers-apache-sqoop/stable/operators.html" + }, + { + "name": "ArangoDB", + "url": "/docs/apache-airflow-providers-arangodb/stable/index.html" + }, + { + "name": "Asana", + "url": "/docs/apache-airflow-providers-asana/stable/operators/asana.html" + }, + { + "name": "Atlassian Jira", + "logo": "/integration-logos/jira/Jira.png", + "url": "/docs/apache-airflow-providers-jira/stable/index.html" + }, + { + "name": "AWS Batch", + "logo": "/integration-logos/aws/AWS-Batch_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/batch.html" + }, + { + "name": "AWS Database Migration Service", + "logo": "/integration-logos/aws/AWS-Database-Migration-Service_64@5x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/dms.html" + }, + { + "name": "AWS DataSync", + "logo": "/integration-logos/aws/AWS-DataSync_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "AWS Glue", + "logo": "/integration-logos/aws/AWS-Glue_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/glue.html" + }, + { + "name": "AWS Lambda", + "logo": "/integration-logos/aws/AWS-Lambda_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/lambda.html" + }, + { + "name": "AWS Security Token Service (STS)", + "logo": "/integration-logos/aws/AWS-STS_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/index.html" + }, + { + "name": "AWS Step Functions", + "logo": "/integration-logos/aws/AWS-Step-Functions_light-bg@4x.png", + "url": "/docs/apache-airflow-providers-amazon/stable/operators/step_functions.html" + }, + { + "name": "Celery", + "logo": "/integration-logos/celery/Celery.png", + "url": "/docs/apache-airflow-providers-celery/stable/index.html" + }, + { + "name": "Databricks", + "logo": "/integration-logos/databricks/Databricks.png", + "url": "/docs/apache-airflow-providers-databricks/stable/operators/submit_run.html" + }, + { + "name": "Databricks Repos", + "logo": "/integration-logos/databricks/Databricks.png", + "url": "/docs/apache-airflow-providers-databricks/stable/operators/repos_create.html" + }, + { + "name": "Databricks SQL", + "logo": "/integration-logos/databricks/Databricks.png", + "url": "/docs/apache-airflow-providers-databricks/stable/operators/sql.html" + }, + { + "name": "Datadog", + "logo": "/integration-logos/datadog/datadog.png", + "url": "/docs/apache-airflow-providers-datadog/stable/index.html" + }, + { + "name": "dbt Cloud", + "logo": "/integration-logos/dbt/dbt.png", + "url": "/docs/apache-airflow-providers-dbt-cloud/stable/operators.html" + }, + { + "name": "Dingding", + "logo": "/integration-logos/dingding/Dingding.png", + "url": "/docs/apache-airflow-providers-dingding/stable/operators.html" + }, + { + "name": "Discord", + "logo": "/integration-logos/discord/Discord.png", + "url": "/docs/apache-airflow-providers-discord/stable/index.html" + }, + { + "name": "Docker", + "logo": "/integration-logos/docker/Docker.png", + "url": "/docs/apache-airflow-providers-docker/stable/index.html" + }, + { + "name": "Docker Swarm", + "logo": "/integration-logos/docker/Docker-Swarm.png", + "url": "/docs/apache-airflow-providers-docker/stable/index.html" + }, + { + "name": "Elasticsearch", + "logo": "/integration-logos/elasticsearch/Elasticsearch.png", + "url": "/docs/apache-airflow-providers-elasticsearch/stable/index.html" + }, + { + "name": "Exasol", + "logo": "/integration-logos/exasol/Exasol.png", + "url": "/docs/apache-airflow-providers-exasol/stable/index.html" + }, + { + "name": "Facebook Ads", + "logo": "/integration-logos/facebook/Facebook-Ads.png", + "url": "/docs/apache-airflow-providers-facebook/stable/index.html" + }, + { + "name": "File Transfer Protocol (FTP)", + "logo": "/integration-logos/ftp/FTP.png", + "url": "/docs/apache-airflow-providers-ftp/stable/index.html" + }, + { + "name": "Github", + "url": "/docs/apache-airflow-providers-github/stable/index.html" + }, + { + "name": "Google", + "logo": "/integration-logos/gcp/Google.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Ads", + "logo": "/integration-logos/gcp/Google-Ads.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/ads.html" + }, + { + "name": "Google Analytics360", + "logo": "/integration-logos/gcp/Google-Analytics.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/marketing_platform/analytics.html" + }, + { + "name": "Google API Python Client", + "logo": "/integration-logos/gcp/Google-API-Python-Client.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google AutoML", + "logo": "/integration-logos/gcp/Cloud-AutoML.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/automl.html" + }, + { + "name": "Google BigQuery", + "logo": "/integration-logos/gcp/BigQuery.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/bigquery.html" + }, + { + "name": "Google BigQuery Data Transfer Service", + "logo": "/integration-logos/gcp/BigQuery.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/bigquery_dts.html" + }, + { + "name": "Google Bigtable", + "logo": "/integration-logos/gcp/Cloud-Bigtable.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/bigtable.html" + }, + { + "name": "Google Calendar", + "logo": "/integration-logos/gcp/Google-Calendar.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Campaign Manager", + "logo": "/integration-logos/gcp/Google-Campaign-Manager.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/marketing_platform/campaign_manager.html" + }, + { + "name": "Google Cloud", + "logo": "/integration-logos/gcp/Google-Cloud.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Cloud Build", + "logo": "/integration-logos/gcp/Cloud-Build.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/cloud_build.html" + }, + { + "name": "Google Cloud Composer", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/cloud_composer.html" + }, + { + "name": "Google Cloud Data Loss Prevention (DLP)", + "logo": "/integration-logos/gcp/google-data-loss-prevention.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/data_loss_prevention.html" + }, + { + "name": "Google Cloud Firestore", + "logo": "/integration-logos/gcp/Google-Firestore.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/firebase/firestore.html" + }, + { + "name": "Google Cloud Functions", + "logo": "/integration-logos/gcp/Cloud-Functions.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/functions.html" + }, + { + "name": "Google Cloud Key Management Service (KMS)", + "logo": "/integration-logos/gcp/Key-Management-Service.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Cloud Life Sciences", + "logo": "/integration-logos/gcp/Google-Cloud-Life-Sciences.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/life_sciences.html" + }, + { + "name": "Google Cloud Memorystore", + "logo": "/integration-logos/gcp/Cloud-Memorystore.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/cloud_memorystore.html" + }, + { + "name": "Google Cloud Natural Language", + "logo": "/integration-logos/gcp/Cloud-NLP.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/natural_language.html" + }, + { + "name": "Google Cloud OS Login", + "logo": "/integration-logos/gcp/Google-Cloud-Generic.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Cloud Pub/Sub", + "logo": "/integration-logos/gcp/Cloud-PubSub.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/pubsub.html" + }, + { + "name": "Google Cloud Secret Manager", + "logo": "/integration-logos/gcp/Google-Cloud-Secret-Manager.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Cloud Spanner", + "logo": "/integration-logos/gcp/Cloud-Spanner.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/spanner.html" + }, + { + "name": "Google Cloud Speech-to-Text", + "logo": "/integration-logos/gcp/Cloud-Speech-to-Text.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/speech_to_text.html" + }, + { + "name": "Google Cloud SQL", + "logo": "/integration-logos/gcp/Cloud-SQL.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/cloud_sql.html" + }, + { + "name": "Google Cloud Stackdriver", + "logo": "/integration-logos/gcp/Google-Cloud-Stackdriver.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/stackdriver.html" + }, + { + "name": "Google Cloud Storage (GCS)", + "logo": "/integration-logos/gcp/Cloud-Storage.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/gcs.html" + }, + { + "name": "Google Cloud Storage Transfer Service", + "logo": "/integration-logos/gcp/Cloud-Storage.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/cloud_storage_transfer_service.html" + }, + { + "name": "Google Cloud Tasks", + "logo": "/integration-logos/gcp/Cloud-Tasks.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/tasks.html" + }, + { + "name": "Google Cloud Text-to-Speech", + "logo": "/integration-logos/gcp/Cloud-Text-to-Speech.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/text_to_speech.html" + }, + { + "name": "Google Cloud Translation", + "logo": "/integration-logos/gcp/Cloud-Translation-API.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/translate.html" + }, + { + "name": "Google Cloud Video Intelligence", + "logo": "/integration-logos/gcp/Cloud-Video-Intelligence-API.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/video_intelligence.html" + }, + { + "name": "Google Cloud Vision", + "logo": "/integration-logos/gcp/Cloud-Vision-API.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/vision.html" + }, + { + "name": "Google Cloud Workflows", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/workflows.html" + }, + { + "name": "Google Compute Engine", + "logo": "/integration-logos/gcp/Compute-Engine.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/compute.html" + }, + { + "name": "Google Data Catalog", + "logo": "/integration-logos/gcp/Google-Data-Catalog.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/datacatalog.html" + }, + { + "name": "Google Data Fusion", + "logo": "/integration-logos/gcp/Google-Data-Fusion.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/datafusion.html" + }, + { + "name": "Google Data Proc", + "logo": "/integration-logos/gcp/Google-Data-Proc.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Dataflow", + "logo": "/integration-logos/gcp/Cloud-Dataflow.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/dataflow.html" + }, + { + "name": "Google Dataplex", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/dataplex.html" + }, + { + "name": "Google Dataprep", + "logo": "/integration-logos/gcp/Google-Dataprep.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/dataprep.html" + }, + { + "name": "Google Dataproc", + "logo": "/integration-logos/gcp/Cloud-Dataproc.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/dataproc.html" + }, + { + "name": "Google Dataproc Metastore", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/dataproc_metastore.html" + }, + { + "name": "Google Datastore", + "logo": "/integration-logos/gcp/Cloud-Datastore.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/datastore.html" + }, + { + "name": "Google Deployment Manager", + "logo": "/integration-logos/gcp/Google-Deployment-Manager.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Discovery API", + "logo": "/integration-logos/gcp/Google-Cloud-Generic.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Display&Video 360", + "logo": "/integration-logos/gcp/Google-Display-And-Video-360.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/marketing_platform/display_video.html" + }, + { + "name": "Google Drive", + "logo": "/integration-logos/gcp/Google-Drive.png", + "url": "/docs/apache-airflow-providers-google/stable/index.html" + }, + { + "name": "Google Kubernetes Engine", + "logo": "/integration-logos/gcp/Kubernetes-Engine.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/kubernetes_engine.html" + }, + { + "name": "Google LevelDB", + "url": "/docs/apache-airflow-providers-google/stable/operators/leveldb/leveldb.html" + }, + { + "name": "Google Looker", + "logo": "/integration-logos/gcp/Cloud-Looker.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/looker.html" + }, + { + "name": "Google Machine Learning Engine", + "logo": "/integration-logos/gcp/AI-Platform.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/mlengine.html" + }, + { + "name": "Google Search Ads 360", + "logo": "/integration-logos/gcp/Google-Search-Ads360.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/marketing_platform/search_ads.html" + }, + { + "name": "Google Spreadsheet", + "logo": "/integration-logos/gcp/Google-Spreadsheet.png", + "url": "/docs/apache-airflow-providers-google/stable/operators/suite/sheets.html" + }, + { + "name": "Google Vertex AI", + "url": "/docs/apache-airflow-providers-google/stable/operators/cloud/vertex_ai.html" + }, + { + "name": "gRPC", + "url": "/docs/apache-airflow-providers-grpc/stable/index.html" + }, + { + "name": "Hadoop Distributed File System (HDFS)", + "logo": "/integration-logos/apache/hadoop.png", + "url": "/docs/apache-airflow-providers-apache-hdfs/stable/operators/hdfs.html" + }, + { + "name": "Hashicorp Vault", + "logo": "/integration-logos/hashicorp/Hashicorp-Vault.png", + "url": "/docs/apache-airflow-providers-hashicorp/stable/index.html" + }, + { + "name": "Hypertext Transfer Protocol (HTTP)", + "logo": "/integration-logos/http/HTTP.png", + "url": "/docs/apache-airflow-providers-http/stable/operators.html" + }, + { + "name": "IBM Cloudant", + "logo": "/integration-logos/cloudant/Cloudant.png", + "url": "/docs/apache-airflow-providers-cloudant/stable/index.html" + }, + { + "name": "Influxdb", + "url": "/docs/apache-airflow-providers-influxdb/stable/index.html" + }, + { + "name": "Internet Message Access Protocol (IMAP)", + "logo": "/integration-logos/imap/IMAP.png", + "url": "/docs/apache-airflow-providers-imap/stable/index.html" + }, + { + "name": "Java Database Connectivity (JDBC)", + "logo": "/integration-logos/jdbc/JDBC.png", + "url": "/docs/apache-airflow-providers-jdbc/stable/operators.html" + }, + { + "name": "Jenkins", + "logo": "/integration-logos/jenkins/Jenkins.png", + "url": "/docs/apache-airflow-providers-jenkins/stable/index.html" + }, + { + "name": "Kubernetes", + "logo": "/integration-logos/kubernetes/Kubernetes.png", + "url": "/docs/apache-airflow-providers-cncf-kubernetes/stable/operators.html" + }, + { + "name": "Microsoft Azure", + "logo": "/integration-logos/azure/Microsoft-Azure.png", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/index.html" + }, + { + "name": "Microsoft Azure Batch", + "logo": "/integration-logos/azure/Microsoft-Azure-Batch.png", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/index.html" + }, + { + "name": "Microsoft Azure Blob Storage", + "logo": "/integration-logos/azure/Blob Storage.svg", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/index.html" + }, + { + "name": "Microsoft Azure Container Instances", + "logo": "/integration-logos/azure/Container Instances.svg", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/index.html" + }, + { + "name": "Microsoft Azure Cosmos DB", + "logo": "/integration-logos/azure/Azure Cosmos DB.svg", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/index.html" + }, + { + "name": "Microsoft Azure Data Explorer", + "logo": "/integration-logos/azure/Microsoft-Azure-Data-Explorer.png", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/index.html" + }, + { + "name": "Microsoft Azure Data Factory", + "logo": "/integration-logos/azure/Azure Data Factory.svg", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/operators/adf_run_pipeline.html" + }, + { + "name": "Microsoft Azure Data Lake Storage", + "logo": "/integration-logos/azure/Data Lake Storage.svg", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/operators/adls.html" + }, + { + "name": "Microsoft Azure Files", + "logo": "/integration-logos/azure/Azure Files.svg", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/index.html" + }, + { + "name": "Microsoft Azure FileShare", + "logo": "/integration-logos/azure/Microsoft-Azure-Fileshare.png", + "url": "/docs/apache-airflow-providers-microsoft-azure/stable/index.html" + }, + { + "name": "Microsoft SQL Server (MSSQL)", + "logo": "/integration-logos/mssql/Microsoft-SQL-Server.png", + "url": "/docs/apache-airflow-providers-microsoft-mssql/stable/operators.html" + }, + { + "name": "MongoDB", + "logo": "/integration-logos/mongo/MongoDB.png", + "url": "/docs/apache-airflow-providers-mongo/stable/index.html" + }, + { + "name": "MySQL", + "logo": "/integration-logos/mysql/MySQL.png", + "url": "/docs/apache-airflow-providers-mysql/stable/operators.html" + }, + { + "name": "Neo4j", + "url": "/docs/apache-airflow-providers-neo4j/stable/operators/neo4j.html" + }, + { + "name": "ODBC", + "logo": "/integration-logos/odbc/ODBC.png", + "url": "/docs/apache-airflow-providers-odbc/stable/index.html" + }, + { + "name": "OpenFaaS", + "logo": "/integration-logos/openfaas/OpenFaaS.png", + "url": "/docs/apache-airflow-providers-openfaas/stable/index.html" + }, + { + "name": "Opsgenie", + "logo": "/integration-logos/opsgenie/Opsgenie.png", + "url": "/docs/apache-airflow-providers-opsgenie/stable/operators/opsgenie_alert.html" + }, + { + "name": "Oracle", + "logo": "/integration-logos/oracle/Oracle.png", + "url": "/docs/apache-airflow-providers-oracle/stable/index.html" + }, + { + "name": "Pagerduty", + "logo": "/integration-logos/pagerduty/PagerDuty.png", + "url": "/docs/apache-airflow-providers-pagerduty/stable/index.html" + }, + { + "name": "Papermill", + "logo": "/integration-logos/papermill/Papermill.png", + "url": "/docs/apache-airflow-providers-papermill/stable/operators.html" + }, + { + "name": "Plexus", + "logo": "/integration-logos/plexus/Plexus.png", + "url": "/docs/apache-airflow-providers-plexus/stable/index.html" + }, + { + "name": "PostgreSQL", + "logo": "/integration-logos/postgres/Postgres.png", + "url": "/docs/apache-airflow-providers-postgres/stable/operators.html" + }, + { + "name": "Presto", + "logo": "/integration-logos/presto/PrestoDB.png", + "url": "/docs/apache-airflow-providers-presto/stable/index.html" + }, + { + "name": "Qubole", + "logo": "/integration-logos/qubole/Qubole.png", + "url": "/docs/apache-airflow-providers-qubole/stable/operators/qubole.html" + }, + { + "name": "Redis", + "logo": "/integration-logos/redis/Redis.png", + "url": "/docs/apache-airflow-providers-redis/stable/index.html" + }, + { + "name": "Salesforce", + "logo": "/integration-logos/salesforce/Salesforce.png", + "url": "/docs/apache-airflow-providers-salesforce/stable/operators/salesforce_apex_rest.html" + }, + { + "name": "Samba", + "logo": "/integration-logos/samba/Samba.png", + "url": "/docs/apache-airflow-providers-samba/stable/index.html" + }, + { + "name": "Secure Shell (SSH)", + "logo": "/integration-logos/ssh/SSH.png", + "url": "/docs/apache-airflow-providers-ssh/stable/index.html" + }, + { + "name": "Segment", + "logo": "/integration-logos/segment/Segment.png", + "url": "/docs/apache-airflow-providers-segment/stable/index.html" + }, + { + "name": "Singularity", + "logo": "/integration-logos/singularity/Singularity.png", + "url": "/docs/apache-airflow-providers-singularity/stable/index.html" + }, + { + "name": "Slack", + "logo": "/integration-logos/slack/Slack.png", + "url": "/docs/apache-airflow-providers-slack/stable/operators/slack_operator_howto_guide.html" + }, + { + "name": "Snowflake", + "logo": "/integration-logos/snowflake/Snowflake.png", + "url": "/docs/apache-airflow-providers-snowflake/stable/operators/snowflake.html" + }, + { + "name": "Spark on Kubernetes", + "logo": "/integration-logos/kubernetes/Spark-On-Kubernetes.png", + "url": "/docs/apache-airflow-providers-cncf-kubernetes/stable/index.html" + }, + { + "name": "SQLite", + "logo": "/integration-logos/sqlite/SQLite.png", + "url": "/docs/apache-airflow-providers-sqlite/stable/operators.html" + }, + { + "name": "SSH File Transfer Protocol (SFTP)", + "logo": "/integration-logos/sftp/SFTP.png", + "url": "/docs/apache-airflow-providers-sftp/stable/index.html" + }, + { + "name": "Tableau", + "logo": "/integration-logos/tableau/tableau.png", + "url": "/docs/apache-airflow-providers-tableau/stable/operators.html" + }, + { + "name": "Telegram", + "logo": "/integration-logos/telegram/Telegram.png", + "url": "/docs/apache-airflow-providers-telegram/stable/operators.html" + }, + { + "name": "Trino", + "logo": "/integration-logos/trino/trino-og.png", + "url": "/docs/apache-airflow-providers-trino/stable/index.html" + }, + { + "name": "Vertica", + "logo": "/integration-logos/vertica/Vertica.png", + "url": "/docs/apache-airflow-providers-vertica/stable/index.html" + }, + { + "name": "WebHDFS", + "logo": "/integration-logos/apache/hadoop.png", + "url": "/docs/apache-airflow-providers-apache-hdfs/stable/operators/webhdfs.html" + }, + { + "name": "Windows PowerShell Remoting Protocol", + "url": "/docs/apache-airflow-providers-microsoft-psrp/stable/index.html" + }, + { + "name": "Windows Remote Management (WinRM)", + "logo": "/integration-logos/winrm/WinRM.png", + "url": "/docs/apache-airflow-providers-microsoft-winrm/stable/operators.html" + }, + { + "name": "Yandex.Cloud", + "logo": "/integration-logos/yandex/Yandex-Cloud.png", + "url": "/docs/apache-airflow-providers-yandex/stable/index.html" + }, + { + "name": "Yandex.Cloud Dataproc", + "logo": "/integration-logos/yandex/Yandex-Cloud.png", + "url": "/docs/apache-airflow-providers-yandex/stable/operators.html" + }, + { + "name": "Zendesk", + "logo": "/integration-logos/zendesk/Zendesk.png", + "url": "/docs/apache-airflow-providers-zendesk/stable/index.html" + } +] diff --git a/landing-pages/site/layouts/partials/footer.html b/landing-pages/site/layouts/partials/footer.html index 7ba6e136905..3ac54dc3e17 100644 --- a/landing-pages/site/layouts/partials/footer.html +++ b/landing-pages/site/layouts/partials/footer.html @@ -63,3 +63,8 @@ + + + diff --git a/landing-pages/src/index.js b/landing-pages/src/index.js index 3b6c772fc76..01c5b60c597 100644 --- a/landing-pages/src/index.js +++ b/landing-pages/src/index.js @@ -27,6 +27,7 @@ import "./js/progressTracking"; import "./js/rating"; import "./js/makeTableResponsive"; import "./js/versionSelector"; +import "./js/scrollToTop"; if (document.querySelector("#search")) { import(/* webpackChunkName: "search" */ "./js/searchBlogPosts"); diff --git a/landing-pages/src/js/scrollToTop.js b/landing-pages/src/js/scrollToTop.js new file mode 100644 index 00000000000..2bd6fdefa64 --- /dev/null +++ b/landing-pages/src/js/scrollToTop.js @@ -0,0 +1,53 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { documentReady } from "./utils"; + +function initScrollToTop() { + const scrollTopBtn = document.getElementById("scroll-to-top"); + + if (!scrollTopBtn) return; + + // Show/hide button based on scroll position + const toggleScrollTopBtn = () => { + const scrollThreshold = 300; // Show after scrolling 300px + + if (window.scrollY > scrollThreshold) { + scrollTopBtn.classList.add("visible"); + } else { + scrollTopBtn.classList.remove("visible"); + } + }; + + // Scroll to top function + const scrollToTop = () => { + window.scrollTo({top: 0, behavior: "smooth"}); + }; + + // Event listeners + window.addEventListener("scroll", toggleScrollTopBtn); + scrollTopBtn.addEventListener("click", scrollToTop); + + // Check initial scroll position + toggleScrollTopBtn(); +} + +documentReady(() => { + initScrollToTop(); +}); diff --git a/landing-pages/yarn.lock b/landing-pages/yarn.lock index 0d832e8ee94..094ddc2d112 100644 --- a/landing-pages/yarn.lock +++ b/landing-pages/yarn.lock @@ -16,7 +16,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz" integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.26.0", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": +"@babel/core@^7.26.0": version "7.28.5" resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz" integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== @@ -1256,7 +1256,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^9.18.0", "@eslint/js@9.39.1": +"@eslint/js@9.39.1", "@eslint/js@^9.18.0": version "9.39.1" resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz" integrity sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw== @@ -1457,7 +1457,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1470,11 +1470,71 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== + "@parcel/watcher-darwin-arm64@2.5.1": version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz" integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== + +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== + +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== + +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== + +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== + +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== + +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== + +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== + +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== + +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== + +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== + "@parcel/watcher@^2.4.1": version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz" @@ -1560,7 +1620,7 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/express-serve-static-core@*": +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": version "5.1.0" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz" integrity sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA== @@ -1580,16 +1640,6 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express-serve-static-core@^5.0.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz" - integrity sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - "@types/express@*": version "5.0.5" resolved "https://registry.npmjs.org/@types/express/-/express-5.0.5.tgz" @@ -1599,7 +1649,7 @@ "@types/express-serve-static-core" "^5.0.0" "@types/serve-static" "^1" -"@types/express@^4.17.13", "@types/express@^4.17.21": +"@types/express@^4.17.21": version "4.17.25" resolved "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz" integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== @@ -1756,7 +1806,7 @@ dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -1857,7 +1907,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -1927,7 +1977,7 @@ acorn-walk@^8.3.4: dependencies: acorn "^8.11.0" -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.11.0, acorn@^8.12.1, acorn@^8.14.0, acorn@^8.15.0: +acorn@^8.11.0, acorn@^8.12.1, acorn@^8.15.0: version "8.15.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -1951,7 +2001,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1961,17 +2011,7 @@ ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@^8.0.1: +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -2283,7 +2323,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.26.0, browserslist@^4.26.3, browserslist@^4.27.0, "browserslist@>= 4.21.0": +browserslist@^4.0.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.26.0, browserslist@^4.26.3, browserslist@^4.27.0: version "4.27.0" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz" integrity sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw== @@ -2462,16 +2502,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-support@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" @@ -2805,6 +2845,13 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -2819,13 +2866,6 @@ debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.1, debug@^4.4.3: dependencies: ms "^2.1.3" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -2880,16 +2920,16 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + dependency-graph@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz" @@ -3220,14 +3260,6 @@ eslint-plugin-import@^2.32.0: string.prototype.trimend "^1.0.9" tsconfig-paths "^3.15.0" -eslint-scope@^8.4.0: - version "8.4.0" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" - integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" @@ -3236,6 +3268,14 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" @@ -3246,7 +3286,7 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.39.1: +eslint@^9.39.1: version "9.39.1" resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz" integrity sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g== @@ -3479,7 +3519,7 @@ file-is-binary@^1.0.0: is-binary-buffer "^1.0.0" isobject "^3.0.0" -file-loader@*, file-loader@^6.2.0: +file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -3934,16 +3974,6 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -3955,6 +3985,16 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.5.1: version "0.5.10" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz" @@ -4063,7 +4103,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4092,16 +4132,16 @@ interpret@^3.1.1: resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -ipaddr.js@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" - integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" @@ -4449,7 +4489,7 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jiti@*, jiti@^2.5.1, jiti@>=1.21.0: +jiti@^2.5.1: version "2.6.1" resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz" integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== @@ -4727,11 +4767,6 @@ mathml-tag-names@^2.1.3: resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -mdn-data@^2.21.0: - version "2.24.0" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.24.0.tgz" - integrity sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA== - mdn-data@2.0.28: version "2.0.28" resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz" @@ -4742,6 +4777,11 @@ mdn-data@2.12.2: resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz" integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== +mdn-data@^2.21.0: + version "2.24.0" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.24.0.tgz" + integrity sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" @@ -4797,16 +4837,16 @@ micromatch@^4.0.2, micromatch@^4.0.5, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" -mime-db@^1.54.0, "mime-db@>= 1.43.0 < 2": - version "1.54.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" @@ -4839,14 +4879,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@*: - version "10.1.1" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz" - integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== - dependencies: - "@isaacs/brace-expansion" "^5.0.0" - -minimatch@^10.0.3: +minimatch@*, minimatch@^10.0.3: version "10.1.1" resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz" integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== @@ -4878,16 +4911,16 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -ms@^2.1.1, ms@^2.1.3, ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" @@ -4901,21 +4934,26 @@ nanoid@^3.3.11: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +natives@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" @@ -5049,7 +5087,7 @@ omggif@^1.0.10: resolved "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz" integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== -on-finished@^2.4.1, on-finished@2.4.1: +on-finished@2.4.1, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -5316,7 +5354,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -"picomatch@^3 || ^4", picomatch@^4.0.3: +picomatch@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== @@ -5326,12 +5364,7 @@ pidtree@^0.3.0: resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^2.3.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -5982,7 +6015,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.3.3, postcss@^8.4, postcss@^8.4.29, postcss@^8.4.31, postcss@^8.4.32, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.40, postcss@^8.4.6, postcss@^8.5.1, postcss@^8.5.6, postcss@>=8.0.9: +postcss@^8.4.33, postcss@^8.4.40, postcss@^8.5.1, postcss@^8.5.6: version "8.5.6" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -6268,7 +6301,7 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6307,7 +6340,7 @@ sass-loader@^16.0.5: dependencies: neo-async "^2.6.2" -sass@^1.3.0, sass@^1.93.2: +sass@^1.93.2: version "1.93.2" resolved "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz" integrity sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg== @@ -6355,12 +6388,7 @@ selfsigned@^2.4.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver@^5.5.0: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -6370,21 +6398,11 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.4: +semver@^7.5.4, semver@^7.6.2: version "7.7.3" resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== -semver@^7.6.2: - version "7.7.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" - integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== - -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - send@0.19.0: version "0.19.0" resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" @@ -6591,7 +6609,7 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" -source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -6663,16 +6681,16 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + stop-iteration-iterator@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" @@ -6681,20 +6699,6 @@ stop-iteration-iterator@^1.1.0: es-errors "^1.3.0" internal-slot "^1.1.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -6764,6 +6768,20 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -6866,7 +6884,7 @@ stylelint-scss@^6.12.1, stylelint-scss@^6.4.0: postcss-selector-parser "^7.1.0" postcss-value-parser "^4.2.0" -stylelint@^16.0.2, stylelint@^16.1.0, stylelint@^16.23.0, stylelint@^16.24.0, stylelint@^16.3.1, stylelint@^16.6.1: +stylelint@^16.24.0: version "16.25.0" resolved "https://registry.npmjs.org/stylelint/-/stylelint-16.25.0.tgz" integrity sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ== @@ -7063,7 +7081,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2, tslib@^2.0.0, tslib@2: +tslib@^2.0.0: version "2.8.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -7171,7 +7189,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -7243,7 +7261,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webpack-cli@^6.0.1, webpack-cli@6.x.x: +webpack-cli@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz" integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== @@ -7322,7 +7340,7 @@ webpack-sources@^3.3.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz" integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== -"webpack@^4.0.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.101.3, webpack@^5.27.0, webpack@^5.82.0, "webpack@>=4.0.0 <6.0.0", webpack@>=5, webpack@>=5.0.0: +webpack@^5.101.3: version "5.102.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz" integrity sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ== @@ -7353,7 +7371,7 @@ webpack-sources@^3.3.3: watchpack "^2.4.4" webpack-sources "^3.3.3" -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== From f88b2ac3c143862c0c3b4b3768afe2ef182c149e Mon Sep 17 00:00:00 2001 From: Abhijay Singh Date: Tue, 25 Nov 2025 20:09:55 +0530 Subject: [PATCH 2/2] add Scroll To Top Button --- .../site/assets/scss/_base-layout.scss | 51 +++- landing-pages/site/assets/scss/_footer.scss | 280 +++++++++--------- .../site/assets/scss/_scroll-to-top.scss | 107 +------ .../site/assets/scss/main-custom.scss | 2 +- .../site/layouts/_default/baseof.html | 7 +- landing-pages/site/layouts/blog/baseof.html | 8 +- .../site/layouts/community/baseof.html | 7 +- landing-pages/site/layouts/docs/baseof.html | 7 +- .../site/layouts/install/baseof.html | 7 +- .../site/layouts/meetups/baseof.html | 7 +- .../partials/buttons/button-with-arrow.html | 24 ++ .../site/layouts/partials/footer.html | 4 - .../site/layouts/partials/scroll-to-top.html | 22 ++ .../site/layouts/partials/suggest-change.html | 2 - .../site/layouts/privacy-notice/baseof.html | 7 +- .../site/layouts/roadmap/baseof.html | 7 +- .../site/layouts/taxonomy/baseof.html | 7 +- .../site/layouts/use-cases/baseof.html | 7 +- landing-pages/src/js/scrollToTop.js | 49 +-- 19 files changed, 331 insertions(+), 281 deletions(-) create mode 100644 landing-pages/site/layouts/partials/buttons/button-with-arrow.html create mode 100644 landing-pages/site/layouts/partials/scroll-to-top.html diff --git a/landing-pages/site/assets/scss/_base-layout.scss b/landing-pages/site/assets/scss/_base-layout.scss index 02639e9532e..63828271f2e 100644 --- a/landing-pages/site/assets/scss/_base-layout.scss +++ b/landing-pages/site/assets/scss/_base-layout.scss @@ -23,16 +23,37 @@ // padding: 123px 0 40px; padding: 163px 0 40px; // TEMP - accommodate Airflow Summit banner (123 + 40) - &--button { + &--scrollButton { display: flex; position: sticky; - width: fit-content; + width: 100%; + margin-left: auto; + margin-right: 40px; + bottom: 40px; + z-index: 1; + } + + &--suggestButton { + display: flex; + position: sticky; + width: 100%; margin-left: auto; margin-right: 40px; bottom: 40px; justify-content: flex-end; z-index: 1; } + + &--button { + display: flex; + position: sticky; + width: 100%; + margin-left: auto; + margin-right: 40px; + bottom: 40px; + justify-content: space-between; + z-index: 1; + } } @media (max-width: $tablet) { @@ -42,6 +63,32 @@ &--button { display: none; } + + &--suggestButton{ + display: none; + } + + &--scrollButton button span { + display: none; + } + + &--scrollButton button { + width: 55px; + height: 55px; // Slightly increased button height + display: flex; + align-items: center; + justify-content: center; + padding: 0; + } + + &--scrollButton button svg { + display: block; + margin: 0 auto; + position: relative; + left: 56%; // Move just a little bit more to the right + transform: translateX(-50%); + } + } } diff --git a/landing-pages/site/assets/scss/_footer.scss b/landing-pages/site/assets/scss/_footer.scss index 9d56a37f1e2..6c7d8ea61ca 100644 --- a/landing-pages/site/assets/scss/_footer.scss +++ b/landing-pages/site/assets/scss/_footer.scss @@ -16,143 +16,143 @@ * specific language governing permissions and limitations * under the License. */ -@import "colors"; -@import "media"; - -footer { - min-height: unset; - - .footer-section { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - - span { - @extend .bodytext__medium--white; - } - - &__media-section { - padding: 60px 60px 30px; - background-color: map-get($colors, greyish-brown); - - &--link { - margin-right: 30px; - } - - &--button-with-text { - display: flex; - align-items: center; - } - - &--text { - margin-right: 20px; - } - } - - &__policies-section { - padding: 30px 60px; - background-color: map-get($colors, slate-grey); - font-size: 12px; - flex-direction: column !important; - - span { - font-size: 12px; - } - - &--policies { - display: flex; - } - - &--policy-item { - &::before { - content: "\00a0\00a0"; - } - - &::after { - content: "\00a0\00a0|"; - color: white; - } - - &:last-of-type { - &::after { - content: "\00a0\00a0|\00a0\00a0"; - } - } - } - - &--disclaimer { - display: block; - max-width: 600px; - color: map-get($colors, very-light-pink) !important; - margin-top: 16px; - - @media (min-width: $fullhd) { - max-width: 800px; - } - } - } - } - - .dropdown-toggle { - &::after { - color: white; - vertical-align: middle; - } - } -} - -@media (max-width: $tablet) { - footer { - .footer-section { - flex-direction: column-reverse; - align-items: flex-start; - - span { - font-size: 14px !important; - line-height: 1.57 !important; - } - - &__media-section { - padding: 30px 40px; - - svg { - height: 31px; - width: auto; - } - - &--link { - margin-right: 20px; - } - - &--button-with-text { - flex-direction: column; - align-items: flex-start; - margin-bottom: 47px; - } - - &--text { - margin-right: 0; - margin-bottom: 16px; - } - } - - &__policies-section { - padding: 30px 40px; - - &--policies { - flex-direction: column; - } - - &--policy-item, &--policy-item:last-of-type { - &::before, &::after { - content: ""; - } - } - - &--language-toggle { - margin: 17px 0 35px; - } - } - } - } -} + @import "colors"; + @import "media"; + + footer { + min-height: unset; + + .footer-section { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + + span { + @extend .bodytext__medium--white; + } + + &__media-section { + padding: 60px 60px 30px; + background-color: map-get($colors, greyish-brown); + + &--link { + margin-right: 30px; + } + + &--button-with-text { + display: flex; + align-items: center; + } + + &--text { + margin-right: 20px; + } + } + + &__policies-section { + padding: 30px 60px; + background-color: map-get($colors, slate-grey); + font-size: 12px; + flex-direction: column !important; + + span { + font-size: 12px; + } + + &--policies { + display: flex; + } + + &--policy-item { + &::before { + content: "\00a0\00a0"; + } + + &::after { + content: "\00a0\00a0|"; + color: white; + } + + &:last-of-type { + &::after { + content: "\00a0\00a0|\00a0\00a0"; + } + } + } + + &--disclaimer { + display: block; + max-width: 600px; + color: map-get($colors, very-light-pink) !important; + margin-top: 16px; + + @media (min-width: $fullhd) { + max-width: 800px; + } + } + } + } + + .dropdown-toggle { + &::after { + color: white; + vertical-align: middle; + } + } + } + + @media (max-width: $tablet) { + footer { + .footer-section { + flex-direction: column-reverse; + align-items: flex-start; + + span { + font-size: 14px !important; + line-height: 1.57 !important; + } + + &__media-section { + padding: 30px 40px; + + svg { + height: 31px; + width: auto; + } + + &--link { + margin-right: 20px; + } + + &--button-with-text { + flex-direction: column; + align-items: flex-start; + margin-bottom: 47px; + } + + &--text { + margin-right: 0; + margin-bottom: 16px; + } + } + + &__policies-section { + padding: 30px 40px; + + &--policies { + flex-direction: column; + } + + &--policy-item, &--policy-item:last-of-type { + &::before, &::after { + content: ""; + } + } + + &--language-toggle { + margin: 17px 0 35px; + } + } + } + } + } \ No newline at end of file diff --git a/landing-pages/site/assets/scss/_scroll-to-top.scss b/landing-pages/site/assets/scss/_scroll-to-top.scss index 1764af0d08a..6e4508f3e68 100644 --- a/landing-pages/site/assets/scss/_scroll-to-top.scss +++ b/landing-pages/site/assets/scss/_scroll-to-top.scss @@ -17,103 +17,16 @@ * under the License. */ -.scroll-to-top { - position: fixed; - bottom: 30px; - left: 20px; - width: 50px; - height: 50px; - background: linear-gradient(135deg, #007bff, #0056b3); - color: white; - border: none; - border-radius: 50%; - cursor: pointer; - opacity: 0; - visibility: hidden; - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); - z-index: 1000; +.scroll-to-top--button { display: flex; - align-items: center; - justify-content: center; - box-shadow: 0 4px 20px rgba(0, 123, 255, 0.4); - - &:hover { - transform: translateY(-4px) scale(1.1); - box-shadow: 0 8px 30px rgba(0, 123, 255, 0.6); - background: linear-gradient(135deg, #0056b3, #004085); - } - - &:active { - transform: translateY(-2px) scale(1.05); - transition: all 0.1s ease; - } - - &:focus { - outline: 2px solid #007bff; - outline-offset: 3px; - box-shadow: 0 0 0 5px rgba(0, 123, 255, 0.2); - } - - .scroll-to-top__arrow { - display: block; - width: 0; - height: 0; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 8px solid white; - margin: 0 auto; - transition: transform 0.3s ease; - } - - &:hover .scroll-to-top__arrow { - transform: translateY(-1px); - } - - &.visible { - opacity: 1; - visibility: visible; - animation: fadeInUp 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94); - } -} - -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -// Responsive design -@media (max-width: 768px) { - .scroll-to-top { - width: 45px; - height: 45px; - bottom: 15px; - right: 15px; - - .scroll-to-top__arrow { - border-left-width: 5px; - border-right-width: 5px; - border-bottom-width: 7px; - } - } -} - -@media (max-width: 480px) { - .scroll-to-top { - width: 40px; - height: 40px; - bottom: 10px; - right: 10px; - - .scroll-to-top__arrow { - border-left-width: 4px; - border-right-width: 4px; - border-bottom-width: 6px; - } + position: sticky; + bottom : 40px; + width: fit-content; + margin-left: 40px; + justify-content: flex-start; + z-index: 2; + + @media (max-width: $tablet) { + display: none; } } diff --git a/landing-pages/site/assets/scss/main-custom.scss b/landing-pages/site/assets/scss/main-custom.scss index 9ffbd322149..cd7079b3166 100644 --- a/landing-pages/site/assets/scss/main-custom.scss +++ b/landing-pages/site/assets/scss/main-custom.scss @@ -48,6 +48,7 @@ @import "search"; @import "rating"; @import "rst-content"; +@import "scroll-to-top"; @import "content-drawer"; @import "dropdown"; @import "highlights"; @@ -57,4 +58,3 @@ @import "survey"; @import "testimonial"; @import "suggest-change"; -@import "scroll-to-top"; diff --git a/landing-pages/site/layouts/_default/baseof.html b/landing-pages/site/layouts/_default/baseof.html index 8858e75f7c0..1319d8d3c4c 100644 --- a/landing-pages/site/layouts/_default/baseof.html +++ b/landing-pages/site/layouts/_default/baseof.html @@ -32,7 +32,12 @@
{{ block "main" . }}{{ end }}
- {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} diff --git a/landing-pages/site/layouts/blog/baseof.html b/landing-pages/site/layouts/blog/baseof.html index 84668775996..97a330bb7f3 100644 --- a/landing-pages/site/layouts/blog/baseof.html +++ b/landing-pages/site/layouts/blog/baseof.html @@ -31,8 +31,12 @@
{{ block "main" . }}{{ end }}
- {{ partial "suggest-change" . }} - +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} {{ partial "scripts.html" . }} diff --git a/landing-pages/site/layouts/community/baseof.html b/landing-pages/site/layouts/community/baseof.html index 6814d9bd5a3..a9605b2ac32 100644 --- a/landing-pages/site/layouts/community/baseof.html +++ b/landing-pages/site/layouts/community/baseof.html @@ -31,7 +31,12 @@
{{ block "main" . }}{{ end }}
- {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} diff --git a/landing-pages/site/layouts/docs/baseof.html b/landing-pages/site/layouts/docs/baseof.html index 5742a85d168..d07a77a9bc9 100644 --- a/landing-pages/site/layouts/docs/baseof.html +++ b/landing-pages/site/layouts/docs/baseof.html @@ -32,7 +32,12 @@ {{ block "main" . }}{{ end }} - {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} {{ partial "scripts.html" . }} diff --git a/landing-pages/site/layouts/install/baseof.html b/landing-pages/site/layouts/install/baseof.html index 7f46604fb7a..019521d8cf4 100644 --- a/landing-pages/site/layouts/install/baseof.html +++ b/landing-pages/site/layouts/install/baseof.html @@ -31,7 +31,12 @@
{{ block "main" . }}{{ end }}
- {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} diff --git a/landing-pages/site/layouts/meetups/baseof.html b/landing-pages/site/layouts/meetups/baseof.html index 84668775996..621f0e0910b 100644 --- a/landing-pages/site/layouts/meetups/baseof.html +++ b/landing-pages/site/layouts/meetups/baseof.html @@ -31,7 +31,12 @@
{{ block "main" . }}{{ end }}
- {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} diff --git a/landing-pages/site/layouts/partials/buttons/button-with-arrow.html b/landing-pages/site/layouts/partials/buttons/button-with-arrow.html new file mode 100644 index 00000000000..566865e4605 --- /dev/null +++ b/landing-pages/site/layouts/partials/buttons/button-with-arrow.html @@ -0,0 +1,24 @@ +{{/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */}} + diff --git a/landing-pages/site/layouts/partials/footer.html b/landing-pages/site/layouts/partials/footer.html index 3ac54dc3e17..3cf62ea44ba 100644 --- a/landing-pages/site/layouts/partials/footer.html +++ b/landing-pages/site/layouts/partials/footer.html @@ -64,7 +64,3 @@ - - diff --git a/landing-pages/site/layouts/partials/scroll-to-top.html b/landing-pages/site/layouts/partials/scroll-to-top.html new file mode 100644 index 00000000000..3f4237f94c5 --- /dev/null +++ b/landing-pages/site/layouts/partials/scroll-to-top.html @@ -0,0 +1,22 @@ +{{/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */}} + + {{ partial "buttons/button-with-arrow" (dict "text" "Scroll to top" "class" "button-fixed" "id" "scroll-to-top-btn") }} + + \ No newline at end of file diff --git a/landing-pages/site/layouts/partials/suggest-change.html b/landing-pages/site/layouts/partials/suggest-change.html index 514b66cacc7..88c68a0cff4 100644 --- a/landing-pages/site/layouts/partials/suggest-change.html +++ b/landing-pages/site/layouts/partials/suggest-change.html @@ -17,9 +17,7 @@ under the License. */}} -
{{ $url := printf "https://github.com/apache/airflow-site/edit/main/landing-pages/site/content/%s/%s" $.Site.Language.Lang .Path }} {{ partial "buttons/button-with-icon" (dict "text" "Suggest a change on this page" "class" "button-fixed") }} -
diff --git a/landing-pages/site/layouts/privacy-notice/baseof.html b/landing-pages/site/layouts/privacy-notice/baseof.html index 5742a85d168..d07a77a9bc9 100644 --- a/landing-pages/site/layouts/privacy-notice/baseof.html +++ b/landing-pages/site/layouts/privacy-notice/baseof.html @@ -32,7 +32,12 @@ {{ block "main" . }}{{ end }} - {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} {{ partial "scripts.html" . }} diff --git a/landing-pages/site/layouts/roadmap/baseof.html b/landing-pages/site/layouts/roadmap/baseof.html index ca7dcd7b2fb..9496583fffc 100644 --- a/landing-pages/site/layouts/roadmap/baseof.html +++ b/landing-pages/site/layouts/roadmap/baseof.html @@ -65,7 +65,12 @@ {{ block "main" . }}{{ end }} - {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} {{ partial "scripts.html" . }} diff --git a/landing-pages/site/layouts/taxonomy/baseof.html b/landing-pages/site/layouts/taxonomy/baseof.html index 84668775996..621f0e0910b 100644 --- a/landing-pages/site/layouts/taxonomy/baseof.html +++ b/landing-pages/site/layouts/taxonomy/baseof.html @@ -31,7 +31,12 @@
{{ block "main" . }}{{ end }}
- {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} diff --git a/landing-pages/site/layouts/use-cases/baseof.html b/landing-pages/site/layouts/use-cases/baseof.html index 84668775996..621f0e0910b 100644 --- a/landing-pages/site/layouts/use-cases/baseof.html +++ b/landing-pages/site/layouts/use-cases/baseof.html @@ -31,7 +31,12 @@
{{ block "main" . }}{{ end }}
- {{ partial "suggest-change" . }} +
+ {{ partial "suggest-change" . }} +
+
+ {{ partial "scroll-to-top" . }} +
{{ partialCached "footer.html" . }} diff --git a/landing-pages/src/js/scrollToTop.js b/landing-pages/src/js/scrollToTop.js index 2bd6fdefa64..4be968fd389 100644 --- a/landing-pages/src/js/scrollToTop.js +++ b/landing-pages/src/js/scrollToTop.js @@ -17,37 +17,38 @@ * under the License. */ -import { documentReady } from "./utils"; +const SCROLL_THRESHOLD = 100; // Show button after scrolling 100px -function initScrollToTop() { - const scrollTopBtn = document.getElementById("scroll-to-top"); +document.addEventListener("DOMContentLoaded", function() { + const scrollToTopBtn = document.getElementById("scroll-to-top-btn"); - if (!scrollTopBtn) return; + if (!scrollToTopBtn) { + return; // Button not found on this page + } - // Show/hide button based on scroll position - const toggleScrollTopBtn = () => { - const scrollThreshold = 300; // Show after scrolling 300px - - if (window.scrollY > scrollThreshold) { - scrollTopBtn.classList.add("visible"); + // Function to toggle button visibility + function toggleScrollToTopBtn() { + if (window.scrollY > SCROLL_THRESHOLD) { + scrollToTopBtn.style.display = "flex"; } else { - scrollTopBtn.classList.remove("visible"); + scrollToTopBtn.style.display = "none"; } - }; + } - // Scroll to top function - const scrollToTop = () => { - window.scrollTo({top: 0, behavior: "smooth"}); - }; + // Function to scroll to top smoothly + function scrollToTop() { + window.scrollTo({ + top: 0, + behavior: "smooth" + }); + } - // Event listeners - window.addEventListener("scroll", toggleScrollTopBtn); - scrollTopBtn.addEventListener("click", scrollToTop); + // Add scroll event listener + window.addEventListener("scroll", toggleScrollToTopBtn); - // Check initial scroll position - toggleScrollTopBtn(); -} + // Add click event listener + scrollToTopBtn.addEventListener("click", scrollToTop); -documentReady(() => { - initScrollToTop(); + // Initialize button visibility on load + toggleScrollToTopBtn(); });