Initial commit of the Dr Shahab Mousavi website.
Next.js clone of the clinic site with Meshkee-backed articles and portfolio pages. Co-authored-by: Cursor <cursoragent@cursor.com>
@@ -0,0 +1,11 @@
|
||||
# Meshkee Website API — see CONTEXT.md. All values below are the defaults that
|
||||
# src/lib/meshkee.ts falls back to, so a local .env.local is only needed to
|
||||
# point the site at a different tenant or environment.
|
||||
|
||||
NEXT_PUBLIC_MESHKEE_API_BASE=https://api.meshkee.com/api/v1
|
||||
|
||||
# Apex domain of this site: no www, api, customer or business prefix.
|
||||
NEXT_PUBLIC_SITE_DOMAIN=dr-mousavi.com
|
||||
|
||||
# Customer portal used for sign-in and the header account icon.
|
||||
NEXT_PUBLIC_CUSTOMER_URL=https://customer.dr-mousavi.com
|
||||
@@ -0,0 +1,7 @@
|
||||
node_modules
|
||||
.next
|
||||
out
|
||||
.DS_Store
|
||||
*.log
|
||||
.env*.local
|
||||
tsconfig.tsbuildinfo
|
||||
@@ -0,0 +1,15 @@
|
||||
Domain: dr-mousavi.com
|
||||
Documentation for backend is:https://api.meshkee.com/docs/website
|
||||
|
||||
|
||||
Login or user icon should go to customer.{domainName}.com
|
||||
|
||||
Create portfolio page and details (نمونه عمل ها) >> connect to portfolios
|
||||
Details page:
|
||||
- use light box gallery
|
||||
- has comments. Comment is for authenticated user if not show a login link button or box
|
||||
|
||||
Create blog page and details >> connect to blog
|
||||
|
||||
|
||||
update context md for better use in other Ai and systems - update it on every prompt (If required)
|
||||
@@ -0,0 +1,19 @@
|
||||
Wire this page to arjmandpharmacy.com static-image slots.
|
||||
|
||||
Read http://meshkee.com/docs/website (static-images). Env is already set.
|
||||
|
||||
Fetch slots, match by key:
|
||||
- slider > duplicatable
|
||||
- two-banner-below-slider > two slot
|
||||
- categories > duplicatable
|
||||
- two-banner-row → two slot
|
||||
- three-banner-row → three slot
|
||||
- about us image - one slot
|
||||
|
||||
Use slot.images (all of them if kind=list, first if kind=single).
|
||||
url → <img src>. linkUrl → wrap in <a>. Empty or fail → keep current placeholder.
|
||||
Use slot.aspectRatio from the API. Do not invent upload APIs.
|
||||
|
||||
If image size or aspect ratio has changed during development, please update it for statics image reader. Add this as rule
|
||||
|
||||
update context md for better use in other Ai and systems - update it on every prompt (If required)
|
||||
@@ -0,0 +1,13 @@
|
||||
Clone a website for ent doctor from dr-mousavi.com
|
||||
Download and use banners,images and fonts from main website, icon and color Pallete from main website
|
||||
Logo from main website either
|
||||
|
||||
Pick data from current website - all data is valid
|
||||
Lang:fa
|
||||
Directions: rtl
|
||||
Use next js
|
||||
Color palette like website
|
||||
use flat design
|
||||
|
||||
Clone only homepage, about us, contact us
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
# Project context — dr-mousavi.com clone
|
||||
|
||||
Next.js rebuild of the ENT clinic site **dr-mousavi.com** (Dr Sayed Shahab Mousavipour).
|
||||
Static marketing pages are a faithful clone of the original theme; articles and
|
||||
portfolio entries come from the Meshkee Website API.
|
||||
|
||||
Locale is Farsi (`fa`) and the layout is RTL. Keep this file current when the
|
||||
project changes — other AI tools and systems read it first.
|
||||
|
||||
## Stack
|
||||
|
||||
- Next.js 15 (App Router, Turbopack) + React 19 + TypeScript
|
||||
- No UI framework: the original theme's CSS is mirrored verbatim and reused
|
||||
- Dev server: `npm run dev` (this workspace usually runs it on port 3001)
|
||||
|
||||
## Routes
|
||||
|
||||
| Route | Source of content |
|
||||
| --- | --- |
|
||||
| `/` | `src/components/generated/HomeSections.tsx` (mirrored markup) |
|
||||
| `/about-us` | `AboutSections.tsx` (mirrored markup) |
|
||||
| `/contact-us` | `ContactSections.tsx` (mirrored markup) |
|
||||
| `/ourservices` | `ServicesSections.tsx` (mirrored markup) — nav label «تخصص ها» |
|
||||
| `/surgeries` | Meshkee API `portfolios` — nav label «نمونه عمل ها» |
|
||||
| `/surgeries/[slug]` | `portfolios/{slug}` + lightbox gallery + comments |
|
||||
| `/articles` | Meshkee API `blogs` — nav label «مجله سلامت» |
|
||||
| `/articles/[slug]` | `blogs/{slug}` + comments |
|
||||
|
||||
Header and footer live in `SiteHeader.tsx` / `SiteFooter.tsx` (also generated).
|
||||
The account icon in the header points at the customer portal.
|
||||
|
||||
## Cloned theme (static pages)
|
||||
|
||||
- `public/theme/**` — the original CSS, fonts, icon font (Fontello), images and
|
||||
`aos.js`, mirrored at their original paths so the theme CSS resolves.
|
||||
- `src/components/generated/**` — JSX converted from the original HTML by
|
||||
`tools/clone_page.py`. **Do not hand-edit these files**; they are overwritten.
|
||||
Put fixes in the converter or in `src/app/globals.css`.
|
||||
- `src/app/globals.css` — fonts, theme variables, and the overrides the clone
|
||||
needs (each one carries a comment explaining what it outranks and why).
|
||||
|
||||
Regenerate everything (downloads source HTML into `tools/.cache`, mirrors any new
|
||||
asset into `public/theme`, rewrites the components):
|
||||
|
||||
```bash
|
||||
python3 tools/clone_page.py # all pages
|
||||
python3 tools/clone_page.py services # one page
|
||||
```
|
||||
|
||||
Delete `tools/.cache` to pull fresh markup from the live site.
|
||||
|
||||
### Conversion rules worth knowing
|
||||
|
||||
- Internal links become `next/link`; the account icon becomes `{CUSTOMER_URL}`.
|
||||
- `data-aos` attributes are preserved: `ScrollAnimations.tsx` loads the theme's
|
||||
own `aos.js` and calls `AOS.init()`, exactly like the original's `main.js`.
|
||||
- React style objects cannot express `!important`, so inline
|
||||
`direction: ltr !important` (how the theme alternates image/text sides) becomes
|
||||
the `wb-force-ltr` class defined in `globals.css`.
|
||||
- The theme's `.wb-convert-date` spans keep their timestamp as `data-date`;
|
||||
`SiteBehaviour.tsx` formats them as Jalali dates.
|
||||
- Forms rendered by React components carry `data-react-form` so the theme's
|
||||
generic form handler in `SiteBehaviour.tsx` leaves them alone.
|
||||
|
||||
## Meshkee Website API
|
||||
|
||||
Docs: <https://api.meshkee.com/docs/website> · OpenAPI:
|
||||
<https://api.meshkee.com/docs/website/openapi.json>
|
||||
|
||||
Only public website endpoints are used — never dashboard/CMS routes.
|
||||
Client: `src/lib/meshkee.ts`.
|
||||
|
||||
| Purpose | Endpoint |
|
||||
| --- | --- |
|
||||
| Tenant (businessId `20`, modules: portfolio, blog, videos, instructions) | `GET /tenants/{domain}` |
|
||||
| Article list | `GET /tenants/{domain}/blogs?page&pageSize&categoryId&title` |
|
||||
| Article detail | `GET /tenants/{domain}/blogs/{slug}` → `{ blog }` |
|
||||
| Portfolio list | `GET /tenants/{domain}/portfolios?page&pageSize&categoryId&title` |
|
||||
| Portfolio detail | `GET /tenants/{domain}/portfolios/{slug}` → `{ portfolio }` |
|
||||
| Farsi category names | `GET /tenants/{domain}/categories?entityType=blog\|portfolio` |
|
||||
| Approved comments | `GET /tenants/{domain}/comments?entityType&entityId` |
|
||||
| Submit comment | `POST /tenants/{domain}/comments` `{ entityType, entityId, authorName, authorEmail, text }` |
|
||||
|
||||
Notes on the payloads:
|
||||
|
||||
- Lists return `{ items, total, page, pageSize }`; details are wrapped in a
|
||||
single key (`blog` / `portfolio`).
|
||||
- Portfolios add `titleFa` / `titleEn` and a `gallery` array; the Farsi title is
|
||||
preferred. `gallery` is empty for every current entry, so detail pages fall
|
||||
back to `titleImageUrl`.
|
||||
- Blog and portfolio items expose only the English `categoryName`, hence the
|
||||
separate categories lookup for Farsi labels.
|
||||
- `mainTextHtml` is authored in the business dashboard and rendered with
|
||||
`dangerouslySetInnerHTML`, styled by `.content-body` in `globals.css`.
|
||||
- Requests are cached for 300s (`revalidate`). A failed request logs and returns
|
||||
an empty result so the page shows its empty state instead of erroring.
|
||||
|
||||
### Comments and sign-in
|
||||
|
||||
- Comments are gated: signed-in visitors get the form, everyone else gets a link
|
||||
to the customer portal (`CommentForm.tsx`).
|
||||
- `useCustomerSession.ts` looks for a `meshkee_access_token` cookie (the portal
|
||||
shares the apex domain) or the same key in `localStorage`, then confirms it
|
||||
with `GET /auth/me` before trusting it.
|
||||
- Submitted comments are held for approval in the dashboard, so they do not
|
||||
appear immediately; the UI says so.
|
||||
- The API itself accepts anonymous comments — the sign-in requirement is this
|
||||
site's rule, not the API's.
|
||||
|
||||
## Environment
|
||||
|
||||
Defaults are in `src/lib/meshkee.ts`; override in `.env.local` (see `.env.example`).
|
||||
|
||||
| Variable | Default |
|
||||
| --- | --- |
|
||||
| `NEXT_PUBLIC_MESHKEE_API_BASE` | `https://api.meshkee.com/api/v1` |
|
||||
| `NEXT_PUBLIC_SITE_DOMAIN` | `dr-mousavi.com` (apex only — no `www`) |
|
||||
| `NEXT_PUBLIC_CUSTOMER_URL` | `https://customer.<site domain>` |
|
||||
|
||||
Pointing `NEXT_PUBLIC_SITE_DOMAIN` at another Meshkee tenant is a quick way to
|
||||
test the API-driven pages against a different content set.
|
||||
|
||||
## Known gaps
|
||||
|
||||
- The homepage «مقالات داغ و جذاب» carousel still shows the articles that were
|
||||
hardcoded in the original markup; its cards link to `/articles`. Wiring it to
|
||||
the API needs a slot mechanism in the converter.
|
||||
- Comment item fields (`id`, `authorName`, `text`, `createdAt`) are inferred:
|
||||
no tenant has an approved comment yet to confirm them.
|
||||
- Portfolio galleries are empty upstream, so the lightbox has only ever been
|
||||
exercised with the single title image.
|
||||
- `www.dr-mousavi.com` currently serves a certificate for an unrelated domain
|
||||
and its HTML now belongs to another site, so re-running the converter against
|
||||
the live site will fail until that hosting issue is fixed. The cached HTML in
|
||||
`tools/.cache` is the last good copy.
|
||||
@@ -0,0 +1,14 @@
|
||||
import { dirname } from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
import { FlatCompat } from "@eslint/eslintrc";
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
const compat = new FlatCompat({
|
||||
baseDirectory: __dirname,
|
||||
});
|
||||
|
||||
const eslintConfig = [...compat.extends("next/core-web-vitals", "next/typescript")];
|
||||
|
||||
export default eslintConfig;
|
||||
@@ -0,0 +1,6 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
/// <reference path="./.next/types/routes.d.ts" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||
@@ -0,0 +1,9 @@
|
||||
import type { NextConfig } from "next";
|
||||
|
||||
const nextConfig: NextConfig = {
|
||||
images: {
|
||||
unoptimized: true,
|
||||
},
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "dr-mousavi",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev --turbopack",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "^15.4.6",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/postcss": "^4.1.11",
|
||||
"@types/node": "^20.19.9",
|
||||
"@types/react": "^19.1.9",
|
||||
"@types/react-dom": "^19.1.7",
|
||||
"@eslint/eslintrc": "^3.3.1",
|
||||
"eslint": "^9.32.0",
|
||||
"eslint-config-next": "^15.4.6",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"typescript": "^5.9.2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
const config = {
|
||||
plugins: {
|
||||
"@tailwindcss/postcss": {},
|
||||
},
|
||||
};
|
||||
|
||||
export default config;
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 362 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 347 KiB |
|
After Width: | Height: | Size: 339 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 36 KiB |
@@ -0,0 +1,158 @@
|
||||
/*----------------------------------------------------------------
|
||||
GLOBAL
|
||||
----------------------------------------------------------------*/
|
||||
body.wb-rtl .direction-auto {
|
||||
direction: rtl !important;
|
||||
}
|
||||
|
||||
.direction-auto .about-img-back {
|
||||
left: 0;
|
||||
right: unset;
|
||||
}
|
||||
|
||||
body.wb-ltr .direction-auto {
|
||||
direction: ltr !important;
|
||||
}
|
||||
|
||||
body.wb-rtl .text-align-auto,
|
||||
body.wb-rtl .dropdown-item {
|
||||
text-align: right !important;
|
||||
}
|
||||
|
||||
body.wb-ltr .text-align-auto {
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
.MulltipleEllipsis-Clamp2 {
|
||||
overflow: hidden;
|
||||
display: -webkit-box !important;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
HEADER
|
||||
----------------------------------------------------------------*/
|
||||
@media(min-width: 1200px) {
|
||||
body.wb-rtl .banner-details>figure {
|
||||
margin-right: -180px;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
body.wb-rtl .banner-details-txt {
|
||||
left: 0;
|
||||
right: unset;
|
||||
}
|
||||
|
||||
body.wb-rtl .banner-details-txt p:after {
|
||||
right: -21px;
|
||||
left: unset;
|
||||
}
|
||||
|
||||
.banner-btn a:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
body.wb-rtl .dropdown-menu,
|
||||
body.wb-rtl .header-con .navbar-light .navbar-nav .nav-item::after {
|
||||
right: 0;
|
||||
left: unset;
|
||||
}
|
||||
|
||||
body.wb-rtl .phone-txt {
|
||||
padding-left: 0;
|
||||
padding-right: 18px;
|
||||
}
|
||||
|
||||
body.wb-rtl .service-provide-box {
|
||||
padding-right: 37px;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
body.wb-rtl .provide-arrow figure {
|
||||
margin-right: 11px;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
body.wb-rtl .patient-details .patient-rating {
|
||||
margin-left: 0;
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
FEATURE BOX
|
||||
----------------------------------------------------------------*/
|
||||
body.wb-rtl .contact-img-box {
|
||||
margin-left: 25px;
|
||||
margin-right: 0;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
CONTACT US
|
||||
----------------------------------------------------------------*/
|
||||
|
||||
.contact-con:before {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.contact-con.result-section:before {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.dots-img:after,
|
||||
.contact-con.result-section:after {
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
#accordion button {
|
||||
font-size: 1.1em;
|
||||
text-decoration: none;
|
||||
background-color: rgb(0 166 229 / 5%);
|
||||
color: var(--wb-primary-color);
|
||||
margin-bottom: 7px;
|
||||
border-radius: 14px;
|
||||
}
|
||||
|
||||
#content h3,
|
||||
#content h4, #content h2 {
|
||||
color: #000;
|
||||
}
|
||||
@media only screen and (min-width: 1200px) {
|
||||
body.wb-rtl .contact-form {
|
||||
margin: auto -15% auto auto;
|
||||
}
|
||||
|
||||
body.wb-rtl .header-con .navbar-expand-lg .navbar-nav {
|
||||
margin-left: 75px;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
body.wb-rtl .banner-title p {
|
||||
padding-left: 100px;
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 991px) {
|
||||
body.wb-rtl .banner-details>figure {
|
||||
margin-left: -90px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 767px) {
|
||||
body.wb-rtl .banner-details>figure {
|
||||
margin-left: -70px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 575px) {
|
||||
body.wb-rtl .banner-details>figure {
|
||||
margin-left: 0;
|
||||
position: relative;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* Owl Carousel v2.3.4
|
||||
* Copyright 2013-2018 David Deutsch
|
||||
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
|
||||
*/
|
||||
.owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;touch-action:manipulation;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-nav button.owl-next,.owl-carousel .owl-nav button.owl-prev,.owl-carousel button.owl-dot{background:0 0;color:inherit;border:none;padding:0!important;font:inherit}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-ms-touch-action:pan-y;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item .owl-lazy:not([src]),.owl-carousel .owl-item .owl-lazy[src^=""]{max-height:0}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.html) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}
|
||||
@@ -0,0 +1,72 @@
|
||||
:root {
|
||||
--primary--color: #030d43;
|
||||
--secondary--color: #243ffa;
|
||||
--text-color: #757887;
|
||||
--accent: #243ffa;
|
||||
--white-color: #fff;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
max-width: 1374px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.wrapper2 {
|
||||
max-width: 1540px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.wrapper3 {
|
||||
max-width: 1175px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.sub-txt {
|
||||
font-size: 16px;
|
||||
line-height: 16px;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
color: var(--secondary--color);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 96px;
|
||||
font-weight: 700;
|
||||
color: var(--white-color);
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 52px;
|
||||
font-weight: 600;
|
||||
color: var(--primary--color);
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 28px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 22px;
|
||||
font-weight: 600;
|
||||
line-height: 22px;
|
||||
color: var(--primary--color);
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 20px;
|
||||
line-height: 24px;
|
||||
font-weight: 600;
|
||||
color: var(--primary--color);
|
||||
}
|
||||
|
||||
.padding-top {
|
||||
padding-top: 150px;
|
||||
}
|
||||
|
||||
.padding-bottom {
|
||||
padding-bottom: 150px;
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 759 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 743 KiB |