├── .astro └── settings.json ├── .github ├── FUNDING.yml ├── actions │ └── build-template-action │ │ ├── action.yml │ │ └── script.sh ├── stale.yml └── workflows │ ├── deploy.yml │ ├── release.yml │ └── standard-version.yml ├── .gitignore ├── .npmrc ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── CHANGELOG.md ├── Dockerfile ├── LICENSE.md ├── README.md ├── astro.config.mjs ├── docker-compose.yml ├── nginx └── alpinejs.conf ├── package.json ├── pnpm-lock.yaml ├── postcss.config.cjs ├── public ├── favicon.svg └── img │ ├── favicon.svg │ ├── illustrations │ ├── doctors │ │ ├── doctor-1.svg │ │ ├── doctor-10.svg │ │ ├── doctor-11.svg │ │ ├── doctor-12.svg │ │ ├── doctor-2.svg │ │ ├── doctor-3.svg │ │ ├── doctor-4.svg │ │ ├── doctor-5.svg │ │ ├── doctor-6.svg │ │ ├── doctor-7.svg │ │ ├── doctor-8.svg │ │ └── doctor-9.svg │ ├── hero-dark.svg │ └── hero.svg │ ├── logo │ └── logo-square.svg │ └── screens │ ├── doctors-dark.png │ ├── doctors-dark.png:Zone.Identifier │ ├── doctors.png │ └── doctors.png:Zone.Identifier ├── src ├── components │ ├── base │ │ ├── ButtonMain.astro │ │ ├── ButtonSub.astro │ │ ├── Card.astro │ │ ├── Hamburger.astro │ │ ├── Logo.astro │ │ ├── Polka.astro │ │ └── ThemeToggler.astro │ ├── content │ │ ├── Cta.astro │ │ ├── IconBlock.astro │ │ ├── Pricing.astro │ │ ├── Testimonials.astro │ │ ├── doctors │ │ │ └── grid │ │ │ │ ├── Filters.astro │ │ │ │ ├── Grid.astro │ │ │ │ └── Toolbar.astro │ │ └── features │ │ │ ├── SideStatsLeft.astro │ │ │ └── SideStatsRight.astro │ ├── hero │ │ ├── HeroMain.astro │ │ └── HeroMainModuleOne.astro │ ├── mockup │ │ ├── MockupOne.astro │ │ └── MockupTwo.astro │ ├── navigation │ │ ├── Navbar.astro │ │ ├── NavbarSearchFilters.astro │ │ ├── NavbarSearchFiltersFive.astro │ │ ├── NavbarSearchFiltersFour.astro │ │ ├── NavbarSearchFiltersOne.astro │ │ ├── NavbarSearchFiltersThree.astro │ │ └── NavbarSearchFiltersTwo.astro │ └── section │ │ ├── Container.astro │ │ ├── Footer.astro │ │ ├── Section.astro │ │ ├── SectionMuted.astro │ │ └── SectionTitle.astro ├── env.d.ts ├── js │ ├── components │ │ ├── index.js │ │ ├── navbar.js │ │ ├── swiper.js │ │ └── theme.js │ ├── main.js │ └── pages │ │ ├── doctors.js │ │ ├── index.js │ │ └── scrollspy.js ├── layouts │ └── Default.astro ├── pages │ └── index.astro └── styles │ ├── main.css │ └── modules │ └── tooltip.css ├── tailwind.config.cjs └── tsconfig.json /.astro/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "_variables": { 3 | "lastUpdateCheck": 1714120368460 4 | }, 5 | "devToolbar": { 6 | "enabled": false 7 | } 8 | } -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: cssninjaStudio 2 | -------------------------------------------------------------------------------- /.github/actions/build-template-action/action.yml: -------------------------------------------------------------------------------- 1 | name: 'build template' 2 | description: 'build template archive' 3 | # We declare that the action takes two arguments in input 4 | inputs: 5 | project: 6 | description: 'Project' 7 | required: true 8 | tag: 9 | description: 'Tag' 10 | required: true 11 | # And ouput one variable that will be available by the workflow 12 | outputs: 13 | filepath: 14 | description: "template archive path" 15 | value: ${{ steps.build.outputs.filepath }} 16 | runs: 17 | using: "composite" 18 | steps: 19 | # Ensure that zip is installed 20 | - run: sudo apt-get install zip 21 | shell: bash 22 | # Here we pass our inputs to the script.sh 23 | - id: build 24 | run: ${{ github.action_path }}/script.sh ${{inputs.project}} ${{inputs.tag}} 25 | shell: bash 26 | -------------------------------------------------------------------------------- /.github/actions/build-template-action/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DIRECTORY=`dirname $0` 4 | INPUT_PROJECT=$1 5 | INPUT_TAG=$2 6 | 7 | if [ -z $INPUT_PROJECT ] 8 | then 9 | echo " missing" 10 | echo "Usage: ${0} " 11 | exit 1 12 | fi 13 | 14 | if [ -z $INPUT_TAG ] 15 | then 16 | echo " missing" 17 | echo "Usage: ${0} " 18 | exit 1 19 | fi 20 | 21 | # Set archive name from arguments 22 | ARCHIVE=template-${INPUT_PROJECT}-${INPUT_TAG}.zip 23 | 24 | echo "::group::building ${ARCHIVE}" 25 | echo "::debug::${ARCHIVE}" 26 | 27 | # zip sources template-${PROJECT}-${TAG}.zip 28 | zip -r ${ARCHIVE} . \ 29 | -x "dist/*" \ 30 | -x "node_modules/*" \ 31 | -x ".git/*" \ 32 | -x ".github/*" \ 33 | -x "docker-compose.yml" 34 | 35 | # Here we use echo to ouput the variables, usefull for to debug in github ui 36 | echo "$PWD" 37 | echo "$DIRECTORY" 38 | echo "$GITHUB_WORKSPACE" 39 | 40 | ls -lh $ARCHIVE 41 | 42 | echo "::endgroup::" 43 | 44 | echo "- ${INPUT_PROJECT^} ${INPUT_TAG} template built :rocket:" >> $GITHUB_STEP_SUMMARY 45 | 46 | # This step is important, it set the "filepath" output variable 47 | # Will be accessible in workflow 48 | echo "filepath=${ARCHIVE}" >> "$GITHUB_OUTPUT" 49 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | daysUntilStale: 60 2 | daysUntilClose: 7 3 | staleLabel: stale 4 | markComment: > 5 | This issue has been automatically marked as stale because it has not had 6 | recent activity. It will be closed if no further activity occurs. 7 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: deploy 2 | on: 3 | workflow_dispatch: 4 | push: 5 | paths-ignore: 6 | - 'README.md' 7 | - 'CHANGELOG.md' 8 | - 'LICENSE.md' 9 | branches: 10 | - main 11 | 12 | concurrency: 13 | group: ${{ github.workflow }} 14 | cancel-in-progress: true 15 | 16 | jobs: 17 | docker-build: 18 | runs-on: ubuntu-latest 19 | 20 | steps: 21 | - uses: actions/checkout@v4 22 | - name: Set up dockertags 23 | run: | 24 | echo "dockertags=digisquad/cssninja.dokto-demo:latest" >> $GITHUB_ENV 25 | 26 | - name: Set up QEMU 27 | uses: docker/setup-qemu-action@v3 28 | 29 | - name: Set up Docker Buildx 30 | uses: docker/setup-buildx-action@v3 31 | 32 | - name: Login to DockerHub 33 | uses: docker/login-action@v3 34 | with: 35 | username: ${{ secrets.DOCKERHUB_USERNAME }} 36 | password: ${{ secrets.DOCKERHUB_TOKEN }} 37 | 38 | - name: Build and push 39 | id: docker_build 40 | uses: docker/build-push-action@v5 41 | timeout-minutes: 60 42 | with: 43 | push: true 44 | tags: ${{ env.dockertags }} 45 | cache-from: type=gha 46 | cache-to: type=gha,mode=max 47 | 48 | deploy: 49 | runs-on: ubuntu-latest 50 | needs: [docker-build] 51 | 52 | steps: 53 | - uses: actions/checkout@v4 54 | - name: Prepare 55 | uses: appleboy/ssh-action@master 56 | with: 57 | host: ${{ secrets.SSH_HOST }} 58 | username: ${{ secrets.SSH_USER }} 59 | key: ${{ secrets.SSH_PRIVATE_KEY }} 60 | script_stop: true 61 | script: mkdir -p ${{ secrets.HOST_DIRECTORY }} 62 | 63 | - name: Publish 64 | uses: appleboy/scp-action@master 65 | with: 66 | host: ${{ secrets.SSH_HOST }} 67 | username: ${{ secrets.SSH_USER }} 68 | key: ${{ secrets.SSH_PRIVATE_KEY }} 69 | source: docker-compose.yml 70 | target: ${{ secrets.HOST_DIRECTORY }} 71 | 72 | - name: Deploy 73 | uses: appleboy/ssh-action@master 74 | with: 75 | host: ${{ secrets.SSH_HOST }} 76 | username: ${{ secrets.SSH_USER }} 77 | key: ${{ secrets.SSH_PRIVATE_KEY }} 78 | script_stop: true 79 | script: | 80 | cd ${{ secrets.HOST_DIRECTORY }} 81 | docker compose pull 82 | docker compose up -d --force-recreate --remove-orphans 83 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | on: 3 | # Automatically run when a semver tag is pushed 4 | push: 5 | tags: 6 | - 'v*.*.*' 7 | 8 | jobs: 9 | release: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | # Checkout action retreive the source (git clone) 14 | - uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 # needed to retreive all git history 17 | 18 | # Enable corepack, note that nodejs is already installed 19 | - run: corepack enable 20 | 21 | # Setup pnpm with cache 22 | - uses: actions/setup-node@v4 23 | with: 24 | node-version: 20 25 | cache: "pnpm" 26 | 27 | # Compute tag and capitalized product name 28 | - id: meta 29 | name: release meta 30 | run: | 31 | project=${GITHUB_REPOSITORY#*/} 32 | echo "PROJECT=${project}" >> "$GITHUB_OUTPUT" 33 | echo "PROJECT_CAP=${project^}" >> "$GITHUB_OUTPUT" 34 | echo "TAG=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT" 35 | 36 | # This is where we generate releases assets. 37 | # It use a github action in the current directory 38 | # which contains a shell script to create the archive. 39 | # The archive path is stored in the output action 40 | - id: build_template 41 | name: build release template 42 | uses: ./.github/actions/build-template-action 43 | with: 44 | tag: ${{ steps.meta.outputs.TAG }} 45 | project: ${{ steps.meta.outputs.PROJECT }} 46 | 47 | # We re-generate the changelog using a subset of standard-version 48 | # The content is generated in a temp /CHANGELOG_RELEASE.md file 49 | # It is used to generate the body of the github release 50 | - id: changelog 51 | name: release changelog 52 | run: | 53 | pnpm dlx conventional-changelog-cli -p conventionalcommits -r 2 -o ${{ github.workspace }}/CHANGELOG_RELEASE.md 54 | cat ${{ github.workspace }}/CHANGELOG_RELEASE.md 55 | 56 | # Prepare the draft github release 57 | - id: create_release 58 | name: create github draft release 59 | uses: softprops/action-gh-release@v2 60 | with: 61 | # Use outputs from meta and changelog 62 | tag_name: ${{ steps.meta.outputs.TAG }} 63 | name: ${{ steps.meta.outputs.PROJECT_CAP }} ${{ steps.meta.outputs.TAG }} 64 | body_path: ${{ github.workspace }}/CHANGELOG_RELEASE.md 65 | prerelease: false 66 | # The draft is required to allow file upload 67 | draft: true 68 | fail_on_unmatched_files: true 69 | # Here we bind files built by custom actions to the release 70 | files: | 71 | ${{ github.workspace }}/${{ steps.build_template.outputs.filepath }} 72 | 73 | # Publish the github release 74 | # Dojo listen to those events 75 | - name: publish github draft release 76 | uses: eregon/publish-release@v1 77 | env: 78 | GITHUB_TOKEN: ${{ secrets.APP_GITHUB_TOKEN }} 79 | with: 80 | release_id: ${{ steps.create_release.outputs.id }} 81 | -------------------------------------------------------------------------------- /.github/workflows/standard-version.yml: -------------------------------------------------------------------------------- 1 | name: standard-version 2 | on: 3 | # Allow to be manually dispatched 4 | workflow_dispatch: 5 | inputs: 6 | options: 7 | description: 'standard-version options' 8 | # Allow to be run via webhooks (Dojo will use this) 9 | repository_dispatch: 10 | types: [standard-version] 11 | 12 | jobs: 13 | standard-version: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | # Checkout action retreive the source (git clone) 18 | - uses: actions/checkout@v4 19 | with: 20 | fetch-depth: 0 # needed to retreive all git history 21 | token: ${{ secrets.APP_GITHUB_TOKEN }} 22 | 23 | # Enable corepack, note that nodejs is already installed 24 | - run: corepack enable 25 | 26 | # Setup pnpm with cache 27 | - uses: actions/setup-node@v4 28 | with: 29 | node-version: 20 30 | cache: "pnpm" 31 | 32 | # Run "standard-version", which may create a new tag 33 | - run: | 34 | git config user.name digisquad-bot 35 | git config user.email admin@digisquad.io 36 | pnpm dlx standard-version ${{ github.event.inputs.options }} 37 | git push --follow-tags origin main 38 | env: 39 | GITHUB_TOKEN: ${{ secrets.APP_GITHUB_TOKEN }} 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | .output/ 4 | 5 | # dependencies 6 | node_modules/ 7 | 8 | # logs 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | pnpm-debug.log* 13 | 14 | 15 | # environment variables 16 | .env 17 | .env.production 18 | 19 | # macOS-specific files 20 | .DS_Store 21 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # Disable npm warning about missing optional peer dependencies 2 | strict-peer-dependencies=false 3 | legacy-peer-deps=true 4 | # Force pnpm to install all deep dependencies in node_modules 5 | shamefully-hoist=true 6 | # Use v6 lockfile format 7 | use-lockfile-v6=true -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "astro.typescript.enabled": false 3 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | ## [1.4.0](https://github.com/cssninjaStudio/dokto/compare/v1.3.0...v1.4.0) (2024-04-27) 6 | 7 | 8 | ### Features 9 | 10 | * migrate to iconify-icon, update dependencies ([232ec47](https://github.com/cssninjaStudio/dokto/commit/232ec47b8c1824b6b44aa117f7eada3a7a2a0bc7)) 11 | 12 | ## [1.3.0](https://github.com/cssninjaStudio/dokto/compare/v1.2.0...v1.3.0) (2023-09-17) 13 | 14 | 15 | ### Features 16 | 17 | * migrate to Astro 3 ([5d67e6a](https://github.com/cssninjaStudio/dokto/commit/5d67e6a1ce4eff68b32973046dc6b525dc704e80)) 18 | * use variable fonts from fontsources ([b6348ba](https://github.com/cssninjaStudio/dokto/commit/b6348bae7a26b9ca42b63f035833a9aa293803b7)) 19 | 20 | 21 | ### Bug Fixes 22 | 23 | * upgrade engines to node 18 and pnpm 8 ([3e6550e](https://github.com/cssninjaStudio/dokto/commit/3e6550e86ee425e9a75a726440d784b9e78dd709)) 24 | 25 | ## [1.2.0](https://github.com/cssninjaStudio/dokto/compare/v1.1.0...v1.2.0) (2023-05-03) 26 | 27 | 28 | ### Features 29 | 30 | * upgrade dependencies + add unplugin-fonts ([581a681](https://github.com/cssninjaStudio/dokto/commit/581a681d43ffd5dd92d24ab09f00c72da9fe27b1)) 31 | 32 | ## [1.1.0](https://github.com/cssninjaStudio/dokto/compare/v1.0.1...v1.1.0) (2023-02-10) 33 | 34 | 35 | ### Features 36 | 37 | * upgrade to Astro v2 ([69d7ea8](https://github.com/cssninjaStudio/dokto/commit/69d7ea885fd9a3943664ae2c83c419bb273b54cb)) 38 | 39 | ### [1.0.1](https://github.com/cssninjaStudio/dokto/compare/v1.0.0...v1.0.1) (2022-12-28) 40 | 41 | 42 | ### Bug Fixes 43 | 44 | * hero ([a2b1c01](https://github.com/cssninjaStudio/dokto/commit/a2b1c01ac159ee0e75d713493e7928a6e5433f30)) 45 | 46 | ## 1.0.0 (2022-12-28) 47 | 48 | 49 | ### Features 50 | 51 | * initial commit ([998fb5d](https://github.com/cssninjaStudio/dokto/commit/998fb5dbee8dfa7c425f32c42a6873393057a49d)) 52 | * search filters, scrollspy ([4263241](https://github.com/cssninjaStudio/dokto/commit/4263241bccd16feac7b727825b2cdad907567633)) 53 | * setup deploy ([4800ecb](https://github.com/cssninjaStudio/dokto/commit/4800ecb9c941da332cab052d8546247ded576a27)) 54 | 55 | 56 | ### Bug Fixes 57 | 58 | * favicon ([647f668](https://github.com/cssninjaStudio/dokto/commit/647f668979756463a926615b1257d5983148c662)) 59 | * scrollspy ([d51b917](https://github.com/cssninjaStudio/dokto/commit/d51b917bfe243277f9d27ff339457dcdb755c514)) 60 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM bitnami/node:20 AS build 2 | WORKDIR /app 3 | 4 | RUN corepack enable 5 | 6 | COPY package.json ./ 7 | COPY pnpm-lock.yaml ./ 8 | COPY .npmrc ./ 9 | RUN pnpm install --frozen-lockfile 10 | 11 | COPY . . 12 | RUN pnpm build 13 | 14 | 15 | FROM bitnami/nginx:1.25 AS prod 16 | WORKDIR /app 17 | 18 | COPY --from=build /app/dist . 19 | COPY ./nginx/alpinejs.conf /opt/bitnami/nginx/conf/server_blocks/nginx.conf -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2023 cssninjaStudio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Screenshot](https://media.cssninja.io/products/dokto/product.png "Dokto") 2 | 3 | # 👋 Dokto 4 | > Dokto is a free landing page starter built by [cssninjaStudio](https://cssninja.io). 5 | 6 | [![cssninja-discord](https://img.shields.io/discord/785473098069311510?label=join%20us%20on%20discord&color=6944EC)](https://go.cssninja.io/discord) 7 | 8 | ## ✌️ preview 9 | 10 | Check out the live demo by clicking [here](https://dokto.cssninja.io). 11 | Dokto is built with [Astro](https://astro.build), [TailwindCSS](https://tailwindcss.com/) and [Alpine JS](https://github.com/alpinejs/alpine). 12 | 13 | ## 👍 Features 14 | 15 | * Astro v4.x 16 | * Alpine v3.x 17 | * Tailwind CSS 18 | 19 | ## 👌 Usage 20 | 21 | 1. Install Depedencies 22 | 23 | ```sh 24 | pnpm i 25 | ``` 26 | 27 | 2. Run in dev mode 28 | 29 | ```sh 30 | pnpm dev 31 | ``` 32 | 33 | 3. Or build source 34 | 35 | ```sh 36 | pnpm build 37 | ``` 38 | 39 | ## 🍔 Issues 40 | 41 | If you've found an issue or a bug, you can report it in the issues section of this repository. Please try to follow these simple guidelines to report your issue: 42 | 43 | * Issue definition 44 | * Expected behaviour 45 | * Actual behaviour 46 | * steps to reproduce 47 | * Already tried fixes (if relevant) 48 | 49 | ## 🎉 More 50 | 51 | Find more premium website and app templates on [Css Ninja](https://cssninja.io/). 52 | 53 | ## 🚀 About Us 54 | 55 | Css Ninja is a web design studio. We build handcrafted and polished templates that will give some hype to your startup or to your next project. 56 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'astro/config'; 2 | 3 | // https://astro.build/config 4 | import tailwind from "@astrojs/tailwind"; 5 | 6 | // https://astro.build/config 7 | export default defineConfig({ 8 | integrations: [ 9 | tailwind() 10 | ] 11 | }); 12 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | networks: 2 | cssninja-services: 3 | external: true 4 | 5 | services: 6 | dokto-demo: 7 | image: digisquad/cssninja.dokto-demo:latest 8 | networks: 9 | - cssninja-services 10 | restart: 'unless-stopped' 11 | labels: 12 | traefik.enable: true 13 | traefik.docker.network: 'cssninja-services' 14 | traefik.http.routers.dokto-demo.entrypoints: 'http' 15 | traefik.http.routers.dokto-demo.rule: 'Host(`dokto.${HOST:-127.0.0.1.nip.io}`)' 16 | traefik.http.routers.dokto-demo.middlewares: 'https-redirect@file' 17 | traefik.http.services.dokto-demo-https.loadbalancer.server.port: 8080 18 | traefik.http.routers.dokto-demo-https.rule: 'Host(`dokto.${HOST:-127.0.0.1.nip.io}`)' 19 | traefik.http.routers.dokto-demo-https.tls: true 20 | traefik.http.routers.dokto-demo-https.entrypoints: 'https' 21 | traefik.http.routers.dokto-demo-https.tls.certresolver: 'http' 22 | 23 | -------------------------------------------------------------------------------- /nginx/alpinejs.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 8080; 3 | server_name 0.0.0.0; 4 | error_page 500 502 503 504 /50x.html; 5 | charset utf-8; 6 | proxy_hide_header X-Frame-Options; 7 | add_header X-Frame-Options ""; 8 | 9 | # Media: images, icons, video, audio, HTC 10 | location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|woff2)$ { 11 | expires 1y; 12 | access_log off; 13 | add_header Cache-Control "public"; 14 | } 15 | 16 | # CSS and Javascript 17 | location ~* \.(?:css|js)$ { 18 | expires 1y; 19 | access_log off; 20 | add_header Cache-Control "public"; 21 | } 22 | 23 | # Allow performing POST requests on static JSON files 24 | location ~* \.(?:json)$ { 25 | error_page 405 =200 $uri; 26 | } 27 | 28 | location / { 29 | root /app; 30 | index index.html; 31 | try_files $uri $uri/ /index.html; 32 | } 33 | 34 | location = /50x.html { 35 | root /usr/share/nginx/html; 36 | } 37 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dokto", 3 | "type": "module", 4 | "version": "1.4.0", 5 | "private": true, 6 | "author": { 7 | "name": "cssninjaStudio (https://cssninja.io)" 8 | }, 9 | "engines": { 10 | "node": ">=18", 11 | "pnpm": ">=8" 12 | }, 13 | "scripts": { 14 | "dev": "astro dev", 15 | "start": "astro dev", 16 | "build": "astro build", 17 | "preview": "astro preview", 18 | "astro": "astro" 19 | }, 20 | "dependencies": { 21 | "@alpinejs/collapse": "3.13.10", 22 | "@alpinejs/intersect": "3.13.10", 23 | "@alpinejs/persist": "3.13.10", 24 | "@astrojs/tailwind": "5.1.0", 25 | "iconify-icon": "^2.0.0", 26 | "@tailwindcss/aspect-ratio": "0.4.2", 27 | "@tailwindcss/typography": "0.5.12", 28 | "alpinejs": "3.13.10", 29 | "astro": "4.7.0", 30 | "swiper": "11.1.1", 31 | "tailwindcss": "3.4.3" 32 | }, 33 | "devDependencies": { 34 | "@fontsource-variable/inter": "^5.0.18", 35 | "autoprefixer": "10.4.19" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('autoprefixer'), 4 | ], 5 | }; 6 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /public/img/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 17 | 18 | -------------------------------------------------------------------------------- /public/img/illustrations/doctors/doctor-11.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/illustrations/doctors/doctor-12.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/illustrations/doctors/doctor-2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/illustrations/doctors/doctor-3.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/illustrations/doctors/doctor-7.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/illustrations/doctors/doctor-8.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/logo/logo-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/screens/doctors-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cssninjaStudio/dokto/e600cec038d053d93b8154d9bd11a623dae3bdc2/public/img/screens/doctors-dark.png -------------------------------------------------------------------------------- /public/img/screens/doctors-dark.png:Zone.Identifier: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cssninjaStudio/dokto/e600cec038d053d93b8154d9bd11a623dae3bdc2/public/img/screens/doctors-dark.png:Zone.Identifier -------------------------------------------------------------------------------- /public/img/screens/doctors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cssninjaStudio/dokto/e600cec038d053d93b8154d9bd11a623dae3bdc2/public/img/screens/doctors.png -------------------------------------------------------------------------------- /public/img/screens/doctors.png:Zone.Identifier: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cssninjaStudio/dokto/e600cec038d053d93b8154d9bd11a623dae3bdc2/public/img/screens/doctors.png:Zone.Identifier -------------------------------------------------------------------------------- /src/components/base/ButtonMain.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { to, class: className } = Astro.props; 3 | --- 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/components/base/ButtonSub.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { to, class: className } = Astro.props; 3 | --- 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/components/base/Card.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className } = Astro.props; 3 | --- 4 | 5 |
9 | 10 |
11 | -------------------------------------------------------------------------------- /src/components/base/Hamburger.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className } = Astro.props; 3 | --- 4 | 5 | 34 | -------------------------------------------------------------------------------- /src/components/base/Logo.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className } = Astro.props; 3 | --- 4 | 5 | 14 | 15 | -------------------------------------------------------------------------------- /src/components/base/Polka.astro: -------------------------------------------------------------------------------- 1 |
2 | 6 |
7 | -------------------------------------------------------------------------------- /src/components/base/ThemeToggler.astro: -------------------------------------------------------------------------------- 1 | 76 | -------------------------------------------------------------------------------- /src/components/content/Cta.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
6 |
9 |
10 |

11 | Ready to try it? 12 | Get started in less than a minute. 13 |

14 |

15 | Lorem ipsum dolor sit amet, consectetur adipiscing elit 16 | apparet statim, quae sint id aliis narrare gestiant. 17 |

18 | 22 | Start your Trial 23 | 24 |
25 |
26 |
27 | Cta image 32 | 37 |
38 |
39 |
40 |
41 | -------------------------------------------------------------------------------- /src/components/content/IconBlock.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className, icon, title, text } = Astro.props; 3 | --- 4 | 5 |
6 | 7 |

{title}

8 |

{text}

9 |
-------------------------------------------------------------------------------- /src/components/content/Pricing.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |

Comprehensive pricing

8 |

9 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Apparet 10 | statim, quae sint officia, quae actiones. Ut id aliis narrare 11 | gestiant? 12 |

13 | 14 | 18 | 19 | Learn more in our FAQ 20 | 21 | 22 | 23 |
24 |
25 |
26 | 27 |
28 |
31 |
32 |
35 |
38 | 39 |
40 |
41 |

44 | Patient 45 |

46 |
47 | 48 |

51 | A starter membership to help us build more free products. 52 |

53 |
54 |

57 | $0 58 |

59 | 60 | /per month 61 | 62 |
63 |
    64 |
  • 65 | 66 | Tracking dashboard 67 |
  • 68 |
  • 69 | 70 | Appointments 71 |
  • 72 |
  • 73 | 74 | Video Calls 75 |
  • 76 |
77 | 81 | Create Account 82 | 83 | 87 | Learn More 88 | 89 |
90 |
91 | 92 |
93 |
96 |
97 |
100 |
103 | 104 |
105 |
106 |

109 | Company 110 |

111 |
112 | 113 |

116 | A starter membership to help us build more free products. 117 |

118 |
119 |

122 | $99 123 |

124 | 125 | /per month 126 | 127 |
128 |
    129 |
  • 130 | 131 | Company dashboard 132 |
  • 133 |
  • 134 | 135 | Appointments 136 |
  • 137 |
  • 138 | 139 | Video Calls 140 |
  • 141 |
142 | 146 | Create Account 147 | 148 | 152 | Learn More 153 | 154 |
155 |
156 |
157 |
158 |
159 | -------------------------------------------------------------------------------- /src/components/content/Testimonials.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Polka from "@components/base/Polka.astro"; 3 | import Card from "@components/base/Card.astro"; 4 | --- 5 | 6 |
7 | 189 |
190 | -------------------------------------------------------------------------------- /src/components/content/doctors/grid/Filters.astro: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |

7 | Availability 8 |

9 | 10 |
11 |
12 | 20 |
23 | 35 | 36 |
37 |
38 |
39 |
40 | 41 |
42 |

45 | Location 46 |

47 | 48 |
49 | 50 |
51 |
54 | 61 |
64 |
65 |
66 | 72 |
73 | 74 |
75 |
78 | 84 |
87 |
88 |
89 | 95 |
96 | 97 |
98 |
101 | 107 |
110 |
111 |
112 | 118 |
119 | 120 |
121 |
124 | 130 |
133 |
134 |
135 | 141 |
142 |
143 |
144 | 145 |
146 |

149 | Consultation type 150 |

151 | 152 |
153 | 154 |
155 |
158 | 165 |
168 |
169 |
170 | 176 |
177 | 178 |
179 |
182 | 188 |
191 |
192 |
193 | 199 |
200 |
201 |
202 | 203 |
204 |

207 | Experience 208 |

209 | 210 |
211 | 212 |
213 |
216 | 223 |
226 |
227 |
228 | 234 |
235 | 236 |
237 |
240 | 246 |
249 |
250 |
251 | 257 |
258 | 259 |
260 |
263 | 269 |
272 |
273 |
274 | 280 |
281 |
282 |
283 |
284 | -------------------------------------------------------------------------------- /src/components/content/doctors/grid/Toolbar.astro: -------------------------------------------------------------------------------- 1 |
4 | 17 | 30 | 43 | 56 | 69 | 82 | 83 | 96 |
97 | -------------------------------------------------------------------------------- /src/components/content/features/SideStatsLeft.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import MockupTwo from '@components/mockup/MockupTwo.astro' 3 | --- 4 | 5 |
6 | 7 |
8 | 9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 |

Remote Conversations

18 | 19 |

Use messaging to keep up with your practician

22 | 23 |

24 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Tum Torquatus: Prorsus, inquit, assentior; Videmus igitur ut conquiescere. 25 |

26 | 27 | 35 | Learn more about our suite 36 | 37 | 38 |
39 |
40 |
41 | -------------------------------------------------------------------------------- /src/components/content/features/SideStatsRight.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import MockupOne from "@components/mockup/MockupOne.astro"; 3 | --- 4 | 5 |
10 | 11 |
12 | 13 |
14 | 15 |

18 | Health Monitoring Tools 19 |

20 | 21 |

24 | Keep a close eye on your health monitoring 25 |

26 | 27 |

28 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Tum Torquatus: 29 | Prorsus, inquit, assentior; Videmus igitur ut conquiescere. 30 |

31 | 32 | 36 | 37 | Learn more about our suite 38 | 39 | 40 | 41 |
42 |
43 | 44 | 45 |
46 | 47 | 48 |
49 |
50 | -------------------------------------------------------------------------------- /src/components/hero/HeroMain.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import ButtonMain from "@components/base/ButtonMain.astro"; 3 | import ButtonSub from "@components/base/ButtonSub.astro"; 4 | import HeroMainModuleOne from "@components/hero/HeroMainModuleOne.astro"; 5 | --- 6 | 7 |
10 |
11 |
12 |
13 |
16 |
19 |

22 | We help you find the Doctor you need 23 |

24 |

25 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Tibi hoc 26 | incredibile, quod beatissimum. Quamquam te quidem video minime 27 | esse deterritum. 28 |

29 |
32 | Get Started 35 | Explore 37 |
38 |
39 |
40 |
41 |
42 | Hero image 47 | 52 | 53 | 58 | 63 | 68 | 73 | 74 |
75 |
76 |
77 |
78 | -------------------------------------------------------------------------------- /src/components/hero/HeroMainModuleOne.astro: -------------------------------------------------------------------------------- 1 | 41 | -------------------------------------------------------------------------------- /src/components/mockup/MockupOne.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Polka from '@components/base/Polka.astro' 3 | --- 4 | 5 |
6 | 7 |
8 | 9 |
10 |
11 | 12 |
13 | 14 | 15 |
16 | 17 |
18 |
33 |

41 | Personal stats 42 |

43 | 44 |
45 |
46 | 47 | Fatigue 48 |
49 |
50 | 51 | Heart rate 52 |
53 |
54 | 55 | Oxygen 56 |
57 |
58 | 59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | 79 |
80 |
95 |
96 | Avatar 103 |

110 | Maya Rosselini 111 |

112 |

Milano, IT

113 |
114 | 115 | 116 | 117 | 118 | 119 |
120 |
121 |
122 |
123 |
124 | 125 |
126 |
142 |
143 | Avatar 150 |
151 |

158 | Dr. Emma Fried 159 |

160 |

has launched the call

161 |
162 |
163 | 184 | 202 |
203 |
204 |
205 |
206 |
207 | -------------------------------------------------------------------------------- /src/components/mockup/MockupTwo.astro: -------------------------------------------------------------------------------- 1 |
2 | 3 |
6 |
7 | 8 | 9 |
12 |
13 | Avatar 20 |
21 |

22 | Maya Rosselini 23 |

24 |

12 minutes ago

25 |

26 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. 27 |

28 |
29 |
30 |
31 | 32 |
35 |
36 | Avatar 43 |
44 |

45 | Dr. Glenn Heartman 46 |

47 |

8 minutes ago

48 |

49 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. 50 |

51 |
52 |
53 |
54 | 55 |
58 |
59 | Avatar 66 |
67 |

68 | Maya Rosselini 69 |

70 |

6 minutes ago

71 |

72 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. 73 |

74 |
75 |
76 |
77 |
78 | -------------------------------------------------------------------------------- /src/components/navigation/Navbar.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Logo from "@components/base/Logo.astro"; 3 | import ButtonMain from "@components/base/ButtonMain.astro"; 4 | import ThemeToggler from "@components/base/ThemeToggler.astro"; 5 | import Hamburger from "@components/base/Hamburger.astro"; 6 | import NavbarSearchFilters from "@components/navigation/NavbarSearchFilters.astro"; 7 | --- 8 | 9 |
16 |
19 | 20 |
21 | 22 |
26 | 27 |
28 | Dokto 32 |
33 | 51 |
52 | 53 |
54 |
55 | 56 |
60 |
61 |
64 | Doctors 65 |
66 |
69 | Product 70 |
71 |
74 | Pricing 75 |
76 |
77 | Sign In 78 |
79 |
80 | 81 |
82 |
83 |
84 | Signup 87 |
88 |
89 |
90 |
91 | -------------------------------------------------------------------------------- /src/components/navigation/NavbarSearchFilters.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import NavbarSearchFiltersOne from "@components/navigation/NavbarSearchFiltersOne.astro"; 3 | import NavbarSearchFiltersTwo from "@components/navigation/NavbarSearchFiltersTwo.astro"; 4 | import NavbarSearchFiltersThree from "@components/navigation/NavbarSearchFiltersThree.astro"; 5 | import NavbarSearchFiltersFour from "@components/navigation/NavbarSearchFiltersFour.astro"; 6 | import NavbarSearchFiltersFive from "@components/navigation/NavbarSearchFiltersFive.astro"; 7 | --- 8 | 9 | 10 |
31 | 32 |
33 | 34 | 61 | 62 | 89 | 90 | 117 | 118 | 145 | 146 | 173 |
174 | 175 | 176 |
177 | 178 |
179 | 180 |
181 | 182 | 183 |
184 | 185 |
186 | 187 | 188 |
189 | 190 |
191 | 192 | 193 |
194 | 195 |
196 | 197 | 198 |
199 | 200 |
201 |
202 |
-------------------------------------------------------------------------------- /src/components/navigation/NavbarSearchFiltersFive.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Select desired experience

5 | 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
21 | 26 |
29 |
30 | 31 |
32 | 38 |
39 | 40 |
41 |
44 | 49 |
52 |
53 | 54 |
55 | 61 |
62 |
63 |
64 | 65 |
66 |
69 | 74 |
77 |
78 | 79 |
80 | 86 |
87 | 88 |
89 |
92 | 97 |
100 |
101 | 102 |
103 | 109 |
110 |
111 |
112 |
113 |
114 | -------------------------------------------------------------------------------- /src/components/navigation/NavbarSearchFiltersFour.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Select a media type

5 | 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
21 | 26 |
29 |
30 | 31 |
32 | 38 |
39 | 40 |
41 |
44 | 49 |
52 |
53 | 54 |
55 | 61 |
62 | 63 |
64 |
67 | 72 |
75 |
76 | 77 |
78 | 84 |
85 |
86 |
87 |
88 |
89 | -------------------------------------------------------------------------------- /src/components/navigation/NavbarSearchFiltersOne.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Select specialities you need

5 | 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
21 | 26 |
29 |
30 | 31 |
32 | 38 |
39 | 40 |
41 |
44 | 49 |
52 |
53 | 54 |
55 | 61 |
62 | 63 |
64 |
67 | 72 |
75 |
76 | 77 |
78 | 84 |
85 | 86 |
87 |
90 | 95 |
98 |
99 | 100 |
101 | 107 |
108 |
109 |
110 | 111 |
112 |
115 | 120 |
123 |
124 | 125 |
126 | 132 |
133 | 134 |
135 |
138 | 143 |
146 |
147 | 148 |
149 | 155 |
156 | 157 |
158 |
161 | 166 |
169 |
170 | 171 |
172 | 178 |
179 |
180 |
181 |
182 |
183 | -------------------------------------------------------------------------------- /src/components/navigation/NavbarSearchFiltersThree.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Select desired locations

5 | 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
21 | 26 |
29 |
30 | 31 |
32 | 38 |
39 | 40 |
41 |
44 | 49 |
52 |
53 | 54 |
55 | 61 |
62 |
63 |
64 | 65 |
66 |
69 | 74 |
77 |
78 | 79 |
80 | 86 |
87 | 88 |
89 |
92 | 97 |
100 |
101 | 102 |
103 | 109 |
110 |
111 |
112 |
113 |
114 | -------------------------------------------------------------------------------- /src/components/navigation/NavbarSearchFiltersTwo.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

When should they be available?

5 | 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
21 | 26 |
29 |
30 | 31 |
32 | 38 |
39 | 40 |
41 |
44 | 49 |
52 |
53 | 54 |
55 | 61 |
62 | 63 |
64 |
67 | 72 |
75 |
76 | 77 |
78 | 84 |
85 | 86 |
87 |
90 | 95 |
98 |
99 | 100 |
101 | 107 |
108 |
109 |
110 |
111 |
112 | -------------------------------------------------------------------------------- /src/components/section/Container.astro: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /src/components/section/Footer.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Container from "@components/section/Container.astro"; 3 | import Logo from "@components/base/Logo.astro"; 4 | --- 5 | 6 | 248 | -------------------------------------------------------------------------------- /src/components/section/Section.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className } = Astro.props; 3 | --- 4 | 5 |
9 | 10 |
11 | -------------------------------------------------------------------------------- /src/components/section/SectionMuted.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className } = Astro.props; 3 | --- 4 | 5 |
9 | 10 |
11 | -------------------------------------------------------------------------------- /src/components/section/SectionTitle.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className, title, subtitle, minititle } = Astro.props; 3 | --- 4 | 5 |
6 |

{minititle}

7 |

{title}

8 |

{subtitle}

9 |
10 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// -------------------------------------------------------------------------------- /src/js/components/index.js: -------------------------------------------------------------------------------- 1 | import { theme } from "./theme"; 2 | import { navbar } from "./navbar"; 3 | import { swiper } from "./swiper"; 4 | 5 | window.theme = theme; 6 | window.navbar = navbar 7 | window.swiper = swiper -------------------------------------------------------------------------------- /src/js/components/navbar.js: -------------------------------------------------------------------------------- 1 | export function navbar() { 2 | return { 3 | scrolled: false, 4 | height: 60, 5 | mobileOpen: false, 6 | scroll() { 7 | let scrollValue = window.scrollY; 8 | if (scrollValue >= this.height) { 9 | this.scrolled = true; 10 | } else { 11 | this.scrolled = false; 12 | } 13 | }, 14 | isFiltersOpen: false, 15 | activeFilterTab: 'tab-1', 16 | openFilters() { 17 | this.isFiltersOpen = true 18 | }, 19 | closeFilters() { 20 | this.isFiltersOpen = false 21 | }, 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /src/js/components/swiper.js: -------------------------------------------------------------------------------- 1 | import Swiper from "swiper"; 2 | 3 | export function swiper() { 4 | return { 5 | swiper: null, 6 | init() { 7 | this.swiper = new Swiper(this.$refs.container, { 8 | loop: true, 9 | autoplay: { 10 | delay: 5000, 11 | }, 12 | slidesPerView: 4, 13 | spaceBetween: 20, 14 | pagination: { 15 | el: ".carousel-pagination", 16 | type: "bullets", 17 | }, 18 | breakpoints: { 19 | 340: { 20 | slidesPerView: 1, 21 | spaceBetween: 20, 22 | }, 23 | 768: { 24 | slidesPerView: 3, 25 | spaceBetween: 20, 26 | }, 27 | 1024: { 28 | slidesPerView: 4, 29 | spaceBetween: 20, 30 | }, 31 | }, 32 | }); 33 | }, 34 | }; 35 | } 36 | -------------------------------------------------------------------------------- /src/js/components/theme.js: -------------------------------------------------------------------------------- 1 | export function theme() { 2 | return { 3 | toggleTheme() { 4 | this.$store.app.isDark = !this.$store.app.isDark; 5 | }, 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /src/js/main.js: -------------------------------------------------------------------------------- 1 | //Alpine JS and plugins import 2 | import Alpine from "alpinejs"; 3 | import intersect from "@alpinejs/intersect"; 4 | import persist from "@alpinejs/persist"; 5 | import collapse from "@alpinejs/collapse"; 6 | import 'iconify-icon'; 7 | 8 | window.Alpine = Alpine; 9 | //Init collapse plugin 10 | Alpine.plugin(collapse); 11 | //Init intersect plugin 12 | Alpine.plugin(intersect); 13 | //Init persist plugin 14 | Alpine.plugin(persist); 15 | //Init store 16 | Alpine.store("app", { 17 | init() { 18 | this.isDark = window.matchMedia("(prefers-color-scheme: dark)").matches; 19 | }, 20 | isDark: Alpine.$persist(false), 21 | isLoggedIn: Alpine.$persist(false), 22 | }); 23 | //Start Alpine JS 24 | Alpine.start(); 25 | 26 | import "./components"; 27 | import "./pages"; 28 | 29 | document.onreadystatechange = function () { 30 | if (document.readyState == "complete") { 31 | //Run something globally 32 | document.querySelectorAll('a[href^="#"]').forEach((trigger) => { 33 | trigger.onclick = function (e) { 34 | e.preventDefault(); 35 | let hash = this.getAttribute("href"); 36 | let target = document.querySelector(hash); 37 | let headerOffset = 100; 38 | let elementPosition = target.offsetTop; 39 | let offsetPosition = elementPosition - headerOffset; 40 | 41 | window.scrollTo({ 42 | top: offsetPosition, 43 | behavior: "smooth", 44 | }); 45 | }; 46 | }); 47 | } 48 | }; 49 | -------------------------------------------------------------------------------- /src/js/pages/doctors.js: -------------------------------------------------------------------------------- 1 | export function doctors() { 2 | return { 3 | activeCategory: "all", 4 | resetScroll() { 5 | window.scrollTo({ top: 350, behavior: "smooth" }); 6 | return false; 7 | }, 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /src/js/pages/index.js: -------------------------------------------------------------------------------- 1 | import { homeSpy } from "./scrollspy"; 2 | import { doctors } from "./doctors"; 3 | 4 | window.homeSpy = homeSpy 5 | window.doctors = doctors; 6 | 7 | -------------------------------------------------------------------------------- /src/js/pages/scrollspy.js: -------------------------------------------------------------------------------- 1 | export function homeSpy() { 2 | return { 3 | activeStep: '' 4 | } 5 | } -------------------------------------------------------------------------------- /src/layouts/Default.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { ViewTransitions } from 'astro:transitions'; 3 | import Navbar from "@components/navigation/Navbar.astro"; 4 | import Footer from "@components/section/Footer.astro"; 5 | import '@fontsource-variable/inter'; 6 | import 'swiper/swiper-bundle.css'; 7 | import "../styles/main.css"; 8 | const { title } = Astro.props; 9 | --- 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | Dokto {"- " + title} 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |