|
38 | 38 | let heroIconRef = $state<HTMLButtonElement | null>(null); |
39 | 39 | let isFlying = $derived(flyingAirplanes.length > 0); |
40 | 40 |
|
41 | | - let scrollY = $state(0); |
42 | 41 | let featuresRef = $state<HTMLElement | null>(null); |
43 | 42 | let createRef = $state<HTMLElement | null>(null); |
44 | 43 | let featuresVisible = $state(false); |
45 | 44 | let createVisible = $state(false); |
46 | | - let pageReady = $state(false); |
| 45 | + let heroHidden = $state(false); |
47 | 46 |
|
48 | 47 | function spawnFlyingAirplane() { |
49 | 48 | if (!heroIconRef || isFlying) return; |
|
67 | 66 |
|
68 | 67 | onMount(() => { |
69 | 68 | resetDemoMode(); |
70 | | - pageReady = true; |
71 | 69 |
|
72 | 70 | recentItineraries = auth.getRecentItineraries(); |
73 | 71 | showRecent = true; |
|
78 | 76 |
|
79 | 77 | const handleScroll = () => { |
80 | 78 | showScrollButton = window.scrollY > 300; |
81 | | - scrollY = window.scrollY; |
| 79 | + heroHidden = window.scrollY > 400; |
82 | 80 | }; |
83 | 81 | window.addEventListener("scroll", handleScroll, { passive: true }); |
84 | 82 |
|
|
119 | 117 | auth.removeFromHistory(id); |
120 | 118 | recentItineraries = auth.getRecentItineraries(); |
121 | 119 | } |
122 | | -
|
123 | | - let heroParallax = $derived(scrollY * 0.3); |
124 | | - let heroOpacity = $derived(Math.max(0, 1 - scrollY / 600)); |
125 | 120 | </script> |
126 | 121 |
|
127 | 122 | <svelte:head> |
128 | 123 | <title>たびたび - 旅のしおり作成アプリ</title> |
129 | 124 | </svelte:head> |
130 | 125 |
|
131 | | -<div class="home-page" class:page-ready={pageReady}> |
| 126 | +<div class="home-page"> |
132 | 127 | {#each flyingAirplanes as id (id)} |
133 | 128 | {@const pos = getHeroIconPosition()} |
134 | 129 | <FlyingAirplane |
|
138 | 133 | /> |
139 | 134 | {/each} |
140 | 135 |
|
141 | | - <section |
142 | | - class="hero" |
143 | | - style="transform: translateY({heroParallax}px); opacity: {heroOpacity};" |
144 | | - > |
| 136 | + <section class="hero" class:hero-hidden={heroHidden}> |
145 | 137 | <div class="hero-bg-decoration"> |
146 | 138 | <div class="bg-circle bg-circle-1"></div> |
147 | 139 | <div class="bg-circle bg-circle-2"></div> |
|
310 | 302 | justify-content: center; |
311 | 303 | padding: 1.5rem 1rem; |
312 | 304 | position: relative; |
313 | | - will-change: transform, opacity; |
| 305 | + transition: opacity 0.3s ease-out; |
| 306 | + } |
| 307 | +
|
| 308 | + .hero.hero-hidden { |
| 309 | + opacity: 0; |
| 310 | + pointer-events: none; |
314 | 311 | } |
315 | 312 |
|
316 | 313 | .hero-bg-decoration { |
|
341 | 338 | } |
342 | 339 |
|
343 | 340 | .animate-slide-up { |
344 | | - animation: slideUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; |
| 341 | + animation: slideUp 0.5s ease-out forwards; |
345 | 342 | } |
346 | 343 |
|
347 | 344 | .animate-delay-1 { |
348 | | - animation-delay: 0.15s; |
| 345 | + animation-delay: 0.1s; |
349 | 346 | opacity: 0; |
350 | 347 | } |
351 | 348 |
|
352 | 349 | @keyframes slideUp { |
353 | 350 | from { |
354 | 351 | opacity: 0; |
355 | | - transform: translateY(30px); |
| 352 | + transform: translateY(20px); |
356 | 353 | } |
357 | 354 | to { |
358 | 355 | opacity: 1; |
|
550 | 547 | margin-bottom: 2.5rem; |
551 | 548 | opacity: 1; |
552 | 549 | transform: translateY(0); |
553 | | - transition: all 0.6s cubic-bezier(0.16, 1, 0.3, 1); |
| 550 | + transition: |
| 551 | + opacity 0.4s ease-out, |
| 552 | + transform 0.4s ease-out; |
554 | 553 | position: relative; |
555 | 554 | z-index: 1; |
556 | 555 | } |
557 | 556 |
|
558 | 557 | @media (min-width: 769px) { |
559 | 558 | .section-header { |
560 | 559 | opacity: 0; |
561 | | - transform: translateY(20px); |
| 560 | + transform: translateY(15px); |
562 | 561 | } |
563 | 562 |
|
564 | 563 | .section-visible .section-header { |
|
652 | 651 | .feature-item { |
653 | 652 | opacity: 1; |
654 | 653 | transform: translateY(0); |
655 | | - transition: all 0.6s cubic-bezier(0.16, 1, 0.3, 1); |
| 654 | + transition: |
| 655 | + opacity 0.4s ease-out, |
| 656 | + transform 0.4s ease-out; |
656 | 657 | } |
657 | 658 |
|
658 | 659 | @media (min-width: 769px) { |
659 | 660 | .feature-item { |
660 | 661 | opacity: 0; |
661 | | - transform: translateY(30px); |
| 662 | + transform: translateY(20px); |
662 | 663 | } |
663 | 664 |
|
664 | 665 | .section-visible .feature-item { |
|
668 | 669 | } |
669 | 670 |
|
670 | 671 | .feature-delay-0 { |
671 | | - transition-delay: 0.1s; |
| 672 | + transition-delay: 0s; |
672 | 673 | } |
673 | 674 | .feature-delay-1 { |
674 | | - transition-delay: 0.2s; |
| 675 | + transition-delay: 0.05s; |
675 | 676 | } |
676 | 677 | .feature-delay-2 { |
677 | | - transition-delay: 0.3s; |
| 678 | + transition-delay: 0.1s; |
678 | 679 | } |
679 | 680 | .feature-delay-3 { |
680 | | - transition-delay: 0.4s; |
| 681 | + transition-delay: 0.15s; |
681 | 682 | } |
682 | 683 |
|
683 | 684 | .hero-preview { |
|
722 | 723 |
|
723 | 724 | .create-form-wrapper { |
724 | 725 | opacity: 1; |
725 | | - transform: translateY(0) scale(1); |
726 | | - transition: all 0.7s cubic-bezier(0.16, 1, 0.3, 1); |
| 726 | + transform: translateY(0); |
| 727 | + transition: |
| 728 | + opacity 0.4s ease-out, |
| 729 | + transform 0.4s ease-out; |
727 | 730 | } |
728 | 731 |
|
729 | 732 | @media (min-width: 769px) { |
730 | 733 | .create-form-wrapper { |
731 | 734 | opacity: 0; |
732 | | - transform: translateY(30px) scale(0.98); |
| 735 | + transform: translateY(20px); |
733 | 736 | } |
734 | 737 |
|
735 | 738 | .section-visible .create-form-wrapper { |
736 | 739 | opacity: 1; |
737 | | - transform: translateY(0) scale(1); |
| 740 | + transform: translateY(0); |
738 | 741 | } |
739 | 742 | } |
740 | 743 |
|
741 | 744 | .recent-wrapper { |
742 | 745 | opacity: 1; |
743 | 746 | transform: translateY(0); |
744 | | - transition: all 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.2s; |
| 747 | + transition: |
| 748 | + opacity 0.4s ease-out 0.1s, |
| 749 | + transform 0.4s ease-out 0.1s; |
745 | 750 | } |
746 | 751 |
|
747 | 752 | @media (min-width: 769px) { |
748 | 753 | .recent-wrapper { |
749 | 754 | opacity: 0; |
750 | | - transform: translateY(20px); |
| 755 | + transform: translateY(15px); |
751 | 756 | } |
752 | 757 |
|
753 | 758 | .section-visible .recent-wrapper { |
|
756 | 761 | } |
757 | 762 | } |
758 | 763 |
|
759 | | - .home-page { |
760 | | - opacity: 1; |
761 | | - } |
762 | | -
|
763 | | - .home-page.page-ready { |
764 | | - animation: fadeIn 0.4s ease-out forwards; |
765 | | - } |
766 | | -
|
767 | | - @keyframes fadeIn { |
768 | | - to { |
769 | | - opacity: 1; |
770 | | - } |
771 | | - } |
772 | | -
|
773 | 764 | @media (prefers-reduced-motion: reduce) { |
774 | | - .home-page.page-ready, |
775 | 765 | .animate-slide-up { |
776 | 766 | animation: none !important; |
777 | 767 | } |
|
780 | 770 | opacity: 1 !important; |
781 | 771 | } |
782 | 772 |
|
783 | | - .hero { |
784 | | - will-change: auto; |
785 | | - } |
786 | | -
|
787 | 773 | .feature-item, |
788 | 774 | .section-header, |
789 | 775 | .create-form-wrapper, |
|
0 commit comments