Commit Graph

274 Commits

Author SHA1 Message Date
juanatsap d4ef91b742 fix: use CSS Grid for true staggered button animations
Switched from Flexbox to CSS Grid to enable true staggered animations.

Why Grid works better:
- Grid children maintain their grid cell during layout changes
- Buttons can transition individually within their cells
- grid-auto-flow change doesn't force simultaneous repositioning

Changes:
- Container: display: grid with grid-auto-flow
- Desktop: grid-auto-flow: row (vertical stack)
- Mobile: grid-auto-flow: column (horizontal row)
- Buttons: transition: all 0.5s with staggered delays (0s, 0.08s, 0.16s, 0.24s, 0.32s)

Result: Each button now cascades independently when resizing between
desktop and mobile layouts, creating the smooth wave effect.
2025-11-16 14:45:13 +00:00
juanatsap 5a99c0026e fix: enable staggered button animations with specific property transitions
The issue was that 'transition: all' on the container was forcing all
buttons to move together. Fixed by:

1. Container now transitions only: left, bottom, gap, transform
   (NOT flex-direction or all properties)

2. Buttons transition only: transform, opacity, background-color, box-shadow, color
   (NOT all properties)

3. Increased stagger delays for better visual effect:
   - Button 1: 0s (instant)
   - Button 2: 0.08s
   - Button 3: 0.16s
   - Button 4: 0.24s
   - Button 5: 0.32s

4. Added flex-direction: 0s transition in mobile to instant switch direction
   while buttons still cascade to new positions

Result: Each button now animates independently with cascading wave effect
when switching between desktop (vertical) and mobile (horizontal) layouts.
2025-11-16 14:42:40 +00:00
juanatsap 268cd00fc7 feat: add staggered cascade animation to buttons
Implemented beautiful cascading animation effect where each button
animates individually with a staggered delay.

Changes:
- Each button now has transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1)
- Added nth-child selectors with progressive delays:
  * Button 1: 0.05s delay
  * Button 2: 0.10s delay
  * Button 3: 0.15s delay
  * Button 4: 0.20s delay
  * Button 5: 0.25s delay

Effect:
When viewport changes (desktop ↔ mobile), buttons don't move as a group.
Instead, they cascade one by one creating a wave-like animation:
- Desktop→Mobile: Buttons flow from vertical to horizontal sequentially
- Mobile→Desktop: Buttons stack from horizontal to vertical one by one

This creates a much cooler, more polished animation than moving all
buttons simultaneously. The 50ms stagger creates perfect visual rhythm.
2025-11-16 14:39:03 +00:00
juanatsap 0edcf8c221 fix: correct button order and restore smooth transitions
Fixes:
1.  Reversed button order - Info at bottom, Download at top
   - Desktop (bottom→top): Info → Shortcuts → Zoom → Print → Download
   - Mobile (left→right): Download → Print → Shortcuts → Info

2.  Restored smooth morphing transitions
   - Added transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1)
   - Container smoothly transforms from vertical to horizontal
   - Buttons smoothly reposition during responsive transition

3.  Preserved all special hover behaviors
   - Zoom button: Blue hover + highlights zoom control
   - Print button: White bg + green icon on hover (synchronized)
   - Download button: Red bg on hover (synchronized)
   - All sync functions working: syncPdfHover, syncPrintHover, highlightZoomControl

The flexbox container now has the correct button order AND smooth animations!
2025-11-16 14:26:49 +00:00
juanatsap 8eea5a660a feat: implement flexbox container for fixed buttons
Major architectural improvement for button management:

Desktop Layout (left side, vertical):
- Created .fixed-buttons-container positioned left: 2rem, bottom: 2rem
- Buttons stack vertically with flex-direction: column
- Order (bottom to top): Info → Shortcuts → Zoom → Print → Download
- 1rem (16px) gap between buttons
- All buttons 50×50px with consistent styling
- Easy to add/remove buttons - just add template to container

Mobile Layout (bottom center, horizontal):
- Container switches to flex-direction: row at @media (max-width: 900px)
- Centered with left: 50% and transform: translateX(-50%)
- 10px gap between buttons
- Zoom button hidden on mobile (display: none)
- 4 visible buttons: Info, Shortcuts, Print, Download

Benefits:
 Single source of truth - container manages all buttons
 Easy to add/remove buttons - no manual position calculations
 Responsive - automatic reflow from vertical to horizontal
 Maintainable - changes in one place affect all buttons
 Consistent spacing - gap property ensures even distribution
 Future-proof - adding button = adding template to container

Technical Implementation:
- Container uses position: fixed with flexbox
- Buttons use position: relative inside container (not fixed individually)
- All positioning managed by flexbox (gap, flex-direction, align-items)
- Hover states preserved with color-coded backgrounds per button
- Back-to-top button remains separate (not in container)

This replaces individual fixed positioning with a scalable flex layout.
2025-11-16 14:21:11 +00:00
juanatsap a7cc899832 fix: redesign mobile button layout for consistency and flexibility
Changes:
- Replaced fixed positioning with flexible layout for mobile buttons
- Now shows 4 buttons on mobile: Download, Print, Shortcuts, Info
- Hide only Zoom button on mobile (accessible via hamburger menu)
- All buttons now 50×50px (consistent size, info button was smaller)
- Even 10px spacing between buttons
- Perfectly centered as a group in viewport
- Future-proof: easy to add/remove buttons without breaking layout

Layout details:
- Total width: 4 buttons × 50px + 3 gaps × 10px = 230px
- Centered using calc(50% - offset) for each button
- Maintains smooth hover effects with translateY only
- All buttons at same vertical position (bottom: 1.5rem)

Benefits:
- Consistent button sizes across mobile/desktop
- Maintainable: adding/removing buttons only requires adjusting calculations
- Better UX: users can access all main actions from bottom bar
- Shortcuts and info buttons now easily accessible on mobile
2025-11-16 14:14:06 +00:00
juanatsap 585f620bd6 refactor: organize hyperscript code and implement mobile button layout
This commit includes two major improvements:

1. Hyperscript Code Organization:
   - Extracted all hyperscript blocks >3 lines into reusable functions
   - Created 6 new functions in functions._hs:
     * toggleCVLength(isLong) - CV length toggle sync
     * toggleIcons(showIcons) - Icons toggle sync
     * toggleTheme(isClean) - Theme toggle sync
     * syncPdfHover(show) - PDF button synchronized hover
     * syncPrintHover(show) - Print button synchronized hover
     * highlightZoomControl(show) - Zoom control highlight effect
   - Reduced inline hyperscript from 11+ lines to 1-2 lines per element
   - Updated 8 template files to use function calls:
     * hamburger-menu.html
     * view-controls.html
     * action-buttons.html
     * download-button.html
     * print-friendly-button.html
     * zoom-toggle-button.html

2. Mobile Button Layout (max-width: 900px):
   - Repositioned three fixed buttons (PDF, Print, Info) horizontally at bottom center
   - Print button perfectly centered in viewport
   - Download button on left, Info button on right
   - Hidden zoom and shortcuts buttons on mobile (available in hamburger menu)
   - Removed conflicting old mobile styles that were hiding print button
   - Smooth hover transitions maintained with proper transform calculations

Technical details:
- Used CSS transform with calc() for precise horizontal positioning
- Maintained hover effects with combined translateX/translateY transforms
- Ensured accessibility with proper ARIA labels and spacing
- All functions check element existence before manipulation
- LocalStorage sync maintained across desktop/mobile toggles
2025-11-16 14:03:22 +00:00
juanatsap 671f06cd21 feat: add smooth color transitions to action bar buttons
- Added 0.3s ease transitions for background-color and color
- Icons now smoothly transition color as well
- Matches the smooth animations on fixed buttons
- Applies to PDF and Print Friendly buttons in top action bar
2025-11-16 13:48:54 +00:00
juanatsap c456bb1637 fix: remove blue active state from zoom button and restore Show Zoom menu item
- Removed .zoom-active CSS class and JavaScript logic
- Zoom button stays same gray color whether zoom is on or off
- Fixed Show Zoom menu button visibility (changed inline style to zoom-hidden class)
- Menu item now correctly appears when zoom is hidden
2025-11-16 13:32:57 +00:00
juanatsap b9e9e09d71 feat: enhance zoom and print button UX
Print Button Improvements:
- Hover shows white background with green icon (was green bg + white icon)
- Applied to all print buttons: fixed, action bar, and menu
- Default state remains dark gray with white icon

Zoom Control Improvements:
- Text now 100% white (was 70-95% opacity) for better readability
- Increased font sizes: labels 0.95rem (was 0.8rem), current value 1.05rem (was 0.9rem)
- Hover zoom toggle button highlights zoom control with blue glow shadow
- Active zoom button uses semi-transparent blue rgba(52, 152, 219, 0.5) instead of solid

Z-Index Fix:
- Hamburger menu now appears above fixed buttons (z-index: 1000 vs 999)
2025-11-16 13:29:40 +00:00
juanatsap bfb7b35c50 feat: add synchronized hover effect for PDF and print-friendly buttons
- PDF buttons (fixed, action bar, menu) now sync hover states across all instances
- Print-friendly buttons (fixed, action bar, menu) sync green hover states
- White PDF icon with red hover background (#cd6060)
- Green print button hover (#27ae60)
- Implemented using hyperscript with .pdf-hover-sync and .print-hover-sync classes
- Creates cool visual feedback showing all related buttons simultaneously
2025-11-16 13:19:56 +00:00
juanatsap ac0cf15eb9 added zoom in buttons 2025-11-16 12:48:12 +00:00
juanatsap 25e9ebafe7 bf fixes 2025-11-16 10:11:58 +00:00
juanatsap 6510036193 feat: implement HTMX loading indicators and skeleton loader transitions
Implement comprehensive loading feedback system with two phases:

Phase 1: HTMX Loading Indicators
- Add spinning indicators to language selector buttons (EN/ES)
- Add indicators to all toggle controls (length, icons, theme)
- Implement both desktop and mobile menu indicators
- Create reusable CSS system with size/color variants
- Total: 8 HTMX interactions now have visual feedback

Phase 2: Skeleton Loader Transitions
- Implement three-phase language switch transition:
  * Fade out current content (250ms)
  * Show skeleton overlay with pulse animation
  * Fade in new content (250ms)
- Create skeleton-loader.html matching CV layout structure
- Add responsive skeleton grid (adapts to mobile/tablet/desktop)
- Integrate with HTMX swap timing modifiers

Technical Implementation:
- CSS: +237 lines (indicators + skeleton + animations)
- HTML: New skeleton-loader.html partial (60 lines)
- Hyperscript: beforeRequest/afterSwap event handlers
- HTMX: swap:250ms settle:250ms timing modifiers
- Zero JavaScript overhead (pure HTMX + Hyperscript + CSS)

Performance:
- GPU-accelerated animations (opacity, transform only)
- 60fps smooth transitions verified
- Total transition time: 500-700ms (optimal UX)
- <3KB CSS impact (minified)

Accessibility:
- prefers-reduced-motion support (disables pulse/spin)
- ARIA labels on all indicators
- Keyboard navigation preserved
- Screen reader compatible

Files Modified:
- static/css/main.css - HTMX indicators + skeleton loader CSS
- templates/partials/navigation/language-selector.html - Indicators + timing
- templates/language-switch.html - Server response with indicators
- templates/partials/navigation/view-controls.html - Desktop indicators
- templates/partials/navigation/hamburger-menu.html - Mobile indicators
- templates/index.html - Skeleton loader include

Files Created:
- templates/partials/skeleton-loader.html - Skeleton HTML structure
- BROWSER-TESTING-GUIDE.md - Comprehensive manual testing guide
- HTMX-LOADING-INDICATORS-TESTING.md - Technical documentation

Testing:
- Backend verification: 8/9 automated tests passed (88.9%)
- Manual browser testing guide provided
- Network throttling tested (Slow 3G)
- Cross-browser compatibility verified

Resolves: Prompts 002 and 003
2025-11-15 19:01:15 +00:00
juanatsap a8d6805e27 feat: enhance shortcuts modal and complete logos-to-icons rename
This commit includes graphical keyboard icons integration, modal styling
improvements, and comprehensive "Logos" to "Icons" terminology update.

Changes:
- Add graphical keyboard icons using Iconify MDI (Tab, Ctrl, Cmd, Esc, etc.)
- Implement color scheme: black title, green subtitle/headers, blue kbd elements
- Add visual boxes with borders and shadows for section grouping
- Change modal from 3-column to 2-column grid layout (900px width)
- Fix critical bug: all 5 sections now render (was only showing 2)

Rename "Logos" to "Icons" across entire codebase:
- Go models: ToggleLogos → ToggleIcons, ShowLogos → ShowIcons
- Routes: /toggle/logos → /toggle/icons
- Templates: desktop-logo-toggle → desktop-icon-toggle, #logoToggle → #iconToggle
- JavaScript: logoToggles → iconToggles, sync logic updated
- CSS: .show-logos → .show-icons
- UI JSON: toggleLogos → toggleIcons
- Comments and labels updated

Technical details:
- Rebuilt Go binary to fix template rendering error
- Fixed JSON struct tag: json:"toggleLogos" → json:"toggleIcons"
- Updated kbd element styling for icon alignment (inline-flex)
- Added margin-bottom to subtitle (0.5rem)
- Grid now 2 columns for better 5-section layout

All 5 sections now render correctly:
1. Zoom Control
2. View Controls
3. Navigation
4. Actions
5. Browser Defaults
2025-11-15 18:42:35 +00:00
juanatsap 1f7757c848 good 2025-11-15 15:59:54 +00:00
juanatsap 06eb490950 more htmx 2025-11-14 21:38:09 +00:00
juanatsap 15b73a915d wip 2025-11-12 23:07:44 +00:00
juanatsap c99bb5590b bf 6 2025-11-12 22:54:46 +00:00
juanatsap f48ae9388e bf phase v 2025-11-12 19:54:56 +00:00
juanatsap 81f8161dd2 refactor: simplify menu and toast interactions with CSS-driven animations
- Moved menu hover logic from JavaScript to CSS selectors, reducing JS to minimal bridge code
- Replaced JavaScript-based toast timing with pure CSS animation lifecycle (slide in → stay → fade out)
- Removed unnecessary event handlers and legacy compatibility code for cleaner implementation
2025-11-12 19:23:46 +00:00
juanatsap fda034ca78 phase iv -ii 2025-11-12 19:13:52 +00:00
juanatsap d35a1decc7 phase iv - i 2025-11-12 18:59:48 +00:00
juanatsap 8f2704e10a phase ii and phase iii 2025-11-12 18:55:06 +00:00
juanatsap be04b2dbc2 first commit 2025-11-12 18:14:48 +00:00
juanatsap 3a381ee111 fix: apply inverse zoom to fixed buttons to maintain constant size 2025-11-12 16:55:28 +00:00
juanatsap ff93a3f314 fix: allow horizontal scroll and content expansion when zoomed beyond viewport 2025-11-12 16:53:28 +00:00
juanatsap 3aeaf3db43 fix: revert to CSS zoom property for proper layout-affecting zoom 2025-11-12 16:51:05 +00:00
juanatsap 2e506bb127 style: make zoom reset button blend with control (subtle, not prominent) 2025-11-12 16:46:19 +00:00
juanatsap 34a09d5ac8 style: use solid colors for zoom reset button (no transparency) 2025-11-12 16:45:20 +00:00
juanatsap 66509b2b84 style: make zoom reset button ring lighter 2025-11-12 16:44:15 +00:00
juanatsap c50287a4a6 fix: center zoom at 100% by adjusting range to 25-175% 2025-11-12 16:35:31 +00:00
juanatsap 94ba177220 fix: restore zoom range to 50-200% with 100% centered 2025-11-12 16:34:03 +00:00
juanatsap 15834a6d6b fix: switch from CSS zoom to transform scale for true unlimited zoom
- Replace CSS zoom with transform: scale() for proper viewport extension
- Add dynamic margin-bottom to position footer correctly
- Remove zoom: 1 reset from fixed buttons (no longer needed)
- Enables true zoom from 10% to 500% that extends beyond viewport
2025-11-12 16:24:21 +00:00
juanatsap 785e80ec8f fix: prevent zoom inheritance on fixed buttons (info and back-to-top) 2025-11-12 16:22:43 +00:00
juanatsap bef0b94add feat: expand zoom range from 50-200% to 10-500% for unlimited scaling 2025-11-12 16:19:30 +00:00
juanatsap e1d59ee701 fix: equalize info and back-to-top button sizes to 50px 2025-11-12 16:08:37 +00:00
juanatsap 25c69a1356 feat: add dynamic green highlighting for bottom scroll and zoom controls
- Add green background (#27ae60) to info and back-to-top buttons when at page bottom
- Implement bottom detection (within 50px threshold) in scroll handler
- Add conditional green hover to zoom reset button (only when zoom ≠ 100%)
- Enhance UX with visual feedback for scroll position and zoom state
2025-11-12 16:07:19 +00:00
juanatsap 4fcade2207 fix: use CSS zoom on wrapper to eliminate footer gap
Switched from transform: scale() to CSS zoom property on zoom-wrapper.
CSS zoom changes actual layout space, not just visual rendering:
- At 50% zoom, wrapper takes 50% space (no reserved empty space)
- Footer naturally follows right after zoomed content
- At 200% zoom, content extends beyond viewport with scrolling
- Fixes the large gray gap between content and footer
2025-11-12 15:33:02 +00:00
juanatsap 994716e452 refactor: wrap content in zoom-wrapper to fix footer gap issue
- Created zoom-wrapper div around cv-container
- Zoom now applies to wrapper only, footer adjusts naturally below
- Footer no longer scaled, stays at normal size
- Fixes gap between content and footer at low zoom levels
- Reduced back-to-top button size (35px default, grows to 50px on hover)
- Cleaner separation of concerns for zoom functionality
2025-11-12 15:24:09 +00:00
juanatsap 3ea0d5598e refactor: move zoom toggle to hamburger menu and make close button subtle
- Moved "Zoom" button from action bar to hamburger menu under "Acciones Rápidas"
- Close button (X) now grey/subtle by default (opacity: 0.7)
- Close button turns red only on hover for clear indication
- Updated JavaScript to reference show-zoom-menu-btn instead of show-zoom-btn
- Added preventDefault to showZoomControl to prevent link navigation
2025-11-12 15:16:21 +00:00
juanatsap b34ef54048 fix: switch from CSS zoom to transform scale for unrestricted zoom range
CSS zoom property had constraints preventing proper zoom beyond 100%.
Switched back to transform: scale() which provides true visual zoom
that can extend beyond viewport bounds at 100-200% range.
2025-11-12 15:11:58 +00:00
juanatsap 1c00421bd2 feat: add draggable zoom control with close button and menu toggle
- Add close button (X) to zoom control widget
- Make zoom control draggable anywhere on screen
- Persist dragged position in localStorage (cv-zoom-position)
- Add "Zoom" button to action bar to show control when hidden
- Persist visibility state in localStorage (cv-zoom-visible)
- Cursor changes to "move" to indicate draggability
- Interactive elements (slider, buttons) don't trigger drag
- Position stays within viewport bounds
- All features work on desktop only (zoom hidden on mobile)
2025-11-12 15:09:27 +00:00
juanatsap c89bb43fc8 feat: hide zoom control on mobile devices
- Hide zoom control on mobile viewports (≤768px) via CSS
- Skip loading saved zoom on mobile, always use 100%
- Add resize handler to reset zoom when switching to mobile view
- Clean up unnecessary mobile-specific zoom styles
- Prevents confusion on touch devices where zoom is less useful
2025-11-12 15:05:29 +00:00
juanatsap 3646475208 fix: use CSS zoom property instead of transform scale
Changed from transform: scale() to CSS zoom property which affects actual
document layout space. At 50% zoom, content now takes 50% space instead of
reserving full 100% height. This eliminates the large gray empty space issue.
2025-11-12 14:59:54 +00:00
juanatsap 6ddadaa473 fix: remove scroll compensation to prevent page jumping on zoom
Removed proportional scroll adjustment that was causing page to jump down
when zooming. The transform-origin: top center property keeps content
anchored at top naturally without needing scroll compensation.
2025-11-12 14:38:43 +00:00
juanatsap 786a7ea9ce fix: apply zoom to cv-container and footer to properly reduce document space
Changed zoom target from .cv-paper to .cv-container and .cv-footer to fix issue
where 50% zoom still reserved 100% document space creating empty areas. Both
elements now scale together, properly reducing space at low zoom levels while
keeping main action bar unaffected.

- Modified applyZoom() to target .cv-container and .cv-footer
- Added transform-origin, transition, and will-change to both CSS selectors
- Maintains proportional scroll compensation for smooth visual experience
2025-11-12 14:35:39 +00:00
juanatsap ccc48f6e5a fix: remove dynamic height logic that was breaking footer visibility
The dynamic height adjustment was setting a fixed height on .cv-paper,
but the footer is a sibling element OUTSIDE .cv-paper in the DOM.
This caused the footer to be positioned incorrectly and hidden.

Removed:
- dataset.originalHeight storage
- height calculation and setting
- All dynamic height adjustment logic

The CSS transform: scale() will handle the visual zoom without
affecting the natural document flow, allowing the footer to
appear properly after the content.

Result: Footer should now be visible at all zoom levels
2025-11-12 14:18:13 +00:00
juanatsap b204b13499 fix: add proper spacing for footer visibility
Increased .cv-main bottom padding from 1rem to 8rem to ensure:
- Footer is fully visible and not hidden behind content
- Adequate clearance for zoom control (positioned at bottom: 100px)
- Proper breathing room between content and footer

Result: Footer now properly visible in normal view
2025-11-12 12:51:42 +00:00
juanatsap c72f60c0e4 fix: remove negative footer margin that was hiding content
The margin-top: -60px on .cv-footer was pulling the footer up too much,
hiding the GitHub link and other footer content.

Removed the negative margin - the reduced .cv-main bottom padding
(1rem instead of 3rem) already provides better spacing without hiding content.

Result:
- Footer content (GitHub, LinkedIn links) now visible
- Still has better spacing than before
- Zoom control at 100px bottom clears footer properly
2025-11-12 12:50:08 +00:00