diff --git a/app/Http/Controllers/ContactController.php b/app/Http/Controllers/ContactController.php new file mode 100644 index 0000000..d0e2933 --- /dev/null +++ b/app/Http/Controllers/ContactController.php @@ -0,0 +1,21 @@ +validate([ + 'name' => 'required|max:255', + 'message' => 'required|max:5000', + ]); + + + + return response()->json(['status' => 'success']); + } +} diff --git a/app/Http/Controllers/EducationController.php b/app/Http/Controllers/EducationController.php index b8e7c7d..bd35f52 100644 --- a/app/Http/Controllers/EducationController.php +++ b/app/Http/Controllers/EducationController.php @@ -32,7 +32,7 @@ class EducationController extends Controller $education = Education::create($data); if ($request->hasFile('afbeelding')) { - $education->addMediaFromRequest('afbeelding')->toMediaCollection('afbeelding'); + $education->addMediaFromRequest('afbeelding')->toMediaCollection('image'); } return redirect()->route('educations.index')->with('success', 'Opleiding toegevoegd.'); @@ -62,8 +62,9 @@ class EducationController extends Controller $education->update($data); if ($request->hasFile('afbeelding')) { - $education->clearMediaCollection('afbeelding'); - $education->addMediaFromRequest('afbeelding')->toMediaCollection('afbeelding'); + $education->clearMediaCollection('image'); + + $education->addMediaFromRequest('afbeelding')->toMediaCollection('image'); } return redirect()->route('educations.index')->with('success', 'Opleiding bijgewerkt.'); diff --git a/app/Http/Controllers/FrontendController.php b/app/Http/Controllers/FrontendController.php index 38f5ac9..386c661 100644 --- a/app/Http/Controllers/FrontendController.php +++ b/app/Http/Controllers/FrontendController.php @@ -7,15 +7,55 @@ use App\Models\Personalia; use App\Models\Skill; use App\Models\WorkExperience; use Illuminate\Http\Request; +use App\Jobs\NotifyTelegramAboutPersonaliaClick; +use App\Jobs\NotifyTelegramAboutContactMessage; class FrontendController extends Controller { public function index() { - $skills = Skill::all(); + $skills = Skill::all()->groupBy('type'); + $personalia = Personalia::all(); - $education = Education::all(); - $experience = WorkExperience::all(); + $education = Education::orderBy('startdatum', 'desc')->get(); + $experience = WorkExperience::orderBy('startdatum', 'desc')->get(); + return view('welcome', compact('skills', 'personalia', 'education', 'experience')); } + + public function getPersonalia($id) + { + $item = Personalia::findOrFail($id); + NotifyTelegramAboutPersonaliaClick::dispatch( + $item, + request()->ip(), + request()->userAgent() + ); + + return response()->json([ + 'value' => $item->value, + ]); + } + + public function message(Request $request) +{ + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'message' => 'required|string|max:5000', + 'email' => 'nullable|email|max:255', + 'phone' => 'nullable|string|max:50', + ]); + + NotifyTelegramAboutContactMessage::dispatch( + $validated['name'], + $validated['message'], + $request->ip(), + $request->userAgent(), + $validated['email'] ?? null, + $validated['phone'] ?? null + ); + + return response()->json(['status' => 'success']); +} + } diff --git a/app/Http/Controllers/SkillController.php b/app/Http/Controllers/SkillController.php index 5049087..c5d66c5 100644 --- a/app/Http/Controllers/SkillController.php +++ b/app/Http/Controllers/SkillController.php @@ -29,11 +29,14 @@ class SkillController extends Controller */ public function store(Request $request) { + $validated = $request->validate([ 'title' => 'required|string|max:255', 'description' => 'nullable|string', - 'rating' => 'required|integer|min:1|max:10', + 'rating' => 'required|numeric|min:1|max:10', 'image' => 'nullable|image|max:2048', + 'type' => 'required|in:rating,tag,other', + ]); $skill = Skill::create($validated); @@ -69,8 +72,10 @@ class SkillController extends Controller $validated = $request->validate([ 'title' => 'required|string|max:255', 'description' => 'nullable|string', - 'rating' => 'required|integer|min:1|max:10', + 'rating' => 'required|numeric|min:1|max:10', 'image' => 'nullable|image|max:2048', + 'type' => 'required|in:rating,tag,other', + ]); $skill->update($validated); diff --git a/app/Http/Controllers/WorkExperienceController.php b/app/Http/Controllers/WorkExperienceController.php index 3d06f7e..bcb807e 100644 --- a/app/Http/Controllers/WorkExperienceController.php +++ b/app/Http/Controllers/WorkExperienceController.php @@ -31,7 +31,7 @@ class WorkExperienceController extends Controller $experience = WorkExperience::create($data); if ($request->hasFile('afbeelding')) { - $experience->addMediaFromRequest('afbeelding')->toMediaCollection('afbeelding'); + $experience->addMediaFromRequest('afbeelding')->toMediaCollection('image'); } return redirect()->route('work-experiences.index')->with('success', 'Ervaring toegevoegd.'); @@ -58,11 +58,13 @@ class WorkExperienceController extends Controller 'afbeelding' => 'nullable|image|max:2048', ]); + + $workExperience->update($data); if ($request->hasFile('afbeelding')) { - $workExperience->clearMediaCollection('afbeelding'); - $workExperience->addMediaFromRequest('afbeelding')->toMediaCollection('afbeelding'); + $workExperience->clearMediaCollection('image'); + $workExperience->addMediaFromRequest('afbeelding')->toMediaCollection('image'); } return redirect()->route('work-experiences.index')->with('success', 'Ervaring bijgewerkt.'); diff --git a/app/Jobs/NotifyTelegramAboutContactMessage.php b/app/Jobs/NotifyTelegramAboutContactMessage.php new file mode 100644 index 0000000..696b3a5 --- /dev/null +++ b/app/Jobs/NotifyTelegramAboutContactMessage.php @@ -0,0 +1,60 @@ +name = $name; + $this->message = $message; + $this->ip = $ip; + $this->userAgent = $userAgent; + $this->email = $email; + $this->phone = $phone; + } + + + public function handle() + { + $email = $this->email ?? '–'; + $phone = $this->phone ?? '–'; + + $text = <<name}* + +💬 Bericht: +{$this->message} +📧 Email: {$email} +📱 Telefoon: {$phone} +🌐 IP: {$this->ip} +🧭 User Agent: `{$this->userAgent}` + +🕒 Tijdstip: *{now()->format('d-m-Y H:i')}* +TEXT; + + Http::post("https://api.telegram.org/bot" . config('services.telegram.bot_token') . "/sendMessage", [ + 'chat_id' => config('services.telegram.chat_id'), + 'text' => $text, + 'parse_mode' => 'Markdown', + ]); + } +} diff --git a/app/Jobs/NotifyTelegramAboutPersonaliaClick.php b/app/Jobs/NotifyTelegramAboutPersonaliaClick.php new file mode 100644 index 0000000..2bf33a3 --- /dev/null +++ b/app/Jobs/NotifyTelegramAboutPersonaliaClick.php @@ -0,0 +1,46 @@ +personalia = $personalia; + $this->ip = $ip; + $this->userAgent = $userAgent; + } + + public function handle() + { + $message = <<personalia->value} +IP: {$this->ip} +User Agent: `{$this->userAgent}` + +📅 Tijdstip: *{$this->personalia->updated_at->format('d-m-Y H:i')}* +TEXT; + + Http::post("https://api.telegram.org/bot" . config('services.telegram.bot_token') . "/sendMessage", [ + 'chat_id' => config('services.telegram.chat_id'), + 'text' => $message, + 'parse_mode' => 'Markdown', + ]); + } +} diff --git a/app/Models/Education.php b/app/Models/Education.php index 71f35ac..aee08e7 100644 --- a/app/Models/Education.php +++ b/app/Models/Education.php @@ -16,4 +16,13 @@ class Education extends Model implements HasMedia 'einddatum', 'beschrijving', ]; + + public function image() + { + return $this->getFirstMedia('image'); + } + public function imageUrl() + { + return $this->image() ? $this->image()->getUrl() : null; + } } diff --git a/app/Models/Personalia.php b/app/Models/Personalia.php index 97e71fc..6aa3cf1 100644 --- a/app/Models/Personalia.php +++ b/app/Models/Personalia.php @@ -10,4 +10,13 @@ class Personalia extends Model protected $casts = [ 'hidden' => 'boolean', ]; + + public function image() + { + return $this->getFirstMedia('image'); + } + public function imageUrl() + { + return $this->image() ? $this->image()->getUrl() : null; + } } diff --git a/app/Models/Skill.php b/app/Models/Skill.php index b47f7a2..8bf7a33 100644 --- a/app/Models/Skill.php +++ b/app/Models/Skill.php @@ -11,5 +11,14 @@ class Skill extends Model implements HasMedia { use InteractsWithMedia; - protected $fillable = ['title', 'description', 'rating']; + protected $fillable = ['title', 'description', 'rating', 'type']; + + public function image() + { + return $this->getFirstMedia('image'); + } + public function imageUrl() + { + return $this->image() ? $this->image()->getUrl() : null; + } } diff --git a/app/Models/WorkExperience.php b/app/Models/WorkExperience.php index a78c150..4d593c7 100644 --- a/app/Models/WorkExperience.php +++ b/app/Models/WorkExperience.php @@ -18,5 +18,14 @@ class WorkExperience extends Model implements HasMedia 'beschrijving', ]; + public function image() + { + return $this->getFirstMedia('image'); + } + public function imageUrl() + { + return $this->image() ? $this->image()->getUrl() : null; + } + // Als je mediaconversies of image handling wil: hier kun je die later toevoegen } diff --git a/config/services.php b/config/services.php index 6182e4b..ef008fb 100644 --- a/config/services.php +++ b/config/services.php @@ -34,5 +34,9 @@ return [ 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), ], ], + 'telegram' => [ + 'bot_token' => env('TELEGRAM_BOT_TOKEN'), + 'chat_id' => env('TELEGRAM_CHAT_ID'), + ], ]; diff --git a/database/data/education.json b/database/data/education.json new file mode 100644 index 0000000..9c6ecb2 --- /dev/null +++ b/database/data/education.json @@ -0,0 +1,32 @@ +[ + { + "id": "1", + "opleiding": "Havo", + "instituut": "Blaise pascal (Scala rietvelden)", + "startdatum": "2006-07-01", + "einddatum": "2013-01-07", + "beschrijving": "Mijn middelbare schoolperiode kende een hobbelig begin: ik startte op het havo/vwo, maar had in de eerste jaren moeite met motivatie en discipline. Daardoor ben ik afgezakt naar het mavo-niveau. Op de mavo heb ik mezelf herpakt en mijn focus hervonden. Dankzij die ommekeer kon ik succesvol doorstromen naar de havo, waar ik mijn diploma met ruime voldoendes heb behaald. Deze periode heeft mij geleerd hoe belangrijk eigen inzet en doelgerichtheid zijn.", + "created_at": "2025-06-18 23:08:02", + "updated_at": "2025-06-18 23:20:19" + }, + { + "id": "2", + "opleiding": "Internation Business and Management Studies", + "instituut": "Hogeschool Rotterdam", + "startdatum": "2013-07-01", + "einddatum": "2014-07-01", + "beschrijving": "International Business and Management Studies is een brede economische hbo-opleiding gericht op internationale handel, marketing en bedrijfsvoering. Tijdens het eerste jaar maakte ik kennis met onderwerpen als exportstrategieën, interculturele communicatie en organisatiekunde. Hoewel ik waardevolle inzichten heb opgedaan, merkte ik al snel dat de inhoud en aanpak van de opleiding niet goed aansloten bij mij.", + "created_at": "2025-06-18 23:11:45", + "updated_at": "2025-06-18 23:11:45" + }, + { + "id": "3", + "opleiding": "HBO Business Studies (Specialisering logistiek)", + "instituut": "Inholland Rotterdam", + "startdatum": "2014-07-01", + "einddatum": "2017-07-01", + "beschrijving": "Tijdens deze hbo-opleiding verdiepte ik mij in bedrijfskunde, ondernemerschap en supply chain management. In de laatste fase volgde ik de specialisatie Logistiek aan de vestiging in Haarlem, met een sterke focus op luchtvaartlogistiek en internationale goederenstromen. Hoewel ik brede kennis heb opgedaan binnen het vakgebied, heb ik de opleiding uiteindelijk voortijdig moeten beëindigen. In 2016 startte ik mijn eigen bedrijf, dat in korte tijd sterk groeide. Het combineren van een fulltime afstudeerstage met mijn ondernemersverantwoordelijkheden bleek op dat moment niet haalbaar.", + "created_at": "2025-06-18 23:17:49", + "updated_at": "2025-06-18 23:17:49" + } +] diff --git a/database/data/media.json b/database/data/media.json new file mode 100644 index 0000000..1c3d201 --- /dev/null +++ b/database/data/media.json @@ -0,0 +1,762 @@ +[ + { + "id": "1", + "model_type": "App\\Models\\WorkExperience", + "model_id": "1", + "uuid": "3aa34696-9a24-4efe-a255-71fb23093bdb", + "collection_name": "image", + "name": "jumbo", + "file_name": "jumbo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "3828", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 17:58:25", + "updated_at": "2025-07-08 17:58:25" + }, + { + "id": "2", + "model_type": "App\\Models\\Skill", + "model_id": "1", + "uuid": "913531cd-8948-45a6-9f8e-abdcfed30677", + "collection_name": "image", + "name": "php-logo", + "file_name": "php-logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "80608", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:22:47", + "updated_at": "2025-07-08 19:22:47" + }, + { + "id": "3", + "model_type": "App\\Models\\WorkExperience", + "model_id": "2", + "uuid": "da630aba-72a4-4dbe-8deb-95d994adde75", + "collection_name": "image", + "name": "sitiweb-logo", + "file_name": "sitiweb-logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "2296", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 18:22:18", + "updated_at": "2025-07-08 18:22:18" + }, + { + "id": "4", + "model_type": "App\\Models\\Skill", + "model_id": "3", + "uuid": "486f344f-dd27-4636-904a-4a5686a06d42", + "collection_name": "image", + "name": "5848152fcef1014c0b5e4967", + "file_name": "5848152fcef1014c0b5e4967.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "9955", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:25:31", + "updated_at": "2025-07-08 19:25:31" + }, + { + "id": "5", + "model_type": "App\\Models\\Skill", + "model_id": "2", + "uuid": "73a14a0b-4f75-41c4-933b-63c107492162", + "collection_name": "image", + "name": "JavaScript", + "file_name": "JavaScript.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "5418", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:35:02", + "updated_at": "2025-07-08 19:35:02" + }, + { + "id": "6", + "model_type": "App\\Models\\Education", + "model_id": "1", + "uuid": "b8166354-3e19-4eb5-8778-5f160c5528c0", + "collection_name": "image", + "name": "images", + "file_name": "images.jpg", + "mime_type": "image/jpeg", + "disk": "public", + "conversions_disk": "public", + "size": "10052", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 18:01:03", + "updated_at": "2025-07-08 18:01:03" + }, + { + "id": "7", + "model_type": "App\\Models\\WorkExperience", + "model_id": "3", + "uuid": "8b814d2e-15f3-4f73-b6b4-ff5114346f63", + "collection_name": "image", + "name": "internettoday-logo", + "file_name": "internettoday-logo.jpg", + "mime_type": "image/jpeg", + "disk": "public", + "conversions_disk": "public", + "size": "13085", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 18:29:44", + "updated_at": "2025-07-08 18:29:44" + }, + { + "id": "8", + "model_type": "App\\Models\\Education", + "model_id": "2", + "uuid": "0af4f477-13a0-4926-988f-44cfd886b88e", + "collection_name": "image", + "name": "hr", + "file_name": "hr.jpg", + "mime_type": "image/jpeg", + "disk": "public", + "conversions_disk": "public", + "size": "4159", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 18:00:56", + "updated_at": "2025-07-08 18:00:56" + }, + { + "id": "9", + "model_type": "App\\Models\\Skill", + "model_id": "4", + "uuid": "f3d64062-0571-40db-8871-18584a45420e", + "collection_name": "image", + "name": "linux-logo", + "file_name": "linux-logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "145726", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:26:24", + "updated_at": "2025-07-08 19:26:24" + }, + { + "id": "10", + "model_type": "App\\Models\\Education", + "model_id": "3", + "uuid": "3d811274-5a83-4b56-99af-d87a9d404fc5", + "collection_name": "image", + "name": "inh", + "file_name": "inh.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "3053", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 18:00:48", + "updated_at": "2025-07-08 18:00:48" + }, + { + "id": "11", + "model_type": "App\\Models\\Skill", + "model_id": "5", + "uuid": "58b96151-814b-4b83-a775-f64101f046a9", + "collection_name": "image", + "name": "git-logo", + "file_name": "git-logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "2383", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 17:12:48", + "updated_at": "2025-07-08 17:12:48" + }, + { + "id": "12", + "model_type": "App\\Models\\Skill", + "model_id": "7", + "uuid": "05cd0535-e055-434d-b025-c9c855651dd3", + "collection_name": "image", + "name": "lara", + "file_name": "lara.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "37110", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:21:24", + "updated_at": "2025-07-08 19:21:24" + }, + { + "id": "13", + "model_type": "App\\Models\\Skill", + "model_id": "8", + "uuid": "65d02709-dc31-4ccf-84da-7e0ac58c62bc", + "collection_name": "image", + "name": "Livewire-logo", + "file_name": "Livewire-logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "32291", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:27:21", + "updated_at": "2025-07-08 19:27:21" + }, + { + "id": "14", + "model_type": "App\\Models\\Skill", + "model_id": "9", + "uuid": "7e04527d-91c8-4017-9f58-31f9b209e5a8", + "collection_name": "image", + "name": "Tailwind CSS", + "file_name": "Tailwind-CSS.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "6255", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:29:55", + "updated_at": "2025-07-08 19:29:55" + }, + { + "id": "15", + "model_type": "App\\Models\\Skill", + "model_id": "10", + "uuid": "428f92d1-918a-4490-a2ac-ec613c71b073", + "collection_name": "image", + "name": "Postman", + "file_name": "Postman.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "8252", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:34:47", + "updated_at": "2025-07-08 19:34:47" + }, + { + "id": "16", + "model_type": "App\\Models\\Skill", + "model_id": "11", + "uuid": "a2ff85d9-e3e6-4e12-ad9d-66b632bd187d", + "collection_name": "image", + "name": "Docker", + "file_name": "Docker.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "11082", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:34:31", + "updated_at": "2025-07-08 19:34:31" + }, + { + "id": "17", + "model_type": "App\\Models\\Skill", + "model_id": "12", + "uuid": "7b827656-bef3-44eb-bb70-53e4b77b9148", + "collection_name": "image", + "name": "proxmox-logo", + "file_name": "proxmox-logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "20014", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:33:25", + "updated_at": "2025-07-08 19:33:25" + }, + { + "id": "18", + "model_type": "App\\Models\\Skill", + "model_id": "13", + "uuid": "12ce5e7b-fc63-4657-a2ff-edef35d4bb78", + "collection_name": "image", + "name": "Grafana", + "file_name": "Grafana.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "12920", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:34:14", + "updated_at": "2025-07-08 19:34:14" + }, + { + "id": "19", + "model_type": "App\\Models\\Skill", + "model_id": "14", + "uuid": "496ad2ef-7df9-42b8-b7ed-6e4424621b77", + "collection_name": "image", + "name": "Cloudflare", + "file_name": "Cloudflare.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "7363", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:35:34", + "updated_at": "2025-07-08 19:35:34" + }, + { + "id": "20", + "model_type": "App\\Models\\Skill", + "model_id": "15", + "uuid": "019cc0f2-57b9-4e94-b307-ecb69988ed00", + "collection_name": "image", + "name": "directadmnin-logo", + "file_name": "directadmnin-logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "2364", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:37:04", + "updated_at": "2025-07-08 19:37:04" + }, + { + "id": "21", + "model_type": "App\\Models\\Skill", + "model_id": "16", + "uuid": "197de2dd-42cb-469e-bd5d-b9d2692ddede", + "collection_name": "image", + "name": "MySQL", + "file_name": "MySQL.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "9330", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:37:57", + "updated_at": "2025-07-08 19:37:57" + }, + { + "id": "22", + "model_type": "App\\Models\\Skill", + "model_id": "17", + "uuid": "c5fed034-9745-4fc3-84c0-720372e6ea56", + "collection_name": "image", + "name": "Uptime-Kuma-Logo", + "file_name": "Uptime-Kuma-Logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "36536", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:38:36", + "updated_at": "2025-07-08 19:38:36" + }, + { + "id": "23", + "model_type": "App\\Models\\Skill", + "model_id": "18", + "uuid": "2e362926-027a-4e8a-93bd-9a27e9e0fc18", + "collection_name": "image", + "name": "NGINX", + "file_name": "NGINX.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "5301", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:39:19", + "updated_at": "2025-07-08 19:39:19" + }, + { + "id": "24", + "model_type": "App\\Models\\Skill", + "model_id": "19", + "uuid": "22a353cd-410a-484f-8362-09a00d97a183", + "collection_name": "image", + "name": "Visual Studio Code (VS Code)", + "file_name": "Visual-Studio-Code-(VS-Code).png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "16772", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:40:32", + "updated_at": "2025-07-08 19:40:32" + }, + { + "id": "25", + "model_type": "App\\Models\\Skill", + "model_id": "20", + "uuid": "d1e09302-0730-493f-9b35-a6f82b27e7b6", + "collection_name": "image", + "name": "GIMP", + "file_name": "GIMP.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "32519", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:41:59", + "updated_at": "2025-07-08 19:41:59" + }, + { + "id": "26", + "model_type": "App\\Models\\Skill", + "model_id": "21", + "uuid": "1d7d73e4-f373-485a-9205-7261869de4b0", + "collection_name": "image", + "name": "WordPress", + "file_name": "WordPress.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "21613", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:42:37", + "updated_at": "2025-07-08 19:42:37" + }, + { + "id": "27", + "model_type": "App\\Models\\Skill", + "model_id": "22", + "uuid": "9e062f71-7e0b-4bb0-b455-c4b954a607a8", + "collection_name": "image", + "name": "WooCommerce", + "file_name": "WooCommerce.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "8433", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:43:00", + "updated_at": "2025-07-08 19:43:00" + }, + { + "id": "28", + "model_type": "App\\Models\\Skill", + "model_id": "23", + "uuid": "dda5797d-16c3-4a70-bf4d-e3eded1d1003", + "collection_name": "image", + "name": "Vaultwarden--Streamline-Simple-Icons", + "file_name": "Vaultwarden--Streamline-Simple-Icons.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "7139", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:44:30", + "updated_at": "2025-07-08 19:44:30" + }, + { + "id": "29", + "model_type": "App\\Models\\Skill", + "model_id": "24", + "uuid": "c981f25b-b486-4b1d-a4f3-5a15d85464ac", + "collection_name": "image", + "name": "healthchecks.logo", + "file_name": "healthchecks.logo.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "11561", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:45:12", + "updated_at": "2025-07-08 19:45:12" + }, + { + "id": "30", + "model_type": "App\\Models\\Skill", + "model_id": "25", + "uuid": "606ecdbf-9ed5-4853-b8eb-405bc35a120d", + "collection_name": "image", + "name": "GitLab", + "file_name": "GitLab.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "24046", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:46:14", + "updated_at": "2025-07-08 19:46:14" + }, + { + "id": "31", + "model_type": "App\\Models\\Skill", + "model_id": "26", + "uuid": "3be7bb80-74a6-444d-b2ef-b072900fc03d", + "collection_name": "image", + "name": "GitHub", + "file_name": "GitHub.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "8449", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:46:27", + "updated_at": "2025-07-08 19:46:27" + }, + { + "id": "32", + "model_type": "App\\Models\\Skill", + "model_id": "27", + "uuid": "939e8d71-73c4-41ea-ae35-6132cecfdc3c", + "collection_name": "image", + "name": "Fedora", + "file_name": "Fedora.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "10591", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:46:54", + "updated_at": "2025-07-08 19:46:54" + }, + { + "id": "33", + "model_type": "App\\Models\\Skill", + "model_id": "28", + "uuid": "671081cf-b852-41ff-a746-835f75beaa46", + "collection_name": "image", + "name": "Ubuntu", + "file_name": "Ubuntu.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "11230", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:47:15", + "updated_at": "2025-07-08 19:47:15" + }, + { + "id": "34", + "model_type": "App\\Models\\Skill", + "model_id": "29", + "uuid": "0c968a1c-202c-4635-b613-04874733d994", + "collection_name": "image", + "name": "CentOS", + "file_name": "CentOS.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "11745", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:47:43", + "updated_at": "2025-07-08 19:47:43" + }, + { + "id": "35", + "model_type": "App\\Models\\Skill", + "model_id": "30", + "uuid": "1e78c7c9-d73f-4ea8-9426-b274d2b63279", + "collection_name": "image", + "name": "Debian", + "file_name": "Debian.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "6999", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:48:14", + "updated_at": "2025-07-08 19:48:14" + }, + { + "id": "36", + "model_type": "App\\Models\\Skill", + "model_id": "31", + "uuid": "b36a3c4f-d19e-4832-b0b9-9728ce850f45", + "collection_name": "image", + "name": "Composer", + "file_name": "Composer.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "31190", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:48:40", + "updated_at": "2025-07-08 19:48:40" + }, + { + "id": "37", + "model_type": "App\\Models\\Skill", + "model_id": "32", + "uuid": "6a888cd6-982b-4e1a-87c8-fd2a200f8fc5", + "collection_name": "image", + "name": "NPM", + "file_name": "NPM.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "1136", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:49:09", + "updated_at": "2025-07-08 19:49:09" + }, + { + "id": "38", + "model_type": "App\\Models\\Skill", + "model_id": "33", + "uuid": "fb6f3d4d-9a4b-4c4a-87a9-09b9c9bb58c9", + "collection_name": "image", + "name": "HTML5", + "file_name": "HTML5.png", + "mime_type": "image/png", + "disk": "public", + "conversions_disk": "public", + "size": "31694", + "manipulations": [], + "custom_properties": [], + "generated_conversions": [], + "responsive_images": [], + "order_column": 1, + "created_at": "2025-07-08 19:50:02", + "updated_at": "2025-07-08 19:50:02" + } +] diff --git a/database/data/personalia.json b/database/data/personalia.json new file mode 100644 index 0000000..fb6668f --- /dev/null +++ b/database/data/personalia.json @@ -0,0 +1,29 @@ +[ + { + "id": "1", + "key": "Email", + "value": "roberto@guagliardo.nl", + "hidden": 1, + "icon": "fa-solid fa-envelope", + "created_at": "2025-06-18 20:24:49", + "updated_at": "2025-07-08 18:47:19" + }, + { + "id": "2", + "key": "Telefoonnummer", + "value": "+ 31 6 444 60 893", + "hidden": 1, + "icon": "fa-solid fa-phone", + "created_at": "2025-06-18 22:43:12", + "updated_at": "2025-06-18 22:43:12" + }, + { + "id": "3", + "key": "Adres", + "value": "Hoefsmid 16
3201TC Spijkenisse", + "hidden": 1, + "icon": "fa-solid fa-home", + "created_at": "2025-06-18 22:50:09", + "updated_at": "2025-06-18 22:50:09" + } +] \ No newline at end of file diff --git a/database/data/skills.json b/database/data/skills.json new file mode 100644 index 0000000..34be4ed --- /dev/null +++ b/database/data/skills.json @@ -0,0 +1,353 @@ +[ + { + "id": "2", + "type": "rating", + "title": "PHP", + "description": "Met meer dan 9 jaar ervaring in PHP, WordPress en Laravel, heb ik brede expertise opgebouwd in het ontwikkelen van zowel maatwerkfuncties als complete webapplicaties.", + "rating": 9, + "created_at": "2025-07-08 16:49:03", + "updated_at": "2025-07-08 17:14:02" + }, + { + "id": "3", + "type": "rating", + "title": "JavaScript", + "description": "Brede ervaring met JavaScript, van vanilla JS tot moderne frameworks zoals React – inzetbaar voor zowel interactieve interfaces als volledige front-end architecturen.", + "rating": 7, + "created_at": "2025-07-08 16:54:03", + "updated_at": "2025-07-08 16:54:03" + }, + { + "id": "4", + "type": "rating", + "title": "Python", + "description": "Ruime ervaring met Python voor het bouwen van tools en automatiseringen: van beeldherkenning en muisbesturing tot webscrapers, image-optimalisatie en importtools voor webshops.", + "rating": 7, + "created_at": "2025-07-08 17:00:01", + "updated_at": "2025-07-08 17:00:01" + }, + { + "id": "5", + "type": "rating", + "title": "Linux & Serverbeheer", + "description": "Ervaren in het opzetten, beheren en automatiseren van Linux-omgevingen. Dagelijks gebruik van Fedora (werkstation), en zakelijk gewerkt met CentOS, AlmaLinux en Debian. Bekwaam in Bash-scripting, serveronderhoud, optimalisatie en het draaien van hostingplatformen.", + "rating": 8, + "created_at": "2025-07-08 17:02:21", + "updated_at": "2025-07-08 20:11:47" + }, + { + "id": "7", + "type": "rating", + "title": "DevOps & Tools", + "description": "Ervaring met Git, Docker, Nginx, SSH en cronjobs. Bekend met CI/CD-principes en inzet van tooling voor automatisering en monitoring binnen ontwikkel- en hostingomgevingen.", + "rating": 8, + "created_at": "2025-07-08 17:12:48", + "updated_at": "2025-07-08 17:12:48" + }, + { + "id": "9", + "type": "tag", + "title": "Leergierig", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:08:00", + "updated_at": "2025-07-08 19:08:00" + }, + { + "id": "10", + "type": "other", + "title": "Laravel", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:19:00", + "updated_at": "2025-07-08 19:19:00" + }, + { + "id": "11", + "type": "other", + "title": "LiveWire", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:27:21", + "updated_at": "2025-07-08 19:27:21" + }, + { + "id": "12", + "type": "other", + "title": "Tailwind", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:29:55", + "updated_at": "2025-07-08 19:29:55" + }, + { + "id": "13", + "type": "other", + "title": "Postman", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:32:42", + "updated_at": "2025-07-08 19:32:42" + }, + { + "id": "14", + "type": "other", + "title": "Docker", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:32:55", + "updated_at": "2025-07-08 19:32:55" + }, + { + "id": "15", + "type": "other", + "title": "Proxmox", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:33:25", + "updated_at": "2025-07-08 19:33:25" + }, + { + "id": "16", + "type": "other", + "title": "Grafana", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:34:14", + "updated_at": "2025-07-08 19:34:14" + }, + { + "id": "17", + "type": "other", + "title": "Cloudflare", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:35:34", + "updated_at": "2025-07-08 19:35:34" + }, + { + "id": "18", + "type": "other", + "title": "directadmin", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:37:04", + "updated_at": "2025-07-08 19:37:04" + }, + { + "id": "19", + "type": "other", + "title": "MySQL/MariaDB", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:37:57", + "updated_at": "2025-07-08 19:37:57" + }, + { + "id": "20", + "type": "other", + "title": "Uptime Kuma", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:38:36", + "updated_at": "2025-07-08 19:38:36" + }, + { + "id": "21", + "type": "other", + "title": "Nginx", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:39:19", + "updated_at": "2025-07-08 19:39:19" + }, + { + "id": "22", + "type": "other", + "title": "VS code", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:40:32", + "updated_at": "2025-07-08 19:40:32" + }, + { + "id": "23", + "type": "other", + "title": "GIMP", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:41:59", + "updated_at": "2025-07-08 19:41:59" + }, + { + "id": "24", + "type": "other", + "title": "WordPress", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:42:37", + "updated_at": "2025-07-08 19:42:37" + }, + { + "id": "25", + "type": "other", + "title": "WooCommerce", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:43:00", + "updated_at": "2025-07-08 19:43:00" + }, + { + "id": "26", + "type": "other", + "title": "Vaultwarden", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:44:30", + "updated_at": "2025-07-08 19:44:30" + }, + { + "id": "27", + "type": "other", + "title": "HealthChecks", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:45:12", + "updated_at": "2025-07-08 19:45:12" + }, + { + "id": "28", + "type": "other", + "title": "GitLab", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:46:14", + "updated_at": "2025-07-08 19:46:14" + }, + { + "id": "29", + "type": "other", + "title": "GitHub", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:46:27", + "updated_at": "2025-07-08 19:46:27" + }, + { + "id": "30", + "type": "other", + "title": "Fedora", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:46:54", + "updated_at": "2025-07-08 19:46:54" + }, + { + "id": "31", + "type": "other", + "title": "Ubuntu", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:47:15", + "updated_at": "2025-07-08 19:47:15" + }, + { + "id": "32", + "type": "other", + "title": "CentOS", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:47:43", + "updated_at": "2025-07-08 19:47:51" + }, + { + "id": "33", + "type": "other", + "title": "Debian", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:48:14", + "updated_at": "2025-07-08 19:48:14" + }, + { + "id": "34", + "type": "other", + "title": "Composer", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:48:40", + "updated_at": "2025-07-08 19:48:40" + }, + { + "id": "35", + "type": "other", + "title": "NPM", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:49:09", + "updated_at": "2025-07-08 19:49:09" + }, + { + "id": "36", + "type": "other", + "title": "HTML", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:50:02", + "updated_at": "2025-07-08 19:50:02" + }, + { + "id": "37", + "type": "tag", + "title": "Klantgericht", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:50:46", + "updated_at": "2025-07-08 19:50:46" + }, + { + "id": "38", + "type": "tag", + "title": "Dekend aan oplossingen", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:51:09", + "updated_at": "2025-07-08 19:51:09" + }, + { + "id": "39", + "type": "tag", + "title": "Meedenkend", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:51:37", + "updated_at": "2025-07-08 19:51:37" + }, + { + "id": "40", + "type": "tag", + "title": "Probleemoplossend", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:52:22", + "updated_at": "2025-07-08 19:52:22" + }, + { + "id": "41", + "type": "tag", + "title": "Initiatiefrijk", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:52:45", + "updated_at": "2025-07-08 19:52:45" + }, + { + "id": "42", + "type": "tag", + "title": "Systeemdenker", + "description": null, + "rating": 5, + "created_at": "2025-07-08 19:53:28", + "updated_at": "2025-07-08 19:53:28" + } +] \ No newline at end of file diff --git a/database/data/work_experiences.json b/database/data/work_experiences.json new file mode 100644 index 0000000..fde7fd0 --- /dev/null +++ b/database/data/work_experiences.json @@ -0,0 +1,32 @@ +[ + { + "id": "1", + "werkgever": "Jumbo Supermarkten", + "functie": "Teamleider", + "startdatum": "2010-01-01", + "einddatum": "2018-12-31", + "beschrijving": "Na mijn start als bijbaanmedewerker ben ik binnen een jaar doorgegroeid naar de rol van teamleider. In deze functie werd ik door de regiomanager actief ingezet op verschillende filialen met een extra behoefte aan structuur, klantgerichtheid en kwaliteitsverbetering. Dit betrof zowel nieuwe vestigingen als filialen waar de bestaande werkmentaliteit niet strookte met de kwaliteitsnormen van Jumbo.\r\n\r\nMijn aanpak was altijd gericht op het verhogen van klanttevredenheid, het verbeteren van interne processen en het motiveren van collega’s. Dankzij mijn inzet en flexibiliteit heb ik meerdere filialen kunnen ondersteunen in het opzetten of herstructureren van een sterk, klantgericht team.", + "created_at": "2025-06-18 18:13:10", + "updated_at": "2025-06-18 18:13:10" + }, + { + "id": "2", + "werkgever": "SitiWeb", + "functie": "Eigenaar / Technisch Specialist", + "startdatum": "2016-08-01", + "einddatum": "2024-10-01", + "beschrijving": "Als oprichter en eigenaar van Sitiweb heb ik gedurende acht jaar totaaloplossingen geleverd aan ondernemers met websites en webshops. De focus lag op zowel het verbeteren van websites als het technisch optimaliseren van hostingomgevingen.\r\n\r\nIk was verantwoordelijk voor de technische infrastructuur, het opzetten en beheren van hostingomgevingen (inclusief VPS-servers), en het uitvoeren van maatwerkoptimalisaties. Daarnaast adviseerde ik klanten actief over verbeteringen op het gebied van snelheid, veiligheid en gebruikservaring.\r\n\r\nOnder mijn leiding groeide Sitiweb uit tot een gewaardeerde partij binnen het MKB, met een sterke focus op kwaliteit en persoonlijke service. In 2024 heb ik besloten om een stap terug te doen, omdat het bedrijf dusdanig was gegroeid dat het met een klein team niet langer optimaal beheersbaar was.", + "created_at": "2025-07-08 18:22:12", + "updated_at": "2025-07-08 18:22:12" + }, + { + "id": "3", + "werkgever": "InternetToday", + "functie": "Senior Developer", + "startdatum": "2024-10-01", + "einddatum": null, + "beschrijving": "Binnen InternetToday vervul ik een sleutelrol als senior developer met een brede technische verantwoordelijkheid. Ik heb de werkstructuur binnen het ontwikkelteam geoptimaliseerd door het opzetten van uitgebreide monitoring- en analysetools, wat direct heeft bijgedragen aan een efficiëntere en kwalitatievere werkwijze binnen het team.\r\n\r\nDaarnaast fungeer ik als brug tussen de developmentafdeling en de serverbeheerafdeling. Dankzij mijn diepgaande kennis van Linux, hosting en infrastructuur ben ik in staat om complexe technische vraagstukken snel op te lossen en oplossingen te ontwikkelen die doorgaans buiten de scope van het developmentteam vallen. Deze veelzijdigheid maakt mij een waardevolle schakel binnen het bedrijf.", + "created_at": "2025-07-08 18:29:36", + "updated_at": "2025-07-08 18:31:59" + } +] \ No newline at end of file diff --git a/database/migrations/2025_07_08_185355_add_type_to_skills_table.php b/database/migrations/2025_07_08_185355_add_type_to_skills_table.php new file mode 100644 index 0000000..eb89a89 --- /dev/null +++ b/database/migrations/2025_07_08_185355_add_type_to_skills_table.php @@ -0,0 +1,26 @@ +string('type')->default('rating')->after('id'); + }); + } + + public function down() + { + Schema::table('skills', function (Blueprint $table) { + $table->dropColumn('type'); + }); + } + +}; diff --git a/database/seeders/EducationSeeder.php b/database/seeders/EducationSeeder.php new file mode 100644 index 0000000..d0fdd53 --- /dev/null +++ b/database/seeders/EducationSeeder.php @@ -0,0 +1,38 @@ +truncate(); + + // Laad nieuwe data in + $data = json_decode(File::get($path), true); + + foreach ($data as $item) { + DB::table('education')->insert([ + 'id' => $item['id'], + 'opleiding' => $item['opleiding'], + 'instituut' => $item['instituut'], + 'startdatum' => $item['startdatum'], + 'einddatum' => $item['einddatum'] ?? null, + 'beschrijving' => $item['beschrijving'], + 'created_at' => $item['created_at'] ?? now(), + 'updated_at' => $item['updated_at'] ?? now(), + ]); + } + } +} diff --git a/database/seeders/MediaSeeder.php b/database/seeders/MediaSeeder.php new file mode 100644 index 0000000..27cd8c4 --- /dev/null +++ b/database/seeders/MediaSeeder.php @@ -0,0 +1,49 @@ +command->warn("media.json niet gevonden, seeding overgeslagen."); + return; + } + + DB::table('media')->truncate(); + + $data = json_decode(File::get($path), true); + + foreach ($data as $item) { + DB::table('media')->insert([ + // 'id' => $item['id'], + 'model_type' => $item['model_type'], + 'model_id' => $item['model_id'], + 'uuid' => $item['uuid'], + 'collection_name' => $item['collection_name'], + 'name' => $item['name'], + 'file_name' => $item['file_name'], + 'mime_type' => $item['mime_type'], + 'disk' => $item['disk'], + 'conversions_disk' => $item['conversions_disk'], + 'size' => $item['size'], + 'manipulations' => json_encode($item['manipulations']), + 'custom_properties' => json_encode($item['custom_properties']), + 'generated_conversions' => json_encode($item['generated_conversions']), + 'responsive_images' => json_encode($item['responsive_images']), + 'order_column' => $item['order_column'] ?? null, + 'created_at' => $item['created_at'] ?? now(), + 'updated_at' => $item['updated_at'] ?? now(), + ]); + } + + $this->command->info('Media succesvol geïmporteerd.'); + } +} diff --git a/database/seeders/PersonaliaSeeder.php b/database/seeders/PersonaliaSeeder.php new file mode 100644 index 0000000..2816a01 --- /dev/null +++ b/database/seeders/PersonaliaSeeder.php @@ -0,0 +1,38 @@ +command->warn("Bestand {$path} bestaat niet, seeder overgeslagen."); + return; + } + + // Leegmaken van de bestaande data + Personalia::truncate(); + + // JSON inladen + $data = json_decode(File::get($path), true); + + // Records toevoegen + foreach ($data as $item) { + Personalia::create([ + 'key' => $item['key'], + 'value' => $item['value'], + 'hidden' => $item['hidden'], + 'icon' => $item['icon'], + ]); + } + + $this->command->info(count($data) . ' personalia-records geïmporteerd.'); + } +} diff --git a/database/seeders/SkillSeeder.php b/database/seeders/SkillSeeder.php new file mode 100644 index 0000000..2f8bd4c --- /dev/null +++ b/database/seeders/SkillSeeder.php @@ -0,0 +1,37 @@ + $item['type'], + 'title' => $item['title'], + 'description' => $item['description'] ?? null, + 'rating' => $item['rating'] ?? null, + 'created_at' => $item['created_at'] ?? now(), + 'updated_at' => $item['updated_at'] ?? now(), + ]); + } + } +} diff --git a/database/seeders/WorkExperienceSeeder.php b/database/seeders/WorkExperienceSeeder.php new file mode 100644 index 0000000..6fd168a --- /dev/null +++ b/database/seeders/WorkExperienceSeeder.php @@ -0,0 +1,45 @@ +command->warn("❌ Bestand $jsonPath niet gevonden. Seeder overgeslagen."); + return; + } + + // Verwijder bestaande records + WorkExperience::truncate(); + + // Lees en decode de JSON + $json = File::get($jsonPath); + $data = json_decode($json, true); + + // Voeg werkervaringen toe + foreach ($data as $item) { + WorkExperience::updateOrCreate( + [ + 'werkgever' => $item['werkgever'], + 'functie' => $item['functie'], + 'startdatum' => $item['startdatum'], + ], + [ + 'einddatum' => $item['einddatum'] ?? null, + 'beschrijving' => $item['beschrijving'], + ] + ); + } + + $this->command->info("✅ Werkervaringen succesvol geïmporteerd."); + } +} diff --git a/package-lock.json b/package-lock.json index 0e2faf6..860b95e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,9 @@ "requires": true, "packages": { "": { + "dependencies": { + "stickybits": "^3.7.11" + }, "devDependencies": { "@tailwindcss/forms": "^0.5.2", "@tailwindcss/vite": "^4.0.0", @@ -3259,6 +3262,12 @@ "node": ">=0.10.0" } }, + "node_modules/stickybits": { + "version": "3.7.11", + "resolved": "https://registry.npmjs.org/stickybits/-/stickybits-3.7.11.tgz", + "integrity": "sha512-WO+ns7BYZqGS4jWVTg5JNhIvNV4LGbUtNTSck4zAkWRQzA1IfxwIkMGc0BbdGy4PGIjK7kKo5CZcN6Sd5dHVlw==", + "license": "MIT" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", diff --git a/package.json b/package.json index 03ff0cd..6bf1f83 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,8 @@ "postcss": "^8.4.31", "tailwindcss": "^3.1.0", "vite": "^6.2.4" + }, + "dependencies": { + "stickybits": "^3.7.11" } } diff --git a/resources/css/app.css b/resources/css/app.css index b5c61c9..4fe6317 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,3 +1,24 @@ @tailwind base; @tailwind components; @tailwind utilities; + +#custom-cursor { + position: fixed; + top: 0; + left: 0; + pointer-events: none; + z-index: 9999; + height: 30px; + width: auto; + display: inline-block; + transform: scaleX(-1) translate(-50%, -50%); + transform-origin: top left; +} + + +#custom-cursor svg { + + height: 100%; + width: auto; + display: block; +} diff --git a/resources/js/app.js b/resources/js/app.js index a8093be..cd5bf61 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -5,3 +5,12 @@ import Alpine from 'alpinejs'; window.Alpine = Alpine; Alpine.start(); + +import stickybits from 'stickybits'; + +document.addEventListener('DOMContentLoaded', () => { + stickybits('#right-content', { + stickyBitStickyOffset: 40, + parent: '.grid' // dit moet de container zijn waarin sticky moet blijven + }); +}); diff --git a/resources/views/auth/verify-email.blade.php b/resources/views/auth/verify-email.blade.php index 4e4222f..16e803f 100644 --- a/resources/views/auth/verify-email.blade.php +++ b/resources/views/auth/verify-email.blade.php @@ -4,7 +4,7 @@ @if (session('status') == 'verification-link-sent') -
+
{{ __('A new verification link has been sent to the email address you provided during registration.') }}
@endif diff --git a/resources/views/components/auth-session-status.blade.php b/resources/views/components/auth-session-status.blade.php index a39bc7d..d9e932e 100644 --- a/resources/views/components/auth-session-status.blade.php +++ b/resources/views/components/auth-session-status.blade.php @@ -1,7 +1,7 @@ @props(['status']) @if ($status) -
merge(['class' => 'font-medium text-sm text-green-600 dark:text-green-400']) }}> +
merge(['class' => 'font-medium text-sm text-green-600 dark:text-sitiweb-green']) }}> {{ $status }}
@endif diff --git a/resources/views/educations/index.blade.php b/resources/views/educations/index.blade.php index 4cd82f6..0d01da2 100644 --- a/resources/views/educations/index.blade.php +++ b/resources/views/educations/index.blade.php @@ -11,12 +11,12 @@

{{ $education->startdatum }} – {{ $education->einddatum ?? 'heden' }}

{{ $education->beschrijving }}

- @if ($education->getFirstMediaUrl('afbeelding')) - + @if ($education->image()) + @endif
- Bewerk + Bewerk
@csrf diff --git a/resources/views/frontend/_card.blade.php b/resources/views/frontend/_card.blade.php new file mode 100644 index 0000000..6deba66 --- /dev/null +++ b/resources/views/frontend/_card.blade.php @@ -0,0 +1,24 @@ +
+

{{ $skill->title }}

+ + @if($skill->type === 'rating') +

Beoordeling: {{ $skill->rating }}/10

+ @endif + + @if($skill->description) +

{{ $skill->description }}

+ @endif + + @if ($skill->getFirstMediaUrl('image')) + {{ $skill->title }} + @endif + +
+ Bewerken + + @csrf + @method('DELETE') + + +
+
diff --git a/resources/views/frontend/cta.blade.php b/resources/views/frontend/cta.blade.php new file mode 100644 index 0000000..fc882d5 --- /dev/null +++ b/resources/views/frontend/cta.blade.php @@ -0,0 +1,115 @@ + +
+ +

+ Wat kan ik voor jou betekenen? +

+ +

+ 📬 Ook beschikbaar voor freelance opdrachten of samenwerkingen.
+ +

+ +
+ + +
+
+ + + + +@push('scripts') + +@endpush diff --git a/resources/views/frontend/opleidingen.blade.php b/resources/views/frontend/opleidingen.blade.php index 37fef16..2fe17c9 100644 --- a/resources/views/frontend/opleidingen.blade.php +++ b/resources/views/frontend/opleidingen.blade.php @@ -1,9 +1,19 @@ @foreach ($education as $item) -
-

- {{ $item->opleiding }} - – {{ $item->instituut }} -

+ +
+
+ @if ($item->image()) + {{ $item->title }} + @endif +

+ + + {{ $item->opleiding }} + – {{ $item->instituut }} + +

+

{{ \Carbon\Carbon::parse($item->startdatum)->translatedFormat('Y') }} diff --git a/resources/views/frontend/personalia.blade.php b/resources/views/frontend/personalia.blade.php index 887d04b..b7b2297 100644 --- a/resources/views/frontend/personalia.blade.php +++ b/resources/views/frontend/personalia.blade.php @@ -1,44 +1,39 @@

    - @foreach($personalia as $item) -
  • - + @foreach ($personalia as $item) +
  • +

    {{ ucfirst($item->key) }}

    - @if($item->hidden) + @if ($item->hidden) @php - // 1. Vervang
    -tags door spaties - $cleanValue = str_ireplace(['
    ', '
    ', '
    '], ' ', $item->value); + // 1. Vervang
    -tags door spaties + $cleanValue = str_ireplace(['
    ', '
    ', '
    '], ' ', $item->value); - // 2. Verwijder alle andere HTML-tags - $cleanValue = strip_tags($cleanValue); - - // 3. Maskeren vanaf derde teken, spaties zichtbaar houden - $masked = ''; - $chars = mb_str_split($cleanValue); // Split veilig per karakter - - foreach ($chars as $i => $char) { - if ($i < 2) { - $masked .= $char; - } elseif ($char === ' ') { - $masked .= ' '; - } else { - $masked .= '*'; - } - } -@endphp - - + // 2. Verwijder alle andere HTML-tags + $cleanValue = strip_tags($cleanValue); + // 3. Maskeren vanaf derde teken, spaties zichtbaar houden + $masked = ''; + $chars = mb_str_split($cleanValue); // Split veilig per karakter + foreach ($chars as $i => $char) { + if ($i < 2) { + $masked .= $char; + } elseif ($char === ' ') { + $masked .= ' '; + } else { + $masked .= '*'; + } + } + @endphp + @else

    {{ $item->value }}

    @endif @@ -47,17 +42,17 @@ @endforeach
diff --git a/resources/views/frontend/vaardigheden.blade.php b/resources/views/frontend/vaardigheden.blade.php index e69de29..4d80336 100644 --- a/resources/views/frontend/vaardigheden.blade.php +++ b/resources/views/frontend/vaardigheden.blade.php @@ -0,0 +1,66 @@ +@if (isset($skills['tag'])) +
+ @foreach ($skills['tag'] as $skill) + + + {{ $skill->title }} + + @endforeach +
+@endif + +@if (isset($skills['rating'])) + + @foreach ($skills['rating'] as $skill) + +
+ +
+ @if ($skill->image()) + {{ $skill->title }} + @endif +

+ {{ $skill->title }} +

+
+ + {{-- Rating bar --}} +
+
+ Beoordeling: {{ $skill->rating }}/10 +
+
+
+
+
+
+ + @if ($skill->description) +
+ {!! nl2br(e($skill->description)) !!} +
+ @endif + +
+ @endforeach + +@endif + + +@if (isset($skills['other'])) +
+ @foreach ($skills['other'] as $skill) +
+ + @if ($skill->getFirstMediaUrl('image')) + {{ $skill->title }} + @endif + {{ $skill->title }} +
+ @endforeach +
+@endif diff --git a/resources/views/frontend/werkervaring.blade.php b/resources/views/frontend/werkervaring.blade.php index eb599e5..96633ca 100644 --- a/resources/views/frontend/werkervaring.blade.php +++ b/resources/views/frontend/werkervaring.blade.php @@ -1,8 +1,16 @@ @foreach ($experience as $item) -
-

- {{ $item->functie }} bij {{ $item->werkgever }} -

+ +
+
+ @if ($item->image()) + {{ $item->title }} + @endif +

+ {{ $item->functie }} bij + {{ $item->werkgever }} +

+

{{ \Carbon\Carbon::parse($item->startdatum)->translatedFormat('F Y') }} diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index ff04aa0..1b7a276 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -43,6 +43,7 @@

+@stack('scripts') diff --git a/resources/views/profile/partials/update-profile-information-form.blade.php b/resources/views/profile/partials/update-profile-information-form.blade.php index 7273fff..a2c5c4d 100644 --- a/resources/views/profile/partials/update-profile-information-form.blade.php +++ b/resources/views/profile/partials/update-profile-information-form.blade.php @@ -39,7 +39,7 @@

@if (session('status') === 'verification-link-sent') -

+

{{ __('A new verification link has been sent to your email address.') }}

@endif diff --git a/resources/views/skills/_form.blade.php b/resources/views/skills/_form.blade.php index 9f9eddd..322b169 100644 --- a/resources/views/skills/_form.blade.php +++ b/resources/views/skills/_form.blade.php @@ -1,24 +1,57 @@
+
+ + +
-
+
+
-
- - -
- -
- - - @if (!empty($skill) && $skill->getFirstMediaUrl('image')) - - @endif -
+
+ +
+ +
+ + + @if (!empty($skill) && $skill->getFirstMediaUrl('image')) + + @endif +
+ +
+@push('scripts') + + + +@endpush diff --git a/resources/views/skills/index.blade.php b/resources/views/skills/index.blade.php index d539721..72221bc 100644 --- a/resources/views/skills/index.blade.php +++ b/resources/views/skills/index.blade.php @@ -1,27 +1,51 @@ -
-

Vaardigheden

- Nieuwe vaardigheid +
+

Vaardigheden

-
- @foreach ($skills as $skill) -
-

{{ $skill->title }}

-

Beoordeling: {{ $skill->rating }}/10

-

{{ $skill->description }}

- @if ($skill->getFirstMediaUrl('image')) - {{ $skill->title }} - @endif -
- Bewerken -
- @csrf - @method('DELETE') - -
-
+ + Nieuwe vaardigheid + + + @php + $groupedSkills = $skills->groupBy('type'); + @endphp + + {{-- Rating --}} + @if($groupedSkills->has('rating')) +
+

Ratings

+
+ @foreach ($groupedSkills['rating'] as $skill) + @include('frontend._card', ['skill' => $skill]) + @endforeach
- @endforeach -
+
+ @endif + + {{-- Tags --}} + @if($groupedSkills->has('tag')) +
+

Tags

+
+ @foreach ($groupedSkills['tag'] as $skill) + + {{ $skill->title }} + + @endforeach +
+
+ @endif + + {{-- Overig --}} + @if($groupedSkills->has('other')) +
+

Overige vaardigheden

+
+ @foreach ($groupedSkills['other'] as $skill) + @include('frontend._card', ['skill' => $skill]) + @endforeach +
+
+ @endif
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index b89c0a7..c4477f2 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1,79 +1,155 @@ - - - - Laravel + + + + - - - + Laravel - - @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) - @vite(['resources/css/app.css', 'resources/js/app.js']) - @else - - @endif - - + + + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + + + +
- -
- Profielfoto -
-

Roberto Guagliardo

-

Full Stack Developer · Laravel Expert · DevOps Enthousiast

-

-Ik word enthousiast van alles wat systemen sneller, stabieler en slimmer maakt. Of het nu gaat om het automatiseren van deploys, het opzetten van monitoring met Grafana & Promtail, of het draaien van Docker-containers op Proxmox — ik denk graag in oplossingen die schaalbaar zijn en onderhoud verminderen. -Ik werk op het snijvlak van development en systeembeheer, en zoek continu naar manieren om processen te versimpelen, te automatiseren en te verbeteren.

+
+ + +
+ Profielfoto +
+ + +
+

+ Roberto Guagliardo +

+ +

+ Full Stack Developer · Laravel Expert · DevOps Enthousiast +

+ +

+ Ik word enthousiast van alles wat systemen sneller, stabieler en slimmer maakt. Of het nu gaat om + het automatiseren van deploys, het opzetten van monitoring met Grafana & Promtail, of het draaien + van Docker-containers op Proxmox — ik denk graag in oplossingen die schaalbaar zijn en onderhoud + verminderen.

+ Ik werk op het snijvlak van development en systeembeheer, en zoek continu naar manieren om processen + te versimpelen, te automatiseren en te verbeteren. +

+ + +
-
- -
- -
-

Personalia

- @include('frontend.personalia') -
+
+ +
- -
-

Vaardigheden

- @include('frontend.vaardigheden') -
-
+ +
+

+ Profiel +

- -
- -
-

Werkervaring

- @include('frontend.werkervaring') -
+ @include('frontend.personalia') +
+ + +
+

+ Vaardigheden +

+ + @include('frontend.vaardigheden') +
+ +
+ + +
+ +
+ +
+

+ Werkervaring +

+ + @include('frontend.werkervaring') +
+ + +
+

+ Opleidingen +

+ @include('frontend.opleidingen') +
+ + +
+
- -
-

Opleidingen

- @include('frontend.opleidingen') -
-
+ @include('frontend.cta')
© {{ date('Y') }} Roberto Guagliardo. Alle rechten voorbehouden.
+
+ {!! file_get_contents(public_path('storage/sitiweb.svg')) !!} +
+ + + + + @stack('scripts') -
+ diff --git a/resources/views/work_experiences/_form.blade.php b/resources/views/work_experiences/_form.blade.php index bbb4f30..86b6d96 100644 --- a/resources/views/work_experiences/_form.blade.php +++ b/resources/views/work_experiences/_form.blade.php @@ -1,4 +1,6 @@
+ +
@@ -32,6 +34,7 @@
+
@@ -39,8 +42,9 @@
- @if (!empty($workExperience) && $workExperience->getFirstMediaUrl('afbeelding')) - + + @if (!empty($workExperience) && $workExperience->image()) + @endif
diff --git a/resources/views/work_experiences/index.blade.php b/resources/views/work_experiences/index.blade.php index 8057b57..42e4c1c 100644 --- a/resources/views/work_experiences/index.blade.php +++ b/resources/views/work_experiences/index.blade.php @@ -7,7 +7,7 @@
@if (session('success')) -
{{ session('success') }}
+
{{ session('success') }}
@endif
@@ -20,7 +20,7 @@

{{ $experience->beschrijving }}

- Bewerken + Bewerken
@csrf @method('DELETE') @@ -28,8 +28,8 @@
- @if ($experience->getFirstMediaUrl('afbeelding')) - + @if ($experience->image()) + @endif
@endforeach diff --git a/routes/web.php b/routes/web.php index bd8850a..910b6ac 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,12 +11,8 @@ Route::get('/', [FrontendController::class, 'index'])->name('home'); Route::get('/dashboard', function () { return view('dashboard'); })->middleware(['auth', 'verified'])->name('dashboard'); -Route::get('/getPersonalia/{id}', function ($id) { - $item = \App\Models\Personalia::findOrFail($id); - return response()->json([ - 'value' => $item->value, - ]); -}); +Route::get('/getPersonalia/{id}', [FrontendController::class, 'getPersonalia'])->name('personalia'); +Route::post('/contact', [FrontendController::class, 'message'])->name('contact'); Route::middleware('auth')->group(function () { Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); diff --git a/storage/app/.gitignore b/storage/app/.gitignore index fedb287..85699dc 100644 --- a/storage/app/.gitignore +++ b/storage/app/.gitignore @@ -1,4 +1,46 @@ -* -!private/ -!public/ -!.gitignore +# Alles negeren +/public/* + +# Uitzonderingen (wél toevoegen aan Git) +!public/1/ +!public/2/ +!public/3/ +!public/4/ +!public/5/ +!public/6/ +!public/7/ +!public/8/ +!public/9/ +!public/10/ +!public/11/ +!public/12/ +!public/13/ +!public/14/ +!public/15/ +!public/16/ +!public/17/ +!public/18/ +!public/19/ +!public/20/ +!public/21/ +!public/22/ +!public/23/ +!public/24/ +!public/25/ +!public/26/ +!public/27/ +!public/28/ +!public/29/ +!public/30/ +!public/31/ +!public/32/ +!public/33/ +!public/34/ +!public/35/ +!public/36/ +!public/37/ +!public/38/ + +# Specifieke losse bestanden +!public/roberto.png +!public/sitiweb.svg diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/storage/app/public/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/storage/app/public/1/jumbo.png b/storage/app/public/1/jumbo.png new file mode 100644 index 0000000..3afdc29 Binary files /dev/null and b/storage/app/public/1/jumbo.png differ diff --git a/storage/app/public/10/inh.png b/storage/app/public/10/inh.png new file mode 100644 index 0000000..07d1caf Binary files /dev/null and b/storage/app/public/10/inh.png differ diff --git a/storage/app/public/11/git-logo.png b/storage/app/public/11/git-logo.png new file mode 100644 index 0000000..51f4ae5 Binary files /dev/null and b/storage/app/public/11/git-logo.png differ diff --git a/storage/app/public/12/lara.png b/storage/app/public/12/lara.png new file mode 100644 index 0000000..c96b343 Binary files /dev/null and b/storage/app/public/12/lara.png differ diff --git a/storage/app/public/13/Livewire-logo.png b/storage/app/public/13/Livewire-logo.png new file mode 100644 index 0000000..e07eb3c Binary files /dev/null and b/storage/app/public/13/Livewire-logo.png differ diff --git a/storage/app/public/14/Tailwind-CSS.png b/storage/app/public/14/Tailwind-CSS.png new file mode 100644 index 0000000..77eb776 Binary files /dev/null and b/storage/app/public/14/Tailwind-CSS.png differ diff --git a/storage/app/public/15/Postman.png b/storage/app/public/15/Postman.png new file mode 100644 index 0000000..2d7322d Binary files /dev/null and b/storage/app/public/15/Postman.png differ diff --git a/storage/app/public/16/Docker.png b/storage/app/public/16/Docker.png new file mode 100644 index 0000000..5b9ca9b Binary files /dev/null and b/storage/app/public/16/Docker.png differ diff --git a/storage/app/public/17/proxmox-logo.png b/storage/app/public/17/proxmox-logo.png new file mode 100644 index 0000000..8f6d459 Binary files /dev/null and b/storage/app/public/17/proxmox-logo.png differ diff --git a/storage/app/public/18/Grafana.png b/storage/app/public/18/Grafana.png new file mode 100644 index 0000000..d63fa1b Binary files /dev/null and b/storage/app/public/18/Grafana.png differ diff --git a/storage/app/public/19/Cloudflare.png b/storage/app/public/19/Cloudflare.png new file mode 100644 index 0000000..b3683e3 Binary files /dev/null and b/storage/app/public/19/Cloudflare.png differ diff --git a/storage/app/public/2/php-logo.png b/storage/app/public/2/php-logo.png new file mode 100644 index 0000000..9dfb905 Binary files /dev/null and b/storage/app/public/2/php-logo.png differ diff --git a/storage/app/public/20/directadmnin-logo.png b/storage/app/public/20/directadmnin-logo.png new file mode 100644 index 0000000..657a465 Binary files /dev/null and b/storage/app/public/20/directadmnin-logo.png differ diff --git a/storage/app/public/21/MySQL.png b/storage/app/public/21/MySQL.png new file mode 100644 index 0000000..cfda724 Binary files /dev/null and b/storage/app/public/21/MySQL.png differ diff --git a/storage/app/public/22/Uptime-Kuma-Logo.png b/storage/app/public/22/Uptime-Kuma-Logo.png new file mode 100644 index 0000000..2adfffc Binary files /dev/null and b/storage/app/public/22/Uptime-Kuma-Logo.png differ diff --git a/storage/app/public/23/NGINX.png b/storage/app/public/23/NGINX.png new file mode 100644 index 0000000..d6816eb Binary files /dev/null and b/storage/app/public/23/NGINX.png differ diff --git a/storage/app/public/24/Visual-Studio-Code-(VS-Code).png b/storage/app/public/24/Visual-Studio-Code-(VS-Code).png new file mode 100644 index 0000000..9a4a45e Binary files /dev/null and b/storage/app/public/24/Visual-Studio-Code-(VS-Code).png differ diff --git a/storage/app/public/25/GIMP.png b/storage/app/public/25/GIMP.png new file mode 100644 index 0000000..1e941c6 Binary files /dev/null and b/storage/app/public/25/GIMP.png differ diff --git a/storage/app/public/26/WordPress.png b/storage/app/public/26/WordPress.png new file mode 100644 index 0000000..723950f Binary files /dev/null and b/storage/app/public/26/WordPress.png differ diff --git a/storage/app/public/27/WooCommerce.png b/storage/app/public/27/WooCommerce.png new file mode 100644 index 0000000..e58214a Binary files /dev/null and b/storage/app/public/27/WooCommerce.png differ diff --git a/storage/app/public/28/Vaultwarden--Streamline-Simple-Icons.png b/storage/app/public/28/Vaultwarden--Streamline-Simple-Icons.png new file mode 100644 index 0000000..41f10c0 Binary files /dev/null and b/storage/app/public/28/Vaultwarden--Streamline-Simple-Icons.png differ diff --git a/storage/app/public/29/healthchecks.logo.png b/storage/app/public/29/healthchecks.logo.png new file mode 100644 index 0000000..42c0814 Binary files /dev/null and b/storage/app/public/29/healthchecks.logo.png differ diff --git a/storage/app/public/3/sitiweb-logo.png b/storage/app/public/3/sitiweb-logo.png new file mode 100644 index 0000000..a790631 Binary files /dev/null and b/storage/app/public/3/sitiweb-logo.png differ diff --git a/storage/app/public/30/GitLab.png b/storage/app/public/30/GitLab.png new file mode 100644 index 0000000..b18437d Binary files /dev/null and b/storage/app/public/30/GitLab.png differ diff --git a/storage/app/public/31/GitHub.png b/storage/app/public/31/GitHub.png new file mode 100644 index 0000000..be999cb Binary files /dev/null and b/storage/app/public/31/GitHub.png differ diff --git a/storage/app/public/32/Fedora.png b/storage/app/public/32/Fedora.png new file mode 100644 index 0000000..28ccce8 Binary files /dev/null and b/storage/app/public/32/Fedora.png differ diff --git a/storage/app/public/33/Ubuntu.png b/storage/app/public/33/Ubuntu.png new file mode 100644 index 0000000..c6fc00d Binary files /dev/null and b/storage/app/public/33/Ubuntu.png differ diff --git a/storage/app/public/34/CentOS.png b/storage/app/public/34/CentOS.png new file mode 100644 index 0000000..5ebb9f9 Binary files /dev/null and b/storage/app/public/34/CentOS.png differ diff --git a/storage/app/public/35/Debian.png b/storage/app/public/35/Debian.png new file mode 100644 index 0000000..14b6966 Binary files /dev/null and b/storage/app/public/35/Debian.png differ diff --git a/storage/app/public/36/Composer.png b/storage/app/public/36/Composer.png new file mode 100644 index 0000000..45982f8 Binary files /dev/null and b/storage/app/public/36/Composer.png differ diff --git a/storage/app/public/37/NPM.png b/storage/app/public/37/NPM.png new file mode 100644 index 0000000..3581bea Binary files /dev/null and b/storage/app/public/37/NPM.png differ diff --git a/storage/app/public/38/HTML5.png b/storage/app/public/38/HTML5.png new file mode 100644 index 0000000..104f2d6 Binary files /dev/null and b/storage/app/public/38/HTML5.png differ diff --git a/storage/app/public/4/5848152fcef1014c0b5e4967.png b/storage/app/public/4/5848152fcef1014c0b5e4967.png new file mode 100644 index 0000000..49ea8f5 Binary files /dev/null and b/storage/app/public/4/5848152fcef1014c0b5e4967.png differ diff --git a/storage/app/public/5/JavaScript.png b/storage/app/public/5/JavaScript.png new file mode 100644 index 0000000..a8fdba8 Binary files /dev/null and b/storage/app/public/5/JavaScript.png differ diff --git a/storage/app/public/6/images.jpg b/storage/app/public/6/images.jpg new file mode 100644 index 0000000..0fcafdc Binary files /dev/null and b/storage/app/public/6/images.jpg differ diff --git a/storage/app/public/7/internettoday-logo.jpg b/storage/app/public/7/internettoday-logo.jpg new file mode 100644 index 0000000..c80a6ba Binary files /dev/null and b/storage/app/public/7/internettoday-logo.jpg differ diff --git a/storage/app/public/8/hr.jpg b/storage/app/public/8/hr.jpg new file mode 100644 index 0000000..d9fca67 Binary files /dev/null and b/storage/app/public/8/hr.jpg differ diff --git a/storage/app/public/9/linux-logo.png b/storage/app/public/9/linux-logo.png new file mode 100644 index 0000000..4dc819c Binary files /dev/null and b/storage/app/public/9/linux-logo.png differ diff --git a/storage/app/public/roberto.png b/storage/app/public/roberto.png new file mode 100644 index 0000000..0f0477a Binary files /dev/null and b/storage/app/public/roberto.png differ diff --git a/storage/app/public/sitiweb.svg b/storage/app/public/sitiweb.svg new file mode 100644 index 0000000..e9eee5b --- /dev/null +++ b/storage/app/public/sitiweb.svg @@ -0,0 +1,2 @@ + +image/svg+xml diff --git a/tailwind.config.js b/tailwind.config.js index c29eb1a..ddb929b 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -14,6 +14,9 @@ export default { fontFamily: { sans: ['Figtree', ...defaultTheme.fontFamily.sans], }, + colors: { + 'sitiweb-green': '#00AB00', + }, }, },