Complete Your Freelancer Profile

Please provide your information to complete your profile. All fields are required for verification and to help clients find you.

Personal Information

Enter your first and last name as it appears on your ID
Your phone number will be used for verification and client contact

Professional Details

This description will be visible to clients looking to hire freelancers
Example: Web Design, Content Writing, Logo Design
Your primary area of expertise
Link to your portfolio website, LinkedIn, or other professional profile
Set a competitive base rate between R50 - R2000 per hour

Add specific pricing for different services you offer

Profile Media

Profile Picture Placeholder
Max size: 400KB. Supported formats: JPEG, PNG, WebP.
Upload a professional headshot with good lighting and a neutral background. Your profile picture is your first impression.

Work Samples

Showcase your best work to attract more clients. Upload images of your completed projects or work samples.

Upload high-quality images of your work (JPEG, PNG, or WebP). These will be displayed on your profile.
Total size: 0 MB / 8 MB
This description will help clients understand your capabilities

Identity Verification

To ensure trust and security on our platform, we require identity verification.

Upload a scan/photo of your ID or passport (JPEG, PNG, or PDF, max 6MB)

Your profile will be reviewed by our team within 1-2 business days

// Ensure close button is working const closeBtn = document.getElementById('sidebarCloseBtn'); if (closeBtn && window.UniversalSidebar) { // Remove existing listeners and add fresh one const newCloseBtn = closeBtn.cloneNode(true); closeBtn.parentNode.replaceChild(newCloseBtn, closeBtn); newCloseBtn.addEventListener('click', () => { console.log('🔧 [Freelancer Setup] Close button clicked'); if (window.UniversalSidebar.closeSidebar) { window.UniversalSidebar.closeSidebar(); } }); console.log('✅ [Freelancer Setup] Close button event listener added'); } }, 100); }); // Additional fallback to ensure mobile menu works window.addEventListener('load', () => { setTimeout(() => { const mobileToggle = document.querySelector('.mobile-menu-toggle'); if (mobileToggle && !mobileToggle.hasAttribute('data-sidebar-setup')) { console.log('🔧 [Freelancer Setup] Setting up mobile toggle fallback'); mobileToggle.addEventListener('click', (e) => { e.preventDefault(); if (window.UniversalSidebar && window.UniversalSidebar.openSidebar) { window.UniversalSidebar.openSidebar(); } }); mobileToggle.setAttribute('data-sidebar-setup', 'true'); } }, 500); }); // Initialize with a sample pricing entry for demonstration document.addEventListener('DOMContentLoaded', () => { // Add a sample pricing entry after a slight delay to ensure all elements are loaded setTimeout(() => { // Only add if the function exists if (typeof addPricingEntry === 'function') { addPricingEntry({ serviceName: 'Example Service', pricingType: 'fixed', price: '500' }); } }, 500); }); // Set up checkbox validation and visual feedback document.addEventListener('DOMContentLoaded', () => { const criminalConsent = document.getElementById('criminalBackgroundConsent'); const termsConsent = document.getElementById('termsAndConditions'); const checkboxes = [criminalConsent, termsConsent]; // Add focus outline for better accessibility checkboxes.forEach(checkbox => { const parentDiv = checkbox.closest('.checkbox'); checkbox.addEventListener('change', () => { if (checkbox.checked) { // Visual feedback when checked parentDiv.style.backgroundColor = 'rgba(21, 101, 192, 0.05)'; } else { parentDiv.style.backgroundColor = ''; } }); // Add validation on blur checkbox.addEventListener('blur', () => { if (checkbox.required && !checkbox.checked) { parentDiv.style.borderLeft = '3px solid #f44336'; } else { parentDiv.style.borderLeft = ''; } }); }); });