create: new folder

This commit is contained in:
abiyasa05 2024-12-31 10:33:04 +07:00
parent be8e09a8c8
commit f0bd9d7d79
42 changed files with 1487 additions and 1 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

93
README.md Normal file
View File

@ -0,0 +1,93 @@
# frontend-landing-page
## Getting started
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
```
cd existing_repo
git remote add origin https://gitlab.com/profile-image/kedaireka/polinema-roadreport/frontend-landing-page.git
git branch -M main
git push -uf origin main
```
## Integrate with your tools
- [ ] [Set up project integrations](https://gitlab.com/profile-image/kedaireka/polinema-roadreport/frontend-landing-page/-/settings/integrations)
## Collaborate with your team
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
## Test and Deploy
Use the built-in continuous integration in GitLab.
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.

BIN
assets/.DS_Store vendored Normal file

Binary file not shown.

710
assets/css/styles.css Normal file
View File

@ -0,0 +1,710 @@
:root {
--primary: #586af5;
--primary-dark: #4c5ae8;
--danger: #f35625;
--neutral: #1b1d21;
--muted: #4f4f4f;
--white: #ffffff;
}
/* reset browser styles */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
}
/* global styles */
body {
font-family: "DM Sans", sans-serif;
font-size: 1rem;
line-height: 1.5;
color: var(--muted);
}
body.no-scroll {
overflow: hidden;
}
header {
position: sticky;
top: 0;
z-index: 2;
}
img {
vertical-align: middle;
}
button:not(:disabled) {
cursor: pointer;
}
aside {
position: fixed;
z-index: 3;
top: 0;
right: -100%;
width: 100%;
min-height: 100vh;
background-color: var(--white);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
transition: right 0.2s ease-in-out;
}
aside.show {
right: 0;
}
aside button {
position: absolute;
top: 1rem;
right: 1rem;
padding: 0;
width: 2rem;
height: 2rem;
background-color: var(--white);
border: 1px solid var(--muted);
border-radius: 0.25rem;
transition: all 0.15s ease-in-out;
}
aside button:hover,
aside button:focus,
aside button:active {
background-color: var(--muted);
color: var(--white);
}
aside nav {
display: flex;
flex-direction: column;
row-gap: 1.5rem;
align-items: center;
}
aside nav a {
font-size: 1.5rem;
font-weight: 600;
text-decoration: none;
color: var(--neutral);
transition: color 0.15s ease-in-out;
}
aside nav a:hover,
aside nav a:focus,
aside nav a:active {
color: var(--primary);
}
.container {
max-width: 1280px;
margin-inline: auto;
padding-inline: 1rem;
}
.button {
display: inline-block;
font-weight: 600;
vertical-align: middle;
text-align: center;
padding: 0.5rem 1.25rem;
border-radius: 0.5rem;
background-color: var(--primary);
color: var(--white);
text-decoration: none;
transition: background-color 0.15s ease-in-out;
border: 0;
}
.button:hover,
.button:focus,
.button:active {
background-color: var(--primary-dark);
}
.button.disabled,
.button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.title {
/* calculate font size base on vw, desktop size is 3rem */
font-size: calc(1.5rem + 1.5vw);
color: var(--neutral);
}
.section {
padding-block: 3.75rem;
}
.scroll-to-top {
position: fixed;
z-index: 1;
bottom: -100%;
right: 2rem;
width: 3rem;
height: 3rem;
border-radius: 50%;
padding: 0;
transition: bottom 0.4s ease-in-out, background-color 0.15s ease-in-out;
}
.scroll-to-top.show {
bottom: 2rem;
}
.navbar {
--navbar-height: 6rem;
background-color: rgba(255, 255, 255, 0.75);
height: var(--navbar-height);
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--white);
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.05);
}
.navbar.scrolled {
border-bottom-color: rgba(0, 0, 0, 0.05);
}
.navbar .container {
display: flex;
align-items: center;
height: 100%;
column-gap: 1rem;
}
.navbar-brand {
flex-shrink: 0;
width: 124px;
}
.navbar-toggle {
margin-left: auto;
padding-inline: 0.75rem;
}
.navbar-menu {
display: none;
}
.navbar-menu-list {
margin-left: auto;
display: flex;
align-items: center;
list-style: none;
column-gap: 4rem;
}
.navbar-menu-list li a {
font-weight: 600;
text-decoration: none;
}
.navbar-menu-list li a {
color: inherit;
}
.navbar-menu-list li a:hover,
.navbar-menu-list li a:focus .navbar-menu-list li a:active {
color: var(--primary);
}
.navbar-menu-action {
width: 124px;
display: flex;
justify-content: end;
margin-left: auto;
}
.hero {
padding-top: 7.5rem;
}
.hero > .container {
display: grid;
grid-template-columns: 1fr;
column-gap: 1rem;
}
.hero-text {
text-align: center;
}
.hero-title {
margin-bottom: 1.5rem;
}
.hero-title span {
color: var(--primary);
}
.hero-desc {
width: min(100%, 50rem);
font-size: 1.25rem;
margin-bottom: 1.5rem;
margin-inline: auto;
}
.hero-cta {
padding-block: 0.75rem;
display: inline-flex;
align-items: center;
column-gap: 0.75rem;
}
.hero-illustration {
display: none;
}
.hero-illustration img {
display: block;
max-width: 100%;
}
.feature-title,
.feature-subtitle,
.feature-desc {
text-align: center;
}
.feature-title {
font-size: 1.125rem;
font-weight: 600;
/* margin-bottom: 0.75rem; */
color: var(--primary);
}
.feature-subtitle {
margin-bottom: 1.5rem;
}
.feature-desc {
width: min(100%, 50rem);
font-size: 1.25rem;
margin-bottom: 1.5rem;
margin-inline: auto;
}
.feature-map {
position: relative;
width: 100%;
height: 480px;
margin-bottom: 7.5rem;
}
.feature-map-legend {
--proses: var(--primary);
--tindak-lanjut: #ffab00;
--perbaikan: var(--danger);
list-style: none;
position: absolute;
top: 1rem;
left: 1rem;
z-index: 1;
background-color: rgba(255, 255, 255, 0.75);
padding: 1rem;
border-radius: 0.5rem;
font-weight: 500;
display: flex;
flex-direction: column;
row-gap: 0.5rem;
}
.feature-map-legend li {
position: relative;
display: flex;
align-items: center;
column-gap: 0.5rem;
}
.feature-map-legend li::before {
content: "";
display: block;
width: 0.5rem;
height: 0.5rem;
border-radius: 50%;
}
.feature-map-legend li:nth-child(1)::before {
background-color: var(--proses);
}
.feature-map-legend li:nth-child(2)::before {
background-color: var(--tindak-lanjut);
}
.feature-map-legend li:nth-child(3)::before {
background-color: var(--perbaikan);
}
.feature-map-canvas {
position: absolute;
top: 0;
left: 0;
z-index: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 0.75rem;
}
.feature-list {
list-style: none;
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
}
.feature-list li {
padding: 1.5rem 1.5rem 0 1.5rem;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.feature-list li img {
display: block;
max-width: 100%;
transition: transform 0.15s ease-in-out;
}
.feature-list li h6 {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 0.5rem;
}
.feature-list li p {
width: min(100%, 20rem);
}
.feature-list li:hover img {
transform: scale(1.05);
}
.app-title {
text-align: center;
margin-bottom: 4.5rem;
}
.app-content {
display: grid;
grid-template-columns: 1fr;
gap: 3rem;
}
.app-illustration img {
display: block;
max-width: 100%;
margin-inline: auto;
}
.app-features {
list-style: none;
display: flex;
flex-direction: column;
row-gap: 2.5rem;
}
.app-features li {
display: flex;
align-items: flex-start;
column-gap: 1rem;
}
.app-features li h6 {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 0.5rem;
}
.dashboard-title {
text-align: center;
margin-bottom: 2.5rem;
}
.dashboard-silder {
position: relative;
/* overflow: hidden; */
}
.dashboard-item {
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
transition: opacity 0.5s ease-in-out;
}
.dashboard-item:not(.active) {
opacity: 0;
display: none;
}
.dashboard-item-text {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
row-gap: 0.875rem;
text-align: center;
}
.dashboard-item-text h6 {
font-size: 1.5rem;
font-weight: 600;
}
.dashboard-item img {
display: block;
max-width: 100%;
}
.dashboard-nav {
display: flex;
align-items: center;
justify-content: center;
column-gap: 1rem;
}
.dashboard-nav button {
padding: 0;
display: block;
width: 0.75rem;
height: 0.75rem;
border-radius: 50%;
background-color: var(--muted);
transition: background-color 0.15s ease-in-out;
}
.dashboard-nav button.active {
background-color: var(--primary);
}
.cta-content {
display: grid;
grid-template-columns: 1fr;
border-radius: 1rem;
overflow: hidden;
}
.cta-text {
background-color: var(--primary);
color: var(--white);
padding: 2.5rem;
display: flex;
flex-direction: column;
row-gap: 1.5rem;
}
.cta-text h1 {
color: inherit;
font-weight: 500;
}
.cta-text a {
margin-top: auto;
display: inline-flex;
align-items: center;
column-gap: 0.75rem;
text-decoration: none;
color: inherit;
font-weight: 600;
}
.cta-illustration {
position: relative;
display: none;
}
.cta-illustration img {
width: 100%;
height: 100%;
object-fit: cover;
}
.cta-illustration p {
position: absolute;
bottom: 0.5rem;
right: 0.5rem;
font-size: 0.5rem;
color: var(--white);
background-color: rgba(0, 0, 0, 0.5);
padding: 0.15rem 0.25rem;
}
.cta-illustration p a {
color: inherit;
text-decoration: underline;
}
footer {
padding-top: 5rem;
}
.footer-content {
display: grid;
grid-template-columns: 1fr;
gap: 2.5rem;
margin-bottom: 2.75rem;
}
.footer-about,
.footer-collab,
.footer-contact {
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
}
.footer-about > a {
display: inline-block;
margin-bottom: 2rem;
}
.footer-about p {
width: min(100%, 280px);
margin-bottom: 3rem;
}
.footer-about ul {
list-style: none;
display: flex;
align-items: center;
gap: 1rem;
}
.footer-collab h6,
.footer-contact h6 {
font-size: 1.5rem;
margin-bottom: 2rem;
}
.footer-collab ul {
list-style: none;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 1rem;
}
.footer-contact > p:not(:last-child) {
margin-bottom: 1rem;
}
.footer-copy {
text-align: center;
font-size: 0.75rem;
}
@media screen and (min-width: 576px) {
.feature-list {
grid-template-columns: 1fr 1fr;
}
.feature-list li {
display: block;
text-align: left;
}
}
@media screen and (min-width: 768px) {
.navbar-menu {
display: flex;
align-items: center;
flex-grow: 1;
column-gap: 1rem;
}
.navbar-toggle {
display: none;
}
aside {
display: none;
}
.app-content {
grid-template-columns: 1fr 1fr;
}
.dashboard-item-text {
text-align: left;
align-items: flex-start;
}
.dashboard-item {
grid-template-columns: auto 60%;
}
.cta-content {
grid-template-columns: 1fr 1fr;
}
.cta-illustration {
display: block;
}
.footer-content {
grid-template-columns: 1fr 1fr 1fr;
}
.footer-about,
.footer-collab,
.footer-contact {
text-align: left;
display: flex;
flex-direction: column;
align-items: flex-start;
}
}
@media screen and (min-width: 992px) {
.hero > .container {
grid-template-columns: 1fr 1fr;
}
.hero-text {
text-align: left;
}
.hero-desc {
width: min(100%, 35rem);
margin-inline: 0;
}
.hero-illustration {
display: block;
}
.feature-list {
grid-template-columns: 1fr 1fr 1fr;
}
.app-content {
align-items: center;
}
.dashboard-item {
grid-template-columns: auto 65%;
}
}
@media screen and (min-width: 1200px) {
.title {
font-size: 3rem;
line-height: 1.2;
}
.cta-text h1 {
font-size: 2.55rem;
}
}

BIN
assets/images/.DS_Store vendored Normal file

Binary file not shown.

BIN
assets/images/Vector.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

BIN
assets/images/cta.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 B

BIN
assets/images/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
assets/images/gplay.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 B

BIN
assets/images/hero.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

BIN
assets/images/jadwal.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
assets/images/location.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

BIN
assets/images/logo.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
assets/images/peta.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
assets/images/pis_logo.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

175
assets/js/script.js Normal file
View File

@ -0,0 +1,175 @@
const menuToggle = document.querySelector(".navbar-toggle");
const nav = document.querySelector("aside");
const navLinks = document.querySelectorAll("aside nav a");
const body = document.querySelector("body");
const closeMenu = document.querySelector("aside button");
// toggle menu
menuToggle.addEventListener("click", () => {
nav.classList.toggle("show");
body.classList.toggle("no-scroll");
});
// close menu when click on the link, check if aside has class show
navLinks.forEach((link) => {
link.addEventListener("click", () => {
if (nav.classList.contains("show")) {
nav.classList.remove("show");
body.classList.remove("no-scroll");
}
});
});
// close menu when click on the button
closeMenu.addEventListener("click", () => {
if (nav.classList.contains("show")) {
nav.classList.remove("show");
body.classList.remove("no-scroll");
}
});
const scrollBtn = document.querySelector(".scroll-to-top");
// check if window scroll is more than 100px
window.addEventListener("scroll", () => {
if (window.scrollY > 300) {
scrollBtn.classList.add("show");
} else {
scrollBtn.classList.remove("show");
}
});
// scroll to top when click the button
scrollBtn.addEventListener("click", () => {
window.scrollTo({
top: 0,
});
});
const endpoint =
"https://api-roadreport.pisdev.my.id/api/landing/street-segmens/report?embed=report.report";
const apiKeyHeader = "rrkr-8d99f820-zwhl-6306-9dxg-75da636f85a2";
const apiBody = {
latitude: -7.8701358,
longitude: 112.5258656,
radius: 100000,
};
const map = L.map("map", {
center: [apiBody.latitude, apiBody.longitude],
zoom: 13,
});
const prosesIcon = "assets/images/location.png";
const tindakIcon = "assets/images/location_tindak.png";
const perbaikanIcon = "assets/images/location_perbaikan.png";
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
attribution: "Profile Image Studio",
}).addTo(map);
// change zoom control position
map.zoomControl.setPosition("bottomright");
// fetch data from API
fetch(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKeyHeader,
},
body: JSON.stringify(apiBody),
})
.then((response) => response.json())
.then((data) => {
// console.log(data);
showData(data);
});
// show data to the map
function showData(data) {
data.data.forEach((item) => {
const center = JSON.parse(item.center_point);
const latitude = center.coordinates[1];
const longitude = center.coordinates[0];
const marker = L.marker([latitude, longitude], {
icon: L.icon({
iconUrl:
item.report.report.status_id === "FOLUP"
? tindakIcon
: item.report.report.status_id === "RPR"
? perbaikanIcon
: prosesIcon,
iconSize: [24, 24],
iconAnchor: [12, 24],
}),
}).addTo(map);
const type = item.report.user_type;
const level = item.report.user_level;
let typeContainer = "";
if (type && level !== "-") {
typeContainer = `<span style="color: var(--danger)">${type} ${level}</span>`;
} else {
typeContainer = "";
}
marker.bindPopup(
`${typeContainer}<p style="font-size: 1rem; margin-top: 0; margin-bottom: 0.5rem">${
item.name
}</p><strong>Status: </strong>${
item.report.report.status_id === "FOLUP"
? "Tindak Lanjut"
: item.report.report.status_id === "RPR"
? "Perbaikan"
: "Dalam Proses"
}`
);
});
}
// let currentSlide = 0;
// const slides = document.querySelectorAll(".dashboard-item");
// const maxSlide = slides.length;
// // add class active to the first slide
// slides[0].classList.add("active");
// const nav = document.querySelector(".dashboard-nav");
// const buttons = nav.querySelectorAll("button");
// // add class active to the first button
// buttons[0].classList.add("active");
// // function to change the slide
// function goToSlide(slide) {
// slides[currentSlide].classList.remove("active");
// buttons[currentSlide].classList.remove("active");
// currentSlide = (slide + maxSlide) % maxSlide;
// slides[currentSlide].classList.add("active");
// buttons[currentSlide].classList.add("active");
// }
// // function to go to the next slide
// function nextSlide() {
// goToSlide(currentSlide + 1);
// }
// // function to go to the previous slide
// function prevSlide() {
// goToSlide(currentSlide - 1);
// }
// // add event listener to the buttons
// buttons.forEach((button, index) => {
// button.addEventListener("click", () => goToSlide(index));
// });
// // auto slide
// setInterval(nextSlide, 5000);
// // reset interval when user click on the button
// buttons.forEach((button) => {
// button.addEventListener("click", () => {
// clearInterval(nextSlide);
// });
// });

509
index.html Normal file
View File

@ -0,0 +1,509 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="description"
content="
RoadReport merupakan aplikasi yang digunakan untuk melaporkan dan
memantau proses perbaikan jalan rusak. Cukup ketuk layar ponsel Anda,
beri tahu kami tentang masalah jalan, dan kami akan segera mengatasinya.
Bergabunglah dalam perjalanan kami untuk membuat jalan lebih baik dengan
RoadReport!
"
/>
<meta
name="keywords"
content="
roadreport, road report, road, report, jalan, rusak, jalan rusak, aplikasi, mobile, android, ios, web, website, dashboard, monitoring, pemantauan, pemantauan jalan, pemantauan jalan rusak, pemantauan jalan rusak berbasis web, pemantauan jalan rusak berbasis mobile, pemantauan jalan rusak berbasis android, pemantauan jalan rusak berbasis ios, pemantauan jalan rusak berbasis website, pemantauan jalan rusak berbasis dashboard, pemantauan jalan rusak berbasis monitoring, pemantauan jalan rusak berbasis pemantauan, pemantauan jalan rusak berbasis pemantauan jalan, pemantauan jalan rusak berbasis pemantauan jalan rusak, pemantauan jalan rusak berbasis pemantauan jalan rusak berbasis web, pemantauan jalan rusak berbasis pemantauan jalan rusak berbasis mobile, pemantauan jalan rusak berbasis pemantauan jalan rusak berbasis android, pemantauan jalan rusak berbasis pemantauan jalan rusak berbasis ios, pemantauan jalan rusak berbasis pemantauan jalan rusak berbasis website, pemantauan jalan rusak berbasis pemantauan jalan rusak berbasis dashboard, pemantauan jalan rusak berbasis pemantauan jalan rusak berbasis monitoring
"
/>
<title>RoadReport</title>
<link rel="icon" href="assets/images/favicon.png" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin=""
/>
<link rel="stylesheet" href="/assets/css/styles.css" />
</head>
<body>
<header>
<nav class="navbar">
<div class="container">
<a href="#" class="navbar-brand">
<img
src="assets/images/logo.webp"
alt="RoadReport"
width="112"
height="38"
/>
</a>
<button class="button navbar-toggle" type="button">menu</button>
<nav class="navbar-menu">
<ul class="navbar-menu-list">
<li>
<a href="#">Beranda</a>
</li>
<li>
<a href="#feature">Fitur Unggulan</a>
</li>
<li>
<a href="#app">Mobile Apps</a>
</li>
</ul>
<div class="navbar-menu-action">
<!-- <a href="#" class="button">Login</a> -->
</div>
</nav>
</div>
</nav>
</header>
<aside>
<button type="button">X</button>
<nav>
<a href="#">Beranda</a>
<a href="#feature">Fitur Unggulan</a>
<a href="#app">Mobile Apps</a>
</nav>
</aside>
<main>
<section id="hero" class="section hero">
<div class="container">
<div class="hero-text">
<h1 class="title hero-title">
Jalan Rusak? Laporkan secara <span>real-time</span> dengan
RoadReport!
</h1>
<p class="hero-desc">
RoadReport merupakan aplikasi yang digunakan untuk melaporkan dan
memantau proses perbaikan jalan rusak. Cukup ketuk layar ponsel
Anda, beri tahu kami tentang masalah jalan, dan kami akan segera
mengatasinya. Bergabunglah dalam perjalanan kami untuk membuat
jalan lebih baik dengan RoadReport!
</p>
<a href="#" class="button hero-cta">
<img
src="assets/images/gplay.webp"
width="32"
height="32"
alt="Google Play"
/>
Download Sekarang
</a>
</div>
<div class="hero-illustration">
<img src="assets/images/hero.webp" alt="Road Report" />
</div>
</div>
</section>
<section id="feature" class="section">
<div class="container">
<h1 class="feature-title">Fitur Unggulan</h1>
<h2 class="title feature-subtitle">Pantau Proses Jalan</h2>
<p class="feature-desc">
Fitur Pemantauan Proses Jalan memungkinkan Anda untuk melihat
perkembangan perbaikan jalan secara real-time.
</p>
<div class="feature-map">
<ul class="feature-map-legend">
<li>Dalam Proses</li>
<li>Tindak Lanjut</li>
<li>Perbaikan</li>
</ul>
<div id="map" class="feature-map-canvas"></div>
</div>
<ul class="feature-list">
<li>
<img
src="assets/images/machine_learning.webp"
width="120"
height="120"
alt="Machine Learning"
/>
<h6>Machine Learning</h6>
<p>
Teknologi Machine Learning untuk mengidentifikasi prioritas
perbaikan jalan.
</p>
</li>
<li>
<img
src="assets/images/pemantauan.webp"
width="120"
height="120"
alt="Pemantauan"
/>
<h6>Pemantauan</h6>
<p>
Fitur pemantauan memungkinkan pengguna untuk melihat kondisi
jalan dengan pembaruan real-time.
</p>
</li>
<li>
<img
src="assets/images/peta.webp"
width="120"
height="120"
alt="Peta Interaktif"
/>
<h6>Peta Interaktif</h6>
<p>
Peta interaktif membantu pengguna untuk mendapatkan informasi
kondisi jalan yang up-to-date.
</p>
</li>
<li>
<img
src="assets/images/pelaporan.webp"
width="120"
height="120"
alt="Pelaporan"
/>
<h6>Pelaporan</h6>
<p>
Melaporkan kerusakan jalan dengan mudah melalui fitur pelaporan
lengkap.
</p>
</li>
<li>
<img
src="assets/images/jadwal.webp"
width="120"
height="120"
alt="Jadwal Perbaikan"
/>
<h6>Jadwal Perbaikan</h6>
<p>
Jadwal perbaikan jalan membantu pengguna untuk mengetahui kapan
perbaikan jalan akan dilakukan.
</p>
</li>
<li>
<img
src="assets/images/keputusan.webp"
width="120"
height="120"
alt="Keputusan Terinformasi"
/>
<h6>Jadwal Perbaikan</h6>
<p>
RoadReport memberikan data dan rekomendasi terkini untuk
mendukung keputusan terinformasi dalam perbaikan jalan.
</p>
</li>
</ul>
</div>
</section>
<section id="app" class="section">
<div class="container">
<h1 class="title app-title">Mobile Apps</h1>
<div class="app-content">
<div class="app-illustration">
<img src="assets/images/mobile_app.webp" alt="Mobile Apps" />
</div>
<ul class="app-features">
<li>
<img
src="assets/images/mobile_app_dashboard.webp"
width="72"
height="72"
alt="Dashboard"
/>
<div>
<h6>Dashboard</h6>
<p>
Dashboard merupakan fitur roadreport untuk menampilkan
kebutuhan umum bagi user seperti current map, faq, dan
foto-foto draft yang ada pada user tersebut.
</p>
</div>
</li>
<li>
<img
src="assets/images/mobile_app_laporan.webp"
width="72"
height="72"
alt="Laporan"
/>
<div>
<h6>Laporan</h6>
<p>
Laporan merupakan fitur utama dari roadreport yang dapat
melaporkan kondisi jalan kepada pihak yang berwenang untuk
memperbaiki jalan.
</p>
</div>
</li>
<li>
<img
src="assets/images/mobile_app_riwayat.webp"
width="72"
height="72"
alt="Riwayat"
/>
<div>
<h6>Riwayat</h6>
<p>
Riwayat merupakan fitur dari aplikasi roadreport agar
pengguna dapat memantau proses atau status dari laporan yang
telah dikirimkan kepada pihak berwenang.
</p>
</div>
</li>
</ul>
</div>
</div>
</section>
<!-- <section id="dashboard" class="section">
<div class="container">
<h1 class="title dashboard-title">Dashboard Monitoring</h1>
<div class="dashboard-silder">
<div id="slide-1" class="dashboard-item">
<div class="dashboard-item-text">
<img
src="assets/images/monitoring_dashboard_icon.webp"
width="56"
height="56"
alt=""
/>
<h6>Dashboard</h6>
<p>
Pada halaman dashboard, admin mendapatkan informasi dasar dari
laporan-laporan yang masuk seperti jumlah laporan dan map
interaktif untuk memantau jalan yang rusak.
</p>
</div>
<img
src="assets/images/monitoring_dashboard.webp"
width="100%"
height="100%"
alt="Dashboard Monitoring"
/>
</div>
<div id="slide-2" class="dashboard-item">
<div class="dashboard-item-text">
<img
src="assets/images/monitoring_laporan_icon.webp"
width="56"
height="56"
alt=""
/>
<h6>Daftar Laporan</h6>
<p>
Pada halaman list laporan, admin dapat memproses laporan yang
dikirimkan oleh user dari aplikasi mobile. Pada fitur ini juga
dapat berkolaborasi dengan pihak pengelola jalan untuk
memproses laporan.
</p>
</div>
<img
src="assets/images/monitoring_laporan.webp"
width="100%"
height="100%"
alt="Daftar Laporan"
/>
</div>
<div id="slide-3" class="dashboard-item">
<div class="dashboard-item-text">
<img
src="assets/images/monitoring_detail_icon.webp"
width="56"
height="56"
alt=""
/>
<h6>Detail Laporan</h6>
<p>
Pada halaman detail laporan, admin dapat melihat proses dari
laporan yang dikirimkan seingga dapat memantau status terkini
dari leporan yang dikrimkan.
</p>
</div>
<img
src="assets/images/monitoring_detail.webp"
width="100%"
height="100%"
alt="Detail Laporan"
/>
</div>
</div>
<div class="dashboard-nav">
<button data-slide="slide-1"></button>
<button data-slide="slide-2"></button>
<button data-slide="slide-3"></button>
</div>
</div>
</section> -->
<section id="cta" class="section">
<div class="container">
<div class="cta-content">
<div class="cta-text">
<h1 class="title">
Ada jalan rusak? laporkan di <strong>RoadReport!</strong>
</h1>
<p>
Jangan biarkan jalan rusak mengganggu perjalanan Anda. Laporkan
dengan cepat melalui RoadReport, aplikasi andalan untuk
melaporkan kondisi jalan!
</p>
<a href="#">
<img src="assets/images/gplay.webp" alt="Google Play" />
Download Sekarang
</a>
</div>
<div class="cta-illustration">
<img
src="assets/images/nicolas-j-leclercq.webp"
width="100%"
height="100%"
alt=""
/>
<p>
Photo by
<a
href="https://unsplash.com/@nicolasjleclercq?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash"
>Nicolas J Leclercq</a
>
on
<a
href="https://unsplash.com/photos/construction-worker-on-street-WJg2bynUWOk?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash"
>Unsplash</a
>
</p>
</div>
</div>
</div>
</section>
</main>
<footer class="section">
<div class="container">
<div class="footer-content">
<div class="footer-about">
<a href="#">
<img
src="assets/images/logo.webp"
width="112"
height="38"
alt="Road Report"
/>
</a>
<p>
Aplikasi untuk melaporkan dan memantau proses perbaikan jalan
rusak.
</p>
<ul>
<li>
<a href="https://facebook.com/" target="_blank">
<img
src="assets/images/facebook_icon.webp"
width="32"
height="32"
alt="Facebook"
/>
</a>
</li>
<li>
<a href="https://instagram.com/" target="_blank">
<img
src="assets/images/instagram_icon.webp"
width="32"
height="32"
alt="Instagram"
/>
</a>
</li>
<li>
<a href="https://x.com/" target="_blank">
<img
src="assets/images/twitter_icon.webp"
width="32"
height="32"
alt="Twitter"
/>
</a>
</li>
</ul>
</div>
<div class="footer-collab">
<h6>Collaborations</h6>
<ul>
<li>
<a
href="https://profileimage.studio/"
target="_blank"
title="Profiel Image Studio"
>
<img
src="assets/images/pis_logo.webp"
width="32"
height="48"
alt="PIS"
/>
</a>
</li>
<li>
<a
href="https://www.polinema.ac.id/"
target="_blank"
title="Polinema"
>
<img
src="assets/images/polinema_logo.webp"
width="48"
height="48"
alt="Polinema"
/>
</a>
</li>
<li>
<a
href="https://kedaireka.id/"
target="_blank"
title="kedaireka"
>
<img
src="assets/images/kedaireka_logo.webp"
width="180"
height="40"
alt="kedaireka"
/>
</a>
</li>
</ul>
</div>
<div class="footer-contact">
<h6>Meet Us</h6>
<p>contact@profileimage.studio</p>
<p>Perum. Bumi Tunggulwulung Indah G/8 Lowokwaru Malang 65143</p>
</div>
</div>
<p class="footer-copy">
&copy; 2023 All rights reserved - Profile Image Studio
</p>
</div>
</footer>
<button class="button scroll-to-top">up</button>
<script
src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
crossorigin=""
></script>
<script type="text/javascript" src="assets/js/script.js"></script>
</body>
</html>

View File

@ -1 +0,0 @@
tes