├── kandy
├── src
│ ├── App.css
│ ├── index.css
│ ├── setupTests.js
│ ├── App.test.js
│ ├── reportWebVitals.js
│ ├── index.js
│ ├── App.js
│ ├── components
│ │ ├── About
│ │ │ ├── about.jsx
│ │ │ └── about.css
│ │ ├── navigationbar
│ │ │ ├── nav.jsx
│ │ │ ├── footer
│ │ │ │ ├── footer.css
│ │ │ │ └── footer.jsx
│ │ │ └── nav.css
│ │ ├── contact
│ │ │ ├── contact.jsx
│ │ │ └── contact.css
│ │ ├── services
│ │ │ ├── services.css
│ │ │ └── services.jsx
│ │ ├── Authentication
│ │ │ └── signup
│ │ │ │ ├── signup.jsx
│ │ │ │ └── signup.css
│ │ └── home
│ │ │ ├── home.jsx
│ │ │ └── home.css
│ └── logo.svg
├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
├── .gitignore
├── github
│ └── workflows
│ │ └── deploy.yml
├── README.md
└── package.json
├── .github
└── workflows
│ ├── deploy.yml
│ └── README.md
├── ballerina-backend
├── modules
│ ├── utils
│ │ └── helper.bal
│ ├── db
│ │ └── db_connection.bal
│ └── mongo
│ │ ├── Module.md
│ │ ├── mongo.bal
│ │ └── tests
│ │ └── mongo_test.bal
├── Ballerina.toml
├── .devcontainer.json
├── .gitignore
├── main.bal
├── README.md
└── Dependencies.toml
├── main
└── README.md
/kandy/src/App.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/kandy/src/index.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.github/workflows/deploy.yml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/ballerina-backend/modules/utils/helper.bal:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ballerina-backend/modules/db/db_connection.bal:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/kandy/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/kandy/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heshan-Lahiru/kandy-website/HEAD/kandy/public/favicon.ico
--------------------------------------------------------------------------------
/kandy/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heshan-Lahiru/kandy-website/HEAD/kandy/public/logo192.png
--------------------------------------------------------------------------------
/kandy/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heshan-Lahiru/kandy-website/HEAD/kandy/public/logo512.png
--------------------------------------------------------------------------------
/ballerina-backend/Ballerina.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | org = "iuhs"
3 | name = "ballerina_backend"
4 | version = "0.1.0"
5 | distribution = "2201.10.0"
6 |
7 | [build-options]
8 | observabilityIncluded = true
9 |
--------------------------------------------------------------------------------
/ballerina-backend/.devcontainer.json:
--------------------------------------------------------------------------------
1 | {
2 | "image": "ballerina/ballerina-devcontainer:2201.10.0",
3 | "customizations": {
4 | "vscode": {
5 | "extensions": ["WSO2.ballerina"]
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/kandy/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/kandy/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render( );
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/ballerina-backend/modules/mongo/Module.md:
--------------------------------------------------------------------------------
1 | Prints "Hello, World!" with a main function.
2 | [//]: # (above is the module summary)
3 |
4 | # Module Overview
5 | Provides an overview about the module when generating the API documentations.
6 | For example, refer to https://lib.ballerina.io/ballerina/io/latest
7 |
--------------------------------------------------------------------------------
/ballerina-backend/modules/mongo/mongo.bal:
--------------------------------------------------------------------------------
1 | # Returns the string `Hello` with the input string name.
2 | #
3 | # + name - name as a string or nil
4 | # + return - "Hello, " with the input string name
5 | public function hello(string? name) returns string {
6 | if name !is () {
7 | return string `Hello, ${name}`;
8 | }
9 | return "Hello, World!";
10 | }
11 |
--------------------------------------------------------------------------------
/kandy/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/kandy/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/ballerina-backend/.gitignore:
--------------------------------------------------------------------------------
1 | # Ballerina generates this directory during the compilation of a package.
2 | # It contains compiler-generated artifacts and the final executable if this is an application package.
3 | target/
4 |
5 | # Ballerina maintains the compiler-generated source code here.
6 | # Remove this if you want to commit generated sources.
7 | generated/
8 |
9 | # Contains configuration values used during development time.
10 | # See https://ballerina.io/learn/provide-values-to-configurable-variables/ for more details.
11 | Config.toml
12 |
--------------------------------------------------------------------------------
/kandy/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 |
7 | const root = ReactDOM.createRoot(document.getElementById('root'));
8 | root.render(
9 |
10 |
11 |
12 | );
13 |
14 | // If you want to start measuring performance in your app, pass a function
15 | // to log results (for example: reportWebVitals(console.log))
16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 | reportWebVitals();
18 |
--------------------------------------------------------------------------------
/kandy/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/kandy/github/workflows/deploy.yml:
--------------------------------------------------------------------------------
1 | name: CI/CD Pipeline
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 |
8 | jobs:
9 | build:
10 | runs-on: ubuntu-latest
11 |
12 | steps:
13 | - name: Checkout code
14 | uses: actions/checkout@v2
15 |
16 | - name: Set up Node.js
17 | uses: actions/setup-node@v2
18 | with:
19 | node-version: '18'
20 |
21 | - name: Install dependencies
22 | run: npm install
23 |
24 | - name: Build
25 | run: npm run build
26 |
27 | - name: Deploy to GitHub Pages
28 | run: |
29 | npm install gh-pages
30 | npm run build
31 | npx gh-pages -d build
32 | env:
33 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
34 |
--------------------------------------------------------------------------------
/ballerina-backend/modules/mongo/tests/mongo_test.bal:
--------------------------------------------------------------------------------
1 | import ballerina/io;
2 | import ballerina/test;
3 |
4 | // Before Suite Function
5 |
6 | @test:BeforeSuite
7 | function beforeSuiteFunc() {
8 | io:println("I'm the before suite function!");
9 | }
10 |
11 | // Test function
12 |
13 | @test:Config {}
14 | function testFunction() {
15 | string name = "John";
16 | string welcomeMsg = hello(name);
17 | test:assertEquals(welcomeMsg, "Hello, John");
18 | }
19 |
20 | // Negative Test function
21 |
22 | @test:Config {}
23 | function negativeTestFunction() {
24 | string welcomeMsg = hello(());
25 | test:assertEquals(welcomeMsg, "Hello, World!");
26 | }
27 |
28 | // After Suite Function
29 |
30 | @test:AfterSuite
31 | function afterSuiteFunc() {
32 | io:println("I'm the after suite function!");
33 | }
34 |
--------------------------------------------------------------------------------
/kandy/src/App.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
3 | import Home from './components/home/home';
4 | import SignUpForm from './components/Authentication/signup/signup';
5 | import About from './components/About/about';
6 | import Services from './components/services/services';
7 | import Contact from './components/contact/contact';
8 |
9 | function App() {
10 | return (
11 |
12 |
13 | } />
14 | } />
15 | } />
16 | } />
17 | } />
18 |
19 |
20 | );
21 | }
22 |
23 | export default App;
24 |
--------------------------------------------------------------------------------
/.github/workflows/README.md:
--------------------------------------------------------------------------------
1 | # Setting Up a CI/CD Pipeline for Your React Website
2 |
3 | 
4 | 
5 | 
6 | 
7 |
8 | Setting up a CI/CD pipeline for your React website involves several steps. Here's a simple step-by-step guide to get you started:
9 |
10 | ## Step 1: Choose Your CI/CD Tool
11 |
12 | There are several CI/CD tools available. Popular options include:
13 |
14 | - **GitHub Actions**
15 | - **Travis CI**
16 | - **CircleCI**
17 | - **GitLab CI**
18 |
19 | For this example, we'll use **GitHub Actions** since it's integrated with GitHub.
20 |
21 | ## Step 2: Create Your React App
22 |
23 | If you haven't already created your React app, do it using:
24 |
25 | ```bash
26 | npx create-react-app my-app
27 | cd my-app
28 |
--------------------------------------------------------------------------------
/kandy/README.md:
--------------------------------------------------------------------------------
1 | To install React project:
2 | npx create-react-app my-app
3 | cd my-app
4 | npm install react-router-dom react-bootstrap bootstrap@5.1.3 date-fns
5 |
6 | For React Router DOM:
7 | import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
8 |
9 | For React Bootstrap:
10 | import 'bootstrap/dist/css/bootstrap.min.css';
11 | import { Button, Navbar } from 'react-bootstrap';
12 |
13 | For Date Handling with:
14 | import { format, parseISO } from 'date-fns';
15 |
16 | A promise-based HTTP client for making API requests
17 | npm install axios
18 |
19 | A CSS preprocessor that adds functionality like variables, nesting, and mixins.
20 | npm install sass
21 |
22 | Redux Toolkit & React Redux:
23 | npm install @reduxjs/toolkit react-redux
24 |
25 | PropTypes:
26 | npm install prop-types
27 |
28 | /////////////////////////////////////////////////////////
29 | Install all packages:
30 | npm install react-router-dom react-bootstrap bootstrap@5.1.3 date-fns axios sass @reduxjs/toolkit react-redux prop-types
31 | ///////////////////////////////////////////////////////////
--------------------------------------------------------------------------------
/kandy/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "kandy",
3 | "version": "0.1.0",
4 | "private": true,
5 | "homepage": "https://github.com/Heshan-Lahiru/kandy-website",
6 | "dependencies": {
7 | "@testing-library/jest-dom": "^5.17.0",
8 | "@testing-library/react": "^13.4.0",
9 | "@testing-library/user-event": "^13.5.0",
10 | "lucide-react": "^0.439.0",
11 | "react": "^18.3.1",
12 | "react-dom": "^18.3.1",
13 | "react-router-dom": "^6.26.1",
14 | "react-scripts": "5.0.1",
15 | "web-vitals": "^2.1.4"
16 | },
17 | "scripts": {
18 | "start": "react-scripts start",
19 | "build": "react-scripts build",
20 | "test": "react-scripts test",
21 | "eject": "react-scripts eject"
22 | },
23 | "eslintConfig": {
24 | "extends": [
25 | "react-app",
26 | "react-app/jest"
27 | ]
28 | },
29 | "browserslist": {
30 | "production": [
31 | ">0.2%",
32 | "not dead",
33 | "not op_mini all"
34 | ],
35 | "development": [
36 | "last 1 chrome version",
37 | "last 1 firefox version",
38 | "last 1 safari version"
39 | ]
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/kandy/src/components/About/about.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './about.css'
3 | import Nav from '../navigationbar/nav';
4 | import Footer from '../navigationbar/footer/footer';
5 | const AboutUs = () => {
6 |
7 |
8 | return (
9 | <>
10 |
11 |
12 |
16 |
17 |
18 |
19 |
Our Story
20 |
21 | Founded in 2010, we've been passionate about photography for over a decade. Our team of skilled photographers and creative minds work tirelessly to capture the essence of every moment, turning fleeting instances into timeless memories.
22 |
23 |
24 |
25 |
Our Mission
26 |
27 | We strive to tell unique stories through our lenses, creating visual narratives that resonate with hearts and minds. Our mission is to preserve the beauty of life's precious moments, one click at a time.
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | >
36 | );
37 | };
38 |
39 | export default AboutUs;
--------------------------------------------------------------------------------
/kandy/src/components/navigationbar/nav.jsx:
--------------------------------------------------------------------------------
1 |
2 | import React, { useState } from 'react';
3 | import './nav.css';
4 |
5 | const Nav = () => {
6 | const [isOpen, setIsOpen] = useState(false);
7 |
8 | const toggleNav = () => {
9 | setIsOpen(!isOpen);
10 | };
11 |
12 | return (
13 |
14 |
15 |
Kandy Tours
16 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | );
36 | };
37 |
38 | export default Nav;
--------------------------------------------------------------------------------
/ballerina-backend/main.bal:
--------------------------------------------------------------------------------
1 | import ballerinax/mongodb;
2 | import ballerina/io;
3 |
4 | public function main() returns error? {
5 | // MongoDB connection configuration
6 | mongodb:ConnectionConfig mongoConfig = {
7 | connection: {
8 | host: "cluster0.mongodb.net",
9 | port: 27017,
10 | auth: {
11 | username: "lahiruheshan454",
12 | password: "pEAFpZLt9VZO86BT"
13 | },
14 | options: {
15 | sslEnabled: true,
16 | retryWrites: true,
17 | // Additional options can be added here if needed
18 | }
19 | },
20 | databaseName: "ballerina" // Replace with your actual database name if needed
21 | };
22 |
23 | // Create MongoDB client
24 | mongodb:Client mongoClient = check new (mongoConfig);
25 |
26 | // Get the database names
27 | var dbNames = mongoClient->getDatabaseNames();
28 | match dbNames {
29 | string[] names => io:println("Databases: ", names);
30 | error e => io:println("Failed to get databases: " + e.message);
31 | }
32 |
33 | // Get collection names in the specified database
34 | var collections = mongoClient->getCollectionNames("ballerina");
35 | match collections {
36 | string[] names => io:println("Collections: ", names);
37 | error e => io:println("Failed to get collections: " + e.message);
38 | }
39 |
40 | // Close the MongoDB client
41 | mongoClient->close();
42 | }
43 |
--------------------------------------------------------------------------------
/kandy/src/components/contact/contact.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Nav from '../navigationbar/nav';
3 | import Footer from '../navigationbar/footer/footer';
4 | import './contact.css'
5 | const Contact = () => {
6 | return (
7 | <>
8 |
9 |
10 |
11 |
Contact Us
12 |
13 |
14 |
20 |
21 |
Get in Touch
22 |
We'd love to hear from you. Feel free to reach out!
23 |
24 | 📞
25 | + (94) 76-4165833
26 |
27 |
28 | ✉️
29 | lahiruheshan454@gmail.com
30 |
31 |
32 | 📍
33 | 158/1,Pethiyagoda, Gampaha, Sri Lanka
34 |
35 |
36 |
37 |
38 |
39 |
40 | >
41 | );
42 | };
43 |
44 | export default Contact;
--------------------------------------------------------------------------------
/kandy/src/components/services/services.css:
--------------------------------------------------------------------------------
1 | .services-page {
2 | padding: 2rem;
3 | background-color: #f0f4f8;
4 | min-height: 100vh;
5 | }
6 | .services-title {
7 | text-align: center;
8 | color: #2c3e50;
9 | font-size: 2.5rem;
10 | margin-bottom: 2rem;
11 | }
12 | .services-grid {
13 | display: grid;
14 | grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
15 | gap: 2rem;
16 | }
17 | .service-card {
18 | perspective: 1000px;
19 | height: 300px;
20 | }
21 | .service-card-inner {
22 | position: relative;
23 | width: 100%;
24 | height: 100%;
25 | text-align: center;
26 | transition: transform 0.8s;
27 | transform-style: preserve-3d;
28 | }
29 | .service-card:hover .service-card-inner {
30 | transform: rotateY(180deg);
31 | }
32 | .service-card-front, .service-card-back {
33 | position: absolute;
34 | width: 100%;
35 | height: 100%;
36 | backface-visibility: hidden;
37 | border-radius: 15px;
38 | box-shadow: 0 4px 8px rgba(0,0,0,0.1);
39 | }
40 | .service-card-front {
41 | background-color: white;
42 | }
43 | .service-card-back {
44 | background-color: #3498db;
45 | color: white;
46 | transform: rotateY(180deg);
47 | display: flex;
48 | align-items: center;
49 | justify-content: center;
50 | padding: 1rem;
51 | }
52 | .service-image {
53 | width: 100%;
54 | height: 200px;
55 | object-fit: cover;
56 | border-top-left-radius: 15px;
57 | border-top-right-radius: 15px;
58 | }
59 | .service-name {
60 | margin: 1rem 0;
61 | color: #2c3e50;
62 | }
63 | .service-description {
64 | font-size: 1rem;
65 | }
--------------------------------------------------------------------------------
/main:
--------------------------------------------------------------------------------
1 | Here are 20 potential services you could offer on your Kandy Safari page, each with a brief description:
2 |
3 | 01. Guided Jeep Safari – Explore Kandy’s wilderness with expert guides leading the way.
4 | 02. Wildlife Photography Tours – Capture stunning wildlife moments with professional photographers.
5 | 03. Birdwatching Excursions – Discover Kandy’s diverse bird species on specialized tours.
6 | 04. Night Safaris – Experience the thrill of Kandy's wildlife under the stars.
7 |
8 | 05. Hiking Adventures – Embark on guided hikes through Kandy’s scenic trails.
9 | 06. Elephant Watching Tours – Get up close with Kandy’s majestic elephants in their natural habitat.
10 | 07. Waterfall Sightseeing – Visit hidden waterfalls nestled in Kandy’s lush landscapes.
11 | 08. Cultural Village Tours – Explore the local villages and learn about the culture and traditions.
12 | 09. Luxury Safari Packages – Enjoy a premium safari experience with luxury amenities.
13 | 10. Family Safari Trips – Tailored safari experiences perfect for families and children.
14 | 11. Picnic Safaris – Combine adventure with a scenic picnic in the heart of nature.
15 |
16 | 12. Bird Sanctuary Tours – Visit local bird sanctuaries and observe rare species.
17 | 13. Botanical Garden Safaris – A serene journey through Kandy’s beautiful botanical gardens.
18 | 14. Historical Site Safaris – Discover ancient temples and monuments on your safari route.
19 | 15. River Rafting Adventures – Add some thrill with an exhilarating rafting experience.
20 | 16. Eco-Friendly Safaris – Explore Kandy with minimal environmental impact using eco-friendly vehicles.
21 | 17. Camping Safaris – Spend the night in the wilderness with our fully equipped camping services.
22 | 18. Off-Road Adventures – Tackle rugged terrains with our off-road safari vehicles.
23 | 19. Private Safari Tours – Enjoy an exclusive and personalized safari experience.
24 | 20. Animal Conservation Tours – Learn about and contribute to the conservation efforts in Kandy.
--------------------------------------------------------------------------------
/kandy/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
14 |
18 |
19 |
28 | React App
29 |
30 |
31 | You need to enable JavaScript to run this app.
32 |
33 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 🐘 Kandy Safari
2 |
3 | Welcome to **Kandy Safari** – Explore the natural beauty and wildlife of Kandy like never before!
4 |
5 | 
6 |
7 |
8 | ---
9 |
10 | ## 🌟 Features
11 | - 🦁 Explore rich wildlife
12 | - 🌲 Discover scenic trails
13 | - 🏞️ Personalized safari guides
14 | - 🌏 Interactive map of key locations
15 |
16 | ## 📸 Sneak Peek
17 | 
18 | 
19 |
20 |
21 |
22 | ---
23 |
24 | ## 🚀 Getting Started
25 |
26 | To get a copy of the project up and running on your local machine:
27 |
28 | ### Prerequisites
29 | Ensure you have these installed:
30 | - [Node.js](https://nodejs.org/en/)
31 | - [npm](https://www.npmjs.com/)
32 |
33 | ### Installation
34 |
35 | 1. Clone the repository:
36 | ```bash
37 | git clone https://github.com/Heshan-Lahiru/kandy-website.git
38 | ```
39 | 2. Navigate to the project directory:
40 | ```bash
41 | cd kandy-safari
42 | ```
43 | 3. Install dependencies:
44 | ```bash
45 | npm install
46 | ```
47 | 4. Run the project:
48 | ```bash
49 | npm start
50 | ```
51 |
52 | ---
53 |
54 | ## 🎨 Tech Stack
55 | - **Frontend**: HTML, CSS, JavaScript
56 | - **Backend**: Node.js, Express.js
57 | - **Database**: MongoDB
58 |
59 | ---
60 |
61 | ## 👨💻 Contributing
62 | Contributions are welcome! Feel free to open a pull request or submit issues.
63 |
64 | 1. Fork the project
65 | 2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
66 | 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
67 | 4. Push to the branch (`git push origin feature/AmazingFeature`)
68 | 5. Open a pull request
69 |
70 | ---
71 |
72 | ## 📄 License
73 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
74 |
75 | ---
76 |
77 | ## 🙌 Contributors
78 | - [Heshan-Lahiru](https://github.com/Heshan-Lahiru)
79 |
--------------------------------------------------------------------------------
/kandy/src/components/contact/contact.css:
--------------------------------------------------------------------------------
1 | .contact-container {
2 | font-family: 'Arial', sans-serif;
3 | color: #333;
4 | padding-top: 5%;
5 | max-width: 1200px;
6 | margin: 0 auto;
7 | }
8 | .cover-image {
9 | background-image: url('https://i0.wp.com/www.bonjoursunset.com/wp-content/uploads/2019/07/IMG_1106-1.jpg?fit=1000%2C667&ssl=1');
10 | background-size: cover;
11 | background-position: center;
12 | height: 300px;
13 | display: flex;
14 | align-items: center;
15 | justify-content: center;
16 | }
17 | .title {
18 | font-size: 3rem;
19 | color: white;
20 | text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
21 | }
22 | .contact-content {
23 | display: flex;
24 | padding: 2rem;
25 | background-color: #f9f9f9;
26 | border-radius: 10px;
27 | box-shadow: 0 4px 6px rgba(0,0,0,0.1);
28 | margin-top: -50px;
29 | }
30 | .contact-form {
31 | flex: 1;
32 | padding-right: 2rem;
33 | }
34 | .input-field {
35 | width: 100%;
36 | padding: 0.75rem;
37 | margin-bottom: 1rem;
38 | border: 1px solid #ddd;
39 | border-radius: 4px;
40 | font-size: 1rem;
41 | }
42 | .textarea {
43 | height: 150px;
44 | resize: vertical;
45 | }
46 | .submit-button {
47 | background-color: #4CAF50;
48 | color: white;
49 | padding: 0.75rem 1.5rem;
50 | border: none;
51 | border-radius: 4px;
52 | font-size: 1rem;
53 | cursor: pointer;
54 | transition: background-color 0.3s;
55 | }
56 | .submit-button:hover {
57 | background-color: #45a049;
58 | }
59 | .contact-info {
60 | flex: 1;
61 | padding-left: 2rem;
62 | border-left: 1px solid #ddd;
63 | }
64 | .contact-info h2 {
65 | margin-top: 0;
66 | font-size: 1.5rem;
67 | color: #4CAF50;
68 | }
69 | .info-item {
70 | display: flex;
71 | align-items: center;
72 | margin-bottom: 1rem;
73 | }
74 | .icon {
75 | font-size: 1.2rem;
76 | margin-right: 0.5rem;
77 | }
78 | @media (max-width: 768px) {
79 | .contact-content {
80 | flex-direction: column;
81 | }
82 | .contact-form, .contact-info {
83 | padding: 1rem 0;
84 | }
85 | .contact-info {
86 | border-left: none;
87 | border-top: 1px solid #ddd;
88 | margin-top: 1rem;
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/kandy/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/kandy/src/components/navigationbar/footer/footer.css:
--------------------------------------------------------------------------------
1 | .bodydesign {
2 | display: grid;
3 | grid-template-rows: 1fr 10rem auto;
4 | grid-template-areas: "main" "." "footer";
5 | overflow-x: hidden;
6 | background: #fdfdfd;
7 | min-height: 40vh;
8 | font-family: 'Open Sans', sans-serif;
9 | }
10 |
11 | .footer {
12 | z-index: 1;
13 | --footer-background: #133eff;
14 | display: grid;
15 | position: relative;
16 | grid-area: footer;
17 | min-height: 12rem;
18 | }
19 |
20 | .footer .bubbles {
21 | position: absolute;
22 | top: 0;
23 | left: 0;
24 | right: 0;
25 | height: 1rem;
26 | background: var(--footer-background);
27 | filter: url("#blob");
28 | }
29 |
30 | .footer .bubble {
31 | position: absolute;
32 | left: var(--position, 50%);
33 | background: var(--footer-background);
34 | border-radius: 100%;
35 | animation: bubble-size var(--time, 4s) ease-in infinite var(--delay, 0s),
36 | bubble-move var(--time, 4s) ease-in infinite var(--delay, 0s);
37 | transform: translate(-50%, 100%);
38 | }
39 |
40 | .footer .content {
41 | z-index: 2;
42 | display: grid;
43 | grid-template-columns: 1fr auto;
44 | grid-gap: 4rem;
45 | padding: 2rem;
46 | background: var(--footer-background);
47 | }
48 |
49 | .footer .content a,
50 | .footer .content p {
51 | color: #F5F7FA;
52 | text-decoration: none;
53 | }
54 |
55 | .footer .content b {
56 | color: white;
57 | }
58 |
59 | .footer .content p {
60 | margin: 0;
61 | font-size: 0.75rem;
62 | }
63 |
64 | .footer .content > div {
65 | display: flex;
66 | flex-direction: column;
67 | justify-content: center;
68 | }
69 |
70 | .footer .content > div > div {
71 | margin: 0.25rem 0;
72 | }
73 |
74 | .footer .content > div > div > * {
75 | margin-right: 0.5rem;
76 | }
77 |
78 | .footer .content .image {
79 | align-self: center;
80 | width: 4rem;
81 | height: 4rem;
82 | margin: 0.25rem 0;
83 | background-size: cover;
84 | background-position: center;
85 | }
86 |
87 | @keyframes bubble-size {
88 | 0%, 75% {
89 | width: var(--size, 4rem);
90 | height: var(--size, 4rem);
91 | }
92 | 100% {
93 | width: 0rem;
94 | height: 0rem;
95 | }
96 | }
97 |
98 | @keyframes bubble-move {
99 | 0% {
100 | bottom: -4rem;
101 | }
102 | 100% {
103 | bottom: var(--distance, 10rem);
104 | }
105 | }
--------------------------------------------------------------------------------
/kandy/src/components/About/about.css:
--------------------------------------------------------------------------------
1 | .about-us-container {
2 | background: linear-gradient(135deg, #f3e7ff 0%, #e5eeff 100%);
3 | min-height: 100vh;
4 | padding: 2rem;
5 | font-family: 'Arial', sans-serif;
6 | }
7 |
8 | .header {
9 | text-align: center;
10 | margin-bottom: 3rem;
11 | }
12 |
13 | .header h1 {
14 | font-size: 3rem;
15 | color: #000000;
16 | margin-bottom: 0.5rem;
17 | }
18 |
19 | .header p {
20 | font-size: 1.2rem;
21 | color: #000000;
22 | }
23 |
24 | .info-section {
25 | display: flex;
26 | justify-content: space-between;
27 | margin-bottom: 3rem;
28 | }
29 |
30 | .info-card {
31 | background-color: rgba(255, 255, 255, 0.8);
32 | border-radius: 15px;
33 | padding: 1.5rem;
34 | width: 48%;
35 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
36 | }
37 |
38 | .info-card h2 {
39 | font-size: 1.5rem;
40 | color: #000000;
41 | margin-bottom: 1rem;
42 | }
43 |
44 | .info-card p {
45 | color: #333;
46 | line-height: 1.6;
47 | }
48 |
49 | .gallery-section {
50 | margin-bottom: 3rem;
51 | }
52 |
53 | .gallery-section h2 {
54 | font-size: 2rem;
55 | color: #4a0e78;
56 | text-align: center;
57 | margin-bottom: 1.5rem;
58 | }
59 |
60 | .image-grid {
61 | display: grid;
62 | grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
63 | gap: 1rem;
64 | }
65 |
66 | .image-container {
67 | position: relative;
68 | overflow: hidden;
69 | border-radius: 10px;
70 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
71 | transition: transform 0.3s ease;
72 | }
73 |
74 | .image-container:hover {
75 | transform: scale(1.05);
76 | }
77 |
78 | .image-container img {
79 | width: 100%;
80 | height: 100%;
81 | object-fit: cover;
82 | }
83 |
84 | .image-overlay {
85 | position: absolute;
86 | top: 0;
87 | left: 0;
88 | width: 100%;
89 | height: 100%;
90 | background-color: rgba(0, 0, 0, 0.5);
91 | display: flex;
92 | align-items: center;
93 | justify-content: center;
94 | opacity: 0;
95 | transition: opacity 0.3s ease;
96 | }
97 |
98 | .image-container:hover .image-overlay {
99 | opacity: 1;
100 | }
101 |
102 | .image-overlay svg {
103 | color: white;
104 | }
105 |
106 | .footer {
107 | text-align: center;
108 | color: #6c3483;
109 | font-size: 0.9rem;
110 | }
111 |
112 | @media (max-width: 768px) {
113 | .info-section {
114 | flex-direction: column;
115 | }
116 |
117 | .info-card {
118 | width: 100%;
119 | margin-bottom: 1rem;
120 | }
121 |
122 | .image-grid {
123 | grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
124 | }
125 | }
126 |
--------------------------------------------------------------------------------
/kandy/src/components/navigationbar/footer/footer.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './footer.css';
3 | const Footer = () => {
4 | const bubbles = Array.from({ length: 128 }, (_, i) => ({
5 | size: 2 + Math.random() * 4,
6 | distance: 6 + Math.random() * 4,
7 | position: -5 + Math.random() * 110,
8 | time: 2 + Math.random() * 2,
9 | delay: -1 * (2 + Math.random() * 2)
10 | }));
11 |
12 | return (
13 |
14 |
15 |
16 | {bubbles.map((bubble, i) => (
17 |
28 | ))}
29 |
30 |
31 |
64 |
65 |
72 |
©2019 Not Really
73 |
74 |
75 |
76 |
77 |
78 |
79 |
85 |
86 |
87 |
88 |
89 |
90 | );
91 | };
92 |
93 | export default Footer;
--------------------------------------------------------------------------------
/ballerina-backend/README.md:
--------------------------------------------------------------------------------
1 | Ballerina Backend Project 🚀
2 |
3 | 🛠️ Ballerina 2201.3.1 | 📜 MIT License | 🏗️ In Development
4 |
5 |
6 | This project demonstrates how to create a simple backend service using Ballerina.
7 |
8 | Table of Contents
9 |
10 | Prerequisites
11 | Getting Started
12 | Project Structure
13 | Running the Project
14 | API Endpoints
15 | Modules
16 | Contributing
17 | License
18 |
19 | Prerequisites
20 |
21 | 🌐 Ballerina installed on your system
22 |
23 | Getting Started
24 |
25 | Install Ballerina from the official website.
26 | Create a new project:
27 | Copybal new my-ballerina-backend
28 |
29 | Navigate to your project folder:
30 | Copycd my-ballerina-backend
31 |
32 |
33 |
34 | Project Structure
35 |
36 | my-ballerina-backend/
37 | ├── Ballerina.toml # Project configuration file
38 | ├── main.bal # Main file where services are defined
39 | ├── modules/ # Additional modules
40 | │ ├── db/
41 | │ │ └── db_connection.bal # Database connection module
42 | │ └── utils/
43 | │ └── helper.bal # Utility functions and helpers
44 | └── resources/ # Static resources (optional)
45 |
46 |
47 |
48 |
49 | Running the Project
50 | To run the Ballerina project, use the following command in the project root:
51 | Copybal run
52 | API Endpoints
53 | The project includes the following API endpoints:
54 |
55 | GET /api/data: Returns a simple JSON response
56 | POST /api/submit: Accepts JSON payload and returns a response
57 |
58 | Example of the main service in main.bal:
59 | ballerinaCopyimport ballerina/http;
60 | import my_ballerina_backend.utils;
61 |
62 | service /api on new http:Listener(8080) {
63 |
64 | resource function get data(http:Caller caller, http:Request req) returns error? {
65 | json response = utils:formatMessage("Hello from Ballerina using a helper!");
66 | check caller->respond(response);
67 | }
68 |
69 | resource function post submit(http:Caller caller, http:Request req) returns error? {
70 | json payload = check req.getJsonPayload();
71 | json response = { "status": "Received", "data": payload };
72 | check caller->respond(response);
73 | }
74 | }
75 | Modules
76 | 💾 Database Module (db_connection.bal)
77 | Located in modules/db/db_connection.bal, this module manages database connections:
78 | ballerinaCopyimport ballerina/sql;
79 | import ballerina/mysql;
80 |
81 | public function getDbConnection() returns sql:Client|error {
82 | mysql:Client dbClient = check new (user = "root", password = "password", database = "testdb", host = "localhost", port = 3306);
83 | return dbClient;
84 | }
85 | 🔧 Utility Module (helper.bal)
86 | Located in modules/utils/helper.bal, this module contains utility functions:
87 | ballerinaCopypublic function formatMessage(string message) returns json {
88 | return { "message": message };
89 | }
90 | Contributing
91 | 🤝 Contributions are welcome! Please feel free to submit a Pull Request.
92 | License
93 | 📄 This project is open source and available under the MIT License.
--------------------------------------------------------------------------------
/kandy/src/components/Authentication/signup/signup.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import './signup.css';
3 |
4 | const SignInUpForm = () => {
5 | const [isRightPanelActive, setIsRightPanelActive] = useState(false);
6 |
7 | const toggleRightPanel = () => {
8 | setIsRightPanelActive(!isRightPanelActive);
9 | };
10 |
11 | return (
12 | <>
13 |
14 |
Dive into a journey of discovery and wonder.
15 |
16 |
17 |
32 |
47 |
48 |
49 |
50 |
Welcome Back!
51 |
Cultural and Historical Significance
52 |
Sign In
53 |
54 |
55 |
Hello, Friend!
56 |
Cultural and Historical Significance
57 |
Sign Up
58 |
59 |
60 |
61 |
62 |
70 |
71 | >
72 | );
73 | };
74 |
75 | export default SignInUpForm;
--------------------------------------------------------------------------------
/kandy/src/components/navigationbar/nav.css:
--------------------------------------------------------------------------------
1 | /* Nav.css */
2 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600&display=swap');
3 |
4 | .unique-nav {
5 | background-color: #2c3e50;
6 | padding: 1rem;
7 | font-family: 'Poppins', sans-serif;
8 | box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
9 | }
10 |
11 | .unique-nav-container {
12 | display: flex;
13 | justify-content: space-between;
14 | align-items: center;
15 | max-width: 1200px;
16 | margin: 0 auto;
17 | }
18 |
19 | .unique-nav-logo {
20 | color: #ecf0f1;
21 | font-size: 1.8rem;
22 | font-weight: 600;
23 | letter-spacing: 1px;
24 | transition: color 0.3s ease;
25 | }
26 |
27 | .unique-nav-logo:hover {
28 | color: #3498db;
29 | }
30 |
31 | .unique-nav-links {
32 | display: flex;
33 | }
34 |
35 | .unique-nav-item {
36 | color: #ecf0f1;
37 | text-decoration: none;
38 | padding: 0.7rem 1.2rem;
39 | font-size: 1rem;
40 | font-weight: 300;
41 | transition: all 0.3s ease;
42 | border-radius: 4px;
43 | margin: 0 5px;
44 | }
45 |
46 | .unique-nav-item:hover {
47 | background-color: #34495e;
48 | color: #3498db;
49 | transform: translateY(-2px);
50 | }
51 |
52 | .unique-nav-toggle {
53 | display: none;
54 | flex-direction: column;
55 | cursor: pointer;
56 | }
57 |
58 | .unique-nav-bar {
59 | width: 25px;
60 | height: 3px;
61 | background-color: #ecf0f1;
62 | margin: 3px 0;
63 | transition: all 0.3s ease;
64 | }
65 |
66 | @media (max-width: 768px) {
67 | .unique-nav-links {
68 | display: none;
69 | flex-direction: column;
70 | width: 100%;
71 | position: absolute;
72 | top: 70px;
73 | left: 0;
74 | background-color: #2c3e50;
75 | padding: 1rem 0;
76 | border-radius: 0 0 10px 10px;
77 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
78 | }
79 |
80 | .unique-nav-active {
81 | display: flex;
82 | animation: slideDown 0.5s ease;
83 | }
84 |
85 | @keyframes slideDown {
86 | from {
87 | opacity: 0;
88 | transform: translateY(-10px);
89 | }
90 | to {
91 | opacity: 1;
92 | transform: translateY(0);
93 | }
94 | }
95 |
96 | .unique-nav-item {
97 | padding: 1rem;
98 | text-align: center;
99 | border-radius: 0;
100 | }
101 |
102 | .unique-nav-toggle {
103 | display: flex;
104 | }
105 |
106 | .unique-nav-active + .unique-nav-toggle .unique-nav-bar:nth-child(1) {
107 | transform: rotate(-45deg) translate(-5px, 6px);
108 | }
109 |
110 | .unique-nav-active + .unique-nav-toggle .unique-nav-bar:nth-child(2) {
111 | opacity: 0;
112 | }
113 |
114 | .unique-nav-active + .unique-nav-toggle .unique-nav-bar:nth-child(3) {
115 | transform: rotate(45deg) translate(-5px, -6px);
116 | }
117 | }
118 |
119 | .knd-nav-item {
120 | position: relative;
121 | color: #d8ff29;
122 | text-decoration: none;
123 | font-size: 1.2rem;
124 | font-weight: bold;
125 | display: flex;
126 | align-items: center;
127 | gap: 0.5rem;
128 | padding: 0.5rem 1rem;
129 | border-radius: 8px;
130 | transition: background-color 0.3s ease, color 0.3s ease, transform 0.3s ease;
131 | }
132 |
133 | .knd-nav-item i {
134 | font-size: 1.5rem;
135 | transition: transform 0.3s ease;
136 | }
137 |
138 | .knd-nav-item:hover {
139 | background-color: rgba(255, 165, 0, 0.1); /* Light orange background */
140 | color: #ffa500; /* Orange color on hover */
141 | transform: translateY(-3px); /* Slight lift effect */
142 | }
143 |
144 | .knd-nav-item:hover i {
145 | transform: rotate(20deg); /* Icon rotation on hover */
146 | }
147 |
148 | .knd-nav-item::before {
149 | content: "";
150 | position: absolute;
151 | bottom: 0;
152 | left: 0;
153 | width: 0;
154 | height: 3px;
155 | background-color: #ffa500;
156 | transition: width 0.3s ease;
157 | }
158 |
159 | .knd-nav-item:hover::before {
160 | width: 100%; /* Underline effect on hover */
161 | }
162 |
163 | .knd-nav-item:active {
164 | transform: translateY(1px); /* Subtle press effect */
165 | }
166 |
--------------------------------------------------------------------------------
/kandy/src/components/Authentication/signup/signup.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css?family=Montserrat:400,800');
2 |
3 | * {
4 | box-sizing: border-box;
5 | }
6 |
7 | .signupbody {
8 | background: #f6f5f7;
9 | display: flex;
10 | justify-content: center;
11 | align-items: center;
12 | flex-direction: column;
13 | font-family: 'Montserrat', sans-serif;
14 | height: 100vh;
15 | margin: -20px 0 50px;
16 | }
17 |
18 | h1 {
19 | font-weight: bold;
20 | margin: 0;
21 | }
22 |
23 | h2 {
24 | text-align: center;
25 | }
26 |
27 | p {
28 | font-size: 14px;
29 | font-weight: 100;
30 | line-height: 20px;
31 | letter-spacing: 0.5px;
32 | margin: 20px 0 30px;
33 | }
34 |
35 | span {
36 | font-size: 12px;
37 | }
38 |
39 | a {
40 | color: #333;
41 | font-size: 14px;
42 | text-decoration: none;
43 | margin: 15px 0;
44 | }
45 |
46 | button {
47 | border-radius: 20px;
48 | border: 1px solid #FF4B2B;
49 | background-color: #FF4B2B;
50 | color: #FFFFFF;
51 | font-size: 12px;
52 | font-weight: bold;
53 | padding: 12px 45px;
54 | letter-spacing: 1px;
55 | text-transform: uppercase;
56 | transition: transform 80ms ease-in;
57 | }
58 |
59 | button:active {
60 | transform: scale(0.95);
61 | }
62 |
63 | button:focus {
64 | outline: none;
65 | }
66 |
67 | button.ghost {
68 | background-color: transparent;
69 | border-color: #FFFFFF;
70 | }
71 |
72 | form {
73 | background-color: #FFFFFF;
74 | display: flex;
75 | align-items: center;
76 | justify-content: center;
77 | flex-direction: column;
78 | padding: 0 50px;
79 | height: 100%;
80 | text-align: center;
81 | }
82 |
83 | input {
84 | background-color: #eee;
85 | border: none;
86 | padding: 12px 15px;
87 | margin: 8px 0;
88 | width: 100%;
89 | }
90 |
91 | .container {
92 | background-color: #fff;
93 | border-radius: 10px;
94 | box-shadow: 0 14px 28px rgba(0,0,0,0.25),
95 | 0 10px 10px rgba(0,0,0,0.22);
96 | position: relative;
97 | overflow: hidden;
98 | width: 768px;
99 | max-width: 100%;
100 | min-height: 480px;
101 | }
102 |
103 | .form-container {
104 | position: absolute;
105 | top: 0;
106 | height: 100%;
107 | transition: all 0.6s ease-in-out;
108 | }
109 |
110 | .sign-in-container {
111 | left: 0;
112 | width: 50%;
113 | z-index: 2;
114 | }
115 |
116 | .container.right-panel-active .sign-in-container {
117 | transform: translateX(100%);
118 | }
119 |
120 | .sign-up-container {
121 | left: 0;
122 | width: 50%;
123 | opacity: 0;
124 | z-index: 1;
125 | }
126 |
127 | .container.right-panel-active .sign-up-container {
128 | transform: translateX(100%);
129 | opacity: 1;
130 | z-index: 5;
131 | animation: show 0.6s;
132 | }
133 |
134 | @keyframes show {
135 | 0%, 49.99% {
136 | opacity: 0;
137 | z-index: 1;
138 | }
139 |
140 | 50%, 100% {
141 | opacity: 1;
142 | z-index: 5;
143 | }
144 | }
145 |
146 | .overlay-container {
147 | position: absolute;
148 | top: 0;
149 | left: 50%;
150 | width: 50%;
151 | height: 100%;
152 | overflow: hidden;
153 | transition: transform 0.6s ease-in-out;
154 | z-index: 100;
155 | }
156 |
157 | .container.right-panel-active .overlay-container{
158 | transform: translateX(-100%);
159 | }
160 |
161 | .overlay {
162 | background: #FF416C;
163 | background: -webkit-linear-gradient(to right, #FF4B2B, #FF416C);
164 | background: linear-gradient(to right, #FF4B2B, #FF416C);
165 | background-repeat: no-repeat;
166 | background-size: cover;
167 | background-position: 0 0;
168 | color: #FFFFFF;
169 | position: relative;
170 | left: -100%;
171 | height: 100%;
172 | width: 200%;
173 | transform: translateX(0);
174 | transition: transform 0.6s ease-in-out;
175 | }
176 |
177 | .container.right-panel-active .overlay {
178 | transform: translateX(50%);
179 | }
180 |
181 | .overlay-panel {
182 | position: absolute;
183 | display: flex;
184 | align-items: center;
185 | justify-content: center;
186 | flex-direction: column;
187 | padding: 0 40px;
188 | text-align: center;
189 | top: 0;
190 | height: 100%;
191 | width: 50%;
192 | transform: translateX(0);
193 | transition: transform 0.6s ease-in-out;
194 | }
195 |
196 | .overlay-left {
197 | transform: translateX(-20%);
198 | }
199 |
200 | .container.right-panel-active .overlay-left {
201 | transform: translateX(0);
202 | }
203 |
204 | .overlay-right {
205 | right: 0;
206 | transform: translateX(0);
207 | }
208 |
209 | .container.right-panel-active .overlay-right {
210 | transform: translateX(20%);
211 | }
212 |
213 | .social-container {
214 | margin: 20px 0;
215 | }
216 |
217 | .social-container a {
218 | border: 1px solid #DDDDDD;
219 | border-radius: 50%;
220 | display: inline-flex;
221 | justify-content: center;
222 | align-items: center;
223 | margin: 0 5px;
224 | height: 40px;
225 | width: 40px;
226 | }
227 |
228 | footer {
229 | background-color: #222;
230 | color: #fff;
231 | font-size: 14px;
232 | bottom: 0;
233 | position: fixed;
234 | left: 0;
235 | right: 0;
236 | text-align: center;
237 | z-index: 999;
238 | }
239 |
240 | footer p {
241 | margin: 10px 0;
242 | }
243 |
244 | footer i {
245 | color: red;
246 | }
247 |
248 | footer a {
249 | color: #3c97bf;
250 | text-decoration: none;
251 | }
--------------------------------------------------------------------------------
/kandy/src/components/services/services.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './services.css'
3 | import Nav from '../navigationbar/nav';
4 | import Footer from '../navigationbar/footer/footer';
5 |
6 | const ServicesPage = () => {
7 | const services = [
8 | { id: 1, name: 'Guided Jeep Safari', description: 'Explore Kandy’s wilderness with expert guides leading the way.', image: 'https://whc.unesco.org/uploads/thumbs/site_0450_0020-1200-630-20151105154018.jpg' },
9 | { id: 2, name: 'Wildlife Photography Tours', description: 'Capture stunning wildlife moments with professional photographers.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0-1nOvm_Oad4OsTByF3mOd4vr1KIqKibyeA&s' },
10 | { id: 3, name: 'Birdwatching Excursions', description: 'Discover Kandy’s diverse bird species on specialized tours.', image: 'https://www.srilankainstyle.com/storage/app/media/uploaded-files/7-reasons-to-visit-kandy-in-sri-lanka-slider-1.jpg' },
11 | { id: 4, name: 'Night Safaris', description: 'Experience the thrill of Kandys wildlife under the stars.', image: 'https://t3.ftcdn.net/jpg/03/09/55/12/360_F_309551222_SPlNjW87clBgksIZWKeU1SiUTjK0gu7y.jpg' },
12 | { id: 5, name: 'Hiking Adventures', description: 'Embark on guided hikes through Kandy’s scenic trails.', image: 'https://cdn.pixabay.com/photo/2013/11/03/11/58/temple-204803_1280.jpg' },
13 | { id: 6, name: 'Elephant Watching Tours', description: 'Get up close with Kandy’s majestic elephants in their natural habitat.', image: 'https://srilankadriverguides.com/wp-content/uploads/2020/03/Kandy.jpg' },
14 | { id: 7, name: 'Waterfall Sightseeing', description: 'Visit hidden waterfalls nestled in Kandy’s lush landscapes.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSHkBUffBb99VkokiJ_P5LrvnZWptFqadq7lQ&s' },
15 | { id: 8, name: 'Cultural Village Tours', description: 'Explore the local villages and learn about the culture and traditions.', image: 'https://littlewanderbook.com/wp-content/uploads/2020/02/Kandy-Sri-Lanka-3.jpg' },
16 | { id: 9, name: 'Luxury Safari Packages', description: ' Enjoy a premium safari experience with luxury amenities.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSI-raVwhHOng6v7rdWd5FTbsvgCKbI5Dz2_A&s' },
17 | { id: 10, name: 'Family Safari Trips', description: 'Tailored safari experiences perfect for families and children.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDxf30FmuVDjolcmD_n0q9LOaElsspEPpw2A&s' },
18 | { id: 11, name: 'Picnic Safaris', description: 'Combine adventure with a scenic picnic in the heart of nature.', image: 'https://www.lanka-excursions-holidays.com/uploads/4/0/2/1/40216937/nelligala-dscf1966-450_orig.jpg' },
19 | { id: 12, name: 'Bird Sanctuary Tours', description: 'Visit local bird sanctuaries and observe rare species.', image: 'https://www.torntackies.com/wp-content/uploads/2020/06/Places-to-visit-in-Kandy-Sri-Lanka.jpg' },
20 | { id: 13, name: 'Botanical Garden Safaris', description: 'A serene journey through Kandy’s beautiful botanical gardens.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTK1bVFOlIxargua2uxhpXqQLayNWsrtFYf9A&s' },
21 | { id: 14, name: 'Historical Site Safaris', description: 'Discover ancient temples and monuments on your safari route.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQr-iAkmsGCJgh_qR9qn0OTXOfDpfvJjc65Ow&s' },
22 | { id: 15, name: 'River Rafting Adventures', description: 'Add some thrill with an exhilarating rafting experience.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRWxLGzQwL7dWfFRTJ7HumHXkKiH_Q9O60biw&s' },
23 | { id: 16, name: 'Eco-Friendly Safaris', description: 'Explore Kandy with minimal environmental impact using eco-friendly vehicles.', image: 'https://www.destguides.com/dynamic-files/itinerary/2424/background-image.jpg' },
24 | { id: 17, name: 'Camping Safaris', description: 'Spend the night in the wilderness with our fully equipped camping services.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRlzPf1XegwcUvuSCJaKDhsRYIgDz9onRjqjA&s' },
25 | { id: 18, name: 'Off-Road Adventures', description: 'Tackle rugged terrains with our off-road safari vehicles', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQsG7Gk59HxgSGzQQveWV1sLxarP2BwgCuUVg&s' },
26 | { id: 19, name: 'Private Safari Tours', description: 'Enjoy an exclusive and personalized safari experience.', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSmDJdwk2PcIY9k_1sMf3B2KpVqFKVxnFAg7Q&s' },
27 | { id: 20, name: 'Animal Conservation Tours', description: 'Learn about and contribute to the conservation efforts in Kandy.', image: 'https://media.tacdn.com/media/attractions-splice-spp-674x446/06/d7/c5/a7.jpg' },
28 | ];
29 |
30 | return (
31 | <>
32 |
33 |
34 |
Our Services
35 |
36 | {services.map((service) => (
37 |
38 |
39 |
40 |
41 |
{service.name}
42 |
43 |
44 |
{service.description}
45 |
46 |
47 |
48 | ))}
49 |
50 |
51 |
52 |
53 | >
54 | );
55 | };
56 |
57 | export default ServicesPage;
--------------------------------------------------------------------------------
/ballerina-backend/Dependencies.toml:
--------------------------------------------------------------------------------
1 | # AUTO-GENERATED FILE. DO NOT MODIFY.
2 |
3 | # This file is auto-generated by Ballerina for managing dependency versions.
4 | # It should not be modified by hand.
5 |
6 | [ballerina]
7 | dependencies-toml-version = "2"
8 | distribution-version = "2201.10.0"
9 |
10 | [[package]]
11 | org = "ballerina"
12 | name = "auth"
13 | version = "2.12.0"
14 | dependencies = [
15 | {org = "ballerina", name = "crypto"},
16 | {org = "ballerina", name = "jballerina.java"},
17 | {org = "ballerina", name = "lang.array"},
18 | {org = "ballerina", name = "lang.string"},
19 | {org = "ballerina", name = "log"}
20 | ]
21 |
22 |
23 | [[package]]
24 | org = "ballerina"
25 | name = "cache"
26 | version = "3.8.0"
27 | dependencies = [
28 | {org = "ballerina", name = "constraint"},
29 | {org = "ballerina", name = "jballerina.java"},
30 | {org = "ballerina", name = "task"},
31 | {org = "ballerina", name = "time"}
32 | ]
33 |
34 | [[package]]
35 | org = "ballerina"
36 | name = "constraint"
37 | version = "1.5.0"
38 | dependencies = [
39 | {org = "ballerina", name = "jballerina.java"}
40 | ]
41 |
42 | [[package]]
43 | org = "ballerina"
44 | name = "crypto"
45 | version = "2.7.2"
46 | dependencies = [
47 | {org = "ballerina", name = "jballerina.java"},
48 | {org = "ballerina", name = "time"}
49 | ]
50 |
51 | [[package]]
52 | org = "ballerina"
53 | name = "file"
54 | version = "1.10.0"
55 | dependencies = [
56 | {org = "ballerina", name = "io"},
57 | {org = "ballerina", name = "jballerina.java"},
58 | {org = "ballerina", name = "os"},
59 | {org = "ballerina", name = "time"}
60 | ]
61 |
62 | [[package]]
63 | org = "ballerina"
64 | name = "http"
65 | version = "2.12.0"
66 | dependencies = [
67 | {org = "ballerina", name = "auth"},
68 | {org = "ballerina", name = "cache"},
69 | {org = "ballerina", name = "constraint"},
70 | {org = "ballerina", name = "crypto"},
71 | {org = "ballerina", name = "file"},
72 | {org = "ballerina", name = "io"},
73 | {org = "ballerina", name = "jballerina.java"},
74 | {org = "ballerina", name = "jwt"},
75 | {org = "ballerina", name = "lang.array"},
76 | {org = "ballerina", name = "lang.decimal"},
77 | {org = "ballerina", name = "lang.int"},
78 | {org = "ballerina", name = "lang.regexp"},
79 | {org = "ballerina", name = "lang.runtime"},
80 | {org = "ballerina", name = "lang.string"},
81 | {org = "ballerina", name = "lang.value"},
82 | {org = "ballerina", name = "log"},
83 | {org = "ballerina", name = "mime"},
84 | {org = "ballerina", name = "oauth2"},
85 | {org = "ballerina", name = "observe"},
86 | {org = "ballerina", name = "time"},
87 | {org = "ballerina", name = "url"}
88 | ]
89 | modules = [
90 | {org = "ballerina", packageName = "http", moduleName = "http"},
91 | {org = "ballerina", packageName = "http", moduleName = "http.httpscerr"}
92 | ]
93 |
94 | [[package]]
95 | org = "ballerina"
96 | name = "io"
97 | version = "1.6.1"
98 | dependencies = [
99 | {org = "ballerina", name = "jballerina.java"},
100 | {org = "ballerina", name = "lang.value"}
101 | ]
102 |
103 | [[package]]
104 | org = "ballerina"
105 | name = "jballerina.java"
106 | version = "0.0.0"
107 |
108 | [[package]]
109 | org = "ballerina"
110 | name = "jwt"
111 | version = "2.13.0"
112 | dependencies = [
113 | {org = "ballerina", name = "cache"},
114 | {org = "ballerina", name = "crypto"},
115 | {org = "ballerina", name = "io"},
116 | {org = "ballerina", name = "jballerina.java"},
117 | {org = "ballerina", name = "lang.int"},
118 | {org = "ballerina", name = "lang.string"},
119 | {org = "ballerina", name = "log"},
120 | {org = "ballerina", name = "time"}
121 | ]
122 |
123 | [[package]]
124 | org = "ballerina"
125 | name = "lang.__internal"
126 | version = "0.0.0"
127 | dependencies = [
128 | {org = "ballerina", name = "jballerina.java"},
129 | {org = "ballerina", name = "lang.object"}
130 | ]
131 |
132 | [[package]]
133 | org = "ballerina"
134 | name = "lang.array"
135 | version = "0.0.0"
136 | dependencies = [
137 | {org = "ballerina", name = "jballerina.java"},
138 | {org = "ballerina", name = "lang.__internal"}
139 | ]
140 |
141 | [[package]]
142 | org = "ballerina"
143 | name = "lang.decimal"
144 | version = "0.0.0"
145 | dependencies = [
146 | {org = "ballerina", name = "jballerina.java"}
147 | ]
148 |
149 | [[package]]
150 | org = "ballerina"
151 | name = "lang.int"
152 | version = "0.0.0"
153 | dependencies = [
154 | {org = "ballerina", name = "jballerina.java"},
155 | {org = "ballerina", name = "lang.__internal"},
156 | {org = "ballerina", name = "lang.object"}
157 | ]
158 |
159 | [[package]]
160 | org = "ballerina"
161 | name = "lang.object"
162 | version = "0.0.0"
163 |
164 | [[package]]
165 | org = "ballerina"
166 | name = "lang.regexp"
167 | version = "0.0.0"
168 | dependencies = [
169 | {org = "ballerina", name = "jballerina.java"}
170 | ]
171 |
172 | [[package]]
173 | org = "ballerina"
174 | name = "lang.runtime"
175 | version = "0.0.0"
176 | dependencies = [
177 | {org = "ballerina", name = "jballerina.java"}
178 | ]
179 |
180 | [[package]]
181 | org = "ballerina"
182 | name = "lang.string"
183 | version = "0.0.0"
184 | dependencies = [
185 | {org = "ballerina", name = "jballerina.java"},
186 | {org = "ballerina", name = "lang.regexp"}
187 | ]
188 |
189 | [[package]]
190 | org = "ballerina"
191 | name = "lang.value"
192 | version = "0.0.0"
193 | dependencies = [
194 | {org = "ballerina", name = "jballerina.java"}
195 | ]
196 |
197 | [[package]]
198 | org = "ballerina"
199 | name = "log"
200 | version = "2.10.0"
201 | dependencies = [
202 | {org = "ballerina", name = "io"},
203 | {org = "ballerina", name = "jballerina.java"},
204 | {org = "ballerina", name = "lang.value"},
205 | {org = "ballerina", name = "observe"}
206 | ]
207 |
208 | [[package]]
209 | org = "ballerina"
210 | name = "mime"
211 | version = "2.10.0"
212 | dependencies = [
213 | {org = "ballerina", name = "io"},
214 | {org = "ballerina", name = "jballerina.java"},
215 | {org = "ballerina", name = "lang.int"},
216 | {org = "ballerina", name = "log"}
217 | ]
218 |
219 | [[package]]
220 | org = "ballerina"
221 | name = "oauth2"
222 | version = "2.12.0"
223 | dependencies = [
224 | {org = "ballerina", name = "cache"},
225 | {org = "ballerina", name = "crypto"},
226 | {org = "ballerina", name = "jballerina.java"},
227 | {org = "ballerina", name = "log"},
228 | {org = "ballerina", name = "time"},
229 | {org = "ballerina", name = "url"}
230 | ]
231 |
232 | [[package]]
233 | org = "ballerina"
234 | name = "observe"
235 | version = "1.3.0"
236 | dependencies = [
237 | {org = "ballerina", name = "jballerina.java"}
238 | ]
239 |
240 | [[package]]
241 | org = "ballerina"
242 | name = "os"
243 | version = "1.8.0"
244 | dependencies = [
245 | {org = "ballerina", name = "io"},
246 | {org = "ballerina", name = "jballerina.java"}
247 | ]
248 |
249 | [[package]]
250 | org = "ballerina"
251 | name = "task"
252 | version = "2.5.0"
253 | dependencies = [
254 | {org = "ballerina", name = "jballerina.java"},
255 | {org = "ballerina", name = "time"}
256 | ]
257 |
258 | [[package]]
259 | org = "ballerina"
260 | name = "time"
261 | version = "2.5.0"
262 | dependencies = [
263 | {org = "ballerina", name = "jballerina.java"}
264 | ]
265 |
266 | [[package]]
267 | org = "ballerina"
268 | name = "url"
269 | version = "2.4.0"
270 | dependencies = [
271 | {org = "ballerina", name = "jballerina.java"}
272 | ]
273 |
274 | [[package]]
275 | org = "ballerinai"
276 | name = "observe"
277 | version = "0.0.0"
278 | dependencies = [
279 | {org = "ballerina", name = "jballerina.java"},
280 | {org = "ballerina", name = "observe"}
281 | ]
282 | modules = [
283 | {org = "ballerinai", packageName = "observe", moduleName = "observe"}
284 | ]
285 |
286 | [[package]]
287 | org = "iuhs"
288 | name = "ballerina_backend"
289 | version = "0.1.0"
290 | dependencies = [
291 | {org = "ballerina", name = "http"},
292 | {org = "ballerinai", name = "observe"}
293 | ]
294 | modules = [
295 | {org = "iuhs", packageName = "ballerina_backend", moduleName = "ballerina_backend"}
296 | ]
297 |
298 |
--------------------------------------------------------------------------------
/kandy/src/components/home/home.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | import './home.css';
3 | import Nav from '../navigationbar/nav';
4 | import Footer from '../navigationbar/footer/footer';
5 | import { Clock, CloudSun, Users, Landmark } from 'lucide-react';
6 |
7 |
8 | const Home = () => {
9 | const [isVisible, setIsVisible] = useState(false);
10 |
11 | useEffect(() => {
12 | setIsVisible(true);
13 | }, []);
14 |
15 | const cardImages = [
16 | 'https://cdn.wegic.ai/assets/onepage/ai/image/c93e98b7-67df-4854-9043-af606d5ceafc.jpeg',
17 | 'https://cdn.wegic.ai/assets/onepage/ai/image/5b071d1b-c6c6-4fae-8835-6d0c6cae2cf6.jpeg',
18 | 'https://cdn.wegic.ai/assets/onepage/ai/image/fb9f087f-f677-45a3-845d-15be9b112708.jpeg',
19 | 'https://cdn.wegic.ai/assets/onepage/ai/image/b8b654d5-a9d6-455f-9554-447192a46257.jpeg',
20 | ];
21 |
22 | const services = [
23 | { title: 'Historical Significance', imgSrc: 'https://www.logodee.com/wp-content/uploads/2021/10/26.jpg' },
24 | { title: 'Cultural Festivals', imgSrc: 'https://images-platform.99static.com//SxCErt1zjd1ib35vyLqHFqlI9H0=/148x123:1085x1060/fit-in/590x590/99designs-contests-attachments/80/80253/attachment_80253079' },
25 | { title: 'Natural Beauty', imgSrc: 'https://st2.depositphotos.com/2100659/9816/v/450/depositphotos_98163818-stock-illustration-media-generation-vector-logo-concept.jpg' },
26 | { title: 'Wonders', imgSrc: 'https://t4.ftcdn.net/jpg/01/15/27/23/360_F_115272368_Y27Y8hrcfULkLnn5XIw406EN4XHp8j0W.jpg' }
27 | ];
28 |
29 | return (
30 | <>
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | Experience the Enchantment of Kandy
40 |
41 |
42 | Join us in exploring the rich culture, stunning landscapes, and historical landmarks of Kandy, Sri Lanka. Dive into a journey of discovery and wonder.
43 |
44 |
45 | Personalized Tours
46 | Safe Travel
47 | Global Reach
48 |
49 |
50 |
51 |
52 | {[...cardImages, ...cardImages].map((image, index) => (
53 |
54 |
55 |
56 | ))}
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | Unveil the Wonders
65 |
66 | Kandy is a vibrant city nestled in the central highlands of Sri Lanka, known for its rich cultural heritage, scenic beauty, and historical significance. As the last royal capital of the island, Kandy retains much of its regal charm, with the stunning Temple of the Sacred Tooth Relic serving as a focal point for both locals and tourists. The city's bustling streets are lined with colonial-era buildings, local markets, and traditional crafts, offering a glimpse into its deep-rooted traditions. Surrounded by misty hills and emerald-green tea plantations, Kandy offers breathtaking views and peaceful escapes into nature, whether it’s a stroll around the picturesque Kandy Lake or a hike through the nearby Knuckles Mountain Range. Visitors can explore the city's many cultural landmarks, including the Royal Botanical Gardens in Peradeniya and the grand Esala Perahera festival, which showcases a magnificent procession of elephants, dancers, and drummers. Kandy's timeless appeal lies in its ability to harmoniously blend its historical significance, religious devotion, and natural beauty, making it a must-visit destination for those seeking an authentic Sri Lankan experience.
67 |
68 |
69 |
70 | Unveil the Wonders
71 |
72 | {services.map((service, index) => (
73 |
74 |
79 |
{service.title}
80 |
81 | ))}
82 |
83 |
84 |
85 | {/* This is a JSX comment */}
86 |
87 |
88 |
Current Kandy Insights
89 |
Stay updated with the latest stats about Kandy, including the current time and weather.
90 |
91 |
92 |
93 |
94 |
Time
95 |
18:13
96 |
97 |
98 |
99 |
100 |
Weather
101 |
27°C, Partly Cloudy
102 |
103 |
104 |
105 |
106 |
Population
107 |
125,000+
108 |
109 |
110 |
111 |
112 |
Tourist Attractions
113 |
50+
114 |
115 |
116 |
117 |
118 | {/* This is a JSX comment */}
119 |
120 |
121 |
Cultural and Historical Significance
122 |
123 | Kandy is renowned for its rich cultural heritage and historical significance. The city is home to the Temple of the Tooth, one of the most sacred Buddhist sites, and hosts the grand Esala Perahera festival.
124 |
125 |
126 |
127 |
128 |
Temple of the Tooth
129 |
A sacred Buddhist temple that houses the relic of the tooth of the Buddha.
130 |
131 |
132 |
133 |
Royal Botanical Gardens
134 |
A lush garden featuring a wide variety of plants and flowers.
135 |
136 |
137 |
138 |
Esala Perahera
139 |
An annual cultural festival showcasing traditional music, dance, and pageantry.
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 | {/* This is a JSX comment */}
152 |
153 |
Cultural and Historical Significance
154 |
155 | Kandy is renowned for its rich cultural heritage and historical significance. The city is home to the Temple of the Tooth, one of the most sacred Buddhist sites, and hosts the grand Esala Perahera festival.
156 |
157 |
158 |
159 |
160 |
Temple of the Tooth
161 |
A sacred Buddhist temple that houses the relic of the tooth of the Buddha.
162 |
163 |
164 |
165 |
Royal Botanical Gardens
166 |
A lush garden featuring a wide variety of plants and flowers.
167 |
168 |
169 |
170 |
Esala Perahera
171 |
An annual cultural festival showcasing traditional music, dance, and pageantry.
172 |
173 |
174 |
175 |
176 |
177 |
178 | >
179 | );
180 | };
181 |
182 | export default Home;
--------------------------------------------------------------------------------
/kandy/src/components/home/home.css:
--------------------------------------------------------------------------------
1 |
2 | .hlp-home {
3 | font-family: Arial, sans-serif;
4 | line-height: 1.6;
5 | }
6 |
7 | .hlp-header {
8 | position: relative;
9 | height: 100vh;
10 | overflow: hidden;
11 | }
12 |
13 | .hlp-cover-image {
14 | background-image: url('#');
15 | background-size: cover;
16 | background-position: center;
17 | height: 100%;
18 | display: flex;
19 | align-items: center;
20 | justify-content: center;
21 | }
22 |
23 | .hlp-content-wrapper {
24 | display: flex;
25 | width: 100%;
26 | max-width: 1200px;
27 | margin: 0 auto;
28 | padding: 0 2rem;
29 | }
30 | .hlp-content-wrapper h1{
31 | color: black;
32 | }
33 | .hlp-content-wrapper p{
34 | color: black;
35 | }
36 | .hlp-content-wrapper ul{
37 | color: black;
38 | }
39 |
40 | .hlp-text-content {
41 | flex: 1;
42 | color: #ffffff;
43 | padding-right: 2rem;
44 | }
45 |
46 | .hlp-title {
47 | font-size: 3rem;
48 | margin-bottom: 1rem;
49 | opacity: 0;
50 | transform: translateY(20px);
51 | transition: opacity 0.8s ease-out, transform 0.8s ease-out;
52 | }
53 |
54 | .hlp-subtitle {
55 | font-size: 1.1rem;
56 | margin-bottom: 2rem;
57 | opacity: 0;
58 | transform: translateY(20px);
59 | transition: opacity 0.8s ease-out 0.2s, transform 0.8s ease-out 0.2s;
60 | }
61 |
62 | .hlp-features {
63 | list-style-type: none;
64 | padding: 0;
65 | opacity: 0;
66 | transform: translateY(20px);
67 | transition: opacity 0.8s ease-out 0.4s, transform 0.8s ease-out 0.4s;
68 | }
69 |
70 | .hlp-features li {
71 | margin-bottom: 0.5rem;
72 | font-size: 1.7rem;
73 | }
74 |
75 | .hlp-features i {
76 | margin-right: 0.5rem;
77 | color: #ffd700;
78 | }
79 |
80 | .hlp-title.hlp-visible,
81 | .hlp-subtitle.hlp-visible,
82 | .hlp-features.hlp-visible {
83 | opacity: 1;
84 | transform: translateY(0);
85 | }
86 |
87 | .hlp-moving-cards-container {
88 | flex: 1;
89 | position: relative;
90 | overflow: hidden;
91 | }
92 |
93 | .hlp-moving-cards-container::before,
94 | .hlp-moving-cards-container::after {
95 | content: '';
96 | position: absolute;
97 | top: 0;
98 | bottom: 0;
99 | width: 50px;
100 | z-index: 1;
101 | pointer-events: none;
102 | }
103 |
104 | .hlp-moving-cards-container::before {
105 | left: 0;
106 | background: linear-gradient(to right, rgba(255,255,255,9.8), rgba(255,255,255,0));
107 | }
108 |
109 | .hlp-moving-cards-container::after {
110 | right: 0;
111 | background: linear-gradient(to left, rgba(255,255,255,9.8), rgba(255,255,255,0));
112 | }
113 |
114 | .hlp-moving-cards {
115 | display: flex;
116 | animation: moveCards 20s linear infinite;
117 | }
118 |
119 | .hlp-card {
120 | flex: 0 0 auto;
121 | width: 350px;
122 | height: 500px;
123 | margin-right: 20px;
124 | }
125 |
126 | .hlp-card img {
127 | width: 100%;
128 | height: 100%;
129 | object-fit: cover;
130 | border-radius: 40px;
131 | }
132 |
133 | @keyframes moveCards {
134 | 0% {
135 | transform: translateX(0);
136 | }
137 | 100% {
138 | transform: translateX(calc(-100% / 2));
139 | }
140 | }
141 |
142 | /* Rest of the CSS remains the same */
143 |
144 | @media (max-width: 768px) {
145 | .hlp-content-wrapper {
146 | flex-direction: column;
147 | }
148 |
149 | .hlp-text-content {
150 | padding-right: 0;
151 | margin-bottom: 2rem;
152 | }
153 |
154 | .hlp-title {
155 | font-size: 2rem;
156 | }
157 |
158 | .hlp-subtitle {
159 | font-size: 1rem;
160 | }
161 |
162 | .hlp-moving-cards-container {
163 | height: 200px;
164 | }
165 |
166 | .hlp-card {
167 | width: 150px;
168 | height: 200px;
169 | }
170 |
171 | /* Rest of the media query remains the same */
172 | }
173 |
174 | .hlp-section-title {
175 | font-size: 2.5rem;
176 | color: #333;
177 | margin-bottom: 1rem;
178 |
179 | }
180 |
181 | .hlp-about-us {
182 | position: relative; /* Necessary for overlay positioning */
183 | padding: 4rem 2rem;
184 | background-size: cover;
185 | background-position: center;
186 | background-repeat: no-repeat;
187 | animation: slideBackground 16s infinite;
188 | overflow: hidden; /* Ensure content doesn't overflow */
189 | }
190 |
191 | .hlp-about-us::before {
192 | content: "";
193 | position: absolute;
194 | top: 0;
195 | left: 0;
196 | width: 100%;
197 | height: 100%;
198 | background-size: cover;
199 | background-position: center;
200 | background-repeat: no-repeat;
201 | animation: slideBackground 16s infinite;
202 | opacity: 0.5; /* Adjust the opacity to your preference (between 0 and 1) */
203 | z-index: -1; /* Make sure it stays behind the content */
204 | }
205 |
206 | @keyframes slideBackground {
207 | 0% {
208 | background-image: url('https://cdn.wegic.ai/assets/onepage/ai/image/e22448b0-5b81-44db-8aa4-d677175e91db.jpeg'); /* Image 1 */
209 | }
210 | 25% {
211 | background-image: url('https://cdn.wegic.ai/assets/onepage/ai/image/5f559490-55d4-41be-90b4-eb7b0ae2fa52.jpeg'); /* Image 2 */
212 | }
213 | 50% {
214 | background-image: url('https://cdn.wegic.ai/assets/onepage/ai/image/64da88c9-ba7c-4398-8247-12d1ab521a7f.jpeg'); /* Image 3 */
215 | }
216 | 75% {
217 | background-image: url('https://cdn.wegic.ai/assets/onepage/ai/image/2df58b0a-b20b-4c5d-ac8d-b66419dae5e4.jpeg'); /* Image 4 */
218 | }
219 | 100% {
220 | background-image: url('https://cdn.wegic.ai/assets/onepage/ai/image/5f559490-55d4-41be-90b4-eb7b0ae2fa52.jpeg'); /* Loop back to Image 2 */
221 | }
222 | }
223 |
224 | .hlp-about-text {
225 | font-size: 1.1rem;
226 | max-width: 90%;
227 | margin: 0 auto;
228 | text-align: center;
229 | background-color: rgba(0, 0, 0, 0.7); /* Semi-transparent white background */
230 | padding: 1rem; /* Optional padding for spacing */
231 | border-radius: 8px; /* Optional: rounded corners */
232 | }
233 |
234 |
235 | .hlp-our-services {
236 | padding: 4rem 2rem;
237 | }
238 |
239 | .hlp-services-grid {
240 | display: grid;
241 | grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
242 | gap: 2rem;
243 | margin-top: 2rem;
244 | }
245 |
246 | .hlp-service-item {
247 | background-color: #ffffff;
248 | border-radius: 8px;
249 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
250 | overflow: hidden;
251 | transition: transform 0.3s ease-in-out;
252 | }
253 |
254 | .hlp-service-item:hover {
255 | transform: translateY(-5px);
256 | }
257 |
258 | .hlp-service-image {
259 | width: 100%;
260 | height: 200px;
261 | object-fit: cover;
262 | }
263 |
264 | .hlp-service-title {
265 | font-size: 1.2rem;
266 | color: #333;
267 | padding: 1rem;
268 | text-align: center;
269 | }
270 |
271 | @media (max-width: 768px) {
272 | .hlp-title {
273 | font-size: 2rem;
274 | }
275 |
276 | .hlp-section-title {
277 | font-size: 2rem;
278 | text-align: center; /* Centers the text */
279 | }
280 |
281 |
282 | .hlp-about-text {
283 | font-size: 1rem;
284 | }
285 |
286 | .hlp-services-grid {
287 | grid-template-columns: 1fr;
288 | }
289 | }
290 |
291 | /* KandyInsights.css KandyInsights.css KandyInsights.css KandyInsights.css */
292 |
293 | /* KandyInsights.css */
294 | .kandy-insights-container {
295 |
296 | line-height: 1.5;
297 | padding: 1.5rem;
298 | max-width: 100%;
299 | margin-left: auto;
300 | margin-right: auto;
301 | }
302 |
303 | .kandy-insights-title {
304 | font-size: 1.875rem;
305 | font-weight: bold;
306 | margin-bottom: 1rem;
307 | text-align: center;
308 | display: block;
309 | width: 100%;
310 | }
311 |
312 |
313 | .kandy-insights-description {
314 | text-align: center;
315 | margin-bottom: 1.5rem;
316 | }
317 |
318 | .kandy-insights-grid {
319 | display: grid;
320 | gap: 1rem;
321 | grid-template-columns: repeat(2, 1fr);
322 | }
323 |
324 | @media (min-width: 768px) {
325 | .kandy-insights-grid {
326 | grid-template-columns: repeat(4, 1fr);
327 | }
328 | }
329 |
330 | .kandy-insights-box {
331 | padding: 1rem;
332 | border-radius: 0.5rem;
333 | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
334 | }
335 |
336 | .kandy-insights-box-title {
337 | font-weight: 600;
338 | margin-bottom: 0.25rem;
339 | }
340 |
341 | .kandy-insights-box-value {
342 | font-size: 1.25rem;
343 | margin-bottom: 0;
344 | }
345 |
346 | .kandy-insights-icon {
347 | width: 2rem;
348 | height: 2rem;
349 | margin-bottom: 0.5rem;
350 | }
351 |
352 | .kandy-insights-box-time {
353 | background-color: #dbeafe;
354 | }
355 |
356 | .kandy-insights-box-time .kandy-insights-icon {
357 | color: #2563eb;
358 | }
359 |
360 | .kandy-insights-box-weather {
361 | background-color: #fef3c7;
362 | }
363 |
364 | .kandy-insights-box-weather .kandy-insights-icon {
365 | color: #d97706;
366 | }
367 |
368 | .kandy-insights-box-population {
369 | background-color: #d1fae5;
370 | }
371 |
372 | .kandy-insights-box-population .kandy-insights-icon {
373 | color: #059669;
374 | }
375 |
376 | .kandy-insights-box-attractions {
377 | background-color: #ede9fe;
378 | }
379 |
380 | .kandy-insights-box-attractions .kandy-insights-icon {
381 | color: #7c3aed;
382 | }
383 | /*-----------------------------------------------------*/
384 |
385 | .kandy-cultural-significance {
386 | font-family: Arial, sans-serif;
387 | max-width: 100%;
388 | margin: 0 auto;
389 | padding: 20px;
390 | background-color: #ffffff;
391 | border-radius: 10px;
392 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
393 | }
394 |
395 | .title {
396 | color: #000000;
397 | border-bottom: 2px solid #d2b48c;
398 | padding-bottom: 10px;
399 | }
400 |
401 | .description {
402 | color: #000000;
403 | line-height: 1.6;
404 | margin-bottom: 20px;
405 | }
406 |
407 | .landmarks {
408 | display: flex;
409 | flex-direction: column;
410 | gap: 20px;
411 | }
412 |
413 | .landmark {
414 | background-color: #ffd5f8;
415 | padding: 15px;
416 | border-radius: 8px;
417 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
418 | transition: transform 0.3s ease;
419 | }
420 |
421 | .landmark:hover {
422 | transform: translateY(-5px);
423 | }
424 |
425 | .landmark i {
426 | font-size: 24px;
427 | color: #ffbb00;
428 | margin-bottom: 10px;
429 | }
430 |
431 | .landmark h2 {
432 |
433 | color: #000000;
434 | margin: 10px 0;
435 | }
436 |
437 | .landmark p {
438 | color: #000000;
439 | font-size: 14px;
440 | }
441 |
442 | @media (min-width: 768px) {
443 | .landmarks {
444 | flex-direction: row;
445 | justify-content: space-between;
446 | }
447 |
448 | .landmark {
449 | flex-basis: calc(33.333% - 20px);
450 | }
451 | }
452 |
453 |
454 | /*--------------------------------------------ctn */
455 |
456 | .kandyCTN {
457 | display: flex;
458 | max-width: 1200px;
459 | margin: 0 auto;
460 | background-color: #ffffff;
461 | border-radius: 15px;
462 | overflow: hidden;
463 | box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
464 | }
465 |
466 | .kandyContent {
467 | flex: 1;
468 | padding: 40px;
469 | display: flex;
470 | flex-direction: column;
471 | justify-content: center;
472 | }
473 |
474 | .kandyImg {
475 | flex: 1;
476 | display: flex;
477 | align-items: center;
478 | justify-content: center;
479 | background-color: #ffffff;
480 | }
481 |
482 | .kandyImg img {
483 | max-width: 100%;
484 | height: 100%;
485 | object-fit: cover;
486 | }
487 |
488 | .kandyTitle {
489 | color: #000000;
490 | font-size: 2.5rem;
491 | margin-bottom: 20px;
492 | border-bottom: 2px solid #ffffff;
493 | padding-bottom: 10px;
494 | }
495 |
496 | .kandyDesc {
497 | font-size: 1.1rem;
498 | line-height: 1.6;
499 | color: #000000;
500 | margin-bottom: 30px;
501 | }
502 |
503 | .kandyFeatures {
504 | display: flex;
505 | flex-direction: column;
506 | gap: 20px;
507 | }
508 |
509 | .kandyFeat {
510 | background-color: #ffffff;
511 | padding: 20px;
512 | border-radius: 10px;
513 | box-shadow: 0 3px 6px rgba(0, 0, 0, 0.1);
514 | transition: transform 0.3s ease, box-shadow 0.3s ease;
515 | }
516 |
517 | .kandyFeat:hover {
518 | transform: translateY(-5px);
519 | box-shadow: 0 5px 12px rgba(0, 0, 0, 0.15);
520 | }
521 |
522 | .kandyFeat i {
523 | font-size: 2rem;
524 | color: #ff9812;
525 | margin-bottom: 10px;
526 | }
527 |
528 | .kandyFeat h2 {
529 | color: #000000;
530 | font-size: 1.3rem;
531 | margin-bottom: 10px;
532 | }
533 |
534 | .kandyFeat p {
535 | font-size: 1rem;
536 | color: #000000;
537 | }
538 |
539 | @media (max-width: 768px) {
540 | .kandyCTN {
541 | flex-direction: column-reverse;
542 | }
543 |
544 | .kandyImg {
545 | height: 300px;
546 | }
547 |
548 | .kandyContent {
549 | padding: 30px;
550 | }
551 |
552 | .kandyTitle {
553 | font-size: 2rem;
554 | }
555 |
556 | .kandyDesc {
557 | font-size: 1rem;
558 | }
559 |
560 | .kandyFeat h2 {
561 | font-size: 1.2rem;
562 | }
563 | }
--------------------------------------------------------------------------------