This commit is contained in:
Maciej Chmielarz 2023-12-12 15:22:29 +01:00
commit 9e2beafb90
1961 changed files with 466441 additions and 651 deletions

BIN
.DS_Store vendored

Binary file not shown.

451
.Rhistory
View File

@ -1,388 +1,16 @@
error = function(e) {
# handle the error
print(paste("An error occurred:", e$message))
})
data$shot <- data$shot %>% select(-freeze_frame, -statsbomb_xg, -key_pass_id)
data$shot$body_part <- data$shot$body_part %>% select(-id)
data$shot$technique <- data$shot$technique %>% select(-id)
data$shot$type <- data$shot$type %>% select(-id)
data$position <- data$position %>% select(-id)
data$shot <- data$shot %>% select(-end_location)
tryCatch({ # TODO reduce error cases
if ("one_on_one" %in% colnames(data$shot)) {
data[is.na(data$shot$one_on_one), ]$shot$one_on_one <- FALSE
} else {
data$shot$one_on_one <- FALSE
}
if ("first_time" %in% colnames(data$shot)) {
data[is.na(data$shot$first_time), ]$shot$first_time <- FALSE
} else {
data$shot$first_time <- FALSE
}
if ("aerial_won" %in% colnames(data$shot)) {
data[is.na(data$shot$aerial_won), ]$shot$aerial_won <- FALSE
} else {
data$shot$aerial_won <- FALSE
}
if ("saved_to_post" %in% colnames(data$shot)) {
data[is.na(data$shot$saved_to_post), ]$shot$saved_to_post <- FALSE
} else {
data$shot$saved_to_post <- FALSE
}
if ("deflected" %in% colnames(data$shot)) {
data[is.na(data$shot$deflected), ]$shot$deflected <- FALSE
} else {
data$shot$deflected <- FALSE
}
if ("saved_off_target" %in% colnames(data$shot)) {
data[is.na(data$shot$saved_off_target), ]$shot$saved_off_target <- FALSE
} else {
data$shot$saved_off_target <- FALSE
}
if ("open_goal" %in% colnames(data$shot)) {
data[is.na(data$shot$open_goal), ]$shot$open_goal <- FALSE
} else {
data$shot$open_goal <- FALSE
}
if ("follows_dribble" %in% colnames(data$shot)) {
data[is.na(data$shot$follows_dribble), ]$shot$follows_dribble <- FALSE
} else {
data$shot$follows_dribble <- FALSE
}
if ("redirect" %in% colnames(data$shot)) {
data[is.na(data$shot$redirect), ]$shot$redirect <- FALSE
} else {
data$shot$redirect <- FALSE
}
if ("kick_off" %in% colnames(data$kick_off)) {
data[is.na(data$kick_off$kick_off), ]$kick_off$kick_off <- FALSE
} else {
data$kick_off$kick_off <- FALSE
}
},
error = function(e) {
# handle the error
print(paste("An error occurred:", e$message))
})
data <- data %>% mutate(angle = atan(7.32 * x1 / (x1^2 + y1^2 - (7.32/2)^2)),
is_goal = ifelse(shot$outcome$id == 97, 1, 0)) %>%
select(-location)
data$shot$outcome <- data$shot$outcome %>% select(-id)
data <- data %>% unnest(shot, names_sep = "_")
data$angle <- ifelse(data$angle<0, base::pi + data$angle, data$angle)
data
}
data_test <- get_shots2("data/la_liga_events/303377.json")
View(data_test)
# TODO not all json data have these same keys/fields, customize function to cover all cases
get_shots2 <- function(json_file) {
data <- fromJSON(json_file) %>% filter(type$name == "Shot") %>% dplyr::select(c(minute, position, location, shot))
df_temp <- do.call(rbind, data$location)
colnames(df_temp) <- c("x1", "y1")
data$x1 <- df_temp[,1]
data$y1 <- df_temp[,2]
tryCatch({ # TODO reduce error cases
data$number_of_players <- mapply(function(sublist, x1_threshold) {
# Extracting the first location value and converting it to numeric
first_location_values <- sapply(sublist$location, function(loc) as.numeric(loc[1]))
if ("teammate" %in% names(sublist)) {
# Filtering and counting
res <- sum(!sublist$teammate & first_location_values > x1_threshold) # error here
} else {
res <- 0
}
res
}, data$shot$freeze_frame, data$x1)
},
error = function(e) {
# handle the error
print(paste("An error occurred:", e$message))
})
data$shot <- data$shot %>% select(-freeze_frame, -statsbomb_xg, -key_pass_id)
data$shot$body_part <- data$shot$body_part %>% select(-id)
data$shot$technique <- data$shot$technique %>% select(-id)
data$shot$type <- data$shot$type %>% select(-id)
data$position <- data$position %>% select(-id)
data$shot <- data$shot %>% select(-end_location)
tryCatch({ # TODO reduce error cases
if ("one_on_one" %in% colnames(data$shot)) {
data[is.na(data$shot$one_on_one), ]$shot$one_on_one <- FALSE
} else {
data$shot$one_on_one <- FALSE
}
if ("first_time" %in% colnames(data$shot)) {
data[is.na(data$shot$first_time), ]$shot$first_time <- FALSE
} else {
data$shot$first_time <- FALSE
}
if ("aerial_won" %in% colnames(data$shot)) {
data[is.na(data$shot$aerial_won), ]$shot$aerial_won <- FALSE
} else {
data$shot$aerial_won <- FALSE
}
if ("saved_to_post" %in% colnames(data$shot)) {
data[is.na(data$shot$saved_to_post), ]$shot$saved_to_post <- FALSE
} else {
data$shot$saved_to_post <- FALSE
}
if ("deflected" %in% colnames(data$shot)) {
data[is.na(data$shot$deflected), ]$shot$deflected <- FALSE
} else {
data$shot$deflected <- FALSE
}
if ("saved_off_target" %in% colnames(data$shot)) {
data[is.na(data$shot$saved_off_target), ]$shot$saved_off_target <- FALSE
} else {
data$shot$saved_off_target <- FALSE
}
if ("open_goal" %in% colnames(data$shot)) {
data[is.na(data$shot$open_goal), ]$shot$open_goal <- FALSE
} else {
data$shot$open_goal <- FALSE
}
if ("follows_dribble" %in% colnames(data$shot)) {
data[is.na(data$shot$follows_dribble), ]$shot$follows_dribble <- FALSE
} else {
data$shot$follows_dribble <- FALSE
}
if ("redirect" %in% colnames(data$shot)) {
data[is.na(data$shot$redirect), ]$shot$redirect <- FALSE
} else {
data$shot$redirect <- FALSE
}
if ("kick_off" %in% colnames(data$kick_off)) {
data[is.na(data$kick_off$kick_off), ]$kick_off$kick_off <- FALSE
} else {
data$kick_off$kick_off <- FALSE
}
},
error = function(e) {
# handle the error
print(paste("An error occurred:", e$message))
})
data <- data %>% mutate(angle = atan(7.32 * x1 / (x1^2 + y1^2 - (7.32/2)^2)),
is_goal = ifelse(shot$outcome$id == 97, 1, 0)) %>%
select(-location)
data$angle <- ifelse(data$angle<0, base::pi + data$angle, data$angle)
data$shot$outcome <- data$shot$outcome %>% select(-id)
data <- data %>% unnest(shot, names_sep = "_")
%>% unnest(position, names_sep = "_")
# TODO not all json data have these same keys/fields, customize function to cover all cases
get_shots2 <- function(json_file) {
data <- fromJSON(json_file) %>% filter(type$name == "Shot") %>% dplyr::select(c(minute, position, location, shot))
df_temp <- do.call(rbind, data$location)
colnames(df_temp) <- c("x1", "y1")
data$x1 <- df_temp[,1]
data$y1 <- df_temp[,2]
tryCatch({ # TODO reduce error cases
data$number_of_players <- mapply(function(sublist, x1_threshold) {
# Extracting the first location value and converting it to numeric
first_location_values <- sapply(sublist$location, function(loc) as.numeric(loc[1]))
if ("teammate" %in% names(sublist)) {
# Filtering and counting
res <- sum(!sublist$teammate & first_location_values > x1_threshold) # error here
} else {
res <- 0
}
res
}, data$shot$freeze_frame, data$x1)
},
error = function(e) {
# handle the error
print(paste("An error occurred:", e$message))
})
data$shot <- data$shot %>% select(-freeze_frame, -statsbomb_xg, -key_pass_id)
data$shot$body_part <- data$shot$body_part %>% select(-id)
data$shot$technique <- data$shot$technique %>% select(-id)
data$shot$type <- data$shot$type %>% select(-id)
data$position <- data$position %>% select(-id)
data$shot <- data$shot %>% select(-end_location)
tryCatch({ # TODO reduce error cases
if ("one_on_one" %in% colnames(data$shot)) {
data[is.na(data$shot$one_on_one), ]$shot$one_on_one <- FALSE
} else {
data$shot$one_on_one <- FALSE
}
if ("first_time" %in% colnames(data$shot)) {
data[is.na(data$shot$first_time), ]$shot$first_time <- FALSE
} else {
data$shot$first_time <- FALSE
}
if ("aerial_won" %in% colnames(data$shot)) {
data[is.na(data$shot$aerial_won), ]$shot$aerial_won <- FALSE
} else {
data$shot$aerial_won <- FALSE
}
if ("saved_to_post" %in% colnames(data$shot)) {
data[is.na(data$shot$saved_to_post), ]$shot$saved_to_post <- FALSE
} else {
data$shot$saved_to_post <- FALSE
}
if ("deflected" %in% colnames(data$shot)) {
data[is.na(data$shot$deflected), ]$shot$deflected <- FALSE
} else {
data$shot$deflected <- FALSE
}
if ("saved_off_target" %in% colnames(data$shot)) {
data[is.na(data$shot$saved_off_target), ]$shot$saved_off_target <- FALSE
} else {
data$shot$saved_off_target <- FALSE
}
if ("open_goal" %in% colnames(data$shot)) {
data[is.na(data$shot$open_goal), ]$shot$open_goal <- FALSE
} else {
data$shot$open_goal <- FALSE
}
if ("follows_dribble" %in% colnames(data$shot)) {
data[is.na(data$shot$follows_dribble), ]$shot$follows_dribble <- FALSE
} else {
data$shot$follows_dribble <- FALSE
}
if ("redirect" %in% colnames(data$shot)) {
data[is.na(data$shot$redirect), ]$shot$redirect <- FALSE
} else {
data$shot$redirect <- FALSE
}
if ("kick_off" %in% colnames(data$kick_off)) {
data[is.na(data$kick_off$kick_off), ]$kick_off$kick_off <- FALSE
} else {
data$kick_off$kick_off <- FALSE
}
},
error = function(e) {
# handle the error
print(paste("An error occurred:", e$message))
})
data <- data %>% mutate(angle = atan(7.32 * x1 / (x1^2 + y1^2 - (7.32/2)^2)),
is_goal = ifelse(shot$outcome$id == 97, 1, 0)) %>%
select(-location)
data$angle <- ifelse(data$angle<0, base::pi + data$angle, data$angle)
data$shot$outcome <- data$shot$outcome %>% select(-id)
data <- data %>% unnest(shot, names_sep = "_") %>%
unnest(position, names_sep = "_") %>%
unnest(shot_type, names_sep = "_") %>%
unnest(shot_outcome, names_sep = "_") %>%
unnest(shot_technique, names_sep = "_")
data
}
data_test <- get_shots2("data/la_liga_events/303377.json")
View(data_test)
write.csv(data_test, file = "data/data_test.csv")
colnames(data_test)
data_test$kick_off
data_test$shot_body_part
data_df <- as.data.frame(data_test)
# TODO not all json data have these same keys/fields, customize function to cover all cases
get_shots2 <- function(json_file) {
data <- fromJSON(json_file) %>% filter(type$name == "Shot") %>% dplyr::select(c(minute, position, location, shot))
df_temp <- do.call(rbind, data$location)
colnames(df_temp) <- c("x1", "y1")
data$x1 <- df_temp[,1]
data$y1 <- df_temp[,2]
tryCatch({ # TODO reduce error cases
data$number_of_players <- mapply(function(sublist, x1_threshold) {
# Extracting the first location value and converting it to numeric
first_location_values <- sapply(sublist$location, function(loc) as.numeric(loc[1]))
if ("teammate" %in% names(sublist)) {
# Filtering and counting
res <- sum(!sublist$teammate & first_location_values > x1_threshold) # error here
} else {
res <- 0
}
res
}, data$shot$freeze_frame, data$x1)
},
error = function(e) {
# handle the error
print(paste("An error occurred:", e$message))
})
data$shot <- data$shot %>% select(-freeze_frame, -statsbomb_xg, -key_pass_id)
data$shot$body_part <- data$shot$body_part %>% select(-id)
data$shot$technique <- data$shot$technique %>% select(-id)
data$shot$type <- data$shot$type %>% select(-id)
data$position <- data$position %>% select(-id)
data$shot <- data$shot %>% select(-end_location)
tryCatch({ # TODO reduce error cases
if ("one_on_one" %in% colnames(data$shot)) {
data[is.na(data$shot$one_on_one), ]$shot$one_on_one <- FALSE
} else {
data$shot$one_on_one <- FALSE
}
if ("first_time" %in% colnames(data$shot)) {
data[is.na(data$shot$first_time), ]$shot$first_time <- FALSE
} else {
data$shot$first_time <- FALSE
}
if ("aerial_won" %in% colnames(data$shot)) {
data[is.na(data$shot$aerial_won), ]$shot$aerial_won <- FALSE
} else {
data$shot$aerial_won <- FALSE
}
if ("saved_to_post" %in% colnames(data$shot)) {
data[is.na(data$shot$saved_to_post), ]$shot$saved_to_post <- FALSE
} else {
data$shot$saved_to_post <- FALSE
}
if ("deflected" %in% colnames(data$shot)) {
data[is.na(data$shot$deflected), ]$shot$deflected <- FALSE
} else {
data$shot$deflected <- FALSE
}
if ("saved_off_target" %in% colnames(data$shot)) {
data[is.na(data$shot$saved_off_target), ]$shot$saved_off_target <- FALSE
} else {
data$shot$saved_off_target <- FALSE
}
if ("open_goal" %in% colnames(data$shot)) {
data[is.na(data$shot$open_goal), ]$shot$open_goal <- FALSE
} else {
data$shot$open_goal <- FALSE
}
if ("follows_dribble" %in% colnames(data$shot)) {
data[is.na(data$shot$follows_dribble), ]$shot$follows_dribble <- FALSE
} else {
data$shot$follows_dribble <- FALSE
}
if ("redirect" %in% colnames(data$shot)) {
data[is.na(data$shot$redirect), ]$shot$redirect <- FALSE
} else {
data$shot$redirect <- FALSE
}
if ("kick_off" %in% colnames(data$kick_off)) {
data[is.na(data$shot$kick_off), ]$shotf$kick_off <- FALSE
} else {
data$kick_off <- FALSE
}
},
error = function(e) {
# handle the error
print(paste("An error occurred:", e$message))
})
data <- data %>% mutate(angle = atan(7.32 * x1 / (x1^2 + y1^2 - (7.32/2)^2)),
is_goal = ifelse(shot$outcome$id == 97, 1, 0)) %>%
select(-location)
data$angle <- ifelse(data$angle<0, base::pi + data$angle, data$angle)
data$shot$outcome <- data$shot$outcome %>% select(-id)
data <- data %>% unnest(shot, names_sep = "_") %>%
unnest(position, names_sep = "_") %>%
unnest(shot_type, names_sep = "_") %>%
unnest(shot_outcome, names_sep = "_") %>%
unnest(shot_technique, names_sep = "_") %>%
unnest(shot_body_part, names_sep = "_")
data
}
data_test <- get_shots2("data/la_liga_events/303377.json")
write.csv(data_test, file = "data/data_test.csv")
data4 <- read.csv("data/data4.csv")
setwd("~/Desktop/fantastyczne_gole")
data4 <- read.csv("data/data4.csv")
nrow
nrow(data4)
data_list
file_names <- list.files(path = "data/la_liga_events/", pattern = "*.json")
length(file_names)
data_list <- lapply(paste("data/la_liga_events/", file_names, sep = ""), get_shots2)
combined_data <- do.call(rbind, data_list)
data_test <- data <- fromJSON(("data/la_liga_events/303377.json") %>% filter(type$name == "Shot")
data_test <- fromJSON("data/la_liga_events/303377.json") %>% filter(type$name == "Shot")
data_test <- fromJSON("data/la_liga_events/303377.json") %>% filter(type$name == "Shot")
data_test$id
data_test$index
data4 <- read.csv("data/data4.csv", nrows = 1000)
View(data4)
library(jsonlite)
library(tidyverse)
library(ggsoccer)
library(dplyr)
# TODO not all json data have these same keys/fields, customize function to cover all cases
get_shots2 <- function(json_file) {
data <- fromJSON(json_file) %>% filter(type$name == "Shot") %>% dplyr::select(c(minute, position, location, shot))
@ -499,14 +127,51 @@ unnest(shot_technique, names_sep = "_") %>%
unnest(shot_body_part, names_sep = "_")
data
}
# sample data
data_test <- get_shots2("data/la_liga_events/303377.json")
write.csv(data_test, file = "data/data3_test.csv")
data1 <- read.csv("data/data1.csv", nrows = 1000)
data_list <- lapply(paste("data/la_liga_events/", file_names, sep = ""), get_shots2)
length(data_list)
ss <- lapply(data_list, nrow())
ss <- lapply(data_list, nrow)
ss
sum(ss)
sss <- unlist(ss)
sss
sum(sss)
source("notebooks/dataCleaning.R")
source("notebooks/dataCleaning.R")
# generate random data
random_data <- as.data.frame(x = rnorm(100),
y = rnorm(100, mean = 1, sd = 3))
# unit tests
expect_silent(
data <- get_shots(file_path = "data/events/events_England.json", name_detail = "EN")
)
library(tinytest)
# unit tests
expect_silent(
data <- get_shots(file_path = "data/events/events_England.json", name_detail = "EN")
)
expect_silent(
data <- get_shots2(json_file = "data/la_liga_events/ (1).json")
)
expect_error(
get_final_data(data = random_data)
)
data1 <- get_shots2(json_file = "data/la_liga_events/ (1).json")
data2 <- get_shots2(json_file = "data/la_liga_events/ (2).json")
expect_equivalent(colnames(data1), colnames(data2))
expect_false(is.vector(data1))
expect_true(is.data.frame(data1))
colnames(data1)
View(data1)
data2 <- read.csv("data/data2.csv", nrows = 1000)
View(data2)
data3 <- read.csv("data/data3_test.csv", nrows = 1000)
colnames(data3)
View(data3)
colnames(data2)
expect_length(length(colnames(data1)), length(colnames(data2)))
length(colnames(data1))
length(colnames(data2))
?expect_length
expect_length(colnames(data1), colnames(data2))
expect_length(colnames(data1), colnames(data2))
expect_length(colnames(data1), 22)
expect_length(colnames(data2), 22)
expect_false(is.vector(data1))
expect_true(is.data.frame(data1))
df <- read.csv("data/data4.csv", nrows = 1000)
View(df)

20
app/.eslintrc.cjs Normal file
View File

@ -0,0 +1,20 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:react-hooks/recommended',
],
ignorePatterns: ['dist', '.eslintrc.cjs'],
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
settings: { react: { version: '18.2' } },
plugins: ['react-refresh'],
rules: {
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
}

24
app/.gitignore vendored Normal file
View File

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

8
app/README.md Normal file
View File

@ -0,0 +1,8 @@
# React + Vite
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
Currently, two official plugins are available:
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

View File

@ -1,245 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Football Field with Ball</title>
<style>
body {
margin: 100px;
display: flex;
align-items: center;
justify-content: center;
background: radial-gradient(blue, black);
--line: 0.3em solid white;
}
.container {
position: relative;
width: 120em;
height: 80em;
background-color: green;
font-size: 5px;
padding: 5em;
}
.container span {
display: block;
}
.field {
border: var(--line);
position: relative;
overflow: hidden;
width: inherit;
height: inherit;
z-index: 1;
}
.halfway-line {
width: 60em;
height: 80em;
border-right: var(--line);
}
.centre-circle,
.penalty-arc {
width: 20em;
height: 20em;
border: var(--line);
border-radius: 50%;
position: absolute;
top: 30em;
}
.centre-circle {
left: calc((120em - 20em - 0.3em) / 2);
}
.centre-mark {
width: 2em;
height: 2em;
background-color: white;
border-radius: 50%;
position: absolute;
top: calc(80em / 2 - 1em);
left: calc(120em / 2 - 1em + 0.3em / 2);
}
.penalty-mark {
width: 2em;
height: 2em;
background-color: white;
border-radius: 50%;
position: absolute;
top: calc(80em / 2 - 1em);
left: calc(12em - 2em / 2);
}
.penalty-area {
width: 18em;
height: 44em;
border: var(--line);
position: absolute;
top: calc((80em - 44em) / 2);
left: -0.3em;
background-color: green;
}
.penalty-arc {
left: calc(12em - 20em / 2);
z-index: -1;
}
.goal-area {
width: 6em;
height: 20em;
border: var(--line);
position: absolute;
top: calc((80em - 20em) / 2);
left: -0.3em;
}
.corner-arc {
border: 1px solid blue;
position: absolute;
}
.corner-arc::after,
.corner-arc::before {
content: '';
position: absolute;
width: 5em;
height: 5em;
border: 0.3em solid white;
border-radius: 50%;
}
.corner-arc::before {
top: 0;
left: 0;
}
.corner-arc::after {
bottom: 0;
right: 0;
}
.right {
position: absolute;
top: 0px;
left: 50%;
transform: rotateY(180deg);
}
.football {
width: 2em;
height: 2em;
background-color: #FFD700;
border-radius: 50%;
position: absolute;
}
.reset-button {
position: absolute;
top: -40px;
left: 50%;
transform: translateX(-50%);
padding: 10px;
background-color: #FFFFFF;
border: none;
cursor: pointer;
}
.info-button {
position: absolute;
top: -80px;
left: 50%;
transform: translateX(-50%);
padding: 10px;
background-color: #FFFFFF;
border: none;
cursor: pointer;
}
</style>
</head>
<body>
<div class="container">
<button class="reset-button" onclick="resetField()">Reset</button>
<button class="info-button" onclick="getBallPosition()">Pobierz pozycję piłki</button>
<div class="field" id="footballField">
<div class="left">
<span class="halfway-line"></span>
<span class="centre-circle"></span>
<span class="centre-mark"></span>
<span class="penalty-area"></span>
<span class="penalty-mark"></span>
<span class="penalty-arc"></span>
<span class="goal-area"></span>
<span class="corner-arc"></span>
</div>
<div class="right">
<span class="halfway-line"></span>
<span class="centre-circle"></span>
<span class="centre-mark"></span>
<span class="penalty-area"></span>
<span class="penalty-mark"></span>
<span class="penalty-arc"></span>
<span class="goal-area"></span>
<span class="corner-arc"></span>
</div>
</div>
</div>
<script>
function resetField() {
var footballField = document.getElementById('footballField');
var footballs = document.querySelectorAll('.football');
footballs.forEach(function (ball) {
footballField.removeChild(ball);
});
}
function getBallPosition() {
var ball = document.querySelector('.football');
if (ball) {
var x = ball.style.left;
var y = ball.style.top;
alert('Pozycja piłki:\nX: ' + x + '\nY: ' + y);
} else {
alert('Piłka nie jest obecnie na boisku.');
}
}
document.addEventListener('DOMContentLoaded', function () {
var footballField = document.getElementById('footballField');
footballField.addEventListener('click', function (event) {
var x = event.clientX - footballField.getBoundingClientRect().left;
var y = event.clientY - footballField.getBoundingClientRect().top;
var existingBall = document.querySelector('.football');
if (!existingBall) {
var ball = document.createElement('div');
ball.className = 'football';
ball.style.left = x + 'px';
ball.style.top = y + 'px';
footballField.appendChild(ball);
} else {
alert('Możesz dodać tylko jedną piłkę!');
}
});
});
</script>
</body>
</html>
<!-- https://github.com/zhenfei666/a-football-pitch-CSS-/blob/master/soccer-pitch.html -->

13
app/index.html Normal file
View File

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Football analysys</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

5497
app/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

41
app/package.json Normal file
View File

@ -0,0 +1,41 @@
{
"name": "react_bs_web",
"private": true,
"proxy": "http://localhost:5000",
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
"dependencies": {
"@emailjs/browser": "^3.11.0",
"@react-three/drei": "^9.89.3",
"@react-three/fiber": "^8.15.12",
"cors": "^2.8.5",
"framer-motion": "^10.16.12",
"maath": "^0.10.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.20.1",
"react-tilt": "^1.0.2",
"react-vertical-timeline-component": "^3.6.0"
},
"devDependencies": {
"@types/react": "^18.2.37",
"@types/react-dom": "^18.2.15",
"@vitejs/plugin-react": "^4.2.0",
"autoprefixer": "^10.4.16",
"css": "^3.0.0",
"eslint": "^8.53.0",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.4",
"post": "^0.0.1",
"postcss": "^8.4.32",
"tailwindcss": "^3.3.5",
"vite": "^5.0.0"
}
}

6
app/postcss.config.js Normal file
View File

@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View File

@ -0,0 +1,11 @@
Model Information:
* title: Gaming Desktop PC
* source: https://sketchfab.com/3d-models/gaming-desktop-pc-d1d8282c9916438091f11aeb28787b66
* author: Yolala1232 (https://sketchfab.com/Yolala1232)
Model License:
* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
* requirements: Author must be credited. Commercial use is allowed.
If you use this 3D model in your project be sure to copy paste this credit wherever you share it:
This work is based on "Gaming Desktop PC" (https://sketchfab.com/3d-models/gaming-desktop-pc-d1d8282c9916438091f11aeb28787b66) by Yolala1232 (https://sketchfab.com/Yolala1232) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

124
app/public/logo.svg Normal file
View File

@ -0,0 +1,124 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="556.000000pt" height="535.000000pt" viewBox="0 0 556.000000 535.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,535.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M0 2675 l0 -2675 2780 0 2780 0 0 2675 0 2675 -2780 0 -2780 0 0
-2675z m2789 2558 c26 -19 55 -33 72 -33 29 0 29 0 29 -65 0 -57 -3 -69 -25
-90 -13 -14 -37 -25 -52 -26 -15 0 -93 -2 -173 -4 -326 -8 -516 -76 -963 -342
-201 -121 -228 -140 -366 -267 -282 -258 -415 -414 -510 -596 -109 -208 -129
-290 -176 -725 -35 -319 -37 -333 -72 -415 l-36 -85 23 -165 c12 -91 24 -179
27 -196 5 -29 3 -31 -20 -27 -36 7 -52 -26 -37 -72 16 -47 36 -62 62 -46 11 7
22 11 24 9 2 -3 31 -71 65 -154 33 -82 77 -175 96 -208 20 -32 108 -133 197
-224 145 -148 521 -509 646 -620 l48 -42 49 10 c26 6 56 18 65 27 17 15 18 15
18 -1 0 -9 -14 -30 -31 -45 l-30 -28 23 -15 c51 -34 167 -87 233 -107 41 -13
146 -30 255 -41 101 -11 200 -22 220 -26 88 -14 296 -57 317 -65 15 -6 47 -3
91 7 37 9 116 22 175 29 103 13 110 15 152 52 34 30 43 45 44 72 1 27 4 31 14
22 19 -15 28 -3 20 28 -6 24 -5 25 11 12 10 -8 24 -28 32 -43 l15 -29 20 25
c24 30 39 33 39 9 0 -15 2 -16 10 -3 5 8 10 27 10 43 0 29 14 37 24 12 8 -22
21 -18 34 10 10 21 18 25 57 25 41 0 45 -2 45 -25 0 -38 25 -41 68 -6 l39 30
23 -24 c14 -15 35 -25 52 -25 50 0 499 313 974 678 l44 34 1 -39 1 -38 16 48
c13 39 20 47 35 43 30 -7 45 3 79 53 37 53 135 158 160 172 17 9 17 6 -1 -38
-110 -278 -235 -496 -405 -706 -61 -75 -84 -112 -89 -141 -10 -59 -40 -86 -99
-86 -66 0 -112 -24 -105 -55 3 -21 1 -23 -14 -15 -25 14 -55 12 -116 -7 -61
-19 -67 -36 -27 -74 28 -26 54 -77 54 -106 -1 -13 -12 -5 -39 26 l-38 44 -34
-21 c-19 -11 -79 -66 -133 -122 -97 -98 -100 -103 -104 -153 l-4 -52 -53 3
c-71 5 -95 -17 -95 -88 0 -28 -5 -50 -10 -50 -6 0 -32 23 -59 50 -27 28 -51
50 -54 50 -24 0 -159 -33 -189 -46 -30 -13 -36 -21 -35 -43 3 -40 -26 -37
-123 9 -101 50 -165 64 -225 50 -35 -8 -61 -6 -127 10 -126 30 -301 36 -513
16 -98 -10 -183 -20 -187 -22 -4 -3 -8 13 -8 35 0 45 -2 46 -28 30 -15 -10
-36 -1 -123 50 -57 34 -156 88 -219 120 -102 52 -124 59 -190 64 -83 6 -167
37 -228 85 -64 51 -82 56 -208 62 -111 6 -128 9 -188 39 -108 53 -183 166
-220 330 -22 95 -40 129 -78 145 -27 12 -35 26 -75 137 -44 120 -80 206 -254
604 -81 185 -83 192 -87 283 l-4 92 25 0 c41 0 50 20 38 87 -28 152 -77 293
-161 463 l-57 115 13 75 c8 41 27 160 44 264 62 379 118 487 385 737 149 140
178 178 214 274 31 82 33 83 204 251 182 179 287 273 326 294 16 8 59 11 135
9 l110 -4 23 48 c28 58 94 125 148 152 28 14 63 20 118 21 88 2 93 5 189 93
64 59 97 75 99 49 1 -7 1 -33 -1 -57 -2 -48 -5 -48 68 2 58 39 169 90 322 147
141 53 138 53 229 -17z m981 -117 c164 -30 387 -122 545 -228 44 -29 123 -96
176 -148 92 -91 107 -113 351 -505 140 -225 259 -416 263 -424 15 -25 55 -385
62 -543 7 -177 11 -184 63 -118 18 23 34 39 36 37 2 -2 -3 -23 -11 -47 -32
-90 -73 -316 -76 -412 l-1 -43 -11 42 c-7 31 -6 79 5 175 8 73 14 134 12 136
-1 2 -12 -6 -24 -18 -27 -27 -45 -14 -52 38 -5 29 -21 52 -79 112 -51 52 -88
102 -117 158 -43 82 -44 83 -32 134 15 62 7 148 -17 191 -10 17 -43 51 -73 76
-30 24 -67 61 -81 82 -40 58 -89 217 -89 288 0 36 -4 61 -10 61 -6 0 -27 -8
-48 -19 -88 -44 -74 -50 -353 150 -270 193 -445 310 -599 402 -87 51 -102 57
-181 66 -189 21 -329 114 -329 218 0 59 37 88 123 96 36 3 79 2 96 -3 26 -7
32 -5 46 16 9 14 26 29 38 34 34 14 283 11 367 -4z m-860 -1131 c30 -8 98 -36
150 -62 78 -39 110 -63 180 -133 96 -96 148 -178 187 -295 25 -74 27 -93 27
-235 0 -141 -3 -162 -26 -227 -44 -122 -94 -201 -188 -295 -75 -74 -102 -93
-191 -136 -134 -65 -237 -87 -369 -79 -118 8 -191 27 -300 80 -70 34 -102 59
-181 137 -81 81 -102 109 -142 190 -59 121 -77 197 -77 336 0 214 63 366 215
519 69 70 109 100 170 132 147 75 232 94 390 87 55 -2 125 -11 155 -19z
m-1422 -1571 c32 -5 32 -5 32 -63 l0 -59 -44 5 c-47 6 -86 -9 -86 -32 0 -10
10 -15 30 -15 l30 0 0 -60 0 -60 -30 0 -30 0 0 -90 0 -90 30 0 30 0 0 -60 0
-60 -130 0 -130 0 0 60 c0 47 3 60 15 60 12 0 15 17 15 90 0 73 -3 90 -15 90
-12 0 -15 13 -15 60 0 45 4 60 14 60 8 0 17 15 21 37 22 119 93 153 263 127z
m1492 -109 c0 -58 4 -105 8 -105 5 0 17 9 27 20 36 40 110 45 173 11 39 -21
64 -94 65 -189 0 -145 -41 -210 -142 -220 -42 -4 -52 -1 -83 27 -43 38 -48 38
-48 6 l0 -25 -100 0 -100 0 0 60 c0 53 2 60 20 60 19 0 20 7 20 171 0 162 -1
171 -20 176 -17 5 -20 14 -20 59 l0 54 100 0 100 0 0 -105z m970 -125 c0 -223
1 -230 20 -230 18 0 20 -7 20 -60 l0 -60 -120 0 -120 0 0 60 c0 53 2 60 20 60
19 0 20 7 20 171 0 162 -1 171 -20 176 -17 5 -20 14 -20 59 l0 54 100 0 100 0
0 -230z m270 0 c0 -198 2 -230 15 -230 12 0 15 -13 15 -60 l0 -60 -115 0 -115
0 0 60 c0 47 3 60 15 60 13 0 15 26 15 175 0 149 -2 175 -15 175 -12 0 -15 13
-15 55 l0 55 100 0 100 0 0 -230z m-1580 115 l0 -45 55 0 55 0 0 -60 0 -60
-55 0 -55 0 0 -64 c0 -36 4 -76 10 -90 8 -23 15 -26 55 -26 l45 0 0 -54 0 -54
-50 -11 c-106 -23 -175 -6 -210 51 -17 27 -20 50 -20 136 0 95 -2 104 -20 109
-17 5 -20 14 -20 64 0 44 4 59 14 59 24 0 46 29 46 61 l0 29 75 0 75 0 0 -45z
m-826 -60 c34 -15 76 -56 97 -95 7 -14 13 -59 13 -100 0 -97 -24 -148 -91
-187 -42 -25 -58 -28 -133 -28 -97 0 -133 15 -183 77 -26 32 -31 48 -35 111
-9 141 40 212 161 237 49 10 128 3 171 -15z m480 0 c34 -15 76 -56 97 -95 7
-14 13 -59 13 -100 1 -96 -27 -152 -94 -190 -38 -21 -58 -25 -130 -25 -97 0
-133 15 -183 77 -26 32 -31 48 -35 111 -9 141 40 212 161 237 49 10 128 3 171
-15z m1315 -3 c62 -30 75 -60 79 -177 3 -81 7 -105 18 -105 10 0 14 -16 14
-60 l0 -60 -95 0 c-95 0 -95 0 -95 25 0 14 -4 25 -10 25 -5 0 -10 -4 -10 -9 0
-17 -67 -51 -99 -51 -43 0 -97 24 -110 48 -14 27 -14 94 1 126 14 32 99 76
147 77 20 1 47 4 61 8 l24 7 -23 23 c-22 22 -29 23 -92 17 -37 -3 -79 -10 -93
-16 l-26 -10 0 65 c0 35 5 67 11 71 18 11 151 22 209 17 30 -3 70 -12 89 -21z
m-2290 -534 c6 -13 34 -88 61 -167 38 -110 47 -147 37 -153 -19 -12 -47 -9
-47 5 -1 32 -16 38 -55 22 -28 -12 -40 -13 -49 -5 -14 14 26 50 55 50 23 0 23
19 0 85 -14 39 -19 46 -24 30 -57 -191 -58 -195 -78 -195 -11 0 -22 6 -25 14
-3 8 12 70 34 138 22 68 43 140 46 161 8 42 27 48 45 15z m529 -149 c2 -105
-1 -161 -9 -176 -13 -23 -29 -31 -29 -13 0 5 -21 44 -47 87 l-48 78 -3 -76
c-2 -69 -5 -77 -24 -82 -12 -4 -25 -4 -30 -1 -12 8 -10 331 2 339 6 4 10 -5
10 -19 0 -16 6 -26 15 -26 8 0 15 -5 15 -11 0 -11 75 -125 88 -133 5 -3 7 42
4 99 l-5 104 29 -8 29 -7 3 -155z m352 157 c0 -8 4 -16 8 -18 13 -5 105 -287
98 -303 -9 -25 -45 -18 -52 11 -5 18 -11 23 -23 19 -42 -17 -71 -23 -76 -14
-10 14 5 30 41 45 37 16 37 18 9 100 -8 24 -15 33 -18 24 -3 -8 -18 -55 -34
-105 -21 -66 -33 -91 -47 -93 -10 -2 -22 0 -27 5 -4 4 12 71 36 148 24 77 46
152 50 168 5 28 35 39 35 13z m388 1 c8 -7 12 -46 12 -134 l0 -125 28 6 c74
19 79 19 85 -4 5 -18 -2 -25 -36 -41 -23 -10 -51 -19 -62 -19 -12 0 -26 -5
-31 -10 -6 -6 -18 -8 -27 -4 -15 5 -17 26 -17 173 0 153 2 168 18 168 9 0 23
-4 30 -10z m399 -52 l31 -66 27 66 c28 65 37 73 64 56 13 -8 9 -24 -24 -98
-32 -71 -40 -103 -43 -166 -4 -73 -6 -78 -26 -75 -19 3 -22 11 -27 83 -6 77
-32 159 -65 211 -19 28 -12 54 14 54 13 0 28 -19 49 -65z m769 -3 l31 -63 28
66 c28 65 37 73 65 56 12 -8 7 -25 -28 -106 -36 -83 -42 -106 -42 -166 0 -67
-1 -70 -22 -67 -21 3 -23 10 -29 83 -4 64 -13 96 -42 160 -21 43 -35 85 -32
93 11 29 41 5 71 -56z m-306 43 c11 -14 7 -22 -29 -59 l-42 -42 51 -43 c27
-23 50 -50 50 -59 0 -19 -98 -122 -116 -122 -6 0 -18 7 -25 16 -12 14 -7 21
34 56 26 22 47 43 47 47 0 4 -22 24 -50 45 -64 49 -64 68 0 129 55 52 61 54
80 32z m770 0 c11 -14 7 -23 -29 -59 l-42 -43 50 -42 c28 -24 51 -50 51 -60 0
-9 -24 -41 -54 -70 -42 -42 -58 -52 -75 -46 -32 10 -25 30 24 72 l46 38 -56
52 c-64 60 -64 62 9 131 51 47 58 49 76 27z"/>
<path d="M560 1975 c0 -3 9 -23 20 -45 11 -22 20 -49 20 -60 0 -28 17 -61 44
-82 36 -30 45 -21 22 25 -11 23 -32 66 -44 95 -13 29 -32 57 -43 62 -10 6 -19
8 -19 5z"/>
<path d="M490 1955 c-10 -12 -6 -22 24 -60 21 -25 39 -45 41 -45 8 0 -32 114
-41 117 -6 2 -17 -3 -24 -12z"/>
<path d="M3048 3630 c-87 -26 -138 -93 -138 -180 0 -106 79 -183 185 -182 82
1 138 38 170 114 41 99 -18 218 -123 248 -42 11 -56 11 -94 0z"/>
<path d="M2996 2108 c-18 -26 -21 -109 -6 -139 7 -12 21 -19 40 -19 38 0 50
23 50 94 0 58 -16 86 -50 86 -10 0 -26 -10 -34 -22z"/>
<path d="M1670 2115 c-17 -20 -24 -84 -13 -125 7 -29 14 -36 38 -38 19 -3 33
2 42 14 19 26 17 129 -3 148 -19 20 -48 20 -64 1z"/>
<path d="M2150 2115 c-17 -20 -24 -84 -13 -125 7 -28 15 -36 37 -38 44 -5 56
13 56 84 0 44 -5 67 -16 78 -19 20 -48 20 -64 1z"/>
<path d="M3472 1994 c-27 -19 -28 -40 -3 -53 24 -13 48 4 57 42 5 22 3 27 -13
27 -10 0 -29 -7 -41 -16z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -0,0 +1,11 @@
Model Information:
* title: Stylized planet
* source: https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70
* author: cmzw (https://sketchfab.com/cmzw)
Model License:
* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
* requirements: Author must be credited. Commercial use is allowed.
If you use this 3D model in your project be sure to copy paste this credit wherever you share it:
This work is based on "Stylized planet" (https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70) by cmzw (https://sketchfab.com/cmzw) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)

BIN
app/public/planet/scene.bin Normal file

Binary file not shown.

View File

@ -0,0 +1,536 @@
{
"accessors": [
{
"bufferView": 2,
"componentType": 5126,
"count": 26495,
"max": [
0.8758764863014221,
0.8545469045639038,
0.8728971481323242
],
"min": [
-0.8763356804847717,
-0.8634992837905884,
-0.8758782148361206
],
"type": "VEC3"
},
{
"bufferView": 2,
"byteOffset": 317940,
"componentType": 5126,
"count": 26495,
"max": [
1.0,
0.9999911785125732,
0.9991646409034729
],
"min": [
-1.0,
-0.9999968409538269,
-0.9999611377716064
],
"type": "VEC3"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 26495,
"max": [
1.0,
1.0
],
"min": [
0.0,
0.0
],
"type": "VEC2"
},
{
"bufferView": 0,
"componentType": 5125,
"count": 103014,
"type": "SCALAR"
},
{
"bufferView": 2,
"byteOffset": 635880,
"componentType": 5126,
"count": 6596,
"max": [
0.6551179885864258,
0.6613333821296692,
0.6618664860725403
],
"min": [
-0.6606217622756958,
-0.6490849852561951,
-0.6526646018028259
],
"type": "VEC3"
},
{
"bufferView": 2,
"byteOffset": 715032,
"componentType": 5126,
"count": 6596,
"max": [
0.999987006187439,
0.9998384118080139,
0.9999796748161316
],
"min": [
-0.9995425939559937,
-0.999676525592804,
-0.9994800686836243
],
"type": "VEC3"
},
{
"bufferView": 1,
"byteOffset": 211960,
"componentType": 5126,
"count": 6596,
"max": [
1.0,
1.0
],
"min": [
0.0,
0.0
],
"type": "VEC2"
},
{
"bufferView": 0,
"byteOffset": 412056,
"componentType": 5125,
"count": 39042,
"type": "SCALAR"
},
{
"bufferView": 3,
"componentType": 5126,
"count": 451,
"max": [
15.0
],
"min": [
0.0
],
"type": "SCALAR"
},
{
"bufferView": 5,
"componentType": 5126,
"count": 451,
"max": [
0.20017318427562714,
0.979751706123352,
0.2001722753047943,
0.9797602891921997
],
"min": [
-0.018710684031248093,
-0.9797568917274475,
-0.1991616040468216,
0.0026621678844094276
],
"type": "VEC4"
},
{
"bufferView": 3,
"byteOffset": 1804,
"componentType": 5126,
"count": 125,
"max": [
15.0
],
"min": [
0.0
],
"type": "SCALAR"
},
{
"bufferView": 4,
"componentType": 5126,
"count": 125,
"max": [
1.0000001192092896,
1.0,
1.0000001192092896
],
"min": [
0.9999998807907104,
1.0,
0.9999998807907104
],
"type": "VEC3"
},
{
"bufferView": 3,
"byteOffset": 2304,
"componentType": 5126,
"count": 451,
"max": [
15.0
],
"min": [
0.0
],
"type": "SCALAR"
},
{
"bufferView": 5,
"byteOffset": 7216,
"componentType": 5126,
"count": 451,
"max": [
0.20017318427562714,
0.979751706123352,
0.2001722753047943,
0.9797602891921997
],
"min": [
-0.018710684031248093,
-0.9797568917274475,
-0.1991616040468216,
0.0026621678844094276
],
"type": "VEC4"
},
{
"bufferView": 3,
"byteOffset": 4108,
"componentType": 5126,
"count": 125,
"max": [
15.0
],
"min": [
0.0
],
"type": "SCALAR"
},
{
"bufferView": 4,
"byteOffset": 1500,
"componentType": 5126,
"count": 125,
"max": [
1.0000001192092896,
1.0,
1.0000001192092896
],
"min": [
0.9999998807907104,
1.0,
0.9999998807907104
],
"type": "VEC3"
}
],
"animations": [
{
"channels": [
{
"sampler": 0,
"target": {
"node": 3,
"path": "rotation"
}
},
{
"sampler": 1,
"target": {
"node": 3,
"path": "scale"
}
},
{
"sampler": 2,
"target": {
"node": 5,
"path": "rotation"
}
},
{
"sampler": 3,
"target": {
"node": 5,
"path": "scale"
}
}
],
"name": "Animation",
"samplers": [
{
"input": 8,
"interpolation": "LINEAR",
"output": 9
},
{
"input": 10,
"interpolation": "LINEAR",
"output": 11
},
{
"input": 12,
"interpolation": "LINEAR",
"output": 13
},
{
"input": 14,
"interpolation": "LINEAR",
"output": 15
}
]
}
],
"asset": {
"extras": {
"author": "cmzw (https://sketchfab.com/cmzw)",
"license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)",
"source": "https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70",
"title": "Stylized planet"
},
"generator": "Sketchfab-14.10.0",
"version": "2.0"
},
"bufferViews": [
{
"buffer": 0,
"byteLength": 568224,
"name": "floatBufferViews",
"target": 34963
},
{
"buffer": 0,
"byteLength": 264728,
"byteOffset": 568224,
"byteStride": 8,
"name": "floatBufferViews",
"target": 34962
},
{
"buffer": 0,
"byteLength": 794184,
"byteOffset": 832952,
"byteStride": 12,
"name": "floatBufferViews",
"target": 34962
},
{
"buffer": 0,
"byteLength": 4608,
"byteOffset": 1627136,
"name": "floatBufferViews"
},
{
"buffer": 0,
"byteLength": 3000,
"byteOffset": 1631744,
"byteStride": 12,
"name": "floatBufferViews"
},
{
"buffer": 0,
"byteLength": 14432,
"byteOffset": 1634744,
"byteStride": 16,
"name": "floatBufferViews"
}
],
"buffers": [
{
"byteLength": 1649176,
"uri": "scene.bin"
}
],
"extensionsUsed": [
"KHR_materials_unlit"
],
"images": [
{
"uri": "textures/Clouds_baseColor.png"
},
{
"uri": "textures/Planet_baseColor.png"
}
],
"materials": [
{
"doubleSided": true,
"emissiveTexture": {
"index": 0
},
"extensions": {
"KHR_materials_unlit": {}
},
"name": "Clouds",
"pbrMetallicRoughness": {
"baseColorTexture": {
"index": 0
},
"metallicFactor": 0.0
}
},
{
"emissiveFactor": [
0.23391156271636818,
0.23391156271636818,
0.23391156271636818
],
"emissiveTexture": {
"index": 1
},
"extensions": {
"KHR_materials_unlit": {}
},
"name": "Planet",
"pbrMetallicRoughness": {
"baseColorTexture": {
"index": 1
},
"metallicFactor": 0.0
}
}
],
"meshes": [
{
"name": "Object_0",
"primitives": [
{
"attributes": {
"NORMAL": 1,
"POSITION": 0,
"TEXCOORD_0": 2
},
"indices": 3,
"material": 0,
"mode": 4
}
]
},
{
"name": "Object_1",
"primitives": [
{
"attributes": {
"NORMAL": 5,
"POSITION": 4,
"TEXCOORD_0": 6
},
"indices": 7,
"material": 1,
"mode": 4
}
]
}
],
"nodes": [
{
"children": [
1
],
"matrix": [
0.9979661703109741,
0.06371438503265381,
0.001990502001717701,
0.0,
0.0,
0.031225780025124772,
-0.9995123744010925,
0.0,
-0.06374546885490417,
0.9974795579910278,
0.031162271276116593,
0.0,
0.0,
0.0,
0.0,
1.0
],
"name": "Sketchfab_model"
},
{
"children": [
2
],
"name": "root"
},
{
"children": [
3,
5
],
"matrix": [
1.0,
0.0,
0.0,
0.0,
0.0,
2.220446049250313e-16,
1.0,
0.0,
0.0,
-1.0,
2.220446049250313e-16,
0.0,
0.0,
0.0,
0.0,
1.0
],
"name": "GLTF_SceneRootNode"
},
{
"children": [
4
],
"name": "Clouds_1"
},
{
"mesh": 0,
"name": "Object_4"
},
{
"children": [
6
],
"name": "Planet_2"
},
{
"mesh": 1,
"name": "Object_6"
}
],
"samplers": [
{
"magFilter": 9729,
"minFilter": 9987,
"wrapS": 10497,
"wrapT": 10497
}
],
"scene": 0,
"scenes": [
{
"name": "Sketchfab_Scene",
"nodes": [
0
]
}
],
"textures": [
{
"sampler": 0,
"source": 0
},
{
"sampler": 0,
"source": 1
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 KiB

23
app/src/App.jsx Normal file
View File

@ -0,0 +1,23 @@
import { BrowserRouter } from "react-router-dom";
import { Hero, Navbar } from "./components";
const App = () => {
return (
<BrowserRouter>
<div className='relative z-0 bg-primary'>
<div className='bg-hero-pattern bg-cover bg-no-repeat'>
<Navbar />
</div>
<div className='relative z-0'>
<Hero/>
</div>
</div>
</BrowserRouter>
);
}
export default App;

BIN
app/src/assets/backend.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
app/src/assets/carrent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 KiB

3
app/src/assets/close.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="#FFF" xmlns="http://www.w3.org/2000/svg">
<path d="M10.4099 9L16.7099 2.71C16.8982 2.5217 17.004 2.2663 17.004 2C17.004 1.7337 16.8982 1.47831 16.7099 1.29C16.5216 1.1017 16.2662 0.995911 15.9999 0.995911C15.7336 0.995911 15.4782 1.1017 15.2899 1.29L8.99994 7.59L2.70994 1.29C2.52164 1.1017 2.26624 0.995911 1.99994 0.995911C1.73364 0.995911 1.47824 1.1017 1.28994 1.29C1.10164 1.47831 0.995847 1.7337 0.995847 2C0.995847 2.2663 1.10164 2.5217 1.28994 2.71L7.58994 9L1.28994 15.29C1.19621 15.383 1.12182 15.4936 1.07105 15.6154C1.02028 15.7373 0.994141 15.868 0.994141 16C0.994141 16.132 1.02028 16.2627 1.07105 16.3846C1.12182 16.5064 1.19621 16.617 1.28994 16.71C1.3829 16.8037 1.4935 16.8781 1.61536 16.9289C1.73722 16.9797 1.86793 17.0058 1.99994 17.0058C2.13195 17.0058 2.26266 16.9797 2.38452 16.9289C2.50638 16.8781 2.61698 16.8037 2.70994 16.71L8.99994 10.41L15.2899 16.71C15.3829 16.8037 15.4935 16.8781 15.6154 16.9289C15.7372 16.9797 15.8679 17.0058 15.9999 17.0058C16.132 17.0058 16.2627 16.9797 16.3845 16.9289C16.5064 16.8781 16.617 16.8037 16.7099 16.71C16.8037 16.617 16.8781 16.5064 16.9288 16.3846C16.9796 16.2627 17.0057 16.132 17.0057 16C17.0057 15.868 16.9796 15.7373 16.9288 15.6154C16.8781 15.4936 16.8037 15.383 16.7099 15.29L10.4099 9Z" fill="#FFFFFF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
app/src/assets/creator.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
app/src/assets/github.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
app/src/assets/herobg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 KiB

62
app/src/assets/index.js Normal file
View File

@ -0,0 +1,62 @@
import logo from "./logo.svg";
import backend from "./backend.png";
import creator from "./creator.png";
import mobile from "./mobile.png";
import web from "./web.png";
import github from "./github.png";
import menu from "./menu.svg";
import close from "./close.svg";
import css from "./tech/css.png";
import docker from "./tech/docker.png";
import figma from "./tech/figma.png";
import git from "./tech/git.png";
import html from "./tech/html.png";
import javascript from "./tech/javascript.png";
import mongodb from "./tech/mongodb.png";
import nodejs from "./tech/nodejs.png";
import reactjs from "./tech/reactjs.png";
import redux from "./tech/redux.png";
import tailwind from "./tech/tailwind.png";
import typescript from "./tech/typescript.png";
import threejs from "./tech/threejs.svg";
import meta from "./company/meta.png";
import shopify from "./company/shopify.png";
import starbucks from "./company/starbucks.png";
import tesla from "./company/tesla.png";
import carrent from "./carrent.png";
import jobit from "./jobit.png";
import tripguide from "./tripguide.png";
export {
logo,
backend,
creator,
mobile,
web,
github,
menu,
close,
css,
docker,
figma,
git,
html,
javascript,
mongodb,
nodejs,
reactjs,
redux,
tailwind,
typescript,
threejs,
meta,
shopify,
starbucks,
tesla,
carrent,
jobit,
tripguide,
};

BIN
app/src/assets/jobit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 KiB

124
app/src/assets/logo.svg Normal file
View File

@ -0,0 +1,124 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="556.000000pt" height="535.000000pt" viewBox="0 0 556.000000 535.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,535.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M0 2675 l0 -2675 2780 0 2780 0 0 2675 0 2675 -2780 0 -2780 0 0
-2675z m2789 2558 c26 -19 55 -33 72 -33 29 0 29 0 29 -65 0 -57 -3 -69 -25
-90 -13 -14 -37 -25 -52 -26 -15 0 -93 -2 -173 -4 -326 -8 -516 -76 -963 -342
-201 -121 -228 -140 -366 -267 -282 -258 -415 -414 -510 -596 -109 -208 -129
-290 -176 -725 -35 -319 -37 -333 -72 -415 l-36 -85 23 -165 c12 -91 24 -179
27 -196 5 -29 3 -31 -20 -27 -36 7 -52 -26 -37 -72 16 -47 36 -62 62 -46 11 7
22 11 24 9 2 -3 31 -71 65 -154 33 -82 77 -175 96 -208 20 -32 108 -133 197
-224 145 -148 521 -509 646 -620 l48 -42 49 10 c26 6 56 18 65 27 17 15 18 15
18 -1 0 -9 -14 -30 -31 -45 l-30 -28 23 -15 c51 -34 167 -87 233 -107 41 -13
146 -30 255 -41 101 -11 200 -22 220 -26 88 -14 296 -57 317 -65 15 -6 47 -3
91 7 37 9 116 22 175 29 103 13 110 15 152 52 34 30 43 45 44 72 1 27 4 31 14
22 19 -15 28 -3 20 28 -6 24 -5 25 11 12 10 -8 24 -28 32 -43 l15 -29 20 25
c24 30 39 33 39 9 0 -15 2 -16 10 -3 5 8 10 27 10 43 0 29 14 37 24 12 8 -22
21 -18 34 10 10 21 18 25 57 25 41 0 45 -2 45 -25 0 -38 25 -41 68 -6 l39 30
23 -24 c14 -15 35 -25 52 -25 50 0 499 313 974 678 l44 34 1 -39 1 -38 16 48
c13 39 20 47 35 43 30 -7 45 3 79 53 37 53 135 158 160 172 17 9 17 6 -1 -38
-110 -278 -235 -496 -405 -706 -61 -75 -84 -112 -89 -141 -10 -59 -40 -86 -99
-86 -66 0 -112 -24 -105 -55 3 -21 1 -23 -14 -15 -25 14 -55 12 -116 -7 -61
-19 -67 -36 -27 -74 28 -26 54 -77 54 -106 -1 -13 -12 -5 -39 26 l-38 44 -34
-21 c-19 -11 -79 -66 -133 -122 -97 -98 -100 -103 -104 -153 l-4 -52 -53 3
c-71 5 -95 -17 -95 -88 0 -28 -5 -50 -10 -50 -6 0 -32 23 -59 50 -27 28 -51
50 -54 50 -24 0 -159 -33 -189 -46 -30 -13 -36 -21 -35 -43 3 -40 -26 -37
-123 9 -101 50 -165 64 -225 50 -35 -8 -61 -6 -127 10 -126 30 -301 36 -513
16 -98 -10 -183 -20 -187 -22 -4 -3 -8 13 -8 35 0 45 -2 46 -28 30 -15 -10
-36 -1 -123 50 -57 34 -156 88 -219 120 -102 52 -124 59 -190 64 -83 6 -167
37 -228 85 -64 51 -82 56 -208 62 -111 6 -128 9 -188 39 -108 53 -183 166
-220 330 -22 95 -40 129 -78 145 -27 12 -35 26 -75 137 -44 120 -80 206 -254
604 -81 185 -83 192 -87 283 l-4 92 25 0 c41 0 50 20 38 87 -28 152 -77 293
-161 463 l-57 115 13 75 c8 41 27 160 44 264 62 379 118 487 385 737 149 140
178 178 214 274 31 82 33 83 204 251 182 179 287 273 326 294 16 8 59 11 135
9 l110 -4 23 48 c28 58 94 125 148 152 28 14 63 20 118 21 88 2 93 5 189 93
64 59 97 75 99 49 1 -7 1 -33 -1 -57 -2 -48 -5 -48 68 2 58 39 169 90 322 147
141 53 138 53 229 -17z m981 -117 c164 -30 387 -122 545 -228 44 -29 123 -96
176 -148 92 -91 107 -113 351 -505 140 -225 259 -416 263 -424 15 -25 55 -385
62 -543 7 -177 11 -184 63 -118 18 23 34 39 36 37 2 -2 -3 -23 -11 -47 -32
-90 -73 -316 -76 -412 l-1 -43 -11 42 c-7 31 -6 79 5 175 8 73 14 134 12 136
-1 2 -12 -6 -24 -18 -27 -27 -45 -14 -52 38 -5 29 -21 52 -79 112 -51 52 -88
102 -117 158 -43 82 -44 83 -32 134 15 62 7 148 -17 191 -10 17 -43 51 -73 76
-30 24 -67 61 -81 82 -40 58 -89 217 -89 288 0 36 -4 61 -10 61 -6 0 -27 -8
-48 -19 -88 -44 -74 -50 -353 150 -270 193 -445 310 -599 402 -87 51 -102 57
-181 66 -189 21 -329 114 -329 218 0 59 37 88 123 96 36 3 79 2 96 -3 26 -7
32 -5 46 16 9 14 26 29 38 34 34 14 283 11 367 -4z m-860 -1131 c30 -8 98 -36
150 -62 78 -39 110 -63 180 -133 96 -96 148 -178 187 -295 25 -74 27 -93 27
-235 0 -141 -3 -162 -26 -227 -44 -122 -94 -201 -188 -295 -75 -74 -102 -93
-191 -136 -134 -65 -237 -87 -369 -79 -118 8 -191 27 -300 80 -70 34 -102 59
-181 137 -81 81 -102 109 -142 190 -59 121 -77 197 -77 336 0 214 63 366 215
519 69 70 109 100 170 132 147 75 232 94 390 87 55 -2 125 -11 155 -19z
m-1422 -1571 c32 -5 32 -5 32 -63 l0 -59 -44 5 c-47 6 -86 -9 -86 -32 0 -10
10 -15 30 -15 l30 0 0 -60 0 -60 -30 0 -30 0 0 -90 0 -90 30 0 30 0 0 -60 0
-60 -130 0 -130 0 0 60 c0 47 3 60 15 60 12 0 15 17 15 90 0 73 -3 90 -15 90
-12 0 -15 13 -15 60 0 45 4 60 14 60 8 0 17 15 21 37 22 119 93 153 263 127z
m1492 -109 c0 -58 4 -105 8 -105 5 0 17 9 27 20 36 40 110 45 173 11 39 -21
64 -94 65 -189 0 -145 -41 -210 -142 -220 -42 -4 -52 -1 -83 27 -43 38 -48 38
-48 6 l0 -25 -100 0 -100 0 0 60 c0 53 2 60 20 60 19 0 20 7 20 171 0 162 -1
171 -20 176 -17 5 -20 14 -20 59 l0 54 100 0 100 0 0 -105z m970 -125 c0 -223
1 -230 20 -230 18 0 20 -7 20 -60 l0 -60 -120 0 -120 0 0 60 c0 53 2 60 20 60
19 0 20 7 20 171 0 162 -1 171 -20 176 -17 5 -20 14 -20 59 l0 54 100 0 100 0
0 -230z m270 0 c0 -198 2 -230 15 -230 12 0 15 -13 15 -60 l0 -60 -115 0 -115
0 0 60 c0 47 3 60 15 60 13 0 15 26 15 175 0 149 -2 175 -15 175 -12 0 -15 13
-15 55 l0 55 100 0 100 0 0 -230z m-1580 115 l0 -45 55 0 55 0 0 -60 0 -60
-55 0 -55 0 0 -64 c0 -36 4 -76 10 -90 8 -23 15 -26 55 -26 l45 0 0 -54 0 -54
-50 -11 c-106 -23 -175 -6 -210 51 -17 27 -20 50 -20 136 0 95 -2 104 -20 109
-17 5 -20 14 -20 64 0 44 4 59 14 59 24 0 46 29 46 61 l0 29 75 0 75 0 0 -45z
m-826 -60 c34 -15 76 -56 97 -95 7 -14 13 -59 13 -100 0 -97 -24 -148 -91
-187 -42 -25 -58 -28 -133 -28 -97 0 -133 15 -183 77 -26 32 -31 48 -35 111
-9 141 40 212 161 237 49 10 128 3 171 -15z m480 0 c34 -15 76 -56 97 -95 7
-14 13 -59 13 -100 1 -96 -27 -152 -94 -190 -38 -21 -58 -25 -130 -25 -97 0
-133 15 -183 77 -26 32 -31 48 -35 111 -9 141 40 212 161 237 49 10 128 3 171
-15z m1315 -3 c62 -30 75 -60 79 -177 3 -81 7 -105 18 -105 10 0 14 -16 14
-60 l0 -60 -95 0 c-95 0 -95 0 -95 25 0 14 -4 25 -10 25 -5 0 -10 -4 -10 -9 0
-17 -67 -51 -99 -51 -43 0 -97 24 -110 48 -14 27 -14 94 1 126 14 32 99 76
147 77 20 1 47 4 61 8 l24 7 -23 23 c-22 22 -29 23 -92 17 -37 -3 -79 -10 -93
-16 l-26 -10 0 65 c0 35 5 67 11 71 18 11 151 22 209 17 30 -3 70 -12 89 -21z
m-2290 -534 c6 -13 34 -88 61 -167 38 -110 47 -147 37 -153 -19 -12 -47 -9
-47 5 -1 32 -16 38 -55 22 -28 -12 -40 -13 -49 -5 -14 14 26 50 55 50 23 0 23
19 0 85 -14 39 -19 46 -24 30 -57 -191 -58 -195 -78 -195 -11 0 -22 6 -25 14
-3 8 12 70 34 138 22 68 43 140 46 161 8 42 27 48 45 15z m529 -149 c2 -105
-1 -161 -9 -176 -13 -23 -29 -31 -29 -13 0 5 -21 44 -47 87 l-48 78 -3 -76
c-2 -69 -5 -77 -24 -82 -12 -4 -25 -4 -30 -1 -12 8 -10 331 2 339 6 4 10 -5
10 -19 0 -16 6 -26 15 -26 8 0 15 -5 15 -11 0 -11 75 -125 88 -133 5 -3 7 42
4 99 l-5 104 29 -8 29 -7 3 -155z m352 157 c0 -8 4 -16 8 -18 13 -5 105 -287
98 -303 -9 -25 -45 -18 -52 11 -5 18 -11 23 -23 19 -42 -17 -71 -23 -76 -14
-10 14 5 30 41 45 37 16 37 18 9 100 -8 24 -15 33 -18 24 -3 -8 -18 -55 -34
-105 -21 -66 -33 -91 -47 -93 -10 -2 -22 0 -27 5 -4 4 12 71 36 148 24 77 46
152 50 168 5 28 35 39 35 13z m388 1 c8 -7 12 -46 12 -134 l0 -125 28 6 c74
19 79 19 85 -4 5 -18 -2 -25 -36 -41 -23 -10 -51 -19 -62 -19 -12 0 -26 -5
-31 -10 -6 -6 -18 -8 -27 -4 -15 5 -17 26 -17 173 0 153 2 168 18 168 9 0 23
-4 30 -10z m399 -52 l31 -66 27 66 c28 65 37 73 64 56 13 -8 9 -24 -24 -98
-32 -71 -40 -103 -43 -166 -4 -73 -6 -78 -26 -75 -19 3 -22 11 -27 83 -6 77
-32 159 -65 211 -19 28 -12 54 14 54 13 0 28 -19 49 -65z m769 -3 l31 -63 28
66 c28 65 37 73 65 56 12 -8 7 -25 -28 -106 -36 -83 -42 -106 -42 -166 0 -67
-1 -70 -22 -67 -21 3 -23 10 -29 83 -4 64 -13 96 -42 160 -21 43 -35 85 -32
93 11 29 41 5 71 -56z m-306 43 c11 -14 7 -22 -29 -59 l-42 -42 51 -43 c27
-23 50 -50 50 -59 0 -19 -98 -122 -116 -122 -6 0 -18 7 -25 16 -12 14 -7 21
34 56 26 22 47 43 47 47 0 4 -22 24 -50 45 -64 49 -64 68 0 129 55 52 61 54
80 32z m770 0 c11 -14 7 -23 -29 -59 l-42 -43 50 -42 c28 -24 51 -50 51 -60 0
-9 -24 -41 -54 -70 -42 -42 -58 -52 -75 -46 -32 10 -25 30 24 72 l46 38 -56
52 c-64 60 -64 62 9 131 51 47 58 49 76 27z"/>
<path d="M560 1975 c0 -3 9 -23 20 -45 11 -22 20 -49 20 -60 0 -28 17 -61 44
-82 36 -30 45 -21 22 25 -11 23 -32 66 -44 95 -13 29 -32 57 -43 62 -10 6 -19
8 -19 5z"/>
<path d="M490 1955 c-10 -12 -6 -22 24 -60 21 -25 39 -45 41 -45 8 0 -32 114
-41 117 -6 2 -17 -3 -24 -12z"/>
<path d="M3048 3630 c-87 -26 -138 -93 -138 -180 0 -106 79 -183 185 -182 82
1 138 38 170 114 41 99 -18 218 -123 248 -42 11 -56 11 -94 0z"/>
<path d="M2996 2108 c-18 -26 -21 -109 -6 -139 7 -12 21 -19 40 -19 38 0 50
23 50 94 0 58 -16 86 -50 86 -10 0 -26 -10 -34 -22z"/>
<path d="M1670 2115 c-17 -20 -24 -84 -13 -125 7 -29 14 -36 38 -38 19 -3 33
2 42 14 19 26 17 129 -3 148 -19 20 -48 20 -64 1z"/>
<path d="M2150 2115 c-17 -20 -24 -84 -13 -125 7 -28 15 -36 37 -38 44 -5 56
13 56 84 0 44 -5 67 -16 78 -19 20 -48 20 -64 1z"/>
<path d="M3472 1994 c-27 -19 -28 -40 -3 -53 24 -13 48 4 57 42 5 22 3 27 -13
27 -10 0 -29 -7 -41 -16z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

3
app/src/assets/menu.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="20" height="12" viewBox="0 0 20 12" fill="#FFF" xmlns="http://www.w3.org/2000/svg">
<path d="M9 2L19 2C19.2652 2 19.5196 1.89464 19.7071 1.70711C19.8946 1.51957 20 1.26522 20 1C20 0.734784 19.8946 0.480429 19.7071 0.292892C19.5196 0.105356 19.2652 0 19 0L9 0C8.73478 0 8.48043 0.105356 8.29289 0.292892C8.10536 0.480429 8 0.734784 8 1C8 1.26522 8.10536 1.51957 8.29289 1.70711C8.48043 1.89464 8.73478 2 9 2ZM19 10L1 10C0.734784 10 0.480429 10.1054 0.292892 10.2929C0.105356 10.4804 0 10.7348 0 11C0 11.2652 0.105356 11.5196 0.292892 11.7071C0.480429 11.8946 0.734784 12 1 12L19 12C19.2652 12 19.5196 11.8946 19.7071 11.7071C19.8946 11.5196 20 11.2652 20 11C20 10.7348 19.8946 10.4804 19.7071 10.2929C19.5196 10.1054 19.2652 10 19 10V10ZM1 7L19 7C19.2652 7 19.5196 6.89464 19.7071 6.70711C19.8946 6.51957 20 6.26522 20 6C20 5.73478 19.8946 5.48043 19.7071 5.29289C19.5196 5.10536 19.2652 5 19 5L1 5C0.734784 5 0.480429 5.10536 0.292892 5.29289C0.105356 5.48043 0 5.73478 0 6C0 6.26522 0.105356 6.51957 0.292892 6.70711C0.480429 6.89464 0.734784 7 1 7Z" fill="#FFFFFF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
app/src/assets/mobile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
app/src/assets/tech/css.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
app/src/assets/tech/git.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg fill="none" stroke-linecap="square" stroke-miterlimit="10" version="1.1" viewBox="0 0 226.77 226.77" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(8.964 4.2527)" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="4">
<path d="m63.02 200.61-43.213-174.94 173.23 49.874z"/>
<path d="m106.39 50.612 21.591 87.496-86.567-24.945z"/>
<path d="m84.91 125.03-10.724-43.465 43.008 12.346z"/>
<path d="m63.458 38.153 10.724 43.465-43.008-12.346z"/>
<path d="m149.47 62.93 10.724 43.465-43.008-12.346z"/>
<path d="m84.915 125.06 10.724 43.465-43.008-12.346z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 677 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Some files were not shown because too many files have changed in this diff Show More