Commit Graph

80 Commits

Author SHA1 Message Date
Melvin Ragusa
6452ed9962 feat(copy): add personal name to EN about intro 2026-02-12 19:13:15 +01:00
Melvin Ragusa
f3501dcb06 update text 2026-02-12 19:11:46 +01:00
Melvin Ragusa
e1e552465c chore(copy): revert contact subtitle to classic 2026-02-12 19:07:19 +01:00
Melvin Ragusa
0c1af4a702 feat(copy): make about section fully personal in solo voice 2026-02-12 18:43:50 +01:00
Melvin Ragusa
c2b6a95df5 feat(copy): switch about section to solo founder voice 2026-02-12 18:43:12 +01:00
Melvin Ragusa
c54ce15211 feat(copy): sharpen value proposition and conversion messaging 2026-02-12 16:55:22 +01:00
Melvin Ragusa
2b9fa3d9e9 Merge pull request #36 from ragusa-it/perf/optimize-language-provider-1011813150608221001
 Optimize LanguageProvider to prevent unnecessary re-renders
2026-01-30 06:00:53 +01:00
Melvin Ragusa
4d87c9a5ec Merge pull request #40 from ragusa-it/feat/ui-input-char-counter-5721943779298145011
🎨 Palette: Add character counter to inputs
2026-01-30 06:00:30 +01:00
Melvin Ragusa
a3de3f9ed8 Merge pull request #39 from ragusa-it/sentinel-email-security-enhancement-1361969690950207643
🛡️ Sentinel: Enhance email security with strict validation and sanitization
2026-01-30 06:00:02 +01:00
google-labs-jules[bot]
c9877db3bb feat(security): add blocked domains and strict TLD validation
- Adds `BLOCKED_DOMAINS` list to reject disposable/invalid email domains.
- Enforces TLD length >= 2 chars in `isValidEmail`.
- Updates tests to cover new validation rules.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-30 04:56:33 +00:00
Melvin Ragusa
c86c5f44a4 Merge pull request #38 from ragusa-it/bolt-navbar-scroll-optimization-12203924683712473060
 Bolt: Optimize Navbar scroll handler
2026-01-30 05:53:13 +01:00
Melvin Ragusa
46e3949a21 fix: FancyCursor hover behaviour on normal text 2026-01-30 05:50:30 +01:00
google-labs-jules[bot]
a27a54843e feat(ui): add character counter to controlled Input and Textarea components
Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-30 01:56:58 +00:00
google-labs-jules[bot]
15c4b88535 feat(security): enhance email validation and sanitization
- Updates `isValidEmail` to strictly reject double quotes and backticks while allowing apostrophes.
- Applies `sanitizeInput` to email fields in Contact form payload (Defense in Depth).
- Adds tests for email validation edge cases.
- Updates Sentinel journal.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-30 01:48:47 +00:00
google-labs-jules[bot]
51547318e1 perf(navbar): optimize scroll handler to reduce state updates
- Introduces a local tracking variable in `Navbar` scroll effect to prevent redundant `setState` calls during scroll.
- Ensures the state is correctly initialized on mount if the page is already scrolled.
- Uses `requestAnimationFrame` for efficient scroll handling.

This reduces the number of React reconciliation cycles during scrolling, improving main thread performance.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-30 01:44:56 +00:00
google-labs-jules[bot]
c0d541d31b Fix GradientBlinds scroll drift on mobile and address dampening regression
- Added isMobile detection (<= 768px) in GradientBlinds.tsx
- Updated onPointerMove to calculate container-relative coordinates immediately on mobile
- Updated animation loop to skip scroll-based target updates on mobile
- Fixed regression where disabling mouse dampening on mobile would freeze the spotlight
- Prevents spotlight from drifting across the background during scroll inertia on mobile devices

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-29 22:30:40 +00:00
google-labs-jules[bot]
7bc42f8d48 Fix GradientBlinds scroll drift on mobile
- Added isMobile detection (<= 768px) in GradientBlinds.tsx
- Updated onPointerMove to calculate container-relative coordinates immediately on mobile
- Updated animation loop to skip scroll-based target updates on mobile
- Prevents spotlight from drifting across the background during scroll inertia on mobile devices

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-29 22:09:19 +00:00
google-labs-jules[bot]
169cbc1bcb Optimize LanguageProvider context value memoization
Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-29 05:00:43 +00:00
Melvin Ragusa
220b03ad97 Merge branch 'main' into bolt/route-lazy-loading-17202030222576625568 2026-01-29 05:20:57 +01:00
Melvin Ragusa
5745e07da2 Merge branch 'main' into palette-contact-a11y-2847648259567731202 2026-01-29 05:19:59 +01:00
Melvin Ragusa
f91f487fda Merge pull request #34 from ragusa-it/sentinel-input-limits-8405607204449411064
🛡️ Sentinel: [Medium] Add input length limits to Contact form
2026-01-29 05:19:01 +01:00
Melvin Ragusa
68727e8b39 Merge pull request #31 from ragusa-it/palette/required-fields-a11y-7470820225000300564
🎨 Palette: Add accessible required field indicators
2026-01-29 05:17:56 +01:00
Melvin Ragusa
7277b9377e Merge pull request #30 from ragusa-it/bolt/optimize-hero-rerenders-1995284140926395636
 Bolt: Optimize Hero re-renders
2026-01-29 05:16:34 +01:00
google-labs-jules[bot]
e84a3313c7 feat(security): enforce input length limits in contact form
- Added `EMAIL_MAX_LENGTH` constant (254).
- Added `maxLength` attributes to Name, Email, Subject, and Message inputs.
- Updated `validateForm` to check email length.
- Mitigates client-side DoS and improves UX.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-29 02:00:58 +00:00
google-labs-jules[bot]
2c9cb547e7 🎨 Palette: Improve Contact form accessibility
💡 What: Added ARIA roles to form status messages and hid decorative icons.
🎯 Why: Screen readers were missing dynamic success/error messages on form submission.
 Accessibility:
- Added `role="alert"` and `aria-live="polite"` to success, error, and rate-limit messages.
- Added `aria-hidden="true"` to decorative icons in the contact info section.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-29 01:48:58 +00:00
google-labs-jules[bot]
bac867f228 perf(GradientBlinds): decouple pointer events from render loop
- Move scroll position and bounding client rect calculations from `pointermove` handler to `requestAnimationFrame` loop.
- Use `pointerPosRef` to store raw event coordinates, reducing overhead in high-frequency event handlers.
- Ensure spotlight effect correctly accounts for scroll position updates during animation frames.
- Add regression test to verify `scrollX` is not accessed during pointer events.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-29 01:40:38 +00:00
google-labs-jules[bot]
e14ce38f61 feat: add accessible required field indicators and alerts
- Add visual asterisk for required inputs in Input.tsx
- Add .required style in Input.module.css
- Update Contact form to use required props and noValidate
- Add role="alert" to Contact form success/error messages
- Add tests for required field rendering

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-28 02:10:17 +00:00
google-labs-jules[bot]
669e96a77c feat: optimize Hero component by isolating typing effect state
Extracted the high-frequency typing animation logic into a new, memoized `TypedText` component.
This prevents the entire `Hero` component (including the heavy `GradientBlinds`) from re-rendering on every character update.

- Created `TypedText` component in `Hero.tsx`
- Wrapped `TypedText` in `React.memo`
- Moved `useTypingEffect` call into `TypedText`
- Updated `Hero` to use `TypedText`

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-28 01:58:55 +00:00
Melvin Ragusa
6b8f54072e Merge pull request #28 from ragusa-it/sentinel/strict-email-validation-13033948493013017418
🛡️ Sentinel: [HIGH] Strict Email Validation to Prevent XSS
2026-01-27 05:11:54 +01:00
google-labs-jules[bot]
57f7c5667f 🛡️ Sentinel: [HIGH] Implement strict email validation
- Implemented `isValidEmail` utility with strict regex validation (rejects `<` and `>`) to prevent XSS vectors.
- Updated `Contact.tsx` to use `isValidEmail` instead of weak regex.
- Added comprehensive tests for `isValidEmail` in `src/utils/security.test.ts`.
- Fixed flaky test in `src/pages/__tests__/Contact.test.tsx` by clearing `localStorage` in `afterEach`.
- Added test case for invalid email submission.
- Documented findings in `.jules/sentinel.md`.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-27 01:56:08 +00:00
google-labs-jules[bot]
6d94ac7b93 🎨 Palette: Improve Button loading state accessibility
- Add `aria-busy` attribute to Button when loading.
- Refactor Button rendering to keep children in DOM (visually hidden) instead of unmounting.
- Fix layout shift regression by replicating flex properties in content wrapper.
- Move inline styles to CSS modules.
- Add tests for loading state accessibility.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-27 01:42:19 +00:00
google-labs-jules[bot]
839e1bf82f feat: add client-side rate limiting to contact form
- Added `useRateLimit` hook
- Integrated hook into `Contact.tsx`
- Added translations for rate limit error
- Added unit tests
- Fixed type error in `Button.tsx` to allow build to pass
2026-01-26 01:49:05 +00:00
google-labs-jules[bot]
0fe47a3790 feat(perf): implement route lazy loading for About and Contact pages
- Splits About and Contact pages into separate chunks using React.lazy and Suspense.
- Keeps Home page eager loaded to prevent layout shifts.
- Adds PageLoader component as a fallback for Suspense.
- Reduces initial bundle size by loading secondary pages only when needed.
2026-01-26 01:41:35 +00:00
Melvin Ragusa
13df58342a Merge pull request #22 from ragusa-it/bolt-optimize-fancycursor-3615259032599906398
 Bolt: Optimize FancyCursor mousemove handler
2026-01-25 15:16:27 +01:00
google-labs-jules[bot]
7c0a0bbec2 perf(FancyCursor): optimize mousemove handler with ticking pattern
- Replaces the `cancelAnimationFrame` pattern with a boolean ticking flag to reduce function allocation and RAF overhead on high-frequency mousemove events.
- Uses closure variables for coordinates to ensure the latest position is used in the animation frame.
- Improves performance of the custom cursor on high-refresh-rate input devices.
2026-01-25 01:37:50 +00:00
google-labs-jules[bot]
2eb8c57a50 Palette: Enable accessibility attributes on Button component
Refactored the `Button` component to accept and spread standard HTML button attributes.
This allows developers to add `aria-label`, `aria-expanded`, and other accessibility properties,
which were previously ignored.

Added unit tests to verify that attributes are correctly passed to the DOM element.
2026-01-25 01:36:53 +00:00
Melvin Ragusa
949d5ab8b9 style: Adjust navbar backdrop blur intensity and background color opacity. 2026-01-24 14:00:11 +01:00
Melvin Ragusa
821e27ff0e style: increase Navbar background opacity for improved visibility. 2026-01-24 13:56:33 +01:00
Melvin Ragusa
de14bfdf5d style: Add -webkit-backdrop-filter for blur effects and refine mobile navigation background colors. 2026-01-24 13:54:03 +01:00
Melvin Ragusa
cefa3ef7aa feat: implement Navbar styling with responsive design and add localStorage mock to Navbar tests. 2026-01-24 13:50:39 +01:00
Melvin Ragusa
89b24e1256 Merge pull request #17 from ragusa-it/sentinel-contact-form-security-13396691456148792037
🛡️ Sentinel: Add input sanitization and validation to Contact form
2026-01-24 11:48:36 +01:00
Melvin Ragusa
6b17b8b007 perf: optimized gradientblinds 2026-01-24 11:45:39 +01:00
Melvin Ragusa
e6df2d25be Merge pull request #19 from ragusa-it/palette-input-a11y-improvement-8429205258158315670
🎨 Palette: Improve Input accessibility with ARIA attributes
2026-01-24 11:20:57 +01:00
Melvin Ragusa
68262de83c Merge pull request #18 from ragusa-it/perf/navbar-debounce-resize-859095585893287738
 Optimize Navbar resize handler with debounce
2026-01-24 11:20:04 +01:00
google-labs-jules[bot]
ffe37fad37 feat: Improve Input accessibility with ARIA attributes
Add `aria-invalid` and `aria-describedby` attributes to Input and Textarea components when an error is present.
This ensures screen readers announce the validation error when the input is focused.
Also added unit tests for these accessibility attributes.
2026-01-24 10:08:34 +00:00
google-labs-jules[bot]
1f21b7bcb9 Optimize Navbar resize handler with debounce
*   💡 **What:** Implemented a generic `debounce` utility and applied it to the `Navbar` component's window resize event listener (150ms delay). Added a `.cancel()` method to the debounce utility to prevent memory leaks/errors on unmount.
*   🎯 **Why:** The `resize` event fires rapidly, causing `getBoundingClientRect` (a layout-thrashing operation) to run excessively, impacting performance.
*   📊 **Measured Improvement:** In a benchmark test simulating 100 rapid resize events:
    *   **Baseline:** 200 calls to `getBoundingClientRect`.
    *   **Optimized:** 2 calls to `getBoundingClientRect`.
    *   **Result:** ~99% reduction in layout calculations during rapid resizing.
    *   Added `src/components/layout/Navbar.perf.test.tsx` to prevent regression.
2026-01-24 10:07:28 +00:00
google-labs-jules[bot]
6801682c2e Shield: Add input sanitization and length validation to Contact form
Added `sanitizeInput` utility to escape HTML characters.
Updated `Contact.tsx` to sanitize inputs before sending via `emailjs`.
Added max length validation for Name (100), Subject (200), and Message (5000).
Updated tests to cover sanitization and validation logic, including adding `cleanup()` to prevent test leakage.
2026-01-24 10:05:33 +00:00
google-labs-jules[bot]
5d29f05248 perf: Optimize GradientBlinds pointer move handler
- Removed synchronous `getBoundingClientRect` call from `pointermove` handler
- Implemented caching of canvas dimensions and scroll position using `ResizeObserver`
- Added logic to compensate for scroll delta in pointer position calculation
- Added regression test to verify `getBoundingClientRect` is not called during pointer interaction
- Fixed `ogl` mock in tests to include `Geometry`
2026-01-24 10:02:30 +00:00
Melvin Ragusa
77fd62447c fix: updated contact information in imprint & /contact page 2026-01-24 10:47:40 +01:00
google-labs-jules[bot]
043a1b2b1e fix(emailjs): send emails sequentially and add reply_to 2026-01-24 09:30:22 +00:00