Rework CI to handle combined website and docs (#1568)
## Description This reworks CI now that we have merged docs and website into a single deployment. ## Type of change <!--- Please check the type of change your PR introduces: ---> - [ ] 🌻 Feature - [ ] 🐛 Bugfix - [ ] 🗺️ Documentation - [ ] 🤖 Test - [x] 💻 CI/Deployment - [ ] 🐹 Trivial/Minor ## Issue(s) <!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. --> * Fixes https://github.com/alcionai/corso/issues/1551 ## Test Plan <!-- How will this be tested prior to merging.--> - [x] 💪 Manual - [ ] ⚡ Unit test - [ ] 💚 E2E
12
.github/dependabot.yml
vendored
@ -24,18 +24,6 @@ updates:
|
|||||||
open-pull-requests-limit: 50
|
open-pull-requests-limit: 50
|
||||||
rebase-strategy: "disabled"
|
rebase-strategy: "disabled"
|
||||||
|
|
||||||
# Maintain dependencies for npm - docs
|
|
||||||
- package-ecosystem: "npm"
|
|
||||||
directory: "docs/"
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
reviewers:
|
|
||||||
- "alcionai/corso-maintainers"
|
|
||||||
- "ntolia"
|
|
||||||
- "gmatev"
|
|
||||||
open-pull-requests-limit: 50
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
|
|
||||||
# Maintain dependencies for go - src
|
# Maintain dependencies for go - src
|
||||||
- package-ecosystem: "gomod"
|
- package-ecosystem: "gomod"
|
||||||
directory: "src/"
|
directory: "src/"
|
||||||
|
|||||||
15
.github/workflows/_filechange_checker.yml
vendored
@ -6,9 +6,6 @@ on:
|
|||||||
srcfileschanged:
|
srcfileschanged:
|
||||||
description: "'true' if src/** or .github/workflows/** files have changed in the branch"
|
description: "'true' if src/** or .github/workflows/** files have changed in the branch"
|
||||||
value: ${{ jobs.file-change-check.outputs.srcfileschanged }}
|
value: ${{ jobs.file-change-check.outputs.srcfileschanged }}
|
||||||
docfileschanged:
|
|
||||||
description: "'true' if docs/** or src/** or .github/workflows/** files have changed in the branch"
|
|
||||||
value: ${{ jobs.file-change-check.outputs.docfileschanged }}
|
|
||||||
websitefileschanged:
|
websitefileschanged:
|
||||||
description: "'true' if websites/** or .github/workflows/** files have changed in the branch"
|
description: "'true' if websites/** or .github/workflows/** files have changed in the branch"
|
||||||
value: ${{ jobs.file-change-check.outputs.websitefileschanged }}
|
value: ${{ jobs.file-change-check.outputs.websitefileschanged }}
|
||||||
@ -21,7 +18,6 @@ jobs:
|
|||||||
pull-requests: read
|
pull-requests: read
|
||||||
outputs:
|
outputs:
|
||||||
srcfileschanged: ${{ steps.srcchecker.outputs.srcfileschanged }}
|
srcfileschanged: ${{ steps.srcchecker.outputs.srcfileschanged }}
|
||||||
docfileschanged: ${{ steps.docchecker.outputs.docfileschanged }}
|
|
||||||
websitefileschanged: ${{ steps.websitechecker.outputs.websitefileschanged }}
|
websitefileschanged: ${{ steps.websitechecker.outputs.websitefileschanged }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
@ -35,8 +31,6 @@ jobs:
|
|||||||
filters: |
|
filters: |
|
||||||
src:
|
src:
|
||||||
- 'src/**'
|
- 'src/**'
|
||||||
docs:
|
|
||||||
- 'docs/**'
|
|
||||||
website:
|
website:
|
||||||
- 'website/**'
|
- 'website/**'
|
||||||
actions:
|
actions:
|
||||||
@ -50,16 +44,9 @@ jobs:
|
|||||||
echo "src or workflow file changes occurred"
|
echo "src or workflow file changes occurred"
|
||||||
echo ::set-output name=srcfileschanged::true
|
echo ::set-output name=srcfileschanged::true
|
||||||
|
|
||||||
- name: Check dorny for changes in docs related filepaths
|
|
||||||
id: docchecker
|
|
||||||
if: steps.dornycheck.outputs.src == 'true' || steps.dornycheck.outputs.docs == 'true' || steps.dornycheck.outputs.actions == 'true'
|
|
||||||
run: |
|
|
||||||
echo "docs, src or workflow file changes occurred"
|
|
||||||
echo ::set-output name=docfileschanged::true
|
|
||||||
|
|
||||||
- name: Check dorny for changes in website related filepaths
|
- name: Check dorny for changes in website related filepaths
|
||||||
id: websitechecker
|
id: websitechecker
|
||||||
if: steps.dornycheck.outputs.website == 'true' || steps.dornycheck.outputs.actions == 'true'
|
if: steps.dornycheck.outputs.src == 'true' || steps.dornycheck.outputs.website == 'true' || steps.dornycheck.outputs.actions == 'true'
|
||||||
run: |
|
run: |
|
||||||
echo "website or workflow file changes occurred"
|
echo "website or workflow file changes occurred"
|
||||||
echo ::set-output name=websitefileschanged::true
|
echo ::set-output name=websitefileschanged::true
|
||||||
78
.github/workflows/ci.yml
vendored
@ -44,7 +44,7 @@ jobs:
|
|||||||
# the results will cascade onto both testing and linting.
|
# the results will cascade onto both testing and linting.
|
||||||
- name: Setup Golang with cache
|
- name: Setup Golang with cache
|
||||||
uses: ./.github/actions/go-setup-cache
|
uses: ./.github/actions/go-setup-cache
|
||||||
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.docfileschanged == 'true'
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.websitefileschanged == 'true'
|
||||||
with:
|
with:
|
||||||
go-version-file: src/go.mod
|
go-version-file: src/go.mod
|
||||||
|
|
||||||
@ -54,6 +54,8 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
environment: ${{ steps.environment.outputs.environment }}
|
environment: ${{ steps.environment.outputs.environment }}
|
||||||
version: ${{ steps.version.outputs.version }}
|
version: ${{ steps.version.outputs.version }}
|
||||||
|
website-bucket: ${{ steps.website-bucket.output.website-bucket }}
|
||||||
|
website-cfid: ${{ steps.website-cfid.output.website-cfid }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
@ -79,15 +81,37 @@ jobs:
|
|||||||
echo "::set-output name=version::$(echo unreleased-$(git rev-parse --short HEAD))"
|
echo "::set-output name=version::$(echo unreleased-$(git rev-parse --short HEAD))"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: Get bucket name for website
|
||||||
|
id: website-bucket
|
||||||
|
run: |
|
||||||
|
if ${{ startsWith(github.ref, 'refs/tags/') }}; then
|
||||||
|
echo "set-output name=website-bucket::corsobackup.io"
|
||||||
|
echo "::set-output name=website-bucket::corsobackup.io"
|
||||||
|
else
|
||||||
|
echo "set-output name=website-bucket::test-corso-docs"
|
||||||
|
echo "::set-output name=website-bucket::test-corso-docs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Get cfid for website
|
||||||
|
id: website-cfid
|
||||||
|
run: |
|
||||||
|
if ${{ startsWith(github.ref, 'refs/tags/') }}; then
|
||||||
|
echo "set-output name=website-cfid::E1W9NGI9YTVZ1A"
|
||||||
|
echo "::set-output name=website-cfid::E1W9NGI9YTVZ1A"
|
||||||
|
else
|
||||||
|
echo "set-output name=website-cfid::ESFTEIYTIP7Y3"
|
||||||
|
echo "::set-output name=website-cfid::ESFTEIYTIP7Y3"
|
||||||
|
fi
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
# --- Docs Linting -----------------------------------------------------------------------------------
|
# --- Website Linting -----------------------------------------------------------------------------------
|
||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
Docs-Linting:
|
Website-Linting:
|
||||||
needs: [Precheck, Checkout, SetEnv]
|
needs: [Precheck, Checkout, SetEnv]
|
||||||
environment: Testing
|
environment: Testing
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.docfileschanged == 'true' # docsfileschanged also includes srcfileschanged
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.websitefileschanged == 'true' # websitefileschanged also includes srcfileschanged
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
@ -102,39 +126,37 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
go run ./cmd/mdgen/mdgen.go generate
|
go run ./cmd/mdgen/mdgen.go generate
|
||||||
|
|
||||||
# migrate generated md files into /docs/docs/cli
|
# migrate generated md files into /website/docs/cli
|
||||||
- name: Move CLI .md to Docs
|
- name: Move CLI .md to Docs
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ./docs/docs/cli
|
mkdir -p ./website/docs/cli
|
||||||
mv ./src/cmd/mdgen/cli_markdown/* ./docs/docs/cli/
|
mv ./src/cmd/mdgen/cli_markdown/* ./website/docs/cli/
|
||||||
rm -R ./src/cmd/mdgen/cli_markdown/
|
rm -R ./src/cmd/mdgen/cli_markdown/
|
||||||
|
|
||||||
- name: Install dependencies for docs lint
|
- name: Install dependencies for website lint
|
||||||
run: |
|
run: |
|
||||||
wget https://github.com/errata-ai/vale/releases/download/v2.20.2/vale_2.20.2_Linux_64-bit.tar.gz # NOTE: update in Dockerfile when updating
|
wget https://github.com/errata-ai/vale/releases/download/v2.20.2/vale_2.20.2_Linux_64-bit.tar.gz # NOTE: update in Dockerfile when updating
|
||||||
mkdir bin && tar -xvzf vale_2.20.2_Linux_64-bit.tar.gz -C bin
|
mkdir bin && tar -xvzf vale_2.20.2_Linux_64-bit.tar.gz -C bin
|
||||||
echo "$PWD/bin" >> $GITHUB_PATH
|
echo "$PWD/bin" >> $GITHUB_PATH
|
||||||
npm i -g markdownlint-cli@0.32.2 # NOTE: update in Dockerfile when updating
|
npm i -g markdownlint-cli@0.32.2 # NOTE: update in Dockerfile when updating
|
||||||
|
|
||||||
- name: Run docs lint
|
- name: Run website lint
|
||||||
env:
|
|
||||||
CORSO_USE_DOCKER: -1 # prevent using docker inside makefile
|
|
||||||
run: |
|
run: |
|
||||||
cd docs && make -o genclidocs localcheck
|
cd website && make -o genclidocs localcheck
|
||||||
|
|
||||||
- name: Build docs
|
- name: Build website
|
||||||
env:
|
env:
|
||||||
CORSO_VERSION: ${{ needs.SetEnv.outputs.version }}
|
CORSO_VERSION: ${{ needs.SetEnv.outputs.version }}
|
||||||
run: |
|
run: |
|
||||||
cd docs &&
|
cd website &&
|
||||||
npm ci &&
|
npm ci &&
|
||||||
npm run build
|
npm run build
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@master
|
||||||
name: Upload docs as artifacts
|
name: Upload website as artifacts
|
||||||
with:
|
with:
|
||||||
name: docs
|
name: website
|
||||||
path: docs/build
|
path: website/build
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
# --- Integration and Unit Testing -------------------------------------------------------------------
|
# --- Integration and Unit Testing -------------------------------------------------------------------
|
||||||
@ -343,7 +365,7 @@ jobs:
|
|||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
Publish-Binary:
|
Publish-Binary:
|
||||||
needs: [Test-Suite-Trusted, Linting, Docs-Linting, SetEnv]
|
needs: [Test-Suite-Trusted, Linting, Website-Linting, SetEnv]
|
||||||
environment: ${{ needs.SetEnv.outputs.environment }}
|
environment: ${{ needs.SetEnv.outputs.environment }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
||||||
@ -379,23 +401,23 @@ jobs:
|
|||||||
name: corso
|
name: corso
|
||||||
path: src/dist/*
|
path: src/dist/*
|
||||||
|
|
||||||
Publish-Docs:
|
Publish-Website:
|
||||||
needs: [Test-Suite-Trusted, Linting, Docs-Linting, SetEnv]
|
needs: [Test-Suite-Trusted, Linting, Website-Linting, SetEnv]
|
||||||
environment: ${{ needs.SetEnv.outputs.environment }}
|
environment: ${{ needs.SetEnv.outputs.environment }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: docs
|
working-directory: website
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/download-artifact@master
|
- uses: actions/download-artifact@master
|
||||||
name: Download docs from build step
|
name: Download website from build step
|
||||||
with:
|
with:
|
||||||
name: docs
|
name: website
|
||||||
path: docs/build
|
path: website/build
|
||||||
|
|
||||||
- name: Configure AWS credentials from Test account
|
- name: Configure AWS credentials from Test account
|
||||||
uses: aws-actions/configure-aws-credentials@v1
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
@ -409,16 +431,16 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
printf 'User-agent: *\nDisallow: /' > build/robots.txt
|
printf 'User-agent: *\nDisallow: /' > build/robots.txt
|
||||||
|
|
||||||
- name: Push docs
|
- name: Push website
|
||||||
run: |
|
run: |
|
||||||
aws s3 sync build "s3://${{ secrets.DOCS_S3_BUCKET }}"
|
aws s3 sync build "s3://${{ needs.SetEnv.outputs.website-bucket }}" --delete
|
||||||
|
|
||||||
- name: Invalidate cloudfront
|
- name: Invalidate cloudfront
|
||||||
run: |
|
run: |
|
||||||
aws cloudfront create-invalidation --distribution-id ${{ secrets.DOCS_CF_DISTRIBUTION }} --paths "/*"
|
aws cloudfront create-invalidation --distribution-id ${{ needs.SetEnv.outputs.website-cfid }} --paths "/*"
|
||||||
|
|
||||||
Publish-Image:
|
Publish-Image:
|
||||||
needs: [Test-Suite-Trusted, Linting, Docs-Linting, SetEnv]
|
needs: [Test-Suite-Trusted, Linting, Website-Linting, SetEnv]
|
||||||
environment: ${{ needs.SetEnv.outputs.environment }}
|
environment: ${{ needs.SetEnv.outputs.environment }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
||||||
|
|||||||
34
.github/workflows/website-ci.yml
vendored
@ -1,34 +0,0 @@
|
|||||||
name: CI for Website
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches: [main]
|
|
||||||
|
|
||||||
# cancel currently running jobs if a new version of the branch is pushed
|
|
||||||
concurrency:
|
|
||||||
group: website-ci-${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
Precheck:
|
|
||||||
uses: alcionai/corso/.github/workflows/_filechange_checker.yml@main
|
|
||||||
|
|
||||||
Website-Build:
|
|
||||||
needs: [Precheck]
|
|
||||||
environment: Testing
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.ref == 'refs/heads/main' || needs.precheck.outputs.websitefileschanged == 'true'
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: website
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Build website image
|
|
||||||
run: |
|
|
||||||
make buildimage
|
|
||||||
|
|
||||||
- name: Build website
|
|
||||||
run: |
|
|
||||||
make build
|
|
||||||
93
.github/workflows/website-publish.yml
vendored
@ -9,27 +9,110 @@ permissions:
|
|||||||
packages: write
|
packages: write
|
||||||
pull-requests: read
|
pull-requests: read
|
||||||
|
|
||||||
|
# cancel currently running jobs if a new version of the branch is pushed
|
||||||
|
concurrency:
|
||||||
|
group: push-website-${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
SetEnv:
|
||||||
|
environment: Testing
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.version.outputs.version }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # needed to get latest tag
|
||||||
|
|
||||||
|
- name: Get version string
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
echo "set-output name=version::$(git describe --tags --abbrev=0)"
|
||||||
|
echo "::set-output name=version::$(git describe --tags --abbrev=0)"
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
# --- Website Linting -----------------------------------------------------------------------------------
|
||||||
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Website-Linting:
|
||||||
|
needs: [SetEnv]
|
||||||
|
environment: Testing
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Setup Golang with cache
|
||||||
|
uses: magnetikonline/action-golang-cache@v3
|
||||||
|
with:
|
||||||
|
go-version-file: src/go.mod
|
||||||
|
|
||||||
|
- name: Generate CLI Docs
|
||||||
|
working-directory: ./src
|
||||||
|
run: |
|
||||||
|
go run ./cmd/mdgen/mdgen.go generate
|
||||||
|
|
||||||
|
# migrate generated md files into /website/docs/cli
|
||||||
|
- name: Move CLI .md to Docs
|
||||||
|
run: |
|
||||||
|
mkdir -p ./website/docs/cli
|
||||||
|
mv ./src/cmd/mdgen/cli_markdown/* ./website/docs/cli/
|
||||||
|
rm -R ./src/cmd/mdgen/cli_markdown/
|
||||||
|
|
||||||
|
- name: Install dependencies for website lint
|
||||||
|
run: |
|
||||||
|
wget https://github.com/errata-ai/vale/releases/download/v2.20.2/vale_2.20.2_Linux_64-bit.tar.gz # NOTE: update in Dockerfile when updating
|
||||||
|
mkdir bin && tar -xvzf vale_2.20.2_Linux_64-bit.tar.gz -C bin
|
||||||
|
echo "$PWD/bin" >> $GITHUB_PATH
|
||||||
|
npm i -g markdownlint-cli@0.32.2 # NOTE: update in Dockerfile when updating
|
||||||
|
|
||||||
|
- name: Run website lint
|
||||||
|
run: |
|
||||||
|
cd website && make -o genclidocs localcheck
|
||||||
|
|
||||||
|
- name: Build website
|
||||||
|
env:
|
||||||
|
CORSO_VERSION: ${{ needs.SetEnv.outputs.version }}
|
||||||
|
run: |
|
||||||
|
cd website &&
|
||||||
|
npm ci &&
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload website as artifacts
|
||||||
|
with:
|
||||||
|
name: website
|
||||||
|
path: website/build
|
||||||
|
|
||||||
Publish-Website:
|
Publish-Website:
|
||||||
|
needs: [Website-Linting]
|
||||||
environment: Production
|
environment: Production
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: website
|
working-directory: website
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Configure AWS credentials
|
- uses: actions/download-artifact@master
|
||||||
|
name: Download website from build step
|
||||||
|
with:
|
||||||
|
name: website
|
||||||
|
path: website/build
|
||||||
|
|
||||||
|
- name: Configure AWS credentials from Test account
|
||||||
uses: aws-actions/configure-aws-credentials@v1
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
with:
|
with:
|
||||||
role-to-assume: ${{ secrets.AWS_IAM_ROLE }}
|
role-to-assume: ${{ secrets.AWS_IAM_ROLE }}
|
||||||
role-session-name: integration-testing
|
role-session-name: integration-testing
|
||||||
aws-region: us-east-1
|
aws-region: us-east-1
|
||||||
|
|
||||||
- name: Build docs image
|
- name: Push website
|
||||||
run: |
|
run: |
|
||||||
make buildimage
|
aws s3 sync build "s3://corsobackup.io" --delete
|
||||||
|
|
||||||
- name: Build & Publish docs
|
- name: Invalidate cloudfront
|
||||||
run: |
|
run: |
|
||||||
make publish
|
aws cloudfront create-invalidation --distribution-id E1W9NGI9YTVZ1A --paths "/*"
|
||||||
@ -1,28 +0,0 @@
|
|||||||
FROM ubuntu:22.04
|
|
||||||
LABEL MAINTAINER="Niraj Tolia"
|
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
# NOTE for lines 13,15: update in CI when updating
|
|
||||||
RUN apt-get -y update && apt-get -y install gpg emacs curl zip git make \
|
|
||||||
&& curl -fsSL https://deb.nodesource.com/setup_current.x | bash - \
|
|
||||||
&& apt-get -y install nodejs \
|
|
||||||
&& apt-get autoclean \
|
|
||||||
&& node --version \
|
|
||||||
&& npm --version \
|
|
||||||
&& cd /tmp && curl -O -L https://github.com/errata-ai/vale/releases/download/v2.20.1/vale_2.20.1_Linux_64-bit.tar.gz \
|
|
||||||
&& tar -xvzf vale_2.20.1_Linux_64-bit.tar.gz -C /usr/bin vale \
|
|
||||||
&& npm install -g markdownlint-cli@0.32.2 \
|
|
||||||
&& curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
|
|
||||||
&& unzip awscliv2.zip && /bin/bash aws/install && rm -rf awscliv2.zip aws
|
|
||||||
|
|
||||||
WORKDIR /usr/src
|
|
||||||
COPY package.json package-lock.json* ./
|
|
||||||
RUN npm ci \
|
|
||||||
&& npm cache clean --force \
|
|
||||||
&& rm -f package.json package-lock.json*
|
|
||||||
ENV PATH /usr/src/node_modules/.bin:$PATH
|
|
||||||
|
|
||||||
WORKDIR /usr/src/docs
|
|
||||||
|
|
||||||
CMD ["npm", "start", "--", "--host", "0.0.0.0"]
|
|
||||||
@ -1,72 +0,0 @@
|
|||||||
.PHONY: buildimage build serve dev shell check genclidocs _validatemdgen publish sync
|
|
||||||
|
|
||||||
CORSO_BUILD_DIR := /tmp/.corsobuild
|
|
||||||
CORSO_BUILD_CACHE := ${CORSO_BUILD_DIR}/cache
|
|
||||||
CORSO_BUILD_MOD := ${CORSO_BUILD_DIR}/mod
|
|
||||||
CORSO_BUILD_BIN := ${CORSO_BUILD_DIR}/bin
|
|
||||||
CORSO_REPO := /go/src/github.com/alcionai/corso
|
|
||||||
CORSO_LOCAL_PATH := $(shell git rev-parse --show-toplevel)
|
|
||||||
GIT_SHA := $(shell git rev-parse --short HEAD)
|
|
||||||
DOCSC := docker run --rm -it -p 3000:3000 -v ${PWD}:/usr/src/docs --env CORSO_VERSION=unreleased-${GIT_SHA} corso/docs
|
|
||||||
CBASE := docker run --rm -it \
|
|
||||||
-v ${CORSO_LOCAL_PATH}:${CORSO_REPO} -v ${CORSO_BUILD_DIR}:${CORSO_BUILD_DIR} \
|
|
||||||
--env GOCACHE=${CORSO_BUILD_CACHE} --env GOMODCACHE=${CORSO_BUILD_MOD} --env GOTMPDIR=${CORSO_BUILD_DIR} \
|
|
||||||
--workdir ${CORSO_REPO}/src
|
|
||||||
GOC := ${CBASE} golang:1.18
|
|
||||||
GOBASHC := ${CBASE} --entrypoint bash golang:1.18
|
|
||||||
MDGEN_SRC := ${CORSO_REPO}/src/cmd/mdgen/mdgen.go
|
|
||||||
MDGEN_BINARY := ${CORSO_BUILD_BIN}/mdgen
|
|
||||||
CLI_DOCS := ${CORSO_REPO}/docs/docs/cli
|
|
||||||
|
|
||||||
buildimage:
|
|
||||||
docker build -t "corso/docs:latest" .
|
|
||||||
|
|
||||||
dev: genclidocs
|
|
||||||
$(DOCSC) npm start -- --host 0.0.0.0
|
|
||||||
|
|
||||||
VALE_TARGET ?= docs README.md
|
|
||||||
|
|
||||||
check: genclidocs
|
|
||||||
$(DOCSC) vale $(VALE_TARGET)
|
|
||||||
$(DOCSC) markdownlint '**/*.md' --ignore styles/ --ignore src/ --ignore node_modules/
|
|
||||||
|
|
||||||
localcheck: genclidocs
|
|
||||||
vale $(VALE_TARGET)
|
|
||||||
markdownlint '**/*.md' --ignore styles/ --ignore src/ --ignore node_modules/
|
|
||||||
|
|
||||||
dockershell:
|
|
||||||
$(DOCSC) bash
|
|
||||||
|
|
||||||
build: genclidocs
|
|
||||||
$(DOCSC) npm run build
|
|
||||||
|
|
||||||
serve:
|
|
||||||
$(DOCSC) npm run serve
|
|
||||||
|
|
||||||
genclidocs: _validatemdgen ${MDGEN_BINARY}
|
|
||||||
@echo 'Auto-generating Corso CLI docs...'
|
|
||||||
$(DOCSC) rm -rf docs/cli
|
|
||||||
$(GOC) ${MDGEN_BINARY} --cli-folder ${CLI_DOCS}
|
|
||||||
|
|
||||||
_validatemdgen: # in case we have a different architecture
|
|
||||||
@echo 'Verifying dependencies...'
|
|
||||||
$(GOBASHC) -c "${MDGEN_BINARY} --help >/dev/null || rm -rf ${MDGEN_BINARY}"
|
|
||||||
|
|
||||||
${MDGEN_BINARY}: $(shell find ${CORSO_LOCAL_PATH}/src -type f -name *.go) $(shell find ${CORSO_LOCAL_PATH}/src -type d )
|
|
||||||
@echo 'Re-building Corso CLI docs auto-gen tooling...'
|
|
||||||
$(GOC) go mod download
|
|
||||||
$(GOC) go build -o ${MDGEN_BINARY} ${MDGEN_SRC}
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(DOCSC) rm -rf docs/cli build node_modules
|
|
||||||
$(GOC) rm -rf ${CORSO_BUILD_DIR}/*
|
|
||||||
|
|
||||||
publish: clean build
|
|
||||||
docker run -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY \
|
|
||||||
-e AWS_SESSION_TOKEN -e AWS_REGION \
|
|
||||||
--rm -v ${PWD}:/usr/src/docs corso/docs:latest \
|
|
||||||
make sync
|
|
||||||
|
|
||||||
sync:
|
|
||||||
aws s3 sync /usr/src/docs/build/ s3://corsobackup.io/ --exclude ".git/*" --delete
|
|
||||||
aws cloudfront create-invalidation --distribution-id E1W9NGI9YTVZ1A --paths "/*"
|
|
||||||
@ -1,71 +0,0 @@
|
|||||||
# Corso documentation
|
|
||||||
|
|
||||||
Corso documentation uses [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
|
|
||||||
[Mermaid](https://mermaid-js.github.io/mermaid/) provides support for native diagrams in Markdown.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
Developing documentation for Corso requires the following tools on your machine:
|
|
||||||
|
|
||||||
- `make`
|
|
||||||
- Docker
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make buildimage
|
|
||||||
```
|
|
||||||
|
|
||||||
## Live documentation development
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make dev
|
|
||||||
```
|
|
||||||
|
|
||||||
This command starts a local development server within the Docker container and will expose docs at [http://localhost:3000](http://localhost:3000).
|
|
||||||
|
|
||||||
## Generating Corso CLI docs
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make genclidocs
|
|
||||||
```
|
|
||||||
|
|
||||||
Corso's CLI documents are auto generated. This command explicitly triggers generating these docs. This step will happen
|
|
||||||
automatically for the other commands where this is relevant.
|
|
||||||
|
|
||||||
## Building static documentation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make build
|
|
||||||
```
|
|
||||||
|
|
||||||
This command generates static content into the `build` directory for integration with any static contents hosting service.
|
|
||||||
|
|
||||||
## Serving static documentation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make serve
|
|
||||||
```
|
|
||||||
|
|
||||||
This command will serve the static content generated with `make build` at [http://localhost:3000](http://localhost:3000).
|
|
||||||
|
|
||||||
## Style and linting
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Lint all docs
|
|
||||||
make check
|
|
||||||
# Lint specific files and/or folders
|
|
||||||
make check VALE_TARGET="README.md docs/concepts"
|
|
||||||
```
|
|
||||||
|
|
||||||
This command will lint all Markdown files and check them for style issues using the Docker container
|
|
||||||
|
|
||||||
## Documentation platform development
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make shell
|
|
||||||
```
|
|
||||||
|
|
||||||
Use this command to interactively (and temporarily!) change the contents or
|
|
||||||
configuration of the live documentation container image (for example, when
|
|
||||||
experimenting with new plugins).
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "docs",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"private": true,
|
|
||||||
"scripts": {
|
|
||||||
"docusaurus": "docusaurus",
|
|
||||||
"start": "docusaurus start",
|
|
||||||
"build": "docusaurus build",
|
|
||||||
"swizzle": "docusaurus swizzle",
|
|
||||||
"deploy": "docusaurus deploy",
|
|
||||||
"clear": "docusaurus clear",
|
|
||||||
"serve": "docusaurus serve",
|
|
||||||
"write-translations": "docusaurus write-translations",
|
|
||||||
"write-heading-ids": "docusaurus write-heading-ids"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@docusaurus/core": "2.2.0",
|
|
||||||
"@docusaurus/plugin-google-gtag": "^2.2.0",
|
|
||||||
"@docusaurus/preset-classic": "2.2.0",
|
|
||||||
"@loadable/component": "^5.15.2",
|
|
||||||
"@mdx-js/react": "^1.6.22",
|
|
||||||
"animate.css": "^4.1.1",
|
|
||||||
"clsx": "^1.2.1",
|
|
||||||
"docusaurus-plugin-image-zoom": "^0.1.1",
|
|
||||||
"docusaurus-plugin-sass": "^0.2.2",
|
|
||||||
"feather-icons": "^4.29.0",
|
|
||||||
"jarallax": "^2.0.4",
|
|
||||||
"mdx-mermaid": "^1.3.2",
|
|
||||||
"mermaid": "^9.2.2",
|
|
||||||
"prism-react-renderer": "^1.3.5",
|
|
||||||
"react": "^17.0.2",
|
|
||||||
"react-dom": "^17.0.2",
|
|
||||||
"sass": "^1.56.1",
|
|
||||||
"tw-elements": "^1.0.0-alpha12",
|
|
||||||
"wowjs": "^1.1.3"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@docusaurus/module-type-aliases": "2.2.0",
|
|
||||||
"@iconify/react": "^4.0.0",
|
|
||||||
"autoprefixer": "^10.4.13",
|
|
||||||
"postcss": "^8.4.19",
|
|
||||||
"tailwindcss": "^3.2.4"
|
|
||||||
},
|
|
||||||
"browserslist": {
|
|
||||||
"production": [
|
|
||||||
">0.5%",
|
|
||||||
"not dead",
|
|
||||||
"not op_mini all"
|
|
||||||
],
|
|
||||||
"development": [
|
|
||||||
"last 1 chrome version",
|
|
||||||
"last 1 firefox version",
|
|
||||||
"last 1 safari version"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,65 +0,0 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
|
||||||
module.exports = {
|
|
||||||
content: ["./src/**/*.{js,jsx,ts,tsx}"],
|
|
||||||
darkMode: ['class', '[data-theme="dark"]'],
|
|
||||||
theme: {
|
|
||||||
screens: {
|
|
||||||
xs: "540px",
|
|
||||||
sm: "640px",
|
|
||||||
md: "768px",
|
|
||||||
lg: "1024px",
|
|
||||||
xl: "1280px",
|
|
||||||
"2xl": "1536px",
|
|
||||||
},
|
|
||||||
fontFamily: {
|
|
||||||
nunito: ['"Nunito", sans-serif'],
|
|
||||||
},
|
|
||||||
container: {
|
|
||||||
center: true,
|
|
||||||
padding: {
|
|
||||||
DEFAULT: "12px",
|
|
||||||
sm: "1rem",
|
|
||||||
lg: "45px",
|
|
||||||
xl: "5rem",
|
|
||||||
"2xl": "13rem",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
extend: {
|
|
||||||
colors: {
|
|
||||||
dark: "#3c4858",
|
|
||||||
black: "#161c2d",
|
|
||||||
"dark-footer": "#192132",
|
|
||||||
},
|
|
||||||
|
|
||||||
boxShadow: {
|
|
||||||
sm: "0 2px 4px 0 rgb(60 72 88 / 0.15)",
|
|
||||||
DEFAULT: "0 0 3px rgb(60 72 88 / 0.15)",
|
|
||||||
md: "0 5px 13px rgb(60 72 88 / 0.20)",
|
|
||||||
lg: "0 10px 25px -3px rgb(60 72 88 / 0.15)",
|
|
||||||
xl: "0 20px 25px -5px rgb(60 72 88 / 0.1), 0 8px 10px -6px rgb(60 72 88 / 0.1)",
|
|
||||||
"2xl": "0 25px 50px -12px rgb(60 72 88 / 0.25)",
|
|
||||||
inner: "inset 0 2px 4px 0 rgb(60 72 88 / 0.05)",
|
|
||||||
testi: "2px 2px 2px -1px rgb(60 72 88 / 0.15)",
|
|
||||||
},
|
|
||||||
|
|
||||||
spacing: {
|
|
||||||
0.75: "0.1875rem",
|
|
||||||
3.25: "0.8125rem",
|
|
||||||
},
|
|
||||||
|
|
||||||
maxWidth: ({ theme, breakpoints }) => ({
|
|
||||||
1200: "71.25rem",
|
|
||||||
992: "60rem",
|
|
||||||
768: "45rem",
|
|
||||||
}),
|
|
||||||
|
|
||||||
zIndex: {
|
|
||||||
1: "1",
|
|
||||||
2: "2",
|
|
||||||
3: "3",
|
|
||||||
999: "999",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
plugins: [require("tw-elements/dist/plugin")],
|
|
||||||
};
|
|
||||||
0
docs/.gitignore → website/.gitignore
vendored
@ -3,28 +3,26 @@ LABEL MAINTAINER="Niraj Tolia"
|
|||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
WORKDIR /usr/src/
|
# NOTE for lines 13,15: update in CI when updating
|
||||||
|
RUN apt-get -y update && apt-get -y install gpg emacs curl zip git make \
|
||||||
RUN apt-get -y update && apt-get -y install curl zip make git emacs \
|
|
||||||
&& curl -fsSL https://deb.nodesource.com/setup_current.x | bash - \
|
&& curl -fsSL https://deb.nodesource.com/setup_current.x | bash - \
|
||||||
&& apt-get -y install nodejs \
|
&& apt-get -y install nodejs \
|
||||||
&& apt-get autoclean \
|
&& apt-get autoclean \
|
||||||
&& npm install -g gulp \
|
|
||||||
&& corepack enable \
|
|
||||||
&& node --version \
|
&& node --version \
|
||||||
&& npm --version \
|
&& npm --version \
|
||||||
&& yarn --version \
|
&& cd /tmp && curl -O -L https://github.com/errata-ai/vale/releases/download/v2.20.1/vale_2.20.1_Linux_64-bit.tar.gz \
|
||||||
&& gulp --version
|
&& tar -xvzf vale_2.20.1_Linux_64-bit.tar.gz -C /usr/bin vale \
|
||||||
|
&& npm install -g markdownlint-cli@0.32.2 \
|
||||||
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
|
&& curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
|
||||||
unzip awscliv2.zip && /bin/bash /usr/src/aws/install
|
&& unzip awscliv2.zip && /bin/bash aws/install && rm -rf awscliv2.zip aws
|
||||||
|
|
||||||
WORKDIR /usr/src
|
WORKDIR /usr/src
|
||||||
COPY package.json yarn.lock ./
|
COPY package.json package-lock.json* ./
|
||||||
RUN yarn install \
|
RUN npm ci \
|
||||||
&& yarn cache clean \
|
&& npm cache clean --force \
|
||||||
&& rm -f package.json yarn.lock
|
&& rm -f package.json package-lock.json*
|
||||||
ENV PATH /usr/src/node_modules/.bin:$PATH
|
ENV PATH /usr/src/node_modules/.bin:$PATH
|
||||||
ENV NODE_MODULES_PATH ../
|
|
||||||
|
|
||||||
WORKDIR /usr/src/website
|
WORKDIR /usr/src/website
|
||||||
|
|
||||||
|
CMD ["npm", "start", "--", "--host", "0.0.0.0"]
|
||||||
|
|||||||
@ -1,34 +1,69 @@
|
|||||||
.PHONY: buildimage dev shell build publish sync clean
|
.PHONY: buildimage build dev shell check genclidocs _validatemdgen publish sync
|
||||||
|
|
||||||
WEBC := docker run --rm -it --init -p 5050:3000 -p 5051:3001 \
|
CORSO_BUILD_DIR := /tmp/.corsobuild
|
||||||
-v ${PWD}:/usr/src/website corso/website:latest
|
CORSO_BUILD_CACHE := ${CORSO_BUILD_DIR}/cache
|
||||||
ifeq (${CI},true)
|
CORSO_BUILD_MOD := ${CORSO_BUILD_DIR}/mod
|
||||||
# Cannot run in interactive/tty mode in CI
|
CORSO_BUILD_BIN := ${CORSO_BUILD_DIR}/bin
|
||||||
WEBC := docker run --rm --init -p 5050:3000 -p 5051:3001 \
|
CORSO_REPO := /go/src/github.com/alcionai/corso
|
||||||
-v ${PWD}:/usr/src/website corso/website:latest
|
CORSO_LOCAL_PATH := $(shell git rev-parse --show-toplevel)
|
||||||
endif
|
GIT_SHA := $(shell git rev-parse --short HEAD)
|
||||||
|
WEBC := docker run --rm -it -p 3000:3000 -v ${PWD}:/usr/src/website --env CORSO_VERSION=unreleased-${GIT_SHA} corso/website
|
||||||
|
CBASE := docker run --rm -it \
|
||||||
|
-v ${CORSO_LOCAL_PATH}:${CORSO_REPO} -v ${CORSO_BUILD_DIR}:${CORSO_BUILD_DIR} \
|
||||||
|
--env GOCACHE=${CORSO_BUILD_CACHE} --env GOMODCACHE=${CORSO_BUILD_MOD} --env GOTMPDIR=${CORSO_BUILD_DIR} \
|
||||||
|
--workdir ${CORSO_REPO}/src
|
||||||
|
GOC := ${CBASE} golang:1.18
|
||||||
|
GOBASHC := ${CBASE} --entrypoint bash golang:1.18
|
||||||
|
MDGEN_SRC := ${CORSO_REPO}/src/cmd/mdgen/mdgen.go
|
||||||
|
MDGEN_BINARY := ${CORSO_BUILD_BIN}/mdgen
|
||||||
|
CLI_DOCS := ${CORSO_REPO}/website/docs/cli
|
||||||
|
|
||||||
buildimage: clean
|
buildimage:
|
||||||
docker build -t "corso/website:latest" .
|
docker build -t "corso/website:latest" .
|
||||||
|
|
||||||
dev:
|
dev: genclidocs
|
||||||
$(WEBC) gulp
|
$(WEBC) npm start -- --host 0.0.0.0
|
||||||
|
|
||||||
shell:
|
VALE_TARGET ?= docs README.md
|
||||||
$(WEBC) /bin/bash
|
|
||||||
|
|
||||||
build:
|
check: genclidocs
|
||||||
$(WEBC) gulp build
|
$(WEBC) vale $(VALE_TARGET)
|
||||||
|
$(WEBC) markdownlint '**/*.md' --ignore styles/ --ignore src/ --ignore node_modules/
|
||||||
|
|
||||||
publish: build
|
localcheck: genclidocs
|
||||||
|
vale $(VALE_TARGET)
|
||||||
|
markdownlint '**/*.md' --ignore styles/ --ignore src/ --ignore node_modules/
|
||||||
|
|
||||||
|
dockershell:
|
||||||
|
$(WEBC) bash
|
||||||
|
|
||||||
|
build: genclidocs
|
||||||
|
$(WEBC) npm run build
|
||||||
|
|
||||||
|
genclidocs: _validatemdgen ${MDGEN_BINARY}
|
||||||
|
@echo 'Auto-generating Corso CLI docs...'
|
||||||
|
$(WEBC) rm -rf docs/cli
|
||||||
|
$(GOC) ${MDGEN_BINARY} --cli-folder ${CLI_DOCS}
|
||||||
|
|
||||||
|
_validatemdgen: # in case we have a different architecture
|
||||||
|
@echo 'Verifying dependencies...'
|
||||||
|
$(GOBASHC) -c "${MDGEN_BINARY} --help >/dev/null || rm -rf ${MDGEN_BINARY}"
|
||||||
|
|
||||||
|
${MDGEN_BINARY}: $(shell find ${CORSO_LOCAL_PATH}/src -type f -name *.go) $(shell find ${CORSO_LOCAL_PATH}/src -type d )
|
||||||
|
@echo 'Re-building Corso CLI docs auto-gen tooling...'
|
||||||
|
$(GOC) go mod download
|
||||||
|
$(GOC) go build -o ${MDGEN_BINARY} ${MDGEN_SRC}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(WEBC) rm -rf docs/cli build node_modules
|
||||||
|
$(GOC) rm -rf ${CORSO_BUILD_DIR}/*
|
||||||
|
|
||||||
|
publish: clean build
|
||||||
docker run -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY \
|
docker run -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY \
|
||||||
-e AWS_SESSION_TOKEN -e AWS_REGION \
|
-e AWS_SESSION_TOKEN -e AWS_REGION \
|
||||||
--rm -v ${PWD}:/usr/src/website corso/website:latest \
|
--rm -v ${PWD}:/usr/src/website corso/website:latest \
|
||||||
make sync
|
make sync
|
||||||
|
|
||||||
sync:
|
sync:
|
||||||
aws s3 sync /usr/src/website/dist/ s3://corsobackup.io/ --exclude ".git/*" --delete
|
aws s3 sync /usr/src/website/build/ s3://corsobackup.io/ --delete
|
||||||
aws cloudfront create-invalidation --distribution-id E1W9NGI9YTVZ1A --paths "/*"
|
aws cloudfront create-invalidation --distribution-id E1W9NGI9YTVZ1A --paths "/*"
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf node_modules
|
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
# Corso website documentation
|
# Corso documentation
|
||||||
|
|
||||||
|
Corso documentation uses [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
|
||||||
|
[Mermaid](https://mermaid-js.github.io/mermaid/) provides support for native diagrams in Markdown.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
Building the Corso website requires the following tools on your machine:
|
Developing documentation for Corso requires the following tools on your machine:
|
||||||
|
|
||||||
- `make`
|
- `make`
|
||||||
- Docker
|
- Docker
|
||||||
@ -19,22 +22,50 @@ make buildimage
|
|||||||
make dev
|
make dev
|
||||||
```
|
```
|
||||||
|
|
||||||
This command starts a local development server within the Docker container and will expose a live website preview at [http://localhost:5050](http://localhost:5050).
|
This command starts a local development server within the Docker container and will expose docs at [http://localhost:3000](http://localhost:3000).
|
||||||
|
|
||||||
## Building a static website
|
## Generating Corso CLI docs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make genclidocs
|
||||||
|
```
|
||||||
|
|
||||||
|
Corso's CLI documents are auto generated. This command explicitly triggers generating these docs. This step will happen
|
||||||
|
automatically for the other commands where this is relevant.
|
||||||
|
|
||||||
|
## Building static documentation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make build
|
make build
|
||||||
```
|
```
|
||||||
|
|
||||||
This command generates static content into the `dist` directory for integration with any static contents hosting service. If you are using AWS S3 + CloudFront, you can run `make publish` to upload to the configured S3 bucket.
|
This command generates static content into the `build` directory for integration with any static contents hosting service.
|
||||||
|
|
||||||
## Website platform development
|
## Serving static documentation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make serve
|
||||||
|
```
|
||||||
|
|
||||||
|
This command will serve the static content generated with `make build` at [http://localhost:3000](http://localhost:3000).
|
||||||
|
|
||||||
|
## Style and linting
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Lint all docs
|
||||||
|
make check
|
||||||
|
# Lint specific files and/or folders
|
||||||
|
make check VALE_TARGET="README.md docs/concepts"
|
||||||
|
```
|
||||||
|
|
||||||
|
This command will lint all Markdown files and check them for style issues using the Docker container
|
||||||
|
|
||||||
|
## Documentation platform development
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make shell
|
make shell
|
||||||
```
|
```
|
||||||
|
|
||||||
Use this command to interactively (and temporarily!) change the contents or
|
Use this command to interactively (and temporarily!) change the contents or
|
||||||
configuration of the live website container image (for example, when
|
configuration of the live documentation container image (for example, when
|
||||||
experimenting with new packages).
|
experimenting with new plugins).
|
||||||
|
|||||||
@ -1,248 +0,0 @@
|
|||||||
const browsersync = require('browser-sync').create();
|
|
||||||
const cached = require('gulp-cached');
|
|
||||||
const cleanCSS = require('clean-css');
|
|
||||||
const cssnano = require('gulp-cssnano');
|
|
||||||
const del = require('del');
|
|
||||||
const fileinclude = require('gulp-file-include');
|
|
||||||
const gulp = require('gulp');
|
|
||||||
const gulpif = require('gulp-if');
|
|
||||||
const npmdist = require('gulp-npm-dist');
|
|
||||||
const replace = require('gulp-replace');
|
|
||||||
const uglify = require('gulp-uglify');
|
|
||||||
const useref = require('gulp-useref-plus');
|
|
||||||
const rename = require('gulp-rename');
|
|
||||||
const sass = require('gulp-sass')(require('sass'));
|
|
||||||
const sourcemaps = require("gulp-sourcemaps");
|
|
||||||
const postcss = require('gulp-postcss');
|
|
||||||
const autoprefixer = require("autoprefixer");
|
|
||||||
const tailwindcss = require('tailwindcss');
|
|
||||||
|
|
||||||
|
|
||||||
const paths = {
|
|
||||||
config: {
|
|
||||||
tailwind: "./tailwind.config.js",
|
|
||||||
},
|
|
||||||
base: {
|
|
||||||
base: {
|
|
||||||
dir: './'
|
|
||||||
},
|
|
||||||
node: {
|
|
||||||
dir: '../node_modules'
|
|
||||||
},
|
|
||||||
packageLock: {
|
|
||||||
files: './package-lock.json'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dist: {
|
|
||||||
base: {
|
|
||||||
dir: './dist',
|
|
||||||
files: './dist/**/*'
|
|
||||||
},
|
|
||||||
libs: {
|
|
||||||
dir: './dist/assets/libs'
|
|
||||||
},
|
|
||||||
css: {
|
|
||||||
dir: './dist/assets/css',
|
|
||||||
},
|
|
||||||
js: {
|
|
||||||
dir: './dist/assets/js',
|
|
||||||
files: './dist/assets/js/pages',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
src: {
|
|
||||||
base: {
|
|
||||||
dir: './src',
|
|
||||||
files: './src/**/*'
|
|
||||||
},
|
|
||||||
css: {
|
|
||||||
dir: './src/assets/css',
|
|
||||||
files: './src/assets/css/**/*'
|
|
||||||
},
|
|
||||||
html: {
|
|
||||||
dir: './src',
|
|
||||||
files: './src/**/*.html',
|
|
||||||
},
|
|
||||||
img: {
|
|
||||||
dir: './src/assets/images',
|
|
||||||
files: './src/assets/images/**/*',
|
|
||||||
},
|
|
||||||
js: {
|
|
||||||
dir: './src/assets/js',
|
|
||||||
pages: './src/assets/js/pages',
|
|
||||||
files: './src/assets/js/pages/*.js',
|
|
||||||
main: './src/assets/js/*.js',
|
|
||||||
},
|
|
||||||
partials: {
|
|
||||||
dir: './src/partials',
|
|
||||||
files: './src/partials/**/*'
|
|
||||||
},
|
|
||||||
scss: {
|
|
||||||
dir: './src/assets/scss',
|
|
||||||
files: './src/assets/scss/**/*',
|
|
||||||
main: './src/assets/scss/*.scss',
|
|
||||||
icon: './src/assets/scss/icons.scss'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
gulp.task('browsersync', function (callback) {
|
|
||||||
browsersync.init({
|
|
||||||
server: {
|
|
||||||
baseDir: [paths.dist.base.dir, paths.src.base.dir, paths.base.base.dir]
|
|
||||||
},
|
|
||||||
open: false,
|
|
||||||
});
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('browsersyncReload', function (callback) {
|
|
||||||
browsersync.reload();
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('watch', function () {
|
|
||||||
gulp.watch([paths.src.scss.files, '!' + paths.src.scss.icon], gulp.series('scss', 'browsersyncReload'));
|
|
||||||
gulp.watch(paths.src.scss.icon, gulp.series('icons', 'browsersyncReload'));
|
|
||||||
gulp.watch([paths.src.js.dir], gulp.series('js', 'browsersyncReload'));
|
|
||||||
// gulp.watch([paths.src.js.pages], gulp.series('jsPages', 'browsersyncReload'));
|
|
||||||
gulp.watch([paths.src.html.files, paths.src.partials.files], gulp.series(['fileinclude', 'scss'], 'browsersyncReload'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('js', function () {
|
|
||||||
return gulp
|
|
||||||
.src(paths.src.js.main)
|
|
||||||
// .pipe(uglify())
|
|
||||||
.pipe(gulp.dest(paths.dist.js.dir));
|
|
||||||
});
|
|
||||||
|
|
||||||
// gulp.task('jsPages', function () {
|
|
||||||
// return gulp
|
|
||||||
// .src(paths.src.js.files)
|
|
||||||
// // .pipe(uglify())
|
|
||||||
// .pipe(gulp.dest(paths.dist.js.files));
|
|
||||||
// });
|
|
||||||
|
|
||||||
const cssOptions = {
|
|
||||||
compatibility: "*", // (default) - Internet Explorer 10+ compatibility mode
|
|
||||||
inline: ["all"], // enables all inlining, same as ['local', 'remote']
|
|
||||||
level: 2, // Optimization levels. The level option can be either 0, 1 (default), or 2, e.g.
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
gulp.task('scss', function () {
|
|
||||||
// generate tailwind
|
|
||||||
return gulp
|
|
||||||
.src([paths.src.scss.main, '!' + paths.src.scss.icon])
|
|
||||||
.pipe(sourcemaps.init())
|
|
||||||
.pipe(sass().on('error', sass.logError))
|
|
||||||
|
|
||||||
.pipe(postcss([
|
|
||||||
tailwindcss(paths.config.tailwind),
|
|
||||||
autoprefixer()
|
|
||||||
]))
|
|
||||||
.pipe(gulp.dest(paths.dist.css.dir))
|
|
||||||
// .pipe(cssnano({ svgo: false }))
|
|
||||||
.on("data", function (file) {
|
|
||||||
const buferFile = new cleanCSS(cssOptions).minify(file.contents);
|
|
||||||
return (file.contents = Buffer.from(buferFile.styles));
|
|
||||||
})
|
|
||||||
.pipe(
|
|
||||||
rename({
|
|
||||||
suffix: ".min"
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.pipe(sourcemaps.write("./"))
|
|
||||||
.pipe(gulp.dest(paths.dist.css.dir));
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
gulp.task('icons', function () {
|
|
||||||
return gulp
|
|
||||||
.src(paths.src.scss.icon)
|
|
||||||
.pipe(sass().on('error', sass.logError))
|
|
||||||
.pipe(gulp.dest(paths.dist.css.dir))
|
|
||||||
.on("data", function (file) {
|
|
||||||
const buferFile = new cleanCSS(cssOptions).minify(file.contents);
|
|
||||||
return (file.contents = Buffer.from(buferFile.styles));
|
|
||||||
})
|
|
||||||
.pipe(
|
|
||||||
rename({
|
|
||||||
suffix: ".min"
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.pipe(gulp.dest(paths.dist.css.dir));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('fileinclude', function () {
|
|
||||||
return gulp
|
|
||||||
.src([
|
|
||||||
paths.src.html.files,
|
|
||||||
'!' + paths.dist.base.files,
|
|
||||||
'!' + paths.src.partials.files
|
|
||||||
])
|
|
||||||
.pipe(fileinclude({
|
|
||||||
prefix: '@@',
|
|
||||||
basepath: '@file',
|
|
||||||
indent: true,
|
|
||||||
}))
|
|
||||||
.pipe(cached())
|
|
||||||
.pipe(gulp.dest(paths.dist.base.dir));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('clean:packageLock', function (callback) {
|
|
||||||
del.sync(paths.base.packageLock.files);
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('clean:dist', function (callback) {
|
|
||||||
del.sync(paths.dist.base.dir);
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('copy:all', function () {
|
|
||||||
return gulp
|
|
||||||
.src([
|
|
||||||
paths.src.base.files,
|
|
||||||
'!' + paths.src.partials.dir, '!' + paths.src.partials.files,
|
|
||||||
'!' + paths.src.scss.dir, '!' + paths.src.scss.files,
|
|
||||||
'!' + paths.src.js.dir, '!' + paths.src.js.files, '!' + paths.src.js.main,
|
|
||||||
'!' + paths.src.html.files,
|
|
||||||
])
|
|
||||||
.pipe(gulp.dest(paths.dist.base.dir));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('copy:libs', function () {
|
|
||||||
return gulp
|
|
||||||
.src(npmdist({ nodeModulesPath: process.env.NODE_MODULES_PATH || './' }), { base: paths.base.node.dir })
|
|
||||||
.pipe(rename(function (path) {
|
|
||||||
path.dirname = path.dirname.replace(/\/dist/, '').replace(/\\dist/, '');
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest(paths.dist.libs.dir));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('html', function () {
|
|
||||||
return gulp
|
|
||||||
.src([
|
|
||||||
paths.src.html.files,
|
|
||||||
'!' + paths.dist.base.files,
|
|
||||||
'!' + paths.src.partials.files
|
|
||||||
])
|
|
||||||
.pipe(fileinclude({
|
|
||||||
prefix: '@@',
|
|
||||||
basepath: '@file',
|
|
||||||
indent: true,
|
|
||||||
}))
|
|
||||||
.pipe(replace(/href="(.{0,10})node_modules/g, 'href="$1assets/libs'))
|
|
||||||
.pipe(replace(/src="(.{0,10})node_modules/g, 'src="$1assets/libs'))
|
|
||||||
.pipe(useref())
|
|
||||||
.pipe(cached())
|
|
||||||
.pipe(gulpif('*.js', uglify()))
|
|
||||||
.pipe(gulpif('*.css', cssnano({ svgo: false })))
|
|
||||||
.pipe(gulp.dest(paths.dist.base.dir));
|
|
||||||
});
|
|
||||||
|
|
||||||
// Default(Producation) Task
|
|
||||||
gulp.task('default', gulp.series(gulp.parallel('clean:packageLock', 'clean:dist', 'copy:all', 'copy:libs', 'fileinclude', 'scss', 'icons', 'js', 'html'), gulp.parallel('browsersync', 'watch')));
|
|
||||||
|
|
||||||
// Build(Development) Task
|
|
||||||
gulp.task('build', gulp.series('clean:packageLock', 'clean:dist', 'copy:all', 'copy:libs', 'fileinclude', 'scss', 'icons', 'js', 'html'));
|
|
||||||
@ -1,52 +1,56 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"name": "docs",
|
||||||
"name": "techwind",
|
"version": "0.1.0",
|
||||||
"version": "1.4.0",
|
"private": true,
|
||||||
"description": "Tailwind CSS Saas & Software Multipurpose Template",
|
"scripts": {
|
||||||
"main": "gulpfile.js",
|
"docusaurus": "docusaurus",
|
||||||
"author": "ShreeThemes",
|
"start": "docusaurus start",
|
||||||
"browserslist": [
|
"build": "docusaurus build",
|
||||||
"last 2 version",
|
"swizzle": "docusaurus swizzle",
|
||||||
"> 2%"
|
"deploy": "docusaurus deploy",
|
||||||
],
|
"clear": "docusaurus clear",
|
||||||
"scripts": {
|
"serve": "docusaurus serve",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"write-translations": "docusaurus write-translations",
|
||||||
},
|
"write-heading-ids": "docusaurus write-heading-ids"
|
||||||
"devDependencies": {
|
},
|
||||||
"autoprefixer": "^10.4.13",
|
"dependencies": {
|
||||||
"browser-sync": "^2.26.7",
|
"@docusaurus/core": "2.2.0",
|
||||||
"clean-css": "^5.3.1",
|
"@docusaurus/plugin-google-gtag": "^2.2.0",
|
||||||
"del": "4.1.1",
|
"@docusaurus/preset-classic": "2.2.0",
|
||||||
"gulp": "^4.0.2",
|
"@loadable/component": "^5.15.2",
|
||||||
"gulp-cached": "1.1.1",
|
"@mdx-js/react": "^1.6.22",
|
||||||
"gulp-cssnano": "2.1.3",
|
"animate.css": "^4.1.1",
|
||||||
"gulp-file-include": "2.3.0",
|
"clsx": "^1.2.1",
|
||||||
"gulp-if": "^3.0.0",
|
"docusaurus-plugin-image-zoom": "^0.1.1",
|
||||||
"gulp-npm-dist": "^1.0.3",
|
"docusaurus-plugin-sass": "^0.2.2",
|
||||||
"gulp-postcss": "^9.0.1",
|
"feather-icons": "^4.29.0",
|
||||||
"gulp-rename": "^2.0.0",
|
"jarallax": "^2.0.4",
|
||||||
"gulp-replace": "1.1.3",
|
"mdx-mermaid": "^1.3.2",
|
||||||
"gulp-sass": "^5.1.0",
|
"mermaid": "^9.2.2",
|
||||||
"gulp-sourcemaps": "^3.0.0",
|
"prism-react-renderer": "^1.3.5",
|
||||||
"gulp-uglify": "3.0.2",
|
"react": "^17.0.2",
|
||||||
"gulp-useref-plus": "0.0.8",
|
"react-dom": "^17.0.2",
|
||||||
"postcss": "^8.4.19",
|
"sass": "^1.56.1",
|
||||||
"sass": "1.56.1",
|
"tw-elements": "^1.0.0-alpha12",
|
||||||
"tailwindcss": "^3.2.4"
|
"wowjs": "^1.1.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"devDependencies": {
|
||||||
"@iconscout/unicons": "^4.0.1",
|
"@docusaurus/module-type-aliases": "2.2.0",
|
||||||
"@midzer/tobii": "^2.3.3",
|
"@iconify/react": "^4.0.0",
|
||||||
"animate.css": "^4.1.1",
|
"autoprefixer": "^10.4.13",
|
||||||
"choices.js": "^10.1.0",
|
"postcss": "^8.4.19",
|
||||||
"feather-icons": "^4.28.0",
|
"tailwindcss": "^3.2.4"
|
||||||
"gumshoejs": "^5.1.2",
|
},
|
||||||
"jarallax": "^2.0.4",
|
"browserslist": {
|
||||||
"js-datepicker": "^5.18.1",
|
"production": [
|
||||||
"shufflejs": "^6.1.0",
|
">0.5%",
|
||||||
"swiper": "8.4.5",
|
"not dead",
|
||||||
"tiny-slider": "^2.9.4",
|
"not op_mini all"
|
||||||
"tobii": "^2.0.0-alpha",
|
],
|
||||||
"wow.js": "^1.2.2"
|
"development": [
|
||||||
}
|
"last 1 chrome version",
|
||||||
|
"last 1 firefox version",
|
||||||
|
"last 1 safari version"
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 384 KiB |
|
Before Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 80 KiB |
@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1350 1350"><defs><style>.cls-1{fill:#205eab;}</style></defs><path class="cls-1" d="M733.67,1251.47c-75.58,0-146.63-29.43-200.08-82.88L40,675,533.6,181.42c53.43-53.45,124.49-82.89,200.08-82.89s146.63,29.43,200.07,82.89l293.52,293.51c110.32,110.33,110.32,289.83,0,400.14l-293.52,293.52c-53.43,53.44-124.49,82.88-200.07,82.88ZM145.48,675l440.85,440.86c81.26,81.24,213.44,81.22,294.68,0l293.52-293.52c81.24-81.24,81.24-213.43,0-294.68L881.01,234.15c-39.36-39.36-91.68-61.04-147.33-61.04s-107.99,21.68-147.34,61.04L145.48,675Z"/><g><path class="cls-1" d="M1079.78,673.48l-14.74-92.16c-2.24-15.96-14.18-24.79-32.94-24.79l-109.95-.31c-17.69,0-30.7-8.84-32.94-24.79l-.38-2.62c-3.57-25.34-21.36-46.39-45.77-54.13l-147.73-54.08c-3.68-1.19-7.09-3.07-10.03-5.56-1.06-.9-1.78-2.14-2.17-3.48l-27.63-94.9c-.28-.96-.79-1.85-1.56-2.48-8.12-6.68-20.56-4.33-25.58,5.17l-54.49,122.05c-1.98,3.74-3.12,7.88-3.33,12.12l6.69,55.63c-.31,5.88-2.41,11.57-6,16.24l-108.67,108.07c-11.57,11.57-35.77,35.77-35.77,35.77l304.33,304.36,27.13-111.43c2.33-13.05,13.15-22.89,26.34-23.96l57.58-4.64c179.88-7.69,181.76-59.61,233.29-140.3,3-4.72,4.6-10.19,4.6-15.74,0-1.33-.1-2.69-.29-4.02Zm-236.75-89.74c-13.26,3.33-50.23,1.19-53.56-12.07-3.33-13.24,28.27-32.6,41.51-35.91,13.26-3.33,26.7,4.72,30.03,17.98,3.31,13.24-4.74,26.7-17.98,30.01Z"/><path class="cls-1" d="M781.88,435.5l-29.01-108.92c-.32-1.19-1.04-2.24-2.04-2.96-6.43-4.6-15.71-2.63-19.55,4.64l-36.4,75.39,87,31.84Z"/><path class="cls-1" d="M726.53,992.3l-1.88,7.71c-4.28,17.56-26.12,23.68-38.91,10.9l-274.22-274.22-26.1-26.1,29.7-29.7,26.1,26.1,285.31,285.31Z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 419 KiB |
|
Before Width: | Height: | Size: 415 KiB |
@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 523"><defs><style>.cls-1{fill:#205eab;}</style></defs><g><path class="cls-1" d="M134.51,129.94c28.63,0,54.6,7.95,75.81,22.79,11.67,7.95,14.31,23.33,6.36,36.58-7.42,12.19-25.98,12.73-37.64,5.83-12.73-7.42-28.63-12.19-44.53-12.19-41.35,0-77.93,30.22-77.93,76.34s36.58,75.81,77.93,75.81c15.91,0,31.81-4.77,44.53-12.19,11.66-6.89,30.22-6.36,37.64,5.83,7.95,13.25,5.3,28.63-6.36,36.58-21.21,14.84-47.18,22.8-75.81,22.8C63.47,388.12,2.5,337.76,2.5,259.29S63.47,129.94,134.51,129.94Z"/><path class="cls-1" d="M261.22,258.23c0-78.46,58.85-128.3,128.83-128.3s129.88,49.83,129.88,128.3-59.37,129.89-129.88,129.89-128.83-51.43-128.83-129.89Zm204.64,0c0-45.59-34.46-75.28-75.81-75.28s-74.75,29.69-74.75,75.28,33.93,76.87,74.75,76.87,75.81-30.22,75.81-76.87Z"/><path class="cls-1" d="M633.91,293.75v64.15c0,14.84-12.19,27.57-28.1,27.57-14.84,0-26.51-12.72-26.51-27.57V160.15c0-14.84,11.67-27.57,26.51-27.57,15.91,0,28.1,12.72,28.1,27.57v31.81c12.73-44,37.11-62.03,67.86-62.03,7.95,0,15.91,.53,23.33,2.12,13.79,3.18,22.8,16.97,19.62,31.28-4.77,23.86-28.63,18.03-44.53,18.03-46.65,0-66.27,46.65-66.27,112.39Z"/><path class="cls-1" d="M788.19,302.24c13.25-5.3,23.33,1.59,27.57,10.6,10.08,19.09,29.16,29.69,53.55,29.69s42.94-11.13,42.94-29.69c0-15.9-15.38-22.79-33.4-27.03l-33.4-7.95c-52.48-14.32-71.57-42.94-68.39-82.7,3.18-36.58,42.94-65.21,88.53-65.21,32.87,0,63.09,10.6,79.53,36.58,7.42,12.72,3.71,25.44-4.77,31.81-9.01,7.42-20.15,6.89-31.81-3.18-13.78-12.19-29.69-16.97-42.41-16.97-13.79,0-29.16,4.77-34.46,13.25-4.24,6.89-4.77,13.78-2.12,21.21,3.18,9.54,18.02,14.31,31.28,18.02l38.17,9.54c53.54,13.25,64.68,48.24,64.68,73.16,0,47.71-41.88,74.75-98.61,74.75-38.17,0-76.87-20.15-90.13-56.2-4.24-13.25,1.59-25.44,13.25-29.68Z"/><path class="cls-1" d="M1006.61,258.23c0-78.46,58.85-128.3,128.83-128.3s129.88,49.83,129.88,128.3-59.37,129.89-129.88,129.89-128.83-51.43-128.83-129.89Zm204.64,0c0-45.59-34.46-75.28-75.81-75.28s-74.75,29.69-74.75,75.28,33.93,76.87,74.75,76.87,75.81-30.22,75.81-76.87Z"/></g><path class="cls-1" d="M1658.37,520.7c-33.98,0-65.93-13.23-89.96-37.26l-221.94-221.93,221.94-221.93c24.03-24.03,55.98-37.27,89.96-37.27s65.93,13.23,89.96,37.27l131.98,131.97c49.6,49.61,49.6,130.31,0,179.92l-131.98,131.98c-24.03,24.03-55.98,37.26-89.96,37.26Zm-264.47-259.2l198.22,198.22c36.53,36.53,95.97,36.52,132.5,0l131.98-131.98c36.53-36.53,36.53-95.97,0-132.5l-131.98-131.97c-17.7-17.7-41.22-27.44-66.25-27.44s-48.55,9.75-66.25,27.44l-198.22,198.22Z"/><g><path class="cls-1" d="M1813.99,260.82l-6.63-41.44c-1.01-7.17-6.37-11.15-14.81-11.15l-49.44-.14c-7.95,0-13.8-3.97-14.81-11.15l-.17-1.18c-1.61-11.39-9.61-20.86-20.58-24.34l-66.42-24.32c-1.66-.53-3.19-1.38-4.51-2.5-.48-.41-.8-.96-.97-1.57l-12.42-42.67c-.13-.43-.36-.83-.7-1.12-3.65-3-9.25-1.95-11.5,2.32l-24.5,54.88c-.89,1.68-1.4,3.54-1.5,5.45l3.01,25.01c-.14,2.64-1.08,5.2-2.7,7.3l-48.86,48.59c-5.2,5.2-16.08,16.08-16.08,16.08l136.84,136.85,12.2-50.1c1.05-5.87,5.91-10.29,11.84-10.77l25.89-2.09c80.88-3.46,81.72-26.8,104.9-63.08,1.35-2.12,2.07-4.58,2.07-7.08,0-.6-.04-1.21-.13-1.81Zm-106.45-40.35c-5.96,1.5-22.58,.54-24.08-5.43-1.5-5.95,12.71-14.66,18.66-16.15,5.96-1.5,12,2.12,13.5,8.08,1.49,5.95-2.13,12-8.08,13.49Z"/><path class="cls-1" d="M1680.04,153.81l-13.04-48.97c-.14-.53-.47-1.01-.92-1.33-2.89-2.07-7.06-1.18-8.79,2.09l-16.37,33.9,39.12,14.32Z"/><path class="cls-1" d="M1655.16,404.17l-.85,3.47c-1.93,7.9-11.75,10.65-17.49,4.9l-123.3-123.3-11.74-11.74,13.35-13.35,11.74,11.74,128.28,128.28Z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.5 KiB |
@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 523"><defs><style>.cls-1{fill:#fff;}</style></defs><g><path class="cls-1" d="M134.51,129.94c28.63,0,54.6,7.95,75.81,22.79,11.67,7.95,14.31,23.33,6.36,36.58-7.42,12.19-25.98,12.73-37.64,5.83-12.73-7.42-28.63-12.19-44.53-12.19-41.35,0-77.93,30.22-77.93,76.34s36.58,75.81,77.93,75.81c15.91,0,31.81-4.77,44.53-12.19,11.66-6.89,30.22-6.36,37.64,5.83,7.95,13.25,5.3,28.63-6.36,36.58-21.21,14.84-47.18,22.8-75.81,22.8C63.47,388.12,2.5,337.76,2.5,259.29S63.47,129.94,134.51,129.94Z"/><path class="cls-1" d="M261.22,258.23c0-78.46,58.85-128.3,128.83-128.3s129.88,49.83,129.88,128.3-59.37,129.89-129.88,129.89-128.83-51.43-128.83-129.89Zm204.64,0c0-45.59-34.46-75.28-75.81-75.28s-74.75,29.69-74.75,75.28,33.93,76.87,74.75,76.87,75.81-30.22,75.81-76.87Z"/><path class="cls-1" d="M633.91,293.75v64.15c0,14.84-12.19,27.57-28.1,27.57-14.84,0-26.51-12.72-26.51-27.57V160.15c0-14.84,11.67-27.57,26.51-27.57,15.91,0,28.1,12.72,28.1,27.57v31.81c12.73-44,37.11-62.03,67.86-62.03,7.95,0,15.91,.53,23.33,2.12,13.79,3.18,22.8,16.97,19.62,31.28-4.77,23.86-28.63,18.03-44.53,18.03-46.65,0-66.27,46.65-66.27,112.39Z"/><path class="cls-1" d="M788.19,302.24c13.25-5.3,23.33,1.59,27.57,10.6,10.08,19.09,29.16,29.69,53.55,29.69s42.94-11.13,42.94-29.69c0-15.9-15.38-22.79-33.4-27.03l-33.4-7.95c-52.48-14.32-71.57-42.94-68.39-82.7,3.18-36.58,42.94-65.21,88.53-65.21,32.87,0,63.09,10.6,79.53,36.58,7.42,12.72,3.71,25.44-4.77,31.81-9.01,7.42-20.15,6.89-31.81-3.18-13.78-12.19-29.69-16.97-42.41-16.97-13.79,0-29.16,4.77-34.46,13.25-4.24,6.89-4.77,13.78-2.12,21.21,3.18,9.54,18.02,14.31,31.28,18.02l38.17,9.54c53.54,13.25,64.68,48.24,64.68,73.16,0,47.71-41.88,74.75-98.61,74.75-38.17,0-76.87-20.15-90.13-56.2-4.24-13.25,1.59-25.44,13.25-29.68Z"/><path class="cls-1" d="M1006.61,258.23c0-78.46,58.85-128.3,128.83-128.3s129.88,49.83,129.88,128.3-59.37,129.89-129.88,129.89-128.83-51.43-128.83-129.89Zm204.64,0c0-45.59-34.46-75.28-75.81-75.28s-74.75,29.69-74.75,75.28,33.93,76.87,74.75,76.87,75.81-30.22,75.81-76.87Z"/></g><path class="cls-1" d="M1658.37,520.7c-33.98,0-65.93-13.23-89.96-37.26l-221.94-221.93,221.94-221.93c24.03-24.03,55.98-37.27,89.96-37.27s65.93,13.23,89.96,37.27l131.98,131.97c49.6,49.61,49.6,130.31,0,179.92l-131.98,131.98c-24.03,24.03-55.98,37.26-89.96,37.26Zm-264.47-259.2l198.22,198.22c36.53,36.53,95.97,36.52,132.5,0l131.98-131.98c36.53-36.53,36.53-95.97,0-132.5l-131.98-131.97c-17.7-17.7-41.22-27.44-66.25-27.44s-48.55,9.75-66.25,27.44l-198.22,198.22Z"/><g><path class="cls-1" d="M1813.99,260.82l-6.63-41.44c-1.01-7.17-6.37-11.15-14.81-11.15l-49.44-.14c-7.95,0-13.8-3.97-14.81-11.15l-.17-1.18c-1.61-11.39-9.61-20.86-20.58-24.34l-66.42-24.32c-1.66-.53-3.19-1.38-4.51-2.5-.48-.41-.8-.96-.97-1.57l-12.42-42.67c-.13-.43-.36-.83-.7-1.12-3.65-3-9.25-1.95-11.5,2.32l-24.5,54.88c-.89,1.68-1.4,3.54-1.5,5.45l3.01,25.01c-.14,2.64-1.08,5.2-2.7,7.3l-48.86,48.59c-5.2,5.2-16.08,16.08-16.08,16.08l136.84,136.85,12.2-50.1c1.05-5.87,5.91-10.29,11.84-10.77l25.89-2.09c80.88-3.46,81.72-26.8,104.9-63.08,1.35-2.12,2.07-4.58,2.07-7.08,0-.6-.04-1.21-.13-1.81Zm-106.45-40.35c-5.96,1.5-22.58,.54-24.08-5.43-1.5-5.95,12.71-14.66,18.66-16.15,5.96-1.5,12,2.12,13.5,8.08,1.49,5.95-2.13,12-8.08,13.49Z"/><path class="cls-1" d="M1680.04,153.81l-13.04-48.97c-.14-.53-.47-1.01-.92-1.33-2.89-2.07-7.06-1.18-8.79,2.09l-16.37,33.9,39.12,14.32Z"/><path class="cls-1" d="M1655.16,404.17l-.85,3.47c-1.93,7.9-11.75,10.65-17.49,4.9l-123.3-123.3-11.74-11.74,13.35-13.35,11.74,11.74,128.28,128.28Z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.5 KiB |
@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1350 1350"><defs><style>.cls-1{fill:#205eab;}</style></defs><path class="cls-1" d="M733.67,1251.47c-75.58,0-146.63-29.43-200.08-82.88L40,675,533.6,181.42c53.43-53.45,124.49-82.89,200.08-82.89s146.63,29.43,200.07,82.89l293.52,293.51c110.32,110.33,110.32,289.83,0,400.14l-293.52,293.52c-53.43,53.44-124.49,82.88-200.07,82.88ZM145.48,675l440.85,440.86c81.26,81.24,213.44,81.22,294.68,0l293.52-293.52c81.24-81.24,81.24-213.43,0-294.68L881.01,234.15c-39.36-39.36-91.68-61.04-147.33-61.04s-107.99,21.68-147.34,61.04L145.48,675Z"/><g><path class="cls-1" d="M1079.78,673.48l-14.74-92.16c-2.24-15.96-14.18-24.79-32.94-24.79l-109.95-.31c-17.69,0-30.7-8.84-32.94-24.79l-.38-2.62c-3.57-25.34-21.36-46.39-45.77-54.13l-147.73-54.08c-3.68-1.19-7.09-3.07-10.03-5.56-1.06-.9-1.78-2.14-2.17-3.48l-27.63-94.9c-.28-.96-.79-1.85-1.56-2.48-8.12-6.68-20.56-4.33-25.58,5.17l-54.49,122.05c-1.98,3.74-3.12,7.88-3.33,12.12l6.69,55.63c-.31,5.88-2.41,11.57-6,16.24l-108.67,108.07c-11.57,11.57-35.77,35.77-35.77,35.77l304.33,304.36,27.13-111.43c2.33-13.05,13.15-22.89,26.34-23.96l57.58-4.64c179.88-7.69,181.76-59.61,233.29-140.3,3-4.72,4.6-10.19,4.6-15.74,0-1.33-.1-2.69-.29-4.02Zm-236.75-89.74c-13.26,3.33-50.23,1.19-53.56-12.07-3.33-13.24,28.27-32.6,41.51-35.91,13.26-3.33,26.7,4.72,30.03,17.98,3.31,13.24-4.74,26.7-17.98,30.01Z"/><path class="cls-1" d="M781.88,435.5l-29.01-108.92c-.32-1.19-1.04-2.24-2.04-2.96-6.43-4.6-15.71-2.63-19.55,4.64l-36.4,75.39,87,31.84Z"/><path class="cls-1" d="M726.53,992.3l-1.88,7.71c-4.28,17.56-26.12,23.68-38.91,10.9l-274.22-274.22-26.1-26.1,29.7-29.7,26.1,26.1,285.31,285.31Z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1350 1350"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M733.67,1251.47c-75.58,0-146.63-29.43-200.08-82.88L40,675,533.6,181.42c53.43-53.45,124.49-82.89,200.08-82.89s146.63,29.43,200.07,82.89l293.52,293.51c110.32,110.33,110.32,289.83,0,400.14l-293.52,293.52c-53.43,53.44-124.49,82.88-200.07,82.88ZM145.48,675l440.85,440.86c81.26,81.24,213.44,81.22,294.68,0l293.52-293.52c81.24-81.24,81.24-213.43,0-294.68L881.01,234.15c-39.36-39.36-91.68-61.04-147.33-61.04s-107.99,21.68-147.34,61.04L145.48,675Z"/><g><path class="cls-1" d="M1079.78,673.48l-14.74-92.16c-2.24-15.96-14.18-24.79-32.94-24.79l-109.95-.31c-17.69,0-30.7-8.84-32.94-24.79l-.38-2.62c-3.57-25.34-21.36-46.39-45.77-54.13l-147.73-54.08c-3.68-1.19-7.09-3.07-10.03-5.56-1.06-.9-1.78-2.14-2.17-3.48l-27.63-94.9c-.28-.96-.79-1.85-1.56-2.48-8.12-6.68-20.56-4.33-25.58,5.17l-54.49,122.05c-1.98,3.74-3.12,7.88-3.33,12.12l6.69,55.63c-.31,5.88-2.41,11.57-6,16.24l-108.67,108.07c-11.57,11.57-35.77,35.77-35.77,35.77l304.33,304.36,27.13-111.43c2.33-13.05,13.15-22.89,26.34-23.96l57.58-4.64c179.88-7.69,181.76-59.61,233.29-140.3,3-4.72,4.6-10.19,4.6-15.74,0-1.33-.1-2.69-.29-4.02Zm-236.75-89.74c-13.26,3.33-50.23,1.19-53.56-12.07-3.33-13.24,28.27-32.6,41.51-35.91,13.26-3.33,26.7,4.72,30.03,17.98,3.31,13.24-4.74,26.7-17.98,30.01Z"/><path class="cls-1" d="M781.88,435.5l-29.01-108.92c-.32-1.19-1.04-2.24-2.04-2.96-6.43-4.6-15.71-2.63-19.55,4.64l-36.4,75.39,87,31.84Z"/><path class="cls-1" d="M726.53,992.3l-1.88,7.71c-4.28,17.56-26.12,23.68-38.91,10.9l-274.22-274.22-26.1-26.1,29.7-29.7,26.1,26.1,285.31,285.31Z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 88 KiB |
@ -1,29 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg version="1.1" id="PowerShell" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
width="204.691px" height="154.521px" viewBox="0 0 204.691 154.521" style="enable-background:new 0 0 204.691 154.521;"
|
|
||||||
xml:space="preserve">
|
|
||||||
<g>
|
|
||||||
<path style="display:none;fill-rule:evenodd;clip-rule:evenodd;fill:#2671BE;" d="M-47.547,226.872
|
|
||||||
c0-97.129,0.094-194.259-0.195-291.387c-0.021-6.982,1.404-8.411,8.388-8.389c94.397,0.292,188.798,0.292,283.195,0
|
|
||||||
c6.984-0.022,8.41,1.407,8.389,8.389c-0.289,97.128-0.195,194.258-0.195,291.387c-3.238,2.008-6.837,1.129-10.268,1.131
|
|
||||||
c-93.015,0.049-186.031,0.049-279.047,0C-40.711,228.001-44.31,228.88-47.547,226.872z"/>
|
|
||||||
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#E0EAF5;" d="M120.14,0.032c23.011-0.008,46.023-0.078,69.034,0.019
|
|
||||||
c13.68,0.056,17.537,4.627,14.588,18.137c-8.636,39.566-17.466,79.092-26.415,118.589c-2.83,12.484-9.332,17.598-22.465,17.637
|
|
||||||
c-46.023,0.137-92.046,0.152-138.068-0.006c-15.043-0.053-19-5.148-15.759-19.404C9.849,96.287,18.69,57.582,27.602,18.892
|
|
||||||
C30.997,4.148,36.099,0.1,51.104,0.057C74.116-0.008,97.128,0.04,120.14,0.032z"/>
|
|
||||||
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#2671BE;" d="M85.365,149.813c-23.014-0.008-46.029,0.098-69.042-0.053
|
|
||||||
c-11.67-0.076-13.792-2.83-11.165-14.244c8.906-38.71,18.099-77.355,26.807-116.109C34.3,9.013,39.337,4.419,50.473,4.522
|
|
||||||
c46.024,0.427,92.056,0.137,138.083,0.184c11.543,0.011,13.481,2.48,10.89,14.187c-8.413,38.007-16.879,76.003-25.494,113.965
|
|
||||||
c-3.224,14.207-6.938,16.918-21.885,16.951C129.833,149.856,107.598,149.821,85.365,149.813z"/>
|
|
||||||
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#FDFDFE;" d="M104.948,73.951c-1.543-1.81-3.237-3.894-5.031-5.886
|
|
||||||
c-10.173-11.3-20.256-22.684-30.61-33.815c-4.738-5.094-6.248-10.041-0.558-15.069c5.623-4.97,11.148-4.53,16.306,1.188
|
|
||||||
c14.365,15.919,28.713,31.856,43.316,47.556c5.452,5.864,4.182,9.851-1.823,14.196c-23.049,16.683-45.968,33.547-68.862,50.443
|
|
||||||
c-5.146,3.799-10.052,4.75-14.209-0.861c-4.586-6.189-0.343-9.871,4.414-13.335c17.013-12.392,33.993-24.83,50.9-37.366
|
|
||||||
C101.146,79.256,104.527,78.238,104.948,73.951z"/>
|
|
||||||
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#FCFDFD;" d="M112.235,133.819c-6.196,0-12.401,0.213-18.583-0.068
|
|
||||||
c-4.932-0.223-7.9-2.979-7.838-8.174c0.06-4.912,2.536-8.605,7.463-8.738c13.542-0.363,27.104-0.285,40.651-0.02
|
|
||||||
c4.305,0.084,7.483,2.889,7.457,7.375c-0.031,5.146-2.739,9.133-8.25,9.465c-6.944,0.42-13.931,0.104-20.899,0.104
|
|
||||||
C112.235,133.78,112.235,133.8,112.235,133.819z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 24 KiB |
@ -1,329 +0,0 @@
|
|||||||
/* Template Name: Techwind - Multipurpose Tailwind CSS Landing Page Template
|
|
||||||
Author: Shreethemes
|
|
||||||
Email: support@shreethemes.in
|
|
||||||
Website: https://shreethemes.in
|
|
||||||
Version: 1.4.0
|
|
||||||
Created: May 2022
|
|
||||||
File Description: Main JS file of the template
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************/
|
|
||||||
/* INDEX */
|
|
||||||
/*================================
|
|
||||||
* 01. Loader *
|
|
||||||
* 02. Toggle Menus *
|
|
||||||
* 03. Active Menu *
|
|
||||||
* 04. Clickable Menu *
|
|
||||||
* 05. Back to top *
|
|
||||||
* 06. Feather icon *
|
|
||||||
* 06. DD Menu *
|
|
||||||
* 06. Active Sidebar Menu *
|
|
||||||
* 07. Contact us *
|
|
||||||
* 08. Wow Animation JS *
|
|
||||||
================================*/
|
|
||||||
|
|
||||||
|
|
||||||
window.addEventListener('load', fn, false)
|
|
||||||
|
|
||||||
// window.onload = function loader() {
|
|
||||||
function fn() {
|
|
||||||
// Preloader
|
|
||||||
if (document.getElementById('preloader')) {
|
|
||||||
setTimeout(() => {
|
|
||||||
document.getElementById('preloader').style.visibility = 'hidden';
|
|
||||||
document.getElementById('preloader').style.opacity = '0';
|
|
||||||
}, 350);
|
|
||||||
}
|
|
||||||
// Menus
|
|
||||||
activateMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Menu
|
|
||||||
/*********************/
|
|
||||||
/* Toggle Menu */
|
|
||||||
/*********************/
|
|
||||||
function toggleMenu() {
|
|
||||||
document.getElementById('isToggle').classList.toggle('open');
|
|
||||||
var isOpen = document.getElementById('navigation')
|
|
||||||
if (isOpen.style.display === "block") {
|
|
||||||
isOpen.style.display = "none";
|
|
||||||
} else {
|
|
||||||
isOpen.style.display = "block";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/*********************/
|
|
||||||
/* Menu Active */
|
|
||||||
/*********************/
|
|
||||||
function getClosest(elem, selector) {
|
|
||||||
|
|
||||||
// Element.matches() polyfill
|
|
||||||
if (!Element.prototype.matches) {
|
|
||||||
Element.prototype.matches =
|
|
||||||
Element.prototype.matchesSelector ||
|
|
||||||
Element.prototype.mozMatchesSelector ||
|
|
||||||
Element.prototype.msMatchesSelector ||
|
|
||||||
Element.prototype.oMatchesSelector ||
|
|
||||||
Element.prototype.webkitMatchesSelector ||
|
|
||||||
function (s) {
|
|
||||||
var matches = (this.document || this.ownerDocument).querySelectorAll(s),
|
|
||||||
i = matches.length;
|
|
||||||
while (--i >= 0 && matches.item(i) !== this) {}
|
|
||||||
return i > -1;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the closest matching element
|
|
||||||
for (; elem && elem !== document; elem = elem.parentNode) {
|
|
||||||
if (elem.matches(selector)) return elem;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
function activateMenu() {
|
|
||||||
var menuItems = document.getElementsByClassName("sub-menu-item");
|
|
||||||
if (menuItems) {
|
|
||||||
|
|
||||||
var matchingMenuItem = null;
|
|
||||||
for (var idx = 0; idx < menuItems.length; idx++) {
|
|
||||||
if (menuItems[idx].href === window.location.href) {
|
|
||||||
matchingMenuItem = menuItems[idx];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (matchingMenuItem) {
|
|
||||||
matchingMenuItem.classList.add('active');
|
|
||||||
|
|
||||||
|
|
||||||
var immediateParent = getClosest(matchingMenuItem, 'li');
|
|
||||||
|
|
||||||
if (immediateParent) {
|
|
||||||
immediateParent.classList.add('active');
|
|
||||||
}
|
|
||||||
|
|
||||||
var parent = getClosest(immediateParent, '.child-menu-item');
|
|
||||||
if(parent){
|
|
||||||
parent.classList.add('active');
|
|
||||||
}
|
|
||||||
|
|
||||||
var parent = getClosest(parent || immediateParent , '.parent-menu-item');
|
|
||||||
|
|
||||||
if (parent) {
|
|
||||||
parent.classList.add('active');
|
|
||||||
|
|
||||||
var parentMenuitem = parent.querySelector('.menu-item');
|
|
||||||
if (parentMenuitem) {
|
|
||||||
parentMenuitem.classList.add('active');
|
|
||||||
}
|
|
||||||
|
|
||||||
var parentOfParent = getClosest(parent, '.parent-parent-menu-item');
|
|
||||||
if (parentOfParent) {
|
|
||||||
parentOfParent.classList.add('active');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var parentOfParent = getClosest(matchingMenuItem, '.parent-parent-menu-item');
|
|
||||||
if (parentOfParent) {
|
|
||||||
parentOfParent.classList.add('active');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*********************/
|
|
||||||
/* Clickable manu */
|
|
||||||
/*********************/
|
|
||||||
if (document.getElementById("navigation")) {
|
|
||||||
var elements = document.getElementById("navigation").getElementsByTagName("a");
|
|
||||||
for (var i = 0, len = elements.length; i < len; i++) {
|
|
||||||
elements[i].onclick = function (elem) {
|
|
||||||
if (elem.target.getAttribute("href") === "javascript:void(0)") {
|
|
||||||
var submenu = elem.target.nextElementSibling.nextElementSibling;
|
|
||||||
submenu.classList.toggle('open');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*********************/
|
|
||||||
/* Menu Sticky */
|
|
||||||
/*********************/
|
|
||||||
function windowScroll() {
|
|
||||||
const navbar = document.getElementById("topnav");
|
|
||||||
if (navbar != null) {
|
|
||||||
if (
|
|
||||||
document.body.scrollTop >= 50 ||
|
|
||||||
document.documentElement.scrollTop >= 50
|
|
||||||
) {
|
|
||||||
navbar.classList.add("nav-sticky");
|
|
||||||
} else {
|
|
||||||
navbar.classList.remove("nav-sticky");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('scroll', (ev) => {
|
|
||||||
ev.preventDefault();
|
|
||||||
windowScroll();
|
|
||||||
})
|
|
||||||
/*********************/
|
|
||||||
/* Back To TOp */
|
|
||||||
/*********************/
|
|
||||||
|
|
||||||
window.onscroll = function () {
|
|
||||||
scrollFunction();
|
|
||||||
};
|
|
||||||
|
|
||||||
function scrollFunction() {
|
|
||||||
var mybutton = document.getElementById("back-to-top");
|
|
||||||
if(mybutton!=null){
|
|
||||||
if (document.body.scrollTop > 500 || document.documentElement.scrollTop > 500) {
|
|
||||||
mybutton.classList.add("block");
|
|
||||||
mybutton.classList.remove("hidden");
|
|
||||||
} else {
|
|
||||||
mybutton.classList.add("hidden");
|
|
||||||
mybutton.classList.remove("block");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function topFunction() {
|
|
||||||
document.body.scrollTop = 0;
|
|
||||||
document.documentElement.scrollTop = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************/
|
|
||||||
/* Active Sidebar */
|
|
||||||
/*********************/
|
|
||||||
(function () {
|
|
||||||
var current = location.pathname.substring(location.pathname.lastIndexOf('/') + 1);;
|
|
||||||
if (current === "") return;
|
|
||||||
var menuItems = document.querySelectorAll('.sidebar-nav a');
|
|
||||||
for (var i = 0, len = menuItems.length; i < len; i++) {
|
|
||||||
if (menuItems[i].getAttribute("href").indexOf(current) !== -1) {
|
|
||||||
menuItems[i].parentElement.className += " active";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
|
|
||||||
/*********************/
|
|
||||||
/* Feather Icons */
|
|
||||||
/*********************/
|
|
||||||
feather.replace();
|
|
||||||
|
|
||||||
/*********************/
|
|
||||||
/* DD Menu */
|
|
||||||
/*********************/
|
|
||||||
var ddmenu = document.getElementsByClassName("dd-menu");
|
|
||||||
for (var i = 0, len = ddmenu.length; i < len; i++) {
|
|
||||||
ddmenu[i].onclick = function (elem) {
|
|
||||||
elem.stopPropagation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************/
|
|
||||||
/* Small Menu */
|
|
||||||
/*********************/
|
|
||||||
try {
|
|
||||||
var spy = new Gumshoe('#navmenu-nav a');
|
|
||||||
} catch (err) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************/
|
|
||||||
/* Dark & Light Mode */
|
|
||||||
/*********************/
|
|
||||||
try {
|
|
||||||
function changeTheme(e){
|
|
||||||
e.preventDefault()
|
|
||||||
const htmlTag = document.getElementsByTagName("html")[0]
|
|
||||||
|
|
||||||
if (htmlTag.className.includes("dark")) {
|
|
||||||
htmlTag.className = 'light'
|
|
||||||
} else {
|
|
||||||
htmlTag.className = 'dark'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const switcher = document.getElementById("theme-mode")
|
|
||||||
switcher?.addEventListener("click" ,changeTheme )
|
|
||||||
|
|
||||||
const chk = document.getElementById('chk');
|
|
||||||
|
|
||||||
chk.addEventListener('change',changeTheme);
|
|
||||||
} catch (err) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************/
|
|
||||||
/* WoW Js */
|
|
||||||
/*********************/
|
|
||||||
try {
|
|
||||||
new WOW().init();
|
|
||||||
} catch (error) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************/
|
|
||||||
/* Contact Js */
|
|
||||||
/*************************/
|
|
||||||
|
|
||||||
try {
|
|
||||||
function validateForm() {
|
|
||||||
var name = document.forms["myForm"]["name"].value;
|
|
||||||
var email = document.forms["myForm"]["email"].value;
|
|
||||||
var subject = document.forms["myForm"]["subject"].value;
|
|
||||||
var comments = document.forms["myForm"]["comments"].value;
|
|
||||||
document.getElementById("error-msg").style.opacity = 0;
|
|
||||||
document.getElementById('error-msg').innerHTML = "";
|
|
||||||
if (name == "" || name == null) {
|
|
||||||
document.getElementById('error-msg').innerHTML = "<div class='alert alert-warning error_message'>*Please enter a Name*</div>";
|
|
||||||
fadeIn();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (email == "" || email == null) {
|
|
||||||
document.getElementById('error-msg').innerHTML = "<div class='alert alert-warning error_message'>*Please enter a Email*</div>";
|
|
||||||
fadeIn();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (subject == "" || subject == null) {
|
|
||||||
document.getElementById('error-msg').innerHTML = "<div class='alert alert-warning error_message'>*Please enter a Subject*</div>";
|
|
||||||
fadeIn();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (comments == "" || comments == null) {
|
|
||||||
document.getElementById('error-msg').innerHTML = "<div class='alert alert-warning error_message'>*Please enter a Comments*</div>";
|
|
||||||
fadeIn();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var xhttp = new XMLHttpRequest();
|
|
||||||
xhttp.onreadystatechange = function () {
|
|
||||||
if (this.readyState == 4 && this.status == 200) {
|
|
||||||
document.getElementById("simple-msg").innerHTML = this.responseText;
|
|
||||||
document.forms["myForm"]["name"].value = "";
|
|
||||||
document.forms["myForm"]["email"].value = "";
|
|
||||||
document.forms["myForm"]["subject"].value = "";
|
|
||||||
document.forms["myForm"]["comments"].value = "";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
xhttp.open("POST", "php/contact.php", true);
|
|
||||||
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
|
|
||||||
xhttp.send("name=" + name + "&email=" + email + "&subject=" + subject + "&comments=" + comments);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function fadeIn() {
|
|
||||||
var fade = document.getElementById("error-msg");
|
|
||||||
var opacity = 0;
|
|
||||||
var intervalID = setInterval(function () {
|
|
||||||
if (opacity < 1) {
|
|
||||||
opacity = opacity + 0.5
|
|
||||||
fade.style.opacity = opacity;
|
|
||||||
} else {
|
|
||||||
clearInterval(intervalID);
|
|
||||||
}
|
|
||||||
}, 200);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
|
|
||||||
}
|
|
||||||
3
website/src/assets/js/wow.min.js
vendored
@ -1,18 +0,0 @@
|
|||||||
/********************/
|
|
||||||
/* Breadcrumb */
|
|
||||||
/*==================*/
|
|
||||||
|
|
||||||
.breadcrumb {
|
|
||||||
.breadcrumb-item {
|
|
||||||
@apply before:content-[''] after:text-sm after:text-black after:dark:text-white after:pl-[5px] last:after:hidden;
|
|
||||||
&:after {
|
|
||||||
content: "\F0142" !important;
|
|
||||||
font-family: 'Material Design Icons';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.breadcrumb-light {
|
|
||||||
.breadcrumb-item {
|
|
||||||
@apply after:text-white/50;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
/********************/
|
|
||||||
/* Buttons */
|
|
||||||
/*==================*/
|
|
||||||
/* Note: If you want to add your own colors, you can do so by going to this tailwind.config.js file */
|
|
||||||
.btn {
|
|
||||||
@apply py-2 px-5 inline-block font-semibold tracking-wide border align-middle transition duration-500 ease-in-out text-base text-center;
|
|
||||||
&.btn-lg{
|
|
||||||
@apply py-2.5 px-6 text-lg;
|
|
||||||
}
|
|
||||||
&.btn-sm{
|
|
||||||
@apply py-[5px] px-4 text-sm;
|
|
||||||
}
|
|
||||||
/* Button icons */
|
|
||||||
&.btn-icon {
|
|
||||||
@apply p-0 h-9 w-9 inline-flex items-center text-center justify-center text-base;
|
|
||||||
&.btn-lg {
|
|
||||||
@apply h-12 w-12;
|
|
||||||
}
|
|
||||||
&.btn-sm {
|
|
||||||
@apply h-8 w-8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Button Link */
|
|
||||||
&.btn-link {
|
|
||||||
@apply relative p-0 border-none after:content-[''] after:absolute after:h-px after:w-0 after:right-0 after:bottom-0 after:left-0 after:transition-all after:duration-500;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
@apply after:w-full after:right-auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
//
|
|
||||||
// _fonts.scss
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
@import url('https://fonts.googleapis.com/css?family=Nunito:300,400,500,600,700&display=swap');
|
|
||||||
@import url('https://fonts.googleapis.com/css2?family=Lexend:wght@200;300;400;500&display=swap');
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
/* // _general.scss */
|
|
||||||
|
|
||||||
/*********************************/
|
|
||||||
/* General */
|
|
||||||
/*===============================*/
|
|
||||||
p {
|
|
||||||
@apply leading-relaxed;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
|
|
||||||
@apply leading-normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
::selection {
|
|
||||||
@apply bg-indigo-600/90 text-white;
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
/*********************************/
|
|
||||||
/* Contact */
|
|
||||||
/*===============================*/
|
|
||||||
.form-input {
|
|
||||||
@apply w-full py-2 px-3 border border-inherit dark:border-gray-800 dark:bg-slate-900 dark:text-slate-200 rounded h-10 outline-none bg-transparent;
|
|
||||||
&:focus {
|
|
||||||
@apply border-indigo-600 shadow-none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Validation */
|
|
||||||
.error {
|
|
||||||
@apply my-2 mx-0 hidden text-red-600;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ajaxsuccess {
|
|
||||||
@apply text-base w-full hidden clear-both my-2 mx-0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error_message,
|
|
||||||
#success_page {
|
|
||||||
@apply p-2.5 mb-5 text-center rounded-md;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error_message {
|
|
||||||
@apply bg-red-600/5 text-red-600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-loader {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
#success_page {
|
|
||||||
@apply bg-emerald-600/5 text-emerald-600;
|
|
||||||
}
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
|
|
||||||
/*********************************/
|
|
||||||
/* Countdown */
|
|
||||||
/*===============================*/
|
|
||||||
#token-sale .count-number .count-head {
|
|
||||||
@apply relative block uppercase md:-mt-5 md:text-base text-sm leading-[1px] font-bold;
|
|
||||||
}
|
|
||||||
#countdown {
|
|
||||||
.count-down {
|
|
||||||
.count-number {
|
|
||||||
@apply text-[40px] leading-[110px] h-[130px] w-[130px] rounded-full shadow-md bg-white/10;
|
|
||||||
backdrop-filter: blur(5px);
|
|
||||||
}
|
|
||||||
.count-head {
|
|
||||||
@apply relative block -translate-y-[25px] uppercase text-sm tracking-[1px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* //maintenance */
|
|
||||||
#maintenance {
|
|
||||||
.indicator {
|
|
||||||
@apply text-lg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,92 +0,0 @@
|
|||||||
/*********************************/
|
|
||||||
/* Helper */
|
|
||||||
/*===============================*/
|
|
||||||
.container {
|
|
||||||
@apply relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Cookies */
|
|
||||||
.cookie-popup-not-accepted {
|
|
||||||
@apply block;
|
|
||||||
animation: cookie-popup-in .5s ease forwards;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cookie-popup-accepted {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes cookie-popup-in {
|
|
||||||
from {
|
|
||||||
bottom: -6.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
to {
|
|
||||||
bottom: 1.25rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Shapes */
|
|
||||||
.shape {
|
|
||||||
&>svg {
|
|
||||||
transform: scale(2);
|
|
||||||
transform-origin: theme('transformOrigin.top') theme('transformOrigin.center');
|
|
||||||
}
|
|
||||||
|
|
||||||
&.marketing-hero {
|
|
||||||
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Preloader */
|
|
||||||
#preloader {
|
|
||||||
background-image: linear-gradient(45deg, #ffffff, #ffffff);
|
|
||||||
z-index: 99999;
|
|
||||||
@apply fixed inset-0;
|
|
||||||
#status {
|
|
||||||
@apply absolute left-0 right-0 top-1/2 -translate-y-1/2;
|
|
||||||
.spinner {
|
|
||||||
@apply w-10 h-10 relative my-[100px] mx-auto;
|
|
||||||
.double-bounce1, .double-bounce2 {
|
|
||||||
@apply w-full h-full rounded-full bg-indigo-600/60 absolute top-0 left-0;
|
|
||||||
animation: sk-bounce 2.0s infinite ease-in-out;
|
|
||||||
}
|
|
||||||
.double-bounce2 {
|
|
||||||
animation-delay: -1.0s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes sk-bounce {
|
|
||||||
0%, 100% {
|
|
||||||
transform: scale(0.0);
|
|
||||||
} 50% {
|
|
||||||
transform: scale(1.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Switcher */
|
|
||||||
.label {
|
|
||||||
.ball {
|
|
||||||
transition: transform 0.2s linear;
|
|
||||||
@apply translate-x-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkbox:checked + .label .ball {
|
|
||||||
@apply translate-x-6;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Mover
|
|
||||||
.mover {
|
|
||||||
animation: mover 1.5s infinite alternate;
|
|
||||||
}
|
|
||||||
@keyframes mover {
|
|
||||||
0% {
|
|
||||||
transform: translateY(0);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: translateY(10px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,209 +0,0 @@
|
|||||||
/*********************************/
|
|
||||||
/* Home */
|
|
||||||
/*===============================*/
|
|
||||||
/* background-effect For Job Hero */
|
|
||||||
.background-effect {
|
|
||||||
.circles {
|
|
||||||
@apply absolute inset-0 h-full w-full overflow-hidden;
|
|
||||||
li {
|
|
||||||
@apply absolute block -bottom-[150px] bg-indigo-600/30;
|
|
||||||
animation: animate 25s linear infinite;
|
|
||||||
|
|
||||||
&.brand-img {
|
|
||||||
&:nth-child(1),
|
|
||||||
&:nth-child(2),
|
|
||||||
&:nth-child(3),
|
|
||||||
&:nth-child(4),
|
|
||||||
&:nth-child(5),
|
|
||||||
&:nth-child(6),
|
|
||||||
&:nth-child(7),
|
|
||||||
&:nth-child(8),
|
|
||||||
&:nth-child(9),
|
|
||||||
&:nth-child(10) {
|
|
||||||
@apply bg-transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:nth-child(1),
|
|
||||||
&:nth-child(2),
|
|
||||||
&:nth-child(3),
|
|
||||||
&:nth-child(4),
|
|
||||||
&:nth-child(5),
|
|
||||||
&:nth-child(6),
|
|
||||||
&:nth-child(7),
|
|
||||||
&:nth-child(8),
|
|
||||||
&:nth-child(9),
|
|
||||||
&:nth-child(10) {
|
|
||||||
@apply w-12 h-12;
|
|
||||||
}
|
|
||||||
&:nth-child(1) {
|
|
||||||
@apply left-1/4;
|
|
||||||
animation-delay: 0s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(2) {
|
|
||||||
@apply left-[10%];
|
|
||||||
animation-delay: 2s;
|
|
||||||
animation-duration: 12s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(3) {
|
|
||||||
@apply left-[70%];
|
|
||||||
animation-delay: 4s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(4) {
|
|
||||||
@apply left-[40%];
|
|
||||||
animation-delay: 0s;
|
|
||||||
animation-duration: 18s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(5) {
|
|
||||||
@apply left-[65%];
|
|
||||||
animation-delay: 0s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(6) {
|
|
||||||
@apply left-3/4;
|
|
||||||
animation-delay: 3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(7) {
|
|
||||||
@apply left-[35%];
|
|
||||||
animation-delay: 7s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(8) {
|
|
||||||
@apply left-1/2;
|
|
||||||
animation-delay: 15s;
|
|
||||||
animation-duration: 45s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(9) {
|
|
||||||
@apply left-[20%];
|
|
||||||
animation-delay: 2s;
|
|
||||||
animation-duration: 35s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:nth-child(10) {
|
|
||||||
@apply left-[85%];
|
|
||||||
animation-delay: 0s;
|
|
||||||
animation-duration: 11s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes animate {
|
|
||||||
0% {
|
|
||||||
transform: translateY(0) rotate(0deg);
|
|
||||||
opacity: 1;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
transform: translateY(-1000px) rotate(720deg);
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* studio home */
|
|
||||||
.studio-wrapper {
|
|
||||||
@apply before:content-[''] before:absolute before:bottom-[14rem] before:left-[50rem] before:w-[60rem] before:h-[30rem] before:rounded-[18rem] before:rotate-[135deg] before:bg-indigo-600/5 dark:before:bg-indigo-600/10;
|
|
||||||
}
|
|
||||||
@media (min-width: 1024px) and (max-width: 1140px) {
|
|
||||||
.studio-wrapper {
|
|
||||||
@apply before:bottom-[10rem] before:left-[30rem] before:w-[40rem] before:h-[20rem];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
.studio-wrapper {
|
|
||||||
@apply before:left-[12rem];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
.studio-wrapper {
|
|
||||||
@apply before:left-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Startup Hero */
|
|
||||||
.startup-wrapper {
|
|
||||||
@apply before:content-[''] before:absolute before:bottom-40 before:left-[45rem] before:w-[90rem] before:h-[35rem] before:rotate-[115deg] before:bg-indigo-600;
|
|
||||||
|
|
||||||
@apply after:content-[''] after:absolute after:bottom-96 after:left-[30rem] after:w-[75rem] after:h-40 after:rotate-[115deg] after:bg-indigo-600/10 after:-z-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 1024px) and (max-width: 1140px) {
|
|
||||||
.startup-wrapper {
|
|
||||||
@apply before:left-40 before:w-[75rem] before:h-[30rem] after:left-0 after:bottom-80 after:w-[75rem] after:h-60;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
.startup-wrapper {
|
|
||||||
@apply before:left-40 after:left-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
.startup-wrapper {
|
|
||||||
@apply before:left-0 after:-left-40;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Kenburn Effect for Business Demo */
|
|
||||||
.image-wrap {
|
|
||||||
animation: 100s ppb_kenburns linear infinite alternate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes move {
|
|
||||||
0% {
|
|
||||||
transform-origin: bottom;
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: scale(1.4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes ppb_kenburns {
|
|
||||||
0% {
|
|
||||||
transform: scale(1.3) translate(-10%, 10%);
|
|
||||||
}
|
|
||||||
25% {
|
|
||||||
transform: scale(1) translate(0, 0);
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
transform: scale(1.3) translate(10%, 10%);
|
|
||||||
}
|
|
||||||
75% {
|
|
||||||
transform: scale(1) translate(0, 0);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: scale(1.3) translate(-10%, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Saas */
|
|
||||||
.home-wrapper {
|
|
||||||
@apply before:content-[''] before:absolute before:-top-[30%] before:-left-80 before:right-0 before:w-[140rem] before:h-[65rem] before:-rotate-12 before:bg-indigo-600/5 dark:before:bg-indigo-600/10 before:z-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 769px) and (max-width: 1024px) {
|
|
||||||
.home-wrapper {
|
|
||||||
@apply before:-top-[50%];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: 426px) and (max-width: 768px) {
|
|
||||||
.home-wrapper {
|
|
||||||
@apply before:-top-[80%];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (max-width: 425px) {
|
|
||||||
.home-wrapper {
|
|
||||||
@apply before:-top-[90%];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
/*********************************/
|
|
||||||
/* Portfolio */
|
|
||||||
/*===============================*/
|
|
||||||
.container-filter {
|
|
||||||
li {
|
|
||||||
&.active,
|
|
||||||
&:hover {
|
|
||||||
@apply text-slate-900 dark:text-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.container-filter-box {
|
|
||||||
li {
|
|
||||||
&.active,
|
|
||||||
&:hover {
|
|
||||||
@apply text-indigo-600 border-indigo-600 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.container-filter-border-bottom {
|
|
||||||
li {
|
|
||||||
&.active,
|
|
||||||
&:hover {
|
|
||||||
@apply text-slate-900 dark:text-white border-b-slate-900 dark:border-b-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.container-filter-white {
|
|
||||||
li {
|
|
||||||
&.active,
|
|
||||||
&:hover {
|
|
||||||
@apply text-white border-b-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.container-creative {
|
|
||||||
li {
|
|
||||||
@apply after:content-[''] after:absolute after:h-0 after:w-0 after:bg-indigo-600/40 after:right-0 after:left-0 after:bottom-[5px] after:rounded-md after:transition-all after:duration-500 after:ease-in-out;
|
|
||||||
&:hover,
|
|
||||||
&.active {
|
|
||||||
@apply after:w-full after:right-auto after:left-0 after:h-[5px] after:top-[60%] text-black dark:text-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************/
|
|
||||||
/* Tobii Lightbox */
|
|
||||||
/*===============================*/
|
|
||||||
/* Tobii Lighbox */
|
|
||||||
.tobii>button.tobii__close svg,
|
|
||||||
.tobii>button.tobii__prev svg,
|
|
||||||
.tobii>button.tobii__next svg {
|
|
||||||
@apply h-9 w-auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tobii__counter {
|
|
||||||
@apply text-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tobii-zoom {
|
|
||||||
@apply block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tobii-zoom__icon {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
#grid {
|
|
||||||
@apply p-0;
|
|
||||||
}
|
|
||||||
@ -1,65 +0,0 @@
|
|||||||
/*********************************/
|
|
||||||
/* Choices */
|
|
||||||
/*===============================*/
|
|
||||||
.filter-search-form {
|
|
||||||
.icons {
|
|
||||||
@apply absolute top-[48%] -translate-y-1/2 left-3 z-1 text-indigo-600 text-[20px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.registration-form {
|
|
||||||
@apply relative;
|
|
||||||
.submit-btn {
|
|
||||||
@apply rounded-lg;
|
|
||||||
}
|
|
||||||
.form-input,
|
|
||||||
.choices[data-type*=select-one] .choices__inner {
|
|
||||||
@apply rounded-lg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width:992px) {
|
|
||||||
.filter-border {
|
|
||||||
@apply before:content-[''] before:absolute before:top-[10px] before:right-0 before:h-10 before:z-1 before:border-r before:border-inherit before:rounded-md before:outline-0 dark:before:border-gray-700;
|
|
||||||
}
|
|
||||||
.registration-form {
|
|
||||||
@apply relative;
|
|
||||||
.submit-btn {
|
|
||||||
@apply rounded-t-none rounded-r-sm rounded-b-sm rounded-l-none;
|
|
||||||
}
|
|
||||||
.form-input {
|
|
||||||
@apply rounded-t-sm rounded-r-none rounded-b-none rounded-l-sm outline-0;
|
|
||||||
}
|
|
||||||
.choices[data-type*=select-one] .choices__inner {
|
|
||||||
@apply rounded-none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.filter-input-box,
|
|
||||||
.filter-input-box.form-select,
|
|
||||||
.filter-search-form .choices__inner {
|
|
||||||
@apply shadow-none border-0 rounded-none text-[15px] h-[60px] pt-[13px] pr-[6px] pb-[15px] pl-[45px];
|
|
||||||
}
|
|
||||||
|
|
||||||
.choices__inner {
|
|
||||||
@apply bg-gray-50 dark:bg-slate-800;
|
|
||||||
}
|
|
||||||
|
|
||||||
.choices__list--dropdown,
|
|
||||||
.choices[data-type*=select-one] .choices__input {
|
|
||||||
@apply bg-white dark:bg-slate-900 border-0 rounded-[5px] shadow dark:shadow-gray-800 z-999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.choices__list--dropdown .choices__item--selectable.is-highlighted {
|
|
||||||
@apply bg-gray-50 dark:bg-slate-800 text-black dark:text-white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.choices__list,
|
|
||||||
.choices__list--dropdown .choices__item--selectable {
|
|
||||||
@apply text-slate-400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.choices__list--dropdown,
|
|
||||||
.choices__list[aria-expanded] {
|
|
||||||
@apply border-0 z-2;
|
|
||||||
}
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
/*********************************/
|
|
||||||
/* Datepicker */
|
|
||||||
/*===============================*/
|
|
||||||
.qs-datepicker-container {
|
|
||||||
@apply bg-white dark:bg-slate-900 border-inherit dark:border-gray-800;
|
|
||||||
}
|
|
||||||
.qs-datepicker-container .qs-controls {
|
|
||||||
@apply bg-gray-50 dark:bg-slate-800;
|
|
||||||
}
|
|
||||||
.qs-datepicker-container .qs-controls .qs-month-year {
|
|
||||||
@apply font-semibold text-[15px] dark:text-white;
|
|
||||||
}
|
|
||||||
.qs-datepicker-container .qs-controls .qs-month-year:hover {
|
|
||||||
@apply border-b rounded-md outline-inherit border-inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.qs-squares .qs-square {
|
|
||||||
@apply text-[15px] h-[34px] w-[34px] text-slate-400;
|
|
||||||
}
|
|
||||||
.qs-squares .qs-square:not(.qs-empty):not(.qs-disabled):not(.qs-day):not(.qs-active):hover,
|
|
||||||
.qs-squares .qs-square.qs-current {
|
|
||||||
text-decoration: none;
|
|
||||||
@apply bg-indigo-600 text-white rounded-[30px] font-semibold;
|
|
||||||
}
|
|
||||||
.qs-squares .qs-day {
|
|
||||||
@apply font-normal text-slate-900 dark:text-white;
|
|
||||||
}
|
|
||||||
@ -1,52 +0,0 @@
|
|||||||
|
|
||||||
/*****************/
|
|
||||||
/* Swiper Slider */
|
|
||||||
/*****************/
|
|
||||||
.swiper-slider-hero {
|
|
||||||
.swiper-container,
|
|
||||||
.swiper-slide .slide-inner {
|
|
||||||
@apply absolute right-0 top-0 w-full h-full;
|
|
||||||
}
|
|
||||||
.swiper-container {
|
|
||||||
.swiper-button-prev,
|
|
||||||
.swiper-button-next {
|
|
||||||
@apply bg-transparent w-[35px] h-[35px] leading-[35px] -mt-[30px] bg-none border border-solid border-white/50;
|
|
||||||
&:before {
|
|
||||||
@apply font-bold text-white;
|
|
||||||
font-family: "Material Design Icons";
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
@apply bg-indigo-600 border-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.swiper-button-prev {
|
|
||||||
&:before {
|
|
||||||
content: "\f0141";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.swiper-button-next {
|
|
||||||
&:before {
|
|
||||||
content: "\f0142";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullet {
|
|
||||||
@apply text-gray-50 bg-transparent;
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullet-active {
|
|
||||||
@apply text-white;
|
|
||||||
}
|
|
||||||
.swiper-container-horizontal > .swiper-pagination-bullets,
|
|
||||||
.swiper-pagination-custom,
|
|
||||||
.swiper-pagination-fraction {
|
|
||||||
@apply bottom-[45px];
|
|
||||||
}
|
|
||||||
.swiper-container-horizontal {
|
|
||||||
> .swiper-pagination-bullets {
|
|
||||||
.swiper-pagination-bullet {
|
|
||||||
@apply my-0 mx-[13px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
/*********************************/
|
|
||||||
/* Testimonial */
|
|
||||||
/*===============================*/
|
|
||||||
.client-testi {
|
|
||||||
@apply cursor-e-resize;
|
|
||||||
.content {
|
|
||||||
@apply before:content-[''] before:absolute before:top-8 before:left-0 before:ml-3 before:box-border before:border-8 before:border-solid before:origin-[0] before:rotate-[135deg] before:shadow before:border-t-transparent before:border-r-white dark:before:border-r-slate-900 before:border-b-white dark:before:border-b-slate-900 before:border-l-transparent;
|
|
||||||
/* border-color: transparent theme('colors.white') theme('colors.white') transparent; */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.customer-testi {
|
|
||||||
@apply cursor-e-resize;
|
|
||||||
.content {
|
|
||||||
&:before {
|
|
||||||
transform-origin: 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@apply before:content-[''] before:absolute before:left-1/2 before:-bottom-[4px] before:box-border before:border-8 before:rotate-[45deg] before:border-t-transparent before:border-r-white dark:before:border-r-slate-900 before:border-b-white dark:before:border-b-slate-900 before:border-l-transparent before:shadow-testi dark:before:shadow-gray-700;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tns-nav {
|
|
||||||
@apply text-center mt-3;
|
|
||||||
button {
|
|
||||||
@apply rounded-[3px] bg-indigo-600/30 transition-all duration-500 ease-in-out border-0 m-1 p-[5px];
|
|
||||||
&.tns-nav-active {
|
|
||||||
@apply bg-indigo-600 rotate-[45deg];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tns control */
|
|
||||||
.tns-controls {
|
|
||||||
button[data-controls="prev"],
|
|
||||||
button[data-controls="next"] {
|
|
||||||
@apply absolute top-2/4 -translate-y-2/4 text-base w-8 h-8 rounded-full bg-white dark:bg-slate-900 text-dark dark:text-white border-0 transition-all duration-500 ease-in-out z-10 shadow-md dark:shadow-gray-800;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
@apply bg-indigo-600 text-white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
button[data-controls="prev"] {
|
|
||||||
@apply left-0;
|
|
||||||
}
|
|
||||||
button[data-controls="next"] {
|
|
||||||
@apply right-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Smoth Slider
|
|
||||||
$animationSpeed: 120s;
|
|
||||||
@keyframes scroll {
|
|
||||||
0% { transform: translateX(0); }
|
|
||||||
100% { transform: translateX(calc(-360px * 6))}
|
|
||||||
}
|
|
||||||
.slider {
|
|
||||||
&:after {
|
|
||||||
transform: rotateZ(360deg);
|
|
||||||
}
|
|
||||||
.slide-track {
|
|
||||||
animation: scroll $animationSpeed linear infinite;
|
|
||||||
width: calc(360px * 20);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
/* // _footer.scss */
|
|
||||||
|
|
||||||
/*********************************/
|
|
||||||
/* Footer */
|
|
||||||
/*===============================*/
|
|
||||||
.footer {
|
|
||||||
.foot-subscribe {
|
|
||||||
input{
|
|
||||||
&::placeholder{
|
|
||||||
@apply text-gray-200;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,651 +0,0 @@
|
|||||||
/*********************************/
|
|
||||||
/* Menu */
|
|
||||||
/*===============================*/
|
|
||||||
#topnav {
|
|
||||||
@apply fixed right-0 left-0 top-0 z-999 bg-transparent border-0 transition-all duration-500 ease-in-out;
|
|
||||||
.logo {
|
|
||||||
@apply float-left text-black dark:text-white #{!important};
|
|
||||||
.l-dark {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
.l-light {
|
|
||||||
@apply inline-block;
|
|
||||||
}
|
|
||||||
&:focus {
|
|
||||||
@apply outline-none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.has-submenu{
|
|
||||||
@apply relative;
|
|
||||||
&.active {
|
|
||||||
a {
|
|
||||||
@apply text-white dark:text-slate-900;
|
|
||||||
}
|
|
||||||
.submenu {
|
|
||||||
li{
|
|
||||||
&.active {
|
|
||||||
> a {
|
|
||||||
@apply text-indigo-600 dark:text-indigo-600 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.active {
|
|
||||||
.menu-arrow {
|
|
||||||
@apply border-indigo-600 dark:border-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.submenu {
|
|
||||||
.submenu-arrow {
|
|
||||||
border-width: 0px 0.125rem 0.125rem 0px;
|
|
||||||
@apply absolute right-[1.25rem] top-[0.8125rem] border-black dark:border-white rounded-[0.5px] inline-block p-[0.1875rem] -rotate-[45deg];
|
|
||||||
}
|
|
||||||
.has-submenu {
|
|
||||||
&:hover {
|
|
||||||
/* .submenu-arrow {
|
|
||||||
@apply border-indigo-600 dark:border-indigo-600;
|
|
||||||
} */
|
|
||||||
> .submenu-arrow {
|
|
||||||
@apply border-indigo-600 dark:border-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.submenu {
|
|
||||||
.has-submenu{
|
|
||||||
&:hover {
|
|
||||||
.submenu-arrow {
|
|
||||||
@apply border-indigo-600 dark:border-indigo-600;
|
|
||||||
}
|
|
||||||
> .submenu-arrow {
|
|
||||||
@apply border-indigo-600 dark:border-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navbar-toggle {
|
|
||||||
@apply border-0 relative p-0 m-0 cursor-pointer;
|
|
||||||
.lines {
|
|
||||||
@apply w-[25px] block relative h-[18px] mt-[30px] mr-0 mb-[26px] ml-[10px];
|
|
||||||
}
|
|
||||||
span {
|
|
||||||
transition: transform 0.5s ease;
|
|
||||||
@apply h-[2px] w-full bg-black dark:bg-white block mb-[5px];
|
|
||||||
&:last-child {
|
|
||||||
@apply mb-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.open {
|
|
||||||
span {
|
|
||||||
@apply absolute;
|
|
||||||
&:first-child {
|
|
||||||
@apply top-[6px] rotate-[45deg];
|
|
||||||
}
|
|
||||||
&:nth-child(2) {
|
|
||||||
@apply invisible;
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
@apply w-full top-[6px] -rotate-[45deg];
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
@apply bg-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:hover, &:focus,
|
|
||||||
.navigation-menu > li > a:hover {
|
|
||||||
@apply bg-transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.buy-button {
|
|
||||||
@apply float-right leading-[74px];
|
|
||||||
> li {
|
|
||||||
@apply leading-[initial];
|
|
||||||
}
|
|
||||||
.login-btn-primary,
|
|
||||||
.btn-icon-dark {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
.login-btn-light,
|
|
||||||
.btn-icon-light {
|
|
||||||
@apply inline-block;
|
|
||||||
}
|
|
||||||
.search-bar {
|
|
||||||
.menu-search {
|
|
||||||
form {
|
|
||||||
@apply relative;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.searchform {
|
|
||||||
@apply after:absolute after:right-[14px] after:top-[14px] after:text-xl after:leading-5 after:pointer-events-none;
|
|
||||||
input[type=text] {
|
|
||||||
@apply shadow-none py-[10px] pr-[42px] pl-3 h-11 text-sm block outline-none #{!important};
|
|
||||||
}
|
|
||||||
input[type=submit] {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
&:after {
|
|
||||||
content: "\f0349";
|
|
||||||
font-family: "Material Design Icons";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.buy-button,
|
|
||||||
.buy-menu-btn {
|
|
||||||
.dropdown {
|
|
||||||
.dropdown-toggle {
|
|
||||||
@apply after:hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navigation-menu {
|
|
||||||
@apply list-none m-0 p-0;
|
|
||||||
> li {
|
|
||||||
@apply float-left block relative my-0 mx-[10px];
|
|
||||||
> a {
|
|
||||||
@apply block text-black dark:text-white text-[13px] bg-transparent font-bold tracking-[1px] leading-6 uppercase px-[15px] #{!important};
|
|
||||||
&:hover,
|
|
||||||
&:active {
|
|
||||||
@apply text-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:hover,
|
|
||||||
&.active{
|
|
||||||
> a {
|
|
||||||
@apply text-indigo-600 dark:text-indigo-600 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.submenu.megamenu {
|
|
||||||
li {
|
|
||||||
.megamenu-head {
|
|
||||||
@apply py-[10px] px-5 whitespace-nowrap text-xs uppercase tracking-[0.04em] font-bold text-slate-400 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.has-submenu {
|
|
||||||
.menu-arrow {
|
|
||||||
border-width: 0 2px 2px 0;
|
|
||||||
@apply border-black dark:border-white rounded-[0.5px] inline-block p-[3px] rotate-[45deg] absolute transition-all duration-500 -right-px top-[30px];
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
.menu-arrow {
|
|
||||||
@apply rotate-[225deg];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.menu-extras {
|
|
||||||
@apply float-right;
|
|
||||||
}
|
|
||||||
&.scroll {
|
|
||||||
@apply bg-white dark:bg-slate-900 border-none shadow;
|
|
||||||
.navigation-menu {
|
|
||||||
> li {
|
|
||||||
> a {
|
|
||||||
@apply text-black dark:text-white;
|
|
||||||
}
|
|
||||||
> .menu-arrow {
|
|
||||||
@apply border-black dark:border-white;
|
|
||||||
}
|
|
||||||
&:hover,
|
|
||||||
&.active{
|
|
||||||
> a {
|
|
||||||
@apply text-indigo-600;
|
|
||||||
}
|
|
||||||
> .menu-arrow {
|
|
||||||
@apply border-indigo-600 dark:border-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.defaultscroll{
|
|
||||||
&.dark-menubar {
|
|
||||||
.logo {
|
|
||||||
@apply leading-[70px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.scroll {
|
|
||||||
.logo {
|
|
||||||
@apply leading-[62px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.nav-sticky {
|
|
||||||
@apply bg-white dark:bg-slate-900 shadow dark:shadow-gray-800;
|
|
||||||
.navigation-menu{
|
|
||||||
&.nav-light {
|
|
||||||
> li {
|
|
||||||
> a {
|
|
||||||
@apply text-black dark:text-white #{!important};
|
|
||||||
}
|
|
||||||
&.active {
|
|
||||||
> a {
|
|
||||||
@apply text-indigo-600 dark:text-indigo-600 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:hover,
|
|
||||||
&.active{
|
|
||||||
> .menu-arrow {
|
|
||||||
@apply border-indigo-600 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&.active {
|
|
||||||
> a {
|
|
||||||
@apply text-indigo-600 dark:text-indigo-600 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.has-submenu {
|
|
||||||
.menu-arrow {
|
|
||||||
@apply border-black dark:border-white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.tagline-height {
|
|
||||||
@apply top-0 #{!important};
|
|
||||||
}
|
|
||||||
.buy-button {
|
|
||||||
.login-btn-primary,
|
|
||||||
.btn-icon-dark {
|
|
||||||
@apply inline-block;
|
|
||||||
}
|
|
||||||
.login-btn-light,
|
|
||||||
.btn-icon-light {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
.l-dark {
|
|
||||||
@apply inline-block;
|
|
||||||
}
|
|
||||||
.l-light {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
@apply font-bold text-[24px] mr-[15px] pt-0 px-[6px] pb-0 tracking-[1px] leading-[68px];
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 1025px) {
|
|
||||||
#topnav {
|
|
||||||
.navigation-menu {
|
|
||||||
> li {
|
|
||||||
.submenu{
|
|
||||||
&.megamenu {
|
|
||||||
@apply w-[1120px] #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) and (min-width: 992px) {
|
|
||||||
#topnav {
|
|
||||||
.navigation-menu {
|
|
||||||
> li {
|
|
||||||
.submenu{
|
|
||||||
&.megamenu {
|
|
||||||
@apply w-[936px] #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 992px) {
|
|
||||||
#topnav {
|
|
||||||
.navigation-menu {
|
|
||||||
@apply flex flex-wrap justify-center;
|
|
||||||
> .has-submenu {
|
|
||||||
&:hover .menu-arrow {
|
|
||||||
@apply top-[33px] #{!important};
|
|
||||||
}
|
|
||||||
&.active .menu-arrow {
|
|
||||||
@apply top-[30px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> li {
|
|
||||||
.submenu {
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
@apply absolute top-full left-0 z-[1000] py-[15px] px-0 list-none min-w-[180px] invisible opacity-0 mt-[10px] rounded-md bg-white dark:bg-slate-900 shadow dark:shadow-gray-800;
|
|
||||||
li {
|
|
||||||
@apply relative;
|
|
||||||
a {
|
|
||||||
transition: all 0.3s;
|
|
||||||
@apply block py-[10px] px-5 clear-both whitespace-nowrap text-[11px] uppercase tracking-[0.04em] font-bold text-black dark:text-white leading-[17px];
|
|
||||||
&:hover {
|
|
||||||
@apply text-indigo-600 dark:text-indigo-600 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ul {
|
|
||||||
@apply list-none pl-0 m-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.megamenu {
|
|
||||||
@apply whitespace-nowrap left-1/2 -translate-x-1/2 fixed top-auto flex;
|
|
||||||
> li {
|
|
||||||
@apply overflow-hidden align-top w-1/5;
|
|
||||||
.submenu {
|
|
||||||
@apply left-full top-0 ml-[10px] -mt-px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> li {
|
|
||||||
.submenu {
|
|
||||||
@apply left-[101%] top-0 ml-[10px] -mt-px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> a {
|
|
||||||
@apply py-[25px] min-h-[62px];
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
> .menu-arrow {
|
|
||||||
@apply border-indigo-600 dark:border-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:hover,
|
|
||||||
&.active{
|
|
||||||
> a {
|
|
||||||
@apply text-indigo-600 dark:text-indigo-600 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.last-elements{
|
|
||||||
.submenu {
|
|
||||||
@apply left-auto right-0 before:left-auto before:right-[10px];
|
|
||||||
> li{
|
|
||||||
&.has-submenu {
|
|
||||||
.submenu {
|
|
||||||
@apply left-auto right-full ml-0 mr-[10px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.nav-light {
|
|
||||||
> li {
|
|
||||||
> a {
|
|
||||||
@apply text-white/50 #{!important};
|
|
||||||
}
|
|
||||||
&.active {
|
|
||||||
> a {
|
|
||||||
@apply text-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
> .menu-arrow {
|
|
||||||
@apply border-white #{!important};
|
|
||||||
}
|
|
||||||
> a {
|
|
||||||
@apply text-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.has-submenu {
|
|
||||||
.menu-arrow {
|
|
||||||
@apply border-white/50;
|
|
||||||
}
|
|
||||||
&.active {
|
|
||||||
.menu-arrow {
|
|
||||||
@apply border-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.buy-button {
|
|
||||||
@apply pl-[15px] ml-[15px];
|
|
||||||
}
|
|
||||||
.navbar-toggle {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
#navigation {
|
|
||||||
@apply block #{!important};
|
|
||||||
}
|
|
||||||
&.scroll {
|
|
||||||
@apply top-0;
|
|
||||||
.navigation-menu {
|
|
||||||
> li {
|
|
||||||
> a {
|
|
||||||
@apply py-5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.scroll-active {
|
|
||||||
.navigation-menu {
|
|
||||||
> li {
|
|
||||||
> a {
|
|
||||||
@apply py-[25px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 991px) {
|
|
||||||
#topnav {
|
|
||||||
@apply bg-white dark:bg-slate-900 shadow dark:shadow-gray-800 min-h-[74px];
|
|
||||||
.logo {
|
|
||||||
.l-dark {
|
|
||||||
@apply inline-block #{!important};
|
|
||||||
}
|
|
||||||
.l-light {
|
|
||||||
@apply hidden #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.container {
|
|
||||||
@apply w-auto;
|
|
||||||
}
|
|
||||||
#navigation {
|
|
||||||
@apply max-h-[400px] shadow;
|
|
||||||
}
|
|
||||||
.navigation-menu {
|
|
||||||
@apply float-none;
|
|
||||||
> li {
|
|
||||||
@apply float-none;
|
|
||||||
.submenu {
|
|
||||||
@apply hidden list-none pl-5 m-0;
|
|
||||||
li {
|
|
||||||
a {
|
|
||||||
transition: all 0.3s;
|
|
||||||
@apply block relative py-[7px] px-[15px] uppercase text-[11px] tracking-[0.04em] font-bold text-black dark:text-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.megamenu {
|
|
||||||
li {
|
|
||||||
.megamenu-head {
|
|
||||||
@apply py-[7px] px-[15px];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> li {
|
|
||||||
> ul {
|
|
||||||
@apply list-none pl-0;
|
|
||||||
> li {
|
|
||||||
> span {
|
|
||||||
@apply block relative py-[10px] px-[15px] uppercase text-xs tracking-[2px] text-slate-200;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.open {
|
|
||||||
@apply block;
|
|
||||||
}
|
|
||||||
.submenu {
|
|
||||||
@apply hidden list-none;
|
|
||||||
&.open {
|
|
||||||
@apply block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> a {
|
|
||||||
@apply text-black dark:text-white py-[10px] px-[20px] after:absolute after:right-[15px];
|
|
||||||
}
|
|
||||||
> a:hover,
|
|
||||||
.submenu li a:hover,
|
|
||||||
&.has-submenu.open > a {
|
|
||||||
@apply text-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.menu-extras {
|
|
||||||
.menu-item {
|
|
||||||
@apply border-gray-200 dark:border-gray-700;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navbar-header {
|
|
||||||
@apply float-left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buy-button {
|
|
||||||
.login-btn-primary,
|
|
||||||
.btn-icon-dark {
|
|
||||||
@apply inline-block #{!important};
|
|
||||||
}
|
|
||||||
.login-btn-light,
|
|
||||||
.btn-icon-light {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.has-submenu {
|
|
||||||
.submenu {
|
|
||||||
.submenu-arrow {
|
|
||||||
@apply rotate-[45deg] absolute right-5 top-3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.active {
|
|
||||||
a {
|
|
||||||
@apply text-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#navigation {
|
|
||||||
@apply absolute top-[74px] left-0 w-full hidden h-auto bg-white dark:bg-slate-900 overflow-auto;
|
|
||||||
&.open {
|
|
||||||
@apply block overflow-y-auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
#topnav {
|
|
||||||
.navigation-menu {
|
|
||||||
.has-submenu {
|
|
||||||
.menu-arrow {
|
|
||||||
@apply right-2 top-4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
#topnav {
|
|
||||||
.navigation-menu {
|
|
||||||
> li{
|
|
||||||
&.has-submenu{
|
|
||||||
&:hover {
|
|
||||||
> .submenu {
|
|
||||||
@apply visible opacity-100 mt-0;
|
|
||||||
> li{
|
|
||||||
&.has-submenu{
|
|
||||||
&:hover {
|
|
||||||
> .submenu {
|
|
||||||
@apply visible opacity-100 ml-0 mr-0;
|
|
||||||
> li{
|
|
||||||
&:hover {
|
|
||||||
> .submenu {
|
|
||||||
@apply visible opacity-100 ml-0 mr-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navbar-toggle {
|
|
||||||
@apply block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 425px) {
|
|
||||||
#topnav {
|
|
||||||
.buy-menu-btn {
|
|
||||||
@apply block my-0 mx-[10px] py-[10px] px-5 #{!important};
|
|
||||||
.dropdown {
|
|
||||||
.dropdown-menu{
|
|
||||||
&.show {
|
|
||||||
transform: translate3d(0px, -54px, 0px) !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.tagline {
|
|
||||||
@apply absolute w-full z-[99] text-sm py-[13px] px-0;
|
|
||||||
}
|
|
||||||
@media screen and (max-width: 575px) {
|
|
||||||
.tagline {
|
|
||||||
@apply hidden;
|
|
||||||
}
|
|
||||||
.tagline-height {
|
|
||||||
@apply top-0 #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: 576px) {
|
|
||||||
.tagline-height {
|
|
||||||
@apply top-[47px] #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-nav {
|
|
||||||
> .navbar-item {
|
|
||||||
&:hover,
|
|
||||||
&.active {
|
|
||||||
.navbar-link {
|
|
||||||
@apply text-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
li{
|
|
||||||
&.active {
|
|
||||||
a {
|
|
||||||
@apply text-indigo-600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.account-menu {
|
|
||||||
&.active,
|
|
||||||
&:hover{
|
|
||||||
.navbar-link {
|
|
||||||
@apply text-indigo-600 dark:text-white #{!important};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
/* Template Name: Techwind - Multipurpose Tailwind CSS Landing Page Template
|
|
||||||
Author: Shreethemes
|
|
||||||
Email: support@shreethemes.in
|
|
||||||
Website: https://shreethemes.in
|
|
||||||
Version: 1.4.0
|
|
||||||
Created: May 2022
|
|
||||||
File Description: Main Icon file of the template
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Plugins */
|
|
||||||
@import "icons/materialdesignicons";
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
/* Template Name: Techwind - Multipurpose Tailwind CSS Landing Page Template
|
|
||||||
Author: Shreethemes
|
|
||||||
Email: support@shreethemes.in
|
|
||||||
Website: https://shreethemes.in
|
|
||||||
Version: 1.4.0
|
|
||||||
Created: May 2022
|
|
||||||
File: Main Css File
|
|
||||||
*/
|
|
||||||
|
|
||||||
@tailwind base;
|
|
||||||
@tailwind components;
|
|
||||||
@tailwind utilities;
|
|
||||||
|
|
||||||
// FONTS
|
|
||||||
@import "custom/fonts";
|
|
||||||
|
|
||||||
// general
|
|
||||||
@import "custom/general";
|
|
||||||
|
|
||||||
// components
|
|
||||||
@import "components/buttons";
|
|
||||||
@import "components/breadcrumb";
|
|
||||||
|
|
||||||
// structure
|
|
||||||
@import "custom/structure/topnav";
|
|
||||||
@import "custom/structure/footer";
|
|
||||||
|
|
||||||
// pages
|
|
||||||
@import "custom/pages/helper";
|
|
||||||
@import "custom/pages/hero";
|
|
||||||
@import "custom/pages/countdown";
|
|
||||||
@import "custom/pages/portfolio";
|
|
||||||
@import "custom/pages/contact";
|
|
||||||
|
|
||||||
// Plugins
|
|
||||||
@import "custom/plugins/swiper-slider";
|
|
||||||
@import "custom/plugins/testi";
|
|
||||||
@import "custom/plugins/choices";
|
|
||||||
@import "custom/plugins/datepicker";
|
|
||||||
@ -1,83 +0,0 @@
|
|||||||
@@include("partials/dark-theme.html")
|
|
||||||
<head>
|
|
||||||
@@include("partials/title-meta.html", {"title": "Corso Blog"})
|
|
||||||
|
|
||||||
<!-- Css -->
|
|
||||||
@@include("partials/head-css.html")
|
|
||||||
</head>
|
|
||||||
|
|
||||||
@@include("partials/body.html")
|
|
||||||
<!-- Loader Start -->
|
|
||||||
<!-- <div id="preloader">
|
|
||||||
<div id="status">
|
|
||||||
<div class="spinner">
|
|
||||||
<div class="double-bounce1"></div>
|
|
||||||
<div class="double-bounce2"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
<!-- Loader End -->
|
|
||||||
|
|
||||||
@@include("partials/navbar/nav-center.html")
|
|
||||||
|
|
||||||
<!-- Start Hero -->
|
|
||||||
<section class="relative table w-full py-32 lg:py-36 bg-[url('../../assets/images/blog/work.jpg')] bg-center bg-no-repeat">
|
|
||||||
<div class="absolute inset-0 bg-black opacity-80"></div>
|
|
||||||
<div class="container">
|
|
||||||
<div class="grid grid-cols-1 pb-8 text-center mt-10">
|
|
||||||
<h3 class="md:text-4xl text-3xl md:leading-normal leading-normal font-medium text-white">Blogs & News</h3>
|
|
||||||
</div><!--end grid-->
|
|
||||||
</div><!--end container-->
|
|
||||||
|
|
||||||
<div class="absolute text-center z-10 bottom-5 right-0 left-0 mx-3">
|
|
||||||
<ul class="breadcrumb tracking-[0.5px] breadcrumb-light mb-0 inline-block">
|
|
||||||
<li class="inline breadcrumb-item uppercase text-[13px] font-bold duration-500 ease-in-out text-white/50 hover:text-white"><a href="index.html">Corso</a></li>
|
|
||||||
<li class="inline breadcrumb-item uppercase text-[13px] font-bold duration-500 ease-in-out text-white" aria-current="page">Blogs</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</section><!--end section-->
|
|
||||||
<div class="relative">
|
|
||||||
<div class="shape absolute right-0 sm:-bottom-px -bottom-[2px] left-0 overflow-hidden z-1 text-white dark:text-slate-900">
|
|
||||||
<svg class="w-full h-auto" viewBox="0 0 2880 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M0 48H1437.5H2880V0H2160C1442.5 52 720 0 720 0H0V48Z" fill="currentColor"></path>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- End Hero -->
|
|
||||||
|
|
||||||
<!-- Start Section-->
|
|
||||||
<section class="relative md:py-24 py-16">
|
|
||||||
<div class="container">
|
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-3 md:grid-cols-2 gap-[30px]">
|
|
||||||
<div class="blog relative rounded-md shadow dark:shadow-gray-800 overflow-hidden">
|
|
||||||
<img src="assets/images/blog/office_desk.jpg" alt="Office desk with laptop and monitor">
|
|
||||||
|
|
||||||
<div class="content p-6">
|
|
||||||
<a href="corso-announcement-free-backup-for-microsoft-365.html" class="title h5 text-lg font-medium hover:text-indigo-600 duration-500 ease-in-out">A home to call your own: the need for your own backups in IT</a>
|
|
||||||
<p class="text-slate-400 mt-3">Read more about why we created Corso for Microsoft 365 backup and how to get started.</p>
|
|
||||||
|
|
||||||
<div class="mt-4">
|
|
||||||
<a href="corso-announcement-free-backup-for-microsoft-365.html" class="btn btn-link font-normal hover:text-indigo-600 after:bg-indigo-600 duration-500 ease-in-out">Read More <i class="uil uil-arrow-right"></i></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div><!--blog end-->
|
|
||||||
|
|
||||||
</div><!--end grid-->
|
|
||||||
|
|
||||||
</div><!--end container-->
|
|
||||||
|
|
||||||
</section><!--end section-->
|
|
||||||
<!-- End -->
|
|
||||||
|
|
||||||
@@include("partials/footer/footer.html")
|
|
||||||
|
|
||||||
<!-- Back to top -->
|
|
||||||
<a href="#" onclick="topFunction()" id="back-to-top" class="back-to-top fixed hidden text-lg rounded-full z-10 bottom-5 right-5 h-9 w-9 text-center bg-indigo-600 text-white leading-9"><i class="uil uil-arrow-up"></i></a>
|
|
||||||
<!-- Back to top -->
|
|
||||||
|
|
||||||
<!-- JAVASCRIPTS -->
|
|
||||||
<script src="assets/libs/feather-icons/feather.min.js"></script>
|
|
||||||
@@include("partials/script-file.html")
|
|
||||||
<!-- JAVASCRIPTS -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
74
website/src/components/parts/Hero.js
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import React from "react";
|
||||||
|
import "animate.css";
|
||||||
|
|
||||||
|
export default function Hero() {
|
||||||
|
return (
|
||||||
|
<section className="relative !tracking-wide flex flex-col home-wrapper items-center overflow-hidden">
|
||||||
|
<div
|
||||||
|
className="bg-[#151C3D] absolute"
|
||||||
|
style={{
|
||||||
|
left: "-20rem",
|
||||||
|
right: 0,
|
||||||
|
zIndex: 1,
|
||||||
|
top: "-30%",
|
||||||
|
height: "62rem",
|
||||||
|
width: "140rem",
|
||||||
|
transform: "rotate(-12deg)",
|
||||||
|
}}
|
||||||
|
></div>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
zIndex: "1 !important",
|
||||||
|
}}
|
||||||
|
className="!container relative !z-10"
|
||||||
|
>
|
||||||
|
<div className="grid !z-10 grid-cols-1 mt-28 text-center">
|
||||||
|
<div className="wow !z-10 animate__animated animate__fadeIn">
|
||||||
|
<h4 className="font-bold !text-white !z-10 !leading-normal text-4xl lg:text-5xl mb-5">
|
||||||
|
Free, Secure, and Open-Source
|
||||||
|
<br /> Backup for Microsoft 365
|
||||||
|
</h4>
|
||||||
|
<p className="text-slate-300 !z-10 text-xl max-w-xl mx-auto">
|
||||||
|
The #1 open-source backup tool for Microsoft 365
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="mt-12 !z-10 mb-6 space-x-4">
|
||||||
|
<a
|
||||||
|
href="../docs/quickstart"
|
||||||
|
className="text-2xl !z-10 !no-underline hover:text-white py-2 px-6 font-bold btn bg-indigo-800 hover:bg-indigo-900 border-indigo-800 hover:border-indigo-900 text-white rounded-md"
|
||||||
|
>
|
||||||
|
Quickstart
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="../docs/setup/download"
|
||||||
|
className="text-2xl !z-10 !no-underline hover:text-white py-2 px-6 font-bold btn bg-indigo-800 hover:bg-indigo-900 border-indigo-800 hover:border-indigo-900 text-white rounded-md"
|
||||||
|
>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="home-dashboard mt-8 !z-10 wow animate__ animate__fadeIn animated"
|
||||||
|
style={{
|
||||||
|
visibility: "visible",
|
||||||
|
animationName: "fadeIn",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="img/cloudbackup.svg"
|
||||||
|
className="w-[70%] inline-block object-contain"
|
||||||
|
alt="Cloud backup and storage"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="bg-indigo-600 w-8 h-16 !z-10 absolute left-8 lg:bottom-28 md:bottom-36 sm:bottom-40 bottom-16"></div>
|
||||||
|
<div className="bg-indigo-600/20 w-8 h-16 !z-10 absolute left-20 lg:bottom-32 md:bottom-40 sm:bottom-44 bottom-20"></div>
|
||||||
|
|
||||||
|
<div className="bg-indigo-600/20 !z-10 w-8 h-16 absolute right-20 xl:bottom-[420px] lg:bottom-[315px] md:bottom-[285px] sm:bottom-80 bottom-32"></div>
|
||||||
|
<div className="bg-indigo-600 w-8 h-16 !z-10 absolute right-8 xl:bottom-[440px] lg:bottom-[335px] md:bottom-[305px] sm:bottom-[340px] bottom-36"></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
32
website/src/components/parts/SecondSection.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import React from "react";
|
||||||
|
import "animate.css";
|
||||||
|
|
||||||
|
export default function Demo() {
|
||||||
|
return (
|
||||||
|
<section className="relative flex !tracking-wide flex-col items-center overflow-hidden">
|
||||||
|
<div className="!container relative">
|
||||||
|
<div className="flex flex-col content-center items-center justify-start relative md:mt-24 mt-16 text-center">
|
||||||
|
<div className="wow w-[95%] sm:w-[80%] animate__animated relative animate__fadeIn">
|
||||||
|
<div className="flex flex-row items-center bg-gray-200 rounded-t-lg h-6">
|
||||||
|
<div className="align-middle flex flex-col items-center justify-center">
|
||||||
|
<img className="h-4 px-2" src="assets/images/powershell.svg" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className="!p-2 relative rounded-b-lg overflow-clip"
|
||||||
|
style={{
|
||||||
|
borderLeft: "2px solid #e5e7eb",
|
||||||
|
borderRight: "2px solid #e5e7eb",
|
||||||
|
borderBottom: "2px solid #e5e7eb",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<video className="w-full" poster="assets/images/corso_demo_thumbnail.png" muted loop autoPlay playsInline>
|
||||||
|
<source src="assets/images/corso_demo.mp4" type="video/mp4" />
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
673
website/src/components/parts/ThirdSection.js
Normal file
@ -0,0 +1,673 @@
|
|||||||
|
import React, { useEffect } from "react";
|
||||||
|
import feather from "feather-icons";
|
||||||
|
import { WOW } from "wowjs";
|
||||||
|
import { jarallax } from "jarallax";
|
||||||
|
import { Icon } from "@iconify/react";
|
||||||
|
import "animate.css";
|
||||||
|
import "tw-elements";
|
||||||
|
|
||||||
|
export default function KeyLoveFAQ() {
|
||||||
|
useEffect(() => {
|
||||||
|
new WOW().init();
|
||||||
|
feather.replace();
|
||||||
|
jarallax(document.querySelectorAll(".jarallax"), {
|
||||||
|
speed: 0.2,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="relative md:py-24 !tracking-wide py-16 overflow-hidden">
|
||||||
|
<div className="container">
|
||||||
|
<div
|
||||||
|
className="grid grid-cols-1 pb-8 text-center wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".1s"
|
||||||
|
>
|
||||||
|
<h3 className="mb-6 mt-8 md:text-4xl text-white text-3xl md:leading-normal leading-normal font-bold">
|
||||||
|
Key Features
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p className="text-slate-400 max-w-xl mx-auto">
|
||||||
|
See why Corso is a perfect fit for your Microsoft 365 backup and
|
||||||
|
recovery needs.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid lg:grid-cols-3 md:grid-cols-2 grid-cols-1 grid-flow-row-dense gap-[30px] mt-8">
|
||||||
|
<div
|
||||||
|
className="col-start-1 wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".1s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i data-feather="share-2" className="h-5 w-5 rotate-45"></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">
|
||||||
|
Comprehensive Workflows
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="col-start-1 wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".1s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i data-feather="zap" className="h-5 w-5 rotate-45"></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">High Throughput</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="col-start-1 wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".1s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i data-feather="activity" className="h-5 w-5 rotate-45"></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">Fault Tolerance</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:col-start-2 md:col-start-1 wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".3s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i data-feather="lock" className="h-5 w-5 rotate-45"></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">
|
||||||
|
End-to-End Encryption
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:col-start-2 md:col-start-2 md:order-last wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".3s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i data-feather="copy" className="h-5 w-5 rotate-45"></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">Deduplication</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:col-start-2 md:col-start-2 md:order-last wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".3s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i data-feather="minimize-2" className="h-5 w-5 rotate-45"></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">Compression</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:col-start-3 md:col-start-2 wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i data-feather="code" className="h-5 w-5 rotate-45"></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">Open Source</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:col-start-3 md:col-start-2 wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i
|
||||||
|
data-feather="upload-cloud"
|
||||||
|
className="h-5 w-5 rotate-45"
|
||||||
|
></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">
|
||||||
|
Choice of Object Storage
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:col-start-3 md:col-start-2 wow animate__animated animate__fadeInUp"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<div className="flex transition-all duration-500 scale-hover shadow dark:shadow-gray-800 hover:shadow-md dark:hover:shadow-gray-700 ease-in-out items-center p-3 rounded-md bg-white dark:bg-slate-900">
|
||||||
|
<div className="flex items-center justify-center h-[45px] min-w-[45px] -rotate-45 bg-gradient-to-r from-transparent to-indigo-600/10 text-indigo-600 text-center rounded-full mr-3">
|
||||||
|
<i
|
||||||
|
data-feather="check-circle"
|
||||||
|
className="h-5 w-5 rotate-45"
|
||||||
|
></i>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="mb-0 text-lg font-bold">Retention Policies</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="container md:mt-24 mt-16">
|
||||||
|
<div className="container lg mx-auto">
|
||||||
|
<div className="grid grid-cols-1 pb-2 text-center wow animate__animated animate__fadeInUp">
|
||||||
|
<h3 className="mb-6 mt-8 md:text-4xl text-3xl md:leading-normal leading-normal font-bold">
|
||||||
|
Why Everyone{" "}
|
||||||
|
<span className="after:absolute after:right-0 after:left-0 after:bottom-1 after:lg:h-3 after:h-2 after:w-auto after:rounded-md after:bg-indigo-600/30 relative text-indigo-600">
|
||||||
|
Loves
|
||||||
|
<div className="absolute right-0 left-0 bottom-1 lg:h-3 h-2 w-auto rounded-md bg-indigo-600/30"></div>
|
||||||
|
</span>{" "}
|
||||||
|
Corso
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid md:grid-cols-2 grid-cols-1 items-center gap-[30px]">
|
||||||
|
<div
|
||||||
|
className="relative wow animate__animated animate__fadeInLeft"
|
||||||
|
data-wow-delay=".3s"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="/img/why/chat.svg"
|
||||||
|
className="rounded-lg"
|
||||||
|
alt="Group discussion"
|
||||||
|
/>
|
||||||
|
<div className="overflow-hidden absolute lg:h-[400px] h-[320px] lg:w-[400px] w-[320px] bg-indigo-600/5 bottom-0 left-0 rotate-45 -z-1 rounded-3xl"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:ml-8 wow animate__animated animate__fadeInRight"
|
||||||
|
data-wow-delay=".3s"
|
||||||
|
>
|
||||||
|
<h3 className="mb-4 text-3xl leading-normal font-bold">
|
||||||
|
Community
|
||||||
|
</h3>
|
||||||
|
<p className="text-slate-400">
|
||||||
|
The Corso community provides a venue for M365 admins to share and
|
||||||
|
learn about the importance of data protection as well as best
|
||||||
|
practices around M365 secure configuration and compliance
|
||||||
|
management.
|
||||||
|
</p>
|
||||||
|
<ul className="list-none text-slate-400 mt-4">
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Community-led blogs, forums, and discussions
|
||||||
|
</li>
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Public and feedback-driven development roadmap{" "}
|
||||||
|
</li>
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
All community contributions welcome
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div className="mt-4">
|
||||||
|
<a
|
||||||
|
href="https://discord.gg/63DTTSnuhT"
|
||||||
|
target="_blank"
|
||||||
|
className="btn btn-link !no-underline link-underline link-underline-black text-indigo-600 hover:text-indigo-600 after:bg-indigo-600 duration-500 ease-in-out"
|
||||||
|
>
|
||||||
|
Join Us On Discord{" "}
|
||||||
|
<Icon icon="uim:angle-right-b" className="align-middle" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="container md:mt-24 mt-16">
|
||||||
|
<div className="grid md:grid-cols-2 grid-cols-1 items-center gap-[30px]">
|
||||||
|
<div
|
||||||
|
className="relative order-1 md:order-2 wow animate__animated animate__fadeInRight"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="/img/why/security.svg"
|
||||||
|
className="rounded-lg"
|
||||||
|
alt="Approval of fingerprint security"
|
||||||
|
/>
|
||||||
|
<div className="overflow-hidden absolute lg:h-[400px] h-[320px] lg:w-[400px] w-[320px] bg-indigo-600/5 bottom-0 right-0 rotate-45 -z-1 rounded-3xl"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:mr-8 order-2 md:order-1 wow animate__animated animate__fadeInLeft"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<h3 className="mb-4 text-3xl leading-normal font-bold">
|
||||||
|
Data Security
|
||||||
|
</h3>
|
||||||
|
<p className="text-slate-400">
|
||||||
|
Corso provides secure data backup that protects customers against
|
||||||
|
accidental data loss, service provider downtime, and malicious
|
||||||
|
threats including ransomware attacks.
|
||||||
|
</p>
|
||||||
|
<ul className="list-none text-slate-400 mt-4">
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
End-to-end zero-trust AES-256 and TLS encryption
|
||||||
|
</li>
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Support for air-gapped backup storage
|
||||||
|
</li>
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Choice of backup storage provider and geo location
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="container md:mt-24 mt-16">
|
||||||
|
<div className="grid md:grid-cols-2 grid-cols-1 items-center mt-8 gap-[30px]">
|
||||||
|
<div
|
||||||
|
className="relative wow animate__animated animate__fadeInLeft"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="/img/why/data.svg"
|
||||||
|
className="rounded-lg"
|
||||||
|
alt="Data extraction dashboard"
|
||||||
|
/>
|
||||||
|
<div className="overflow-hidden absolute lg:h-[400px] h-[320px] lg:w-[400px] w-[320px] bg-indigo-600/5 bottom-0 left-0 rotate-45 -z-1 rounded-3xl"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:ml-8 wow animate__animated animate__fadeInRight"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<h3 className="mb-4 text-3xl leading-normal font-bold">
|
||||||
|
Robust Backups
|
||||||
|
</h3>
|
||||||
|
<p className="text-slate-400">
|
||||||
|
Corso, purpose-built for M365 protection, provides easy-to-use
|
||||||
|
comprehensive backup and restore workflows that reduces backup
|
||||||
|
time, improve time-to-recovery, reduce admin overhead, and replace
|
||||||
|
unreliable scripts or workarounds.
|
||||||
|
</p>
|
||||||
|
<ul className="list-none text-slate-400 mt-4">
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Constantly updated M365 Graph Data engine
|
||||||
|
</li>
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Purpose-built, flexible, fine-grained data protection workflows
|
||||||
|
</li>
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
High-performance backup and recovery data movers
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div className="mt-4">
|
||||||
|
<a
|
||||||
|
href="docs/quickstart"
|
||||||
|
className="btn btn-link !no-underline link-underline link-underline-black text-indigo-600 hover:text-indigo-600 after:bg-indigo-600 duration-500 ease-in-out"
|
||||||
|
>
|
||||||
|
Use The Quick Start For Your First Backup{" "}
|
||||||
|
<Icon icon="uim:angle-right-b" className="align-middle" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="container md:mt-24 mt-16">
|
||||||
|
<div className="grid md:grid-cols-2 grid-cols-1 items-center gap-[30px]">
|
||||||
|
<div
|
||||||
|
className="relative order-1 md:order-2 wow animate__animated animate__fadeInRight"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="/img/why/savings.svg"
|
||||||
|
className="rounded-lg"
|
||||||
|
alt="Adding money to a savings jar"
|
||||||
|
/>
|
||||||
|
<div className="overflow-hidden absolute lg:h-[400px] h-[320px] lg:w-[400px] w-[320px] bg-indigo-600/5 bottom-0 right-0 rotate-45 -z-1 rounded-3xl"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="lg:mr-8 order-2 md:order-1 wow animate__animated animate__fadeInLeft"
|
||||||
|
data-wow-delay=".5s"
|
||||||
|
>
|
||||||
|
<h3 className="mb-4 text-3xl leading-normal font-bold">
|
||||||
|
Cost Savings
|
||||||
|
</h3>
|
||||||
|
<p className="text-slate-400">
|
||||||
|
Corso, a 100% open-source tool, provides a free alternative for
|
||||||
|
cost-conscious teams. It further reduces storage costs by
|
||||||
|
supporting flexible retention policies and efficiently compressing
|
||||||
|
and deduplicating data before storing it in low-cost cloud object
|
||||||
|
storage.
|
||||||
|
</p>
|
||||||
|
<ul className="list-none text-slate-400 mt-4">
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Free forever OSS with no licensing costs
|
||||||
|
</li>
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Client-side compression and deduplication
|
||||||
|
</li>
|
||||||
|
<li className="mb-1 flex">
|
||||||
|
<Icon
|
||||||
|
className="text-indigo-600 text-xl mr-2"
|
||||||
|
icon="material-symbols:check-circle-outline"
|
||||||
|
/>{" "}
|
||||||
|
Support for S3-compliant storage including AWS Glacier IA
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div className="mt-4">
|
||||||
|
<a
|
||||||
|
href="docs/setup/repos"
|
||||||
|
className="btn btn-link !no-underline link-underline link-underline-black text-indigo-600 hover:text-indigo-600 after:bg-indigo-600 duration-500 ease-in-out"
|
||||||
|
>
|
||||||
|
Read about our Object Storage support{" "}
|
||||||
|
<Icon icon="uim:angle-right-b" className="align-middle" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Accordions */}
|
||||||
|
|
||||||
|
<div className="container md:mb-8 mb-4 md:mt-24 mt-16 wow animate__animated animate__fadeInUp">
|
||||||
|
<div className="grid grid-cols-1 pb-8 text-center">
|
||||||
|
<h3 className="mb-6 mt-8 text-white md:text-4xl text-3xl md:leading-normal leading-normal font-bold">
|
||||||
|
Frequently Asked Questions
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="relative grid md:grid-cols-12 grid-cols-1 items-center gap-[30px]">
|
||||||
|
<div className="md:col-span-6">
|
||||||
|
<div className="relative">
|
||||||
|
<div className="relative rounded-xl overflow-hidden shadow-md dark:shadow-gray-800">
|
||||||
|
<div
|
||||||
|
className="w-full jarallax py-72 bg-slate-400 custom-bg_ bg-no-repeat bg-top"
|
||||||
|
data-jarallax='{"speed": 0.1}'
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="md:col-span-6">
|
||||||
|
<div className="accordion space-y-3" id="accordionExample">
|
||||||
|
<div className="accordion-item !text-white relative shadow dark:shadow-gray-800 rounded-md overflow-hidden">
|
||||||
|
<h2
|
||||||
|
className="accordion-header mb-0 !cursor-pointer font-semibold"
|
||||||
|
id="headingOne"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className="transition accordion-button-custom text-white !text-base !cursor-pointer border-none outline-none collapsed focus:outline-none !bg-transparent flex justify-between items-center p-5 w-full font-bold text-left"
|
||||||
|
type="button"
|
||||||
|
data-bs-toggle="collapse"
|
||||||
|
data-bs-target="#collapseOne"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="collapseOne"
|
||||||
|
>
|
||||||
|
<span>What platforms does Corso run on?</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div
|
||||||
|
id="collapseOne"
|
||||||
|
className="accordion-collapse collapse"
|
||||||
|
aria-labelledby="headingOne"
|
||||||
|
data-bs-parent="#accordionExample"
|
||||||
|
>
|
||||||
|
<div className="accordion-body p-5">
|
||||||
|
<p className="text-slate-400 !visible dark:text-gray-400">
|
||||||
|
Corso has both native binaries and container images for
|
||||||
|
Windows, Linux, and macOS.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="accordion-item !text-white relative shadow dark:shadow-gray-800 rounded-md overflow-hidden">
|
||||||
|
<h2
|
||||||
|
className="accordion-header mb-0 !cursor-pointer font-semibold"
|
||||||
|
id="heading2"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className="transition accordion-button-custom text-white !text-base !cursor-pointer border-none outline-none collapsed focus:outline-none !bg-transparent flex justify-between items-center p-5 w-full font-bold text-left"
|
||||||
|
type="button"
|
||||||
|
data-bs-toggle="collapse"
|
||||||
|
data-bs-target="#collapse2"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="collapse2"
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
What Microsoft 365 services can I backup using Corso?
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div
|
||||||
|
id="collapse2"
|
||||||
|
className="accordion-collapse collapse"
|
||||||
|
aria-labelledby="heading2"
|
||||||
|
data-bs-parent="#accordionExample"
|
||||||
|
>
|
||||||
|
<div className="accordion-body p-5">
|
||||||
|
<p className="text-slate-400 !visible dark:text-gray-400">
|
||||||
|
Corso currently supports OneDrive and Exchange. Support
|
||||||
|
for Teams and SharePoint is in active development and is
|
||||||
|
therefore not recommended for production use.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="accordion-item !text-white relative shadow dark:shadow-gray-800 rounded-md overflow-hidden">
|
||||||
|
<h2
|
||||||
|
className="accordion-header mb-0 !cursor-pointer font-semibold"
|
||||||
|
id="heading3"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className="transition accordion-button-custom text-white !text-base !cursor-pointer border-none outline-none collapsed focus:outline-none !bg-transparent flex justify-between items-center p-5 w-full font-bold text-left"
|
||||||
|
type="button"
|
||||||
|
data-bs-toggle="collapse"
|
||||||
|
data-bs-target="#collapse3"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="collapse3"
|
||||||
|
>
|
||||||
|
<span>What object storage does Corso support?</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div
|
||||||
|
id="collapse3"
|
||||||
|
className="accordion-collapse collapse"
|
||||||
|
aria-labelledby="heading3"
|
||||||
|
data-bs-parent="#accordionExample"
|
||||||
|
>
|
||||||
|
<div className="accordion-body p-5">
|
||||||
|
<p className="text-slate-400 dark:text-gray-400 !visible">
|
||||||
|
Corso supports any S3-compliant object storage system
|
||||||
|
including AWS S3 (including Glacier Instant Access),
|
||||||
|
Google Cloud Storage, and Backblaze. Azure Blob support is
|
||||||
|
coming soon.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="accordion-item !text-white relative shadow dark:shadow-gray-800 rounded-md overflow-hidden">
|
||||||
|
<h2
|
||||||
|
className="accordion-header mb-0 font-semibold"
|
||||||
|
id="heading4"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className="transition accordion-button-custom text-white !text-base !cursor-pointer border-none outline-none collapsed focus:outline-none !bg-transparent flex justify-between items-center p-5 w-full font-bold text-left"
|
||||||
|
type="button"
|
||||||
|
data-bs-toggle="collapse"
|
||||||
|
data-bs-target="#collapse4"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="collapse4"
|
||||||
|
>
|
||||||
|
<span>How can I get help for Corso?</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div
|
||||||
|
id="collapse4"
|
||||||
|
className="accordion-collapse collapse"
|
||||||
|
aria-labelledby="heading4"
|
||||||
|
data-bs-parent="#accordionExample"
|
||||||
|
>
|
||||||
|
<div className="accordion-body p-5">
|
||||||
|
<p className="text-slate-400 dark:text-gray-400 !visible">
|
||||||
|
If you are unable to find an answer in our documentation,
|
||||||
|
please file{" "}
|
||||||
|
<a
|
||||||
|
href="https://github.com/alcionai/corso/issues"
|
||||||
|
className="text-indigo-600"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
GitHub issues
|
||||||
|
</a>{" "}
|
||||||
|
for bugs or join the{" "}
|
||||||
|
<a
|
||||||
|
href="https://discord.gg/63DTTSnuhT"
|
||||||
|
className="text-indigo-600"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
Discord community
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="accordion-item !text-white relative shadow dark:shadow-gray-800 rounded-md overflow-hidden">
|
||||||
|
<h2
|
||||||
|
className="accordion-header mb-0 !cursor-pointer font-semibold"
|
||||||
|
id="heading5"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className="transition accordion-button-custom text-white !text-base !cursor-pointer border-none outline-none collapsed focus:outline-none !bg-transparent flex justify-between items-center p-5 w-full font-bold text-left"
|
||||||
|
type="button"
|
||||||
|
data-bs-toggle="collapse"
|
||||||
|
data-bs-target="#collapse5"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="collapse5"
|
||||||
|
>
|
||||||
|
<span>What is Corso's open-source license?</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div
|
||||||
|
id="collapse5"
|
||||||
|
className="accordion-collapse collapse"
|
||||||
|
aria-labelledby="heading5"
|
||||||
|
data-bs-parent="#accordionExample"
|
||||||
|
>
|
||||||
|
<div className="accordion-body p-5">
|
||||||
|
<p className="text-slate-400 dark:text-gray-400 !visible">
|
||||||
|
Corso's source code is licensed under the OSI-approved
|
||||||
|
Apache v2 open-source license.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="accordion-item !text-white relative shadow dark:shadow-gray-800 rounded-md overflow-hidden">
|
||||||
|
<h2
|
||||||
|
className="accordion-header mb-0 !cursor-pointer font-semibold"
|
||||||
|
id="heading6"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className="transition accordion-button-custom text-white !text-base !cursor-pointer border-none outline-none collapsed focus:outline-none !bg-transparent flex justify-between items-center p-5 w-full font-bold text-left"
|
||||||
|
type="button"
|
||||||
|
data-bs-toggle="collapse"
|
||||||
|
data-bs-target="#collapse6"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="collapse6"
|
||||||
|
>
|
||||||
|
<span>How do I request a new feature?</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div
|
||||||
|
id="collapse6"
|
||||||
|
className="accordion-collapse collapse"
|
||||||
|
aria-labelledby="heading6"
|
||||||
|
data-bs-parent="#accordionExample"
|
||||||
|
>
|
||||||
|
<div className="accordion-body p-5">
|
||||||
|
<p className="text-slate-400 dark:text-gray-400 !visible">
|
||||||
|
You can request new features by creating a{" "}
|
||||||
|
<a
|
||||||
|
href="https://github.com/alcionai/corso/issues"
|
||||||
|
className="text-indigo-600"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
new GitHub issue
|
||||||
|
</a>{" "}
|
||||||
|
and labeling it as an enhancement.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -1,83 +0,0 @@
|
|||||||
<h1>Cookie Policy for Corso</h1>
|
|
||||||
|
|
||||||
<p>This is the Cookie Policy for Corso, accessible from https://corsobackup.io</p>
|
|
||||||
|
|
||||||
<p><strong>What Are Cookies</strong></p>
|
|
||||||
|
|
||||||
<p>As is common practice with almost all professional websites this site uses cookies, which are tiny files that are downloaded to your computer, to improve your experience. This page describes what information they gather, how we use it and why we sometimes need to store these cookies. We will also share how you can prevent these cookies from being stored however this may downgrade or 'break' certain elements of the sites functionality.</p>
|
|
||||||
|
|
||||||
<p><strong>How We Use Cookies</strong></p>
|
|
||||||
|
|
||||||
<p>We use cookies for a variety of reasons detailed below. Unfortunately in most cases there are no industry standard options for disabling cookies without completely disabling the functionality and features they add to this site. It is recommended that you leave on all cookies if you are not sure whether you need them or not in case they are used to provide a service that you use.</p>
|
|
||||||
|
|
||||||
<p><strong>Disabling Cookies</strong></p>
|
|
||||||
|
|
||||||
<p>You can prevent the setting of cookies by adjusting the settings on your browser (see your browser Help for how to do this). Be aware that disabling cookies will affect the functionality of this and many other websites that you visit. Disabling cookies will usually result in also disabling certain functionality and features of the this site. Therefore it is recommended that you do not disable cookies. This Cookies Policy was created with the help of the <a href="https://www.cookiepolicygenerator.com/cookie-policy-generator/">Cookies Policy Generator</a>.</p>
|
|
||||||
<p><strong>The Cookies We Set</strong></p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<p>Email newsletters related cookies</p>
|
|
||||||
<p>This site offers newsletter or email subscription services and cookies may be used to remember if you are already registered and whether to show certain notifications which might only be valid to subscribed/unsubscribed users.</p>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<p>Surveys related cookies</p>
|
|
||||||
<p>From time to time we offer user surveys and questionnaires to provide you with interesting insights, helpful tools, or to understand our user base more accurately. These surveys may use cookies to remember who has already taken part in a survey or to provide you with accurate results after you change pages.</p>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<p>Forms related cookies</p>
|
|
||||||
<p>When you submit data to through a form such as those found on contact pages or comment forms cookies may be set to remember your user details for future correspondence.</p>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<p>Site preferences cookies</p>
|
|
||||||
<p>In order to provide you with a great experience on this site we provide the functionality to set your preferences for how this site runs when you use it. In order to remember your preferences we need to set cookies so that this information can be called whenever you interact with a page is affected by your preferences.</p>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p><strong>Third Party Cookies</strong></p>
|
|
||||||
|
|
||||||
<p>In some special cases we also use cookies provided by trusted third parties. The following section details which third party cookies you might encounter through this site.</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<p>This site uses Google Analytics which is one of the most widespread and trusted analytics solution on the web for helping us to understand how you use the site and ways that we can improve your experience. These cookies may track things such as how long you spend on the site and the pages that you visit so we can continue to produce engaging content.</p>
|
|
||||||
<p>For more information on Google Analytics cookies, see the official Google Analytics page.</p>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<p>Third party analytics are used to track and measure usage of this site so that we can continue to produce engaging content. These cookies may track things such as how long you spend on the site or pages you visit which helps us to understand how we can improve the site for you.</p>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<p>From time to time we test new features and make subtle changes to the way that the site is delivered. When we are still testing new features these cookies may be used to ensure that you receive a consistent experience whilst on the site whilst ensuring we understand which optimisations our users appreciate the most.</p>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p><strong>More Information</strong></p>
|
|
||||||
|
|
||||||
<p>Hopefully that has clarified things for you and as was previously mentioned if there is something that you aren't sure whether you need or not it's usually safer to leave cookies enabled in case it does interact with one of the features you use on our site.</p>
|
|
||||||
|
|
||||||
<p>For more general information on cookies, please read <a href="https://www.cookiepolicygenerator.com/sample-cookies-policy/">the Cookies Policy article</a>.</p>
|
|
||||||
|
|
||||||
<p>However if you are still looking for more information then you can contact us through one of our preferred contact methods:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Email: info@corsobackup.io</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
@ -1,109 +0,0 @@
|
|||||||
@@include("partials/dark-theme.html")
|
|
||||||
<head>
|
|
||||||
@@include("partials/title-meta.html", {"title": "Corso Announcement"})
|
|
||||||
|
|
||||||
<!-- Css -->
|
|
||||||
@@include("partials/head-css.html")
|
|
||||||
</head>
|
|
||||||
|
|
||||||
@@include("partials/body.html")
|
|
||||||
<!-- Loader Start -->
|
|
||||||
<!-- <div id="preloader">
|
|
||||||
<div id="status">
|
|
||||||
<div class="spinner">
|
|
||||||
<div class="double-bounce1"></div>
|
|
||||||
<div class="double-bounce2"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
<!-- Loader End -->
|
|
||||||
|
|
||||||
@@include("partials/navbar/nav-center.html")
|
|
||||||
|
|
||||||
<!-- Start Hero -->
|
|
||||||
<section class="relative table w-full py-32 lg:py-36 bg-[url('../../assets/images/blog/work.jpg')] bg-center bg-no-repeat">
|
|
||||||
<div class="absolute inset-0 bg-black opacity-80"></div>
|
|
||||||
<div class="container">
|
|
||||||
<div class="grid grid-cols-1 pb-8 text-center mt-10">
|
|
||||||
<h3 class="mb-3 text-3xl leading-normal font-medium text-white">A home to call your own: <br> The need for your own backups in IT </h3>
|
|
||||||
</div><!--end grid-->
|
|
||||||
</div><!--end container-->
|
|
||||||
|
|
||||||
<div class="absolute text-center z-10 bottom-5 right-0 left-0 mx-3">
|
|
||||||
<ul class="breadcrumb tracking-[0.5px] breadcrumb-light mb-0 inline-block">
|
|
||||||
<li class="inline breadcrumb-item uppercase text-[13px] font-bold duration-500 ease-in-out text-white/50 hover:text-white"><a href="index.html">Corso</a></li>
|
|
||||||
<li class="inline breadcrumb-item uppercase text-[13px] font-bold duration-500 ease-in-out text-white" aria-current="page">Blogs</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</section><!--end section-->
|
|
||||||
<div class="relative">
|
|
||||||
<div class="shape absolute right-0 sm:-bottom-px -bottom-[2px] left-0 overflow-hidden z-1 text-white dark:text-slate-900">
|
|
||||||
<svg class="w-full h-auto" viewBox="0 0 2880 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M0 48H1437.5H2880V0H2160C1442.5 52 720 0 720 0H0V48Z" fill="currentColor"></path>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- End Hero -->
|
|
||||||
|
|
||||||
<!-- Start Section-->
|
|
||||||
<section class="relative md:py-24 py-16">
|
|
||||||
<div class="container">
|
|
||||||
<div class="grid md:grid-cols-12 grid-cols-1 gap-[30px]">
|
|
||||||
<div class="lg:col-span-8 md:col-span-6">
|
|
||||||
<div class="p-6 rounded-md shadow dark:shadow-gray-800">
|
|
||||||
|
|
||||||
<div id="output" class="content markdown-body"><h1 class="mb-6 mt-8 md:text-4xl text-3xl md:leading-normal leading-normal font-bold" id="a-home-to-call-your-own-the-need-for-your-own-backups-in-it">A Home to Call Your Own: The Need for Your Own Backups in IT</h1>
|
|
||||||
<p class="text-base pb-4">Have you had it with Google sheets? So have I. Excel is my home. It’s where I write all my best formulae. And what about PowerPoint? The way it just finds stock photos for you? The automatic ‘alternative designs for this slide’ button? It’s too good. I can’t give up Microsoft 365. </p>
|
|
||||||
<p class="text-base pb-4">If you did some work today, there’s a very good chance you opened a Microsoft tool. M365 is used by <a class="text-indigo-600" target="_blank" href="https://www.statista.com/statistics/983321/worldwide-office-365-user-numbers-by-country/">more than a million</a> companies worldwide, and nearly 880,000 companies in the U.S. use the software suite. But with that widespread usage comes risk, business-critical data is at risk of loss or corruption, if not securely backed up and protected. </p>
|
|
||||||
<h2 class="mb-4 text-3xl leading-normal font-medium pt-6" id="the-problem-with-built-in-backups">The problem with built-in backups</h2>
|
|
||||||
<p class="text-base pb-4">A couple of years back I took the time to get the AWS ‘baby cert,’ their first certification. The focus of the material surprised me, along with learning about the most popular AWS products and their benefits, you had to learn cold all the things that AWS will not do for you. AWS won’t alert you to poor performance on your applications. It won’t automatically scale down your instances. And while AWS and the other public cloud providers completely meet their promised SLA, they do not promise to deliver the backups that you expect them to deliver. </p>
|
|
||||||
<p class="text-base pb-4">“I accidentally deleted the customer DB,” isn’t a situation that public cloud companies are built to prevent or ameliorate. Fundamentally, on all public clouds, backups are a shared responsibility between administrator and service. For another example, see this from Microsoft's Diana Kelley: <a class="text-indigo-600" target="_blank" href="https://www.statista.com/statistics/983321/worldwide-office-365-user-numbers-by-country/">"Driving data security is a shared responsibility, here’s how you can protect yourself"</a></p>
|
|
||||||
<h2 class="mb-4 text-3xl leading-normal font-medium" id="data-loss-happens">Data Loss Happens</h2>
|
|
||||||
<p class="text-base pb-4">Let’s talk about the stats on data loss: </p>
|
|
||||||
<p class="text-base pb-4">Data loss can result from accidental or intentional deletion, cyber-attacks and malware, a poorly executed migration, or the cancellation of a software license, among other reasons. For example, <a class="text-indigo-600" target="_blank" href="https://www.veeam.com/blog/data-loss-2022.html">40% – 2 out of 5 servers</a> – had at least one or more outages over the past 12 months. And cybercrime is on a continual rise – the average number of data breaches and cyberattacks were <a class="text-indigo-600" target="_blank" href="https://www.forbes.com/sites/chuckbrooks/2022/06/03/alarming-cyber-statistics-for-mid-year-2022-that-you-need-to-know/?sh=642204357864">up 15.1% in 2021</a>, compared with the previous year. As of 2022, the average cost of a data breach in the U.S. was $9.44 million. </p>
|
|
||||||
<h2 class="mb-4 text-3xl leading-normal font-medium" id="the-limitations-of-backup-tools">The limitations of backup tools</h2>
|
|
||||||
<p class="text-base pb-4">While many backup and recovery solutions exist for M365 data, many lack comprehensive workflows, are hard to use and implement, or are cost prohibitive. Yet reliable and regular backups are critical for ensuring your data is protected and always available, in case of a breach, unexpected server failure or failed data migration. </p>
|
|
||||||
|
|
||||||
</div><p class="text-base pb-4">And that’s why we built Corso, a free and secure, 100% open-source solution that protects M365 data by securely and efficiently backing up all business-critical data to object storage. </p>
|
|
||||||
<h2 class="mb-4 text-3xl leading-normal font-medium" id="why-corso">Why Corso?</h2>
|
|
||||||
<p class="text-base pb-4">Corso is purpose-built for protection of your M365 organization account (this tool doesn’t work with consumer accounts) with easy-to-use comprehensive backup and restore workflows that reduce backup time and administrative overhead, improve time-to-recovery, and replace unreliable scripts or workarounds. It enables high-throughput, high-tolerance backups that feature end-to-end encryption, deduplication, and compression. Plus, it’s compatible with any S3-compliant object storage system: AWS S3 (including Glacier Instant Access), Google Cloud Storage and Backblaze. (Azure Blob support is coming soon). </p>
|
|
||||||
<p class="text-base pb-4">Corso’s secure backup protects against accidental data loss, service provider downtime and malicious threats, including ransomware attacks. Plus, a robust user community provides a venue for admins to share and learn about data protection and find best practices for how to security configure their M365 environments. As a member of the community, you’ll have access to blogs, forums, and discussion, as well as updates on public and feedback-driven development. <a class="text-indigo-600" target="_blank" href="https://discord.gg/63DTTSnuhT">Join the Corso community on Discord</a>. </p>
|
|
||||||
<h2 class="mb-4 text-3xl leading-normal font-medium" id="low-cost-and-highly-secure">Low-Cost and Highly Secure</h2>
|
|
||||||
<p class="text-base pb-4">Corso's source code is licensed under the Apache v2 open-source license. It’s open source, and it’s free – which makes it the perfect solution for cost-conscious teams. And that’s not where the cost savings end, Corso’s flexible retention policies and ability to compress and deduplicate data efficiently before sending it to storage, helps reduce storage costs, as well. </p>
|
|
||||||
<h2 class="mb-4 text-3xl leading-normal font-medium" id="interested-in-trying-corso">Interested in Trying Corso?</h2>
|
|
||||||
<p class="text-base pb-4">Corso is currently a tool in alpha to give you a CLI for backups of your M365 data. <a class="text-indigo-600" target="_blank" href="https://docs.corsobackup.io/">Follow the quickstart guide</a> to start protecting your business-critical M365 data in just a few minutes. Because Corso is currently in alpha, it should NOT be used in production. </p>
|
|
||||||
<p class="text-base pb-4">Corso supports Microsoft 365 Exchange and OneDrive, with SharePoint and Teams support in active development. Coverage for more services, beyond M365, will expand based on the interests and needs of the community. </p>
|
|
||||||
<p class="text-base pb-4">So, your feedback is critical for our work on this tool! Please <a class="text-indigo-600" target="_blank" href="https://discord.gg/63DTTSnuhT">tell us what you think of Corso</a>. </p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="lg:col-span-4 md:col-span-6">
|
|
||||||
<div class="sticky top-20">
|
|
||||||
<h5 class="text-lg font-semibold bg-gray-50 dark:bg-slate-800 shadow dark:shadow-gray-800 rounded-md p-2 text-center">Author</h5>
|
|
||||||
<div class="text-center mt-8">
|
|
||||||
<img src="assets/images/people/nica.jpeg" class="h-24 w-24 mx-auto rounded-full shadow mb-4" alt="">
|
|
||||||
|
|
||||||
<a href="" class="text-lg font-semibold hover:text-indigo-600 transition-all duration-500 ease-in-out">Nočnica Mellifera</a>
|
|
||||||
<p class="text-slate-400">Head of Developer Advocacy</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div><!--end grid-->
|
|
||||||
</div><!--end container-->
|
|
||||||
|
|
||||||
</section><!--end section-->
|
|
||||||
<!-- End -->
|
|
||||||
|
|
||||||
@@include("partials/footer/footer.html")
|
|
||||||
|
|
||||||
<!-- Back to top -->
|
|
||||||
<a href="#" onclick="topFunction()" id="back-to-top" class="back-to-top fixed hidden text-lg rounded-full z-10 bottom-5 right-5 h-9 w-9 text-center bg-indigo-600 text-white leading-9"><i class="uil uil-arrow-up"></i></a>
|
|
||||||
<!-- Back to top -->
|
|
||||||
|
|
||||||
<!-- JAVASCRIPTS -->
|
|
||||||
<script src="assets/libs/feather-icons/feather.min.js"></script>
|
|
||||||
@@include("partials/script-file.html")
|
|
||||||
<!-- JAVASCRIPTS -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||