Commit Graph

70 Commits

Author SHA1 Message Date
Melvin Ragusa
9223331ee9 Merge pull request #25 from ragusa-it/sentinel/add-rate-limiting-6220090788029597128
🛡️ Sentinel: [Enhancement] Add rate limiting to contact form
2026-01-26 08:55:45 +01: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
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
Melvin Ragusa
ca9e365780 Merge pull request #21 from ragusa-it/palette/button-a11y-fix-1082057340107931289
Palette: Enable accessibility attributes on Button component
2026-01-25 15:16:08 +01:00
Melvin Ragusa
2503e71dc5 Merge pull request #20 from ragusa-it/sentinel-security-headers-5394727340569705425
🛡️ Sentinel: Add Security Headers to Firebase Config
2026-01-25 15:15:39 +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
google-labs-jules[bot]
5f7f422167 🛡️ Sentinel: [HIGH] Add security headers to firebase.json
Added strict security headers to `firebase.json` for Firebase Hosting.
Headers included:
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY
- Referrer-Policy: strict-origin-when-cross-origin
- Content-Security-Policy: Includes directives for 'self', Google Fonts, EmailJS, and disallows object/frame embedding.

Also initialized `.jules/sentinel.md` with the first security learning.
2026-01-25 01:35: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
b80db420c2 jules: merged .jules and .Jules directories 2026-01-24 11:50:38 +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
Melvin Ragusa
8a80915982 Merge pull request #15 from ragusa-it/perf-gradient-blinds-reflow-11693170314543928560
 Optimize GradientBlinds pointer move handler
2026-01-24 11:18:57 +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
Melvin Ragusa
516f29f312 Merge pull request #14 from ragusa-it/fix-emailjs-config-10566427372995944214
fix(emailjs): send emails sequentially and add reply_to
2026-01-24 10:33:47 +01:00
Melvin Ragusa
690e8647bc Merge branch 'main' into fix-emailjs-config-10566427372995944214 2026-01-24 10:33:37 +01:00
google-labs-jules[bot]
043a1b2b1e fix(emailjs): send emails sequentially and add reply_to 2026-01-24 09:30:22 +00:00
Melvin Ragusa
f020b61ced Merge pull request #13 from ragusa-it/fix-emailjs-config-10566427372995944214
Fix EmailJS parameter mapping and update API usage
2026-01-23 23:42:59 +01:00
google-labs-jules[bot]
dd49676fca fix(emailjs): update param mapping and api usage 2026-01-23 17:20:35 +00:00
Melvin Ragusa
7ee61ed342 fix: emailJS implementation 2026-01-23 17:19:35 +01:00
Melvin Ragusa
a9c259f60f fix: firebase.json config 2026-01-23 12:24:45 +01:00
Melvin Ragusa
de8604f40f fix: 4 column layout for about section 2026-01-23 12:21:21 +01:00
Melvin Ragusa
7616edf907 fix: card sizing on homepage 2026-01-23 12:16:13 +01:00
Melvin Ragusa
f3ff2a7b9c fix: attached mouse event listener to window instead of canvas element 2026-01-23 11:54:30 +01:00
Melvin Ragusa
4d8fc7ad85 fix: rendering issues on chrome for background effect 2026-01-23 11:49:27 +01:00
Melvin Ragusa
4955c41dc0 fix: lazyloading issues on about page 2026-01-23 11:35:18 +01:00
Melvin Ragusa
1aead86921 Merge pull request #11 from ragusa-it/perf/hero-scroll-optimization-17565878780941299000
 Improve Hero Scroll Performance
2026-01-23 11:03:35 +01:00
Melvin Ragusa
7c3dd7b5cb Merge branch 'main' and resolve conflict in Hero.test.tsx 2026-01-23 11:03:04 +01:00
Melvin Ragusa
344cfbce99 Merge pull request #10 from ragusa-it/optimize-gradient-blinds-intersection-observer-8465585914404469487
Optimize GradientBlinds with IntersectionObserver
2026-01-23 10:55:48 +01:00
Melvin Ragusa
eea334a1d7 Merge pull request #9 from ragusa-it/perf/optimize-typing-effect-timer-13814216160386825632
 Optimize useTypingEffect timer performance
2026-01-23 10:55:36 +01:00
Melvin Ragusa
0e7efbfb75 Merge pull request #8 from ragusa-it/optimize-fancy-cursor-13866096887027914754
 Optimize FancyCursor: Move DOM checks to mouseover
2026-01-23 10:55:22 +01:00
google-labs-jules[bot]
196ab41ac6 refactor(Hero): replace scroll listener with IntersectionObserver
- Replaced window scroll event listener with IntersectionObserver for better performance.
- Added a sentinel element to track scroll position relative to the top.
- Updated tests to mock IntersectionObserver and verify behavior without scroll events.
2026-01-23 09:31:08 +00:00
google-labs-jules[bot]
fe6e07fe92 perf: pause GradientBlinds animation when off-screen
Removes the unconditional start of the animation loop on mount. The loop is now exclusively managed by the existing IntersectionObserver, ensuring it only runs when the component is visible.

Updates tests to reflect this behavior by simulating intersection events to trigger the animation.
2026-01-23 09:29:42 +00:00
google-labs-jules[bot]
58b82d04c1 Optimize useTypingEffect to reduce re-renders and timer churn
Refactored the useTypingEffect hook to use a Ref for accessing the current text state inside the timer loop.
This prevents the main useEffect from being torn down and recreated on every single character keystroke, significantly reducing timer setup/cleanup overhead.

Baseline Effect Runs for 'Hello': 13
Optimized Effect Runs for 'Hello': 4

Also split the logic into two effects:
1. One for handling immediate state transitions (word switching).
2. One for the timer loop (typing/deleting/pausing).

This ensures correct behavior while maximizing performance.
2026-01-23 09:28:02 +00:00
google-labs-jules[bot]
d5b079d452 Refactor FancyCursor to use mouseover delegation
- Moves expensive DOM checks (`closest`) and class toggling from `mousemove` loop to `mouseover` handler.
- Removes `document.elementFromPoint` fallback to eliminate layout thrashing.
- Updates tests to verify performance improvements.
- Fixes `Hero.test.tsx` missing jsdom environment.
2026-01-23 09:27:45 +00:00
Melvin Ragusa
acfbb8571c Merge pull request #7 from ragusa-it/perf/navbar-scroll-throttling-16938841465799544697
 Optimize Navbar scroll listener with requestAnimationFrame
2026-01-23 10:06:57 +01:00
Melvin Ragusa
83f2229175 Merge pull request #6 from ragusa-it/perf/cursor-optimization-18391845640472037951
 Optimize FancyCursor by replacing elementFromPoint with event delegation
2026-01-23 10:06:45 +01:00
Melvin Ragusa
9d19aa0ef6 Merge pull request #5 from ragusa-it/fix-typing-effect-timer-leak-7224626563395361239
Refactor useTypingEffect to fix timer leak and optimize re-renders
2026-01-23 10:06:33 +01:00
Melvin Ragusa
37653dc707 Merge pull request #4 from ragusa-it/perf/hero-scroll-throttle-1683118190839821830
 Perf: Throttle Hero scroll listener
2026-01-23 10:06:16 +01:00
Melvin Ragusa
8171fc13c1 Merge pull request #3 from ragusa-it/perf/optimize-gradient-blinds-536844470945230510
 Optimize GradientBlinds: Pause animation when off-screen
2026-01-23 10:05:16 +01:00
google-labs-jules[bot]
8592775485 perf: throttle scroll event listener in Navbar
Implemented `requestAnimationFrame` throttling for the scroll event listener in `Navbar` to reduce the frequency of state updates and logic execution.

- Wrapped scroll handler in `requestAnimationFrame`.
- Added performance test `src/components/layout/Navbar.test.tsx` verifying logic runs once per frame instead of per event.
- Verified functional correctness of scroll state updates.
- Fixed `useTypingEffect` test environment.
2026-01-22 08:24:10 +00:00