Przeglądaj źródła

Merge branch 'master' of http://git.fmode.cn:3000/AAA/cloth-color11

0235966 2 tygodni temu
rodzic
commit
47419916ef
100 zmienionych plików z 5121 dodań i 167 usunięć
  1. 38 39
      cloth-dit-web/src/modules/cloth/color/page/pages-community/pages-community/pages-community.html
  2. 221 8
      cloth-dit-web/src/modules/cloth/color/page/pages-community/pages-community/pages-community.scss
  3. 27 2
      cloth-dit-web/src/modules/cloth/color/page/pages-community/pages-community/pages-community.ts
  4. 34 13
      cloth-dit-web/src/modules/cloth/color/page/pages-my-space/pages-my-space/pages-my-space.html
  5. 40 0
      cloth-dit-web/src/modules/cloth/color/page/pages-my-space/pages-my-space/pages-my-space.scss
  6. 30 12
      cloth-dit-web/src/modules/cloth/color/page/pages-my-space/pages-my-space/pages-my-space.ts
  7. 36 7
      cloth-dit-web/src/modules/cloth/color/pages-fitting-room/pages-fitting-room/pages-fitting-room.html
  8. 314 79
      cloth-dit-web/src/modules/cloth/color/pages-fitting-room/pages-fitting-room/pages-fitting-room.scss
  9. 68 7
      cloth-dit-web/src/modules/cloth/color/pages-fitting-room/pages-fitting-room/pages-fitting-room.ts
  10. 32 0
      node_modules/.package-lock.json
  11. 21 0
      node_modules/@types/swiper/LICENSE
  12. 16 0
      node_modules/@types/swiper/README.md
  13. 1684 0
      node_modules/@types/swiper/index.d.ts
  14. 312 0
      node_modules/@types/swiper/js/swiper.esm.d.ts
  15. 60 0
      node_modules/@types/swiper/package.json
  16. 20 0
      node_modules/swiper/LICENSE
  17. 11 0
      node_modules/swiper/README.md
  18. 9 0
      node_modules/swiper/modules/a11y-element.css
  19. 1 0
      node_modules/swiper/modules/a11y-element.min.css
  20. 9 0
      node_modules/swiper/modules/a11y.css
  21. 9 0
      node_modules/swiper/modules/a11y.less
  22. 1 0
      node_modules/swiper/modules/a11y.min.css
  23. 0 0
      node_modules/swiper/modules/a11y.min.mjs
  24. 0 0
      node_modules/swiper/modules/a11y.min.mjs.map
  25. 377 0
      node_modules/swiper/modules/a11y.mjs
  26. 9 0
      node_modules/swiper/modules/a11y.scss
  27. 0 0
      node_modules/swiper/modules/autoplay-element.css
  28. 0 0
      node_modules/swiper/modules/autoplay-element.min.css
  29. 0 0
      node_modules/swiper/modules/autoplay.css
  30. 0 0
      node_modules/swiper/modules/autoplay.less
  31. 0 0
      node_modules/swiper/modules/autoplay.min.css
  32. 0 0
      node_modules/swiper/modules/autoplay.min.mjs
  33. 0 0
      node_modules/swiper/modules/autoplay.min.mjs.map
  34. 304 0
      node_modules/swiper/modules/autoplay.mjs
  35. 0 0
      node_modules/swiper/modules/autoplay.scss
  36. 0 0
      node_modules/swiper/modules/controller-element.css
  37. 0 0
      node_modules/swiper/modules/controller-element.min.css
  38. 0 0
      node_modules/swiper/modules/controller.css
  39. 0 0
      node_modules/swiper/modules/controller.less
  40. 0 0
      node_modules/swiper/modules/controller.min.css
  41. 0 0
      node_modules/swiper/modules/controller.min.mjs
  42. 0 0
      node_modules/swiper/modules/controller.min.mjs.map
  43. 191 0
      node_modules/swiper/modules/controller.mjs
  44. 0 0
      node_modules/swiper/modules/controller.scss
  45. 9 0
      node_modules/swiper/modules/effect-cards-element.css
  46. 1 0
      node_modules/swiper/modules/effect-cards-element.min.css
  47. 9 0
      node_modules/swiper/modules/effect-cards.css
  48. 10 0
      node_modules/swiper/modules/effect-cards.less
  49. 1 0
      node_modules/swiper/modules/effect-cards.min.css
  50. 0 0
      node_modules/swiper/modules/effect-cards.min.mjs
  51. 0 0
      node_modules/swiper/modules/effect-cards.min.mjs.map
  52. 128 0
      node_modules/swiper/modules/effect-cards.mjs
  53. 10 0
      node_modules/swiper/modules/effect-cards.scss
  54. 0 0
      node_modules/swiper/modules/effect-coverflow-element.css
  55. 0 0
      node_modules/swiper/modules/effect-coverflow-element.min.css
  56. 0 0
      node_modules/swiper/modules/effect-coverflow.css
  57. 2 0
      node_modules/swiper/modules/effect-coverflow.less
  58. 0 0
      node_modules/swiper/modules/effect-coverflow.min.css
  59. 0 0
      node_modules/swiper/modules/effect-coverflow.min.mjs
  60. 0 0
      node_modules/swiper/modules/effect-coverflow.min.mjs.map
  61. 104 0
      node_modules/swiper/modules/effect-coverflow.mjs
  62. 2 0
      node_modules/swiper/modules/effect-coverflow.scss
  63. 6 0
      node_modules/swiper/modules/effect-creative-element.css
  64. 1 0
      node_modules/swiper/modules/effect-creative-element.min.css
  65. 6 0
      node_modules/swiper/modules/effect-creative.css
  66. 7 0
      node_modules/swiper/modules/effect-creative.less
  67. 1 0
      node_modules/swiper/modules/effect-creative.min.css
  68. 0 0
      node_modules/swiper/modules/effect-creative.min.mjs
  69. 0 0
      node_modules/swiper/modules/effect-creative.min.mjs.map
  70. 146 0
      node_modules/swiper/modules/effect-creative.mjs
  71. 7 0
      node_modules/swiper/modules/effect-creative.scss
  72. 53 0
      node_modules/swiper/modules/effect-cube-element.css
  73. 1 0
      node_modules/swiper/modules/effect-cube-element.min.css
  74. 62 0
      node_modules/swiper/modules/effect-cube.css
  75. 71 0
      node_modules/swiper/modules/effect-cube.less
  76. 1 0
      node_modules/swiper/modules/effect-cube.min.css
  77. 0 0
      node_modules/swiper/modules/effect-cube.min.mjs
  78. 0 0
      node_modules/swiper/modules/effect-cube.min.mjs.map
  79. 174 0
      node_modules/swiper/modules/effect-cube.mjs
  80. 71 0
      node_modules/swiper/modules/effect-cube.scss
  81. 16 0
      node_modules/swiper/modules/effect-fade-element.css
  82. 1 0
      node_modules/swiper/modules/effect-fade-element.min.css
  83. 16 0
      node_modules/swiper/modules/effect-fade.css
  84. 20 0
      node_modules/swiper/modules/effect-fade.less
  85. 1 0
      node_modules/swiper/modules/effect-fade.min.css
  86. 2 0
      node_modules/swiper/modules/effect-fade.min.mjs
  87. 1 0
      node_modules/swiper/modules/effect-fade.min.mjs.map
  88. 66 0
      node_modules/swiper/modules/effect-fade.mjs
  89. 20 0
      node_modules/swiper/modules/effect-fade.scss
  90. 17 0
      node_modules/swiper/modules/effect-flip-element.css
  91. 1 0
      node_modules/swiper/modules/effect-flip-element.min.css
  92. 26 0
      node_modules/swiper/modules/effect-flip.css
  93. 30 0
      node_modules/swiper/modules/effect-flip.less
  94. 1 0
      node_modules/swiper/modules/effect-flip.min.css
  95. 0 0
      node_modules/swiper/modules/effect-flip.min.mjs
  96. 0 0
      node_modules/swiper/modules/effect-flip.min.mjs.map
  97. 111 0
      node_modules/swiper/modules/effect-flip.mjs
  98. 30 0
      node_modules/swiper/modules/effect-flip.scss
  99. 4 0
      node_modules/swiper/modules/free-mode-element.css
  100. 1 0
      node_modules/swiper/modules/free-mode-element.min.css

+ 38 - 39
cloth-dit-web/src/modules/cloth/color/page/pages-community/pages-community/pages-community.html

@@ -1,8 +1,7 @@
-<p>pages-community works!</p>
 <div class="community-page">
   <div class="community-header">
     <h1>设计社区</h1>
-    <p>与全球设计师交流创意</p>
+    <p class="header-subtitle">与全球设计师交流创意</p>
     <div class="community-stats">
       <div class="stat-item">
         <div class="stat-number">12.8k</div>
@@ -20,61 +19,61 @@
   </div>
 
   <main class="main-content">
-    <div style="margin: 20px;">
+    <div class="content-container">
       <!-- 热门话题 -->
-      <div style="background: white; border-radius: 15px; padding: 20px; margin-bottom: 20px; box-shadow: 0 5px 20px rgba(0,0,0,0.1);">
-        <h4 style="margin-bottom: 15px; font-size: 16px;">🔥 热门话题</h4>
-        <div style="display: flex; flex-wrap: wrap; gap: 8px;">
-          <span style="background: #ff6b6b; color: white; padding: 6px 12px; border-radius: 20px; font-size: 12px; cursor: pointer;">#春季时尚</span>
-          <span style="background: #4ecdc4; color: white; padding: 6px 12px; border-radius: 20px; font-size: 12px; cursor: pointer;">#环保设计</span>
-          <span style="background: #45b7d1; color: white; padding: 6px 12px; border-radius: 20px; font-size: 12px; cursor: pointer;">#极简主义</span>
-          <span style="background: #96ceb4; color: white; padding: 6px 12px; border-radius: 20px; font-size: 12px; cursor: pointer;">#复古回潮</span>
+      <div class="content-card">
+        <h4 class="card-title">🔥 热门话题</h4>
+        <div class="tags-container">
+          <span class="tag tag-fashion">#春季时尚</span>
+          <span class="tag tag-eco">#环保设计</span>
+          <span class="tag tag-minimal">#极简主义</span>
+          <span class="tag tag-vintage">#复古回潮</span>
         </div>
       </div>
 
       <!-- 设计师排行榜 -->
-      <div style="background: white; border-radius: 15px; padding: 20px; margin-bottom: 20px; box-shadow: 0 5px 20px rgba(0,0,0,0.1);">
-        <h4 style="margin-bottom: 15px; font-size: 16px;">🏆 本周设计师排行</h4>
-        <div style="display: flex; flex-direction: column; gap: 12px;">
-          <div style="display: flex; align-items: center; justify-content: space-between; padding: 10px; background: #f8f9fa; border-radius: 10px;">
-            <div style="display: flex; align-items: center; gap: 12px;">
-              <div style="width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(45deg, #ff6b6b, #ffa726); display: flex; align-items: center; justify-content: center; color: white; font-weight: bold;">1</div>
-              <div>
-                <div style="font-weight: 600; font-size: 14px;">设计大师Alex</div>
-                <div style="font-size: 12px; color: #666;">点赞数: 8.9k</div>
+      <div class="content-card">
+        <h4 class="card-title">🏆 本周设计师排行</h4>
+        <div class="ranking-list">
+          <div class="ranking-item">
+            <div class="ranking-info">
+              <div class="rank-avatar rank-1">1</div>
+              <div class="ranking-details">
+                <div class="designer-name">设计大师Alex</div>
+                <div class="designer-likes">点赞数: 8.9k</div>
               </div>
             </div>
-            <div style="font-size: 20px;">👑</div>
+            <div class="rank-crown">👑</div>
           </div>
-          <div style="display: flex; align-items: center; justify-content: space-between; padding: 10px; background: #f8f9fa; border-radius: 10px;">
-            <div style="display: flex; align-items: center; gap: 12px;">
-              <div style="width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(45deg, #4ecdc4, #44a08d); display: flex; align-items: center; justify-content: center; color: white; font-weight: bold;">2</div>
-              <div>
-                <div style="font-weight: 600; font-size: 14px;">时尚达人Lisa</div>
-                <div style="font-size: 12px; color: #666;">点赞数: 7.2k</div>
+          <div class="ranking-item">
+            <div class="ranking-info">
+              <div class="rank-avatar rank-2">2</div>
+              <div class="ranking-details">
+                <div class="designer-name">时尚达人Lisa</div>
+                <div class="designer-likes">点赞数: 7.2k</div>
               </div>
             </div>
-            <div style="font-size: 20px;">🥈</div>
+            <div class="rank-medal">🥈</div>
           </div>
-          <div style="display: flex; align-items: center; justify-content: space-between; padding: 10px; background: #f8f9fa; border-radius: 10px;">
-            <div style="display: flex; align-items: center; gap: 12px;">
-              <div style="width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(45deg, #667eea, #764ba2); display: flex; align-items: center; justify-content: center; color: white; font-weight: bold;">3</div>
-              <div>
-                <div style="font-weight: 600; font-size: 14px;">创意师Mike</div>
-                <div style="font-size: 12px; color: #666;">点赞数: 5.8k</div>
+          <div class="ranking-item">
+            <div class="ranking-info">
+              <div class="rank-avatar rank-3">3</div>
+              <div class="ranking-details">
+                <div class="designer-name">创意师Mike</div>
+                <div class="designer-likes">点赞数: 5.8k</div>
               </div>
             </div>
-            <div style="font-size: 20px;">🥉</div>
+            <div class="rank-medal">🥉</div>
           </div>
         </div>
       </div>
 
       <!-- 最新作品 -->
-      <div style="background: white; border-radius: 15px; padding: 20px; box-shadow: 0 5px 20px rgba(0,0,0,0.1);">
-        <h4 style="margin-bottom: 15px; font-size: 16px;">✨ 最新作品</h4>
-        <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px;">
-          <div style="background: linear-gradient(45deg, #a8edea 0%, #fed6e3 100%); border-radius: 12px; height: 120px; display: flex; align-items: center; justify-content: center; font-size: 36px; cursor: pointer; transition: all 0.3s ease;" (click)="likeWork($event)">🌸</div>
-          <div style="background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); border-radius: 12px; height: 120px; display: flex; align-items: center; justify-content: center; font-size: 36px; cursor: pointer; transition: all 0.3s ease;" (click)="likeWork($event)">⚡</div>
+      <div class="content-card">
+        <h4 class="card-title">✨ 最新作品</h4>
+        <div class="works-grid">
+          <div class="work-item work-1" (click)="likeWork($event)">🌸</div>
+          <div class="work-item work-2" (click)="likeWork($event)">⚡</div>
         </div>
       </div>
     </div>

+ 221 - 8
cloth-dit-web/src/modules/cloth/color/page/pages-community/pages-community/pages-community.scss

@@ -1,36 +1,249 @@
 .community-page {
-  display: block;
+  display: flex;
+  flex-direction: column;
+  min-height: 100vh;
+  background-color: #f5f7fa;
 }
 
 .community-header {
   background: linear-gradient(45deg, #667eea 0%, #764ba2 100%);
-  padding: 20px;
+  padding: 30px 20px;
   color: white;
   text-align: center;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+
+  h1 {
+    margin: 0;
+    font-size: 2.2rem;
+    font-weight: 700;
+  }
+
+  .header-subtitle {
+    margin: 8px 0 0;
+    font-size: 1rem;
+    opacity: 0.9;
+  }
 }
 
 .community-stats {
   display: flex;
   justify-content: space-around;
-  margin: 20px 0;
+  max-width: 600px;
+  margin: 30px auto 0;
+  padding: 15px 0;
+  background-color: rgba(255, 255, 255, 0.15);
+  border-radius: 12px;
 }
 
 .stat-item {
   text-align: center;
+  padding: 0 15px;
 }
 
 .stat-number {
-  font-size: 24px;
+  font-size: 1.8rem;
   font-weight: 700;
+  line-height: 1.2;
 }
 
 .stat-label {
-  font-size: 12px;
-  opacity: 0.8;
+  font-size: 0.75rem;
+  opacity: 0.85;
+  margin-top: 4px;
 }
 
 .main-content {
   flex: 1;
-  overflow-y: auto;
-  padding-bottom: 80px;
+  padding: 20px 0 40px;
+}
+
+.content-container {
+  max-width: 800px;
+  margin: 0 auto;
+  padding: 0 20px;
+}
+
+.content-card {
+  background: white;
+  border-radius: 16px;
+  padding: 20px;
+  margin-bottom: 20px;
+  box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08);
+  transition: transform 0.2s ease, box-shadow 0.2s ease;
+
+  &:hover {
+    transform: translateY(-2px);
+    box-shadow: 0 8px 25px rgba(0, 0, 0, 0.12);
+  }
+}
+
+.card-title {
+  margin: 0 0 15px;
+  font-size: 1.1rem;
+  font-weight: 600;
+  color: #333;
+}
+
+.tags-container {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+
+.tag {
+  padding: 6px 12px;
+  border-radius: 20px;
+  font-size: 0.75rem;
+  cursor: pointer;
+  transition: all 0.2s ease;
+  color: white;
+  font-weight: 500;
+
+  &:hover {
+    transform: scale(1.05);
+    opacity: 0.9;
+  }
+
+  &.tag-fashion {
+    background: #ff6b6b;
+  }
+
+  &.tag-eco {
+    background: #4ecdc4;
+  }
+
+  &.tag-minimal {
+    background: #45b7d1;
+  }
+
+  &.tag-vintage {
+    background: #96ceb4;
+  }
+}
+
+.ranking-list {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+}
+
+.ranking-item {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 12px;
+  background: #f8f9fa;
+  border-radius: 12px;
+  transition: background 0.2s ease;
+
+  &:hover {
+    background: #e9ecef;
+  }
+}
+
+.ranking-info {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+}
+
+.rank-avatar {
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: white;
+  font-weight: bold;
+  font-size: 1rem;
+
+  &.rank-1 {
+    background: linear-gradient(45deg, #ff6b6b, #ffa726);
+  }
+
+  &.rank-2 {
+    background: linear-gradient(45deg, #4ecdc4, #44a08d);
+  }
+
+  &.rank-3 {
+    background: linear-gradient(45deg, #667eea, #764ba2);
+  }
+}
+
+.ranking-details {
+  .designer-name {
+    font-weight: 600;
+    font-size: 0.875rem;
+    margin-bottom: 2px;
+  color: #333;
+  }
+
+  .designer-likes {
+    font-size: 0.75rem;
+    color: #666;
+  }
+}
+
+.rank-crown, .rank-medal {
+  font-size: 1.25rem;
+}
+
+.works-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
+  gap: 12px;
+}
+
+.work-item {
+  border-radius: 12px;
+  height: 120px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 2.5rem;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+
+  &:hover {
+    transform: translateY(-3px);
+    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
+  }
+
+  &.work-1 {
+    background: linear-gradient(45deg, #a8edea 0%, #fed6e3 100%);
+  }
+
+  &.work-2 {
+    background: linear-gradient(45deg, #667eea 0%, #764ba2 100%);
+  }
+}
+
+/* 响应式设计 */
+@media (max-width: 600px) {
+  .community-header {
+    padding: 20px 15px;
+
+    h1 {
+      font-size: 1.8rem;
+    }
+  }
+
+  .community-stats {
+    margin: 20px auto 0;
+    padding: 10px 0;
+  }
+
+  .stat-number {
+    font-size: 1.5rem;
+  }
+
+  .content-container {
+    padding: 0 15px;
+  }
+
+  .works-grid {
+    grid-template-columns: 1fr;
+  }
 }

+ 27 - 2
cloth-dit-web/src/modules/cloth/color/page/pages-community/pages-community/pages-community.ts

@@ -9,17 +9,42 @@ import { Component } from '@angular/core';
 export class PagesCommunity {
   likeWork(event: Event) {
     const element = event.target as HTMLElement;
+    
+    // 添加点击动画
     element.style.transform = 'scale(0.95)';
+    element.style.opacity = '0.8';
+    
     setTimeout(() => {
       element.style.transform = 'scale(1)';
+      element.style.opacity = '1';
     }, 150);
     
     this.showNotification('点赞成功', '感谢你的支持!');
   }
 
   private showNotification(title: string, message: string) {
-    // 在这里实现通知逻辑
+    // 在实际应用中,这里可以调用通知服务
     console.log(`${title}: ${message}`);
-    // 在实际应用中,你会使用通知服务或组件
+    
+    // 简单实现一个临时提示
+    const notification = document.createElement('div');
+    notification.style.position = 'fixed';
+    notification.style.bottom = '20px';
+    notification.style.left = '50%';
+    notification.style.transform = 'translateX(-50%)';
+    notification.style.backgroundColor = '#4CAF50';
+    notification.style.color = 'white';
+    notification.style.padding = '12px 24px';
+    notification.style.borderRadius = '4px';
+    notification.style.boxShadow = '0 2px 10px rgba(0,0,0,0.2)';
+    notification.style.zIndex = '1000';
+    notification.style.animation = 'fadeIn 0.3s, fadeOut 0.3s 2.7s';
+    notification.textContent = `${title}: ${message}`;
+    
+    document.body.appendChild(notification);
+    
+    setTimeout(() => {
+      document.body.removeChild(notification);
+    }, 3000);
   }
 }

+ 34 - 13
cloth-dit-web/src/modules/cloth/color/page/pages-my-space/pages-my-space/pages-my-space.html

@@ -1,4 +1,3 @@
-<p>pages-my-space works!</p>
 <div class="profile-page">
   <div class="profile-header">
     <div class="avatar">👤</div>
@@ -7,47 +6,69 @@
   </div>
 
   <div class="profile-menu">
-    <div class="menu-item" (click)="showMyDesigns()">
+    <!-- 我的设计稿 -->
+    <div class="menu-item" (click)="showMyDesigns()" [class.active]="activeMenu === 'my-designs'">
       <div class="menu-left">
         <span class="menu-icon">🎨</span>
         <span>我的设计稿</span>
       </div>
-      <span>></span>
+      <span *ngIf="!isLoading || activeMenu !== 'my-designs'">></span>
+      <span *ngIf="isLoading && activeMenu === 'my-designs'" class="loading">...</span>
     </div>
-    <div class="menu-item" (click)="showTryOnHistory()">
+    
+    <!-- 试穿历史 -->
+    <div class="menu-item" (click)="showTryOnHistory()" [class.active]="activeMenu === 'fitting-history'">
       <div class="menu-left">
         <span class="menu-icon">👕</span>
         <span>试穿历史</span>
       </div>
-      <span>></span>
+      <span *ngIf="!isLoading || activeMenu !== 'fitting-history'">></span>
+      <span *ngIf="isLoading && activeMenu === 'fitting-history'" class="loading">...</span>
     </div>
-    <div class="menu-item" (click)="showOrders()">
+    
+    <!-- 订单管理 -->
+    <div class="menu-item" (click)="showOrders()" [class.active]="activeMenu === 'order-management'">
       <div class="menu-left">
         <span class="menu-icon">📦</span>
         <span>订单管理</span>
       </div>
-      <span>></span>
+      <span *ngIf="!isLoading || activeMenu !== 'order-management'">></span>
+      <span *ngIf="isLoading && activeMenu === 'order-management'" class="loading">...</span>
     </div>
-    <div class="menu-item" (click)="showCollections()">
+    
+    <!-- 收藏夹 -->
+    <div class="menu-item" (click)="showCollections()" [class.active]="activeMenu === 'collections'">
       <div class="menu-left">
         <span class="menu-icon">❤️</span>
         <span>收藏夹</span>
       </div>
-      <span>></span>
+      <span *ngIf="!isLoading || activeMenu !== 'collections'">></span>
+      <span *ngIf="isLoading && activeMenu === 'collections'" class="loading">...</span>
     </div>
-    <div class="menu-item" (click)="showFollowers()">
+    
+    <!-- 粉丝管理 -->
+    <div class="menu-item" (click)="showFollowers()" [class.active]="activeMenu === 'followers'">
       <div class="menu-left">
         <span class="menu-icon">👥</span>
         <span>粉丝管理</span>
       </div>
-      <span>></span>
+      <span *ngIf="!isLoading || activeMenu !== 'followers'">></span>
+      <span *ngIf="isLoading && activeMenu === 'followers'" class="loading">...</span>
     </div>
-    <div class="menu-item" (click)="showSettings()">
+    
+    <!-- 设置 -->
+    <div class="menu-item" (click)="showSettings()" [class.active]="activeMenu === 'settings'">
       <div class="menu-left">
         <span class="menu-icon">⚙️</span>
         <span>设置</span>
       </div>
-      <span>></span>
+      <span *ngIf="!isLoading || activeMenu !== 'settings'">></span>
+      <span *ngIf="isLoading && activeMenu === 'settings'" class="loading">...</span>
     </div>
   </div>
+  
+  <!-- 全局加载指示器 -->
+  <div *ngIf="isLoading" class="global-loading">
+    <div class="loading-spinner"></div>
+  </div>
 </div>

+ 40 - 0
cloth-dit-web/src/modules/cloth/color/page/pages-my-space/pages-my-space/pages-my-space.scss

@@ -53,4 +53,44 @@
 .menu-icon {
   font-size: 18px;
   color: #667eea;
+}
+
+// pages-my-space.scss
+/* 原有样式保持不变,添加以下新样式 */
+
+.menu-item.active {
+  background-color: #f0f4ff;
+  border-left: 4px solid #667eea;
+}
+
+.loading {
+  color: #667eea;
+  font-weight: bold;
+}
+
+.global-loading {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: rgba(255, 255, 255, 0.7);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 1000;
+}
+
+.loading-spinner {
+  width: 40px;
+  height: 40px;
+  border: 4px solid #f3f3f3;
+  border-top: 4px solid #667eea;
+  border-radius: 50%;
+  animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
 }

+ 30 - 12
cloth-dit-web/src/modules/cloth/color/page/pages-my-space/pages-my-space/pages-my-space.ts

@@ -1,4 +1,6 @@
+// pages-my-space.ts
 import { Component } from '@angular/core';
+import { Router } from '@angular/router';
 
 @Component({
   selector: 'app-pages-my-space',
@@ -7,33 +9,49 @@ import { Component } from '@angular/core';
   styleUrl: './pages-my-space.scss'
 })
 export class PagesMySpace {
+  isLoading = false;
+  activeMenu: string | null = null;
+
+  constructor(private router: Router) {}
+
+  async navigateTo(route: string) {
+    this.isLoading = true;
+    this.activeMenu = route;
+    
+    try {
+      // 模拟网络延迟
+      await new Promise(resolve => setTimeout(resolve, 300));
+      
+      // 在实际应用中,你可以使用:
+      // this.router.navigate([route]);
+      
+      console.log(`Navigate to ${route}`);
+    } finally {
+      this.isLoading = false;
+    }
+  }
+
   showMyDesigns() {
-    console.log('Navigate to My Designs');
-    // In a real app, you would navigate to the my-designs component
+    this.navigateTo('my-designs');
   }
 
   showTryOnHistory() {
-    console.log('Navigate to Fitting History');
-    // In a real app, you would navigate to the fitting-history component
+    this.navigateTo('fitting-history');
   }
 
   showOrders() {
-    console.log('Navigate to Order Management');
-    // In a real app, you would navigate to the order-management component
+    this.navigateTo('order-management');
   }
 
   showCollections() {
-    console.log('Navigate to Collections');
-    // In a real app, you would navigate to the collections component
+    this.navigateTo('collections');
   }
 
   showFollowers() {
-    console.log('Navigate to Followers');
-    // In a real app, you would navigate to the followers component
+    this.navigateTo('followers');
   }
 
   showSettings() {
-    console.log('Navigate to Settings');
-    // In a real app, you would navigate to the settings component
+    this.navigateTo('settings');
   }
 }

+ 36 - 7
cloth-dit-web/src/modules/cloth/color/pages-fitting-room/pages-fitting-room/pages-fitting-room.html

@@ -8,12 +8,18 @@
 <main class="main-content">
     <div class="fitting-room-container">
         <!-- AR相机区域 -->
-        <div class="ar-camera" (click)="startAR()">
-            <div class="camera-content">
+        <div class="ar-camera" [class.active]="isARCameraActive" (click)="isARCameraActive ? stopAR() : startAR()">
+            <div class="camera-content" *ngIf="!isARCameraActive">
                 <div class="camera-icon">📷</div>
                 <div>点击开启AR试穿</div>
                 <div class="camera-desc">支持实时身材建模</div>
             </div>
+            <div class="ar-preview" *ngIf="isARCameraActive">
+                <div class="ar-overlay">
+                    <div class="scanning-animation"></div>
+                    <div class="ar-instruction">请将摄像头对准全身</div>
+                </div>
+            </div>
         </div>
 
         <!-- 身材设置 -->
@@ -34,17 +40,40 @@
                            [style.accentColor]="'#ff6b6b'">
                     <span>{{ weight }}kg</span>
                 </div>
+                <div class="setting-item">
+                    <label>胸围 (cm)</label>
+                    <div class="measurement-value">{{ bodyMeasurements.chest }}cm</div>
+                </div>
+                <div class="setting-item">
+                    <label>腰围 (cm)</label>
+                    <div class="measurement-value">{{ bodyMeasurements.waist }}cm</div>
+                </div>
+                <div class="setting-item">
+                    <label>臀围 (cm)</label>
+                    <div class="measurement-value">{{ bodyMeasurements.hips }}cm</div>
+                </div>
+                <div class="setting-item full-width">
+                    <label>体型预览</label>
+                    <div class="body-preview">
+                        <div class="body-shape" [style.height.px]="height/2"></div>
+                    </div>
+                </div>
             </div>
         </div>
 
         <!-- 场景选择 -->
         <div class="scene-selector">
-            <h4>试穿场景</h4>
+            <h4>试穿场景 <span *ngIf="selectedScene">- {{ sceneNames[selectedScene] }}</span></h4>
             <div class="scenes">
-                <div class="scene-item" (click)="selectScene('office')">🏢</div>
-                <div class="scene-item" (click)="selectScene('date')">💕</div>
-                <div class="scene-item" (click)="selectScene('party')">🎉</div>
-                <div class="scene-item" (click)="selectScene('casual')">☕</div>
+                <div class="scene-item" 
+                     *ngFor="let scene of sceneKeys"
+                     [style.--scene-bg-start]="sceneBackgrounds[scene]['--scene-bg-start']"
+                     [style.--scene-bg-end]="sceneBackgrounds[scene]['--scene-bg-end']"
+                     [class.active]="selectedScene === scene"
+                     (click)="selectScene(scene)">
+                    <div class="scene-icon">{{ getSceneIcon(scene) }}</div>
+                    <div class="scene-name">{{ sceneNames[scene] }}</div>
+                </div>
             </div>
         </div>
     </div>

+ 314 - 79
cloth-dit-web/src/modules/cloth/color/pages-fitting-room/pages-fitting-room/pages-fitting-room.scss

@@ -1,123 +1,358 @@
+@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap');
+
+:root {
+  --primary-color: #667eea;
+  --primary-dark: #764ba2;
+  --accent-color: #ff6b6b;
+  --text-color: #333;
+  --light-text: #777;
+  --bg-color: #f8f9fa;
+  --card-bg: white;
+}
+
+body {
+  font-family: 'Noto Sans SC', sans-serif;
+  color: var(--text-color);
+  background-color: var(--bg-color);
+  margin: 0;
+  padding: 0;
+}
+
+.header {
+  background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
+  color: white;
+  padding: 2rem 1rem;
+  text-align: center;
+  box-shadow: 0 4px 12px rgba(0,0,0,0.1);
+  
+  h1 {
+    margin: 0;
+    font-size: 2.2rem;
+    font-weight: 700;
+  }
+  
+  p {
+    margin: 0.5rem 0 0;
+    font-size: 1rem;
+    opacity: 0.9;
+  }
+}
+
 .fitting-room-container {
-    margin: 20px;
+  max-width: 800px;
+  margin: 20px auto;
+  padding: 0 20px;
 }
 
 .ar-camera {
-    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-    border-radius: 20px;
-    height: 400px;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    color: white;
-    font-size: 18px;
-    margin-bottom: 20px;
-    position: relative;
-    overflow: hidden;
-    cursor: pointer;
+  background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
+  border-radius: 20px;
+  height: 400px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: white;
+  font-size: 18px;
+  margin-bottom: 20px;
+  position: relative;
+  overflow: hidden;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  
+  &:hover:not(.active) {
+    transform: translateY(-5px);
+    box-shadow: 0 10px 25px rgba(102, 126, 234, 0.4);
+  }
+  
+  &::before {
+    content: '';
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="grid" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M 10 0 L 0 0 0 10" fill="none" stroke="white" stroke-width="0.5" opacity="0.1"/></pattern></defs><rect width="100" height="100" fill="url(%23grid)"/></svg>');
+  }
+  
+  &.active {
+    background: #222;
     
     &::before {
-        content: '';
-        position: absolute;
-        top: 0;
-        left: 0;
-        right: 0;
-        bottom: 0;
-        background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="grid" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M 10 0 L 0 0 0 10" fill="none" stroke="white" stroke-width="0.5" opacity="0.1"/></pattern></defs><rect width="100" height="100" fill="url(%23grid)"/></svg>');
+      opacity: 0.5;
     }
+  }
 }
 
 .camera-content {
-    text-align: center;
-    z-index: 2;
-    position: relative;
+  text-align: center;
+  z-index: 2;
+  position: relative;
+  padding: 20px;
 }
 
 .camera-icon {
-    font-size: 80px;
-    margin-bottom: 20px;
-    animation: pulse 2s infinite;
+  font-size: 80px;
+  margin-bottom: 20px;
+  animation: pulse 2s infinite;
 }
 
 .camera-desc {
-    font-size: 14px;
-    opacity: 0.8;
-    margin-top: 8px;
+  font-size: 14px;
+  opacity: 0.8;
+  margin-top: 8px;
+}
+
+.ar-preview {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 1;
+}
+
+.ar-overlay {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.scanning-animation {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  height: 3px;
+  background: var(--accent-color);
+  animation: scan 3s infinite;
+  box-shadow: 0 0 10px var(--accent-color);
+}
+
+.ar-instruction {
+  position: absolute;
+  bottom: 30px;
+  left: 0;
+  right: 0;
+  text-align: center;
+  font-size: 16px;
+  background: rgba(0,0,0,0.7);
+  padding: 10px;
+  border-radius: 20px;
+  margin: 0 40px;
+}
+
+@keyframes scan {
+  0% { top: 0; }
+  50% { top: 100%; }
+  100% { top: 0; }
 }
 
 @keyframes pulse {
-    0%, 100% { transform: scale(1); }
-    50% { transform: scale(1.1); }
+  0%, 100% { transform: scale(1); }
+  50% { transform: scale(1.1); }
 }
 
 .body-settings {
-    background: white;
-    border-radius: 15px;
-    padding: 20px;
-    margin-bottom: 20px;
-    box-shadow: 0 5px 20px rgba(0,0,0,0.1);
+  background: var(--card-bg);
+  border-radius: 15px;
+  padding: 20px;
+  margin-bottom: 20px;
+  box-shadow: 0 5px 20px rgba(0,0,0,0.1);
+  
+  h4 {
+    margin-bottom: 15px;
+    font-size: 16px;
+    color: var(--primary-dark);
+    display: flex;
+    align-items: center;
     
-    h4 {
-        margin-bottom: 15px;
-        font-size: 16px;
+    &::before {
+      content: '👤';
+      margin-right: 8px;
     }
+  }
 }
 
 .settings-grid {
-    display: grid;
-    grid-template-columns: repeat(2, 1fr);
-    gap: 15px;
+  display: grid;
+  grid-template-columns: repeat(2, 1fr);
+  gap: 15px;
+  
+  @media (max-width: 600px) {
+    grid-template-columns: 1fr;
+  }
 }
 
 .setting-item {
-    label {
-        display: block;
-        font-size: 14px;
-        color: #666;
-        margin-bottom: 5px;
-    }
-    
-    input[type="range"] {
-        width: 100%;
-    }
-    
-    span {
-        font-size: 12px;
-        color: #999;
-    }
+  label {
+    display: block;
+    font-size: 14px;
+    color: var(--light-text);
+    margin-bottom: 5px;
+    font-weight: 500;
+  }
+  
+  input[type="range"] {
+    width: 100%;
+    margin: 8px 0;
+  }
+  
+  span, .measurement-value {
+    font-size: 14px;
+    color: var(--text-color);
+    font-weight: 500;
+  }
+  
+  &.full-width {
+    grid-column: 1 / -1;
+  }
+}
+
+.body-preview {
+  height: 120px;
+  background: linear-gradient(to right, #f5f5f5, #e0e0e0);
+  border-radius: 10px;
+  position: relative;
+  overflow: hidden;
+  margin-top: 10px;
+}
+
+.body-shape {
+  position: absolute;
+  bottom: 0;
+  left: 50%;
+  transform: translateX(-50%);
+  width: 60px;
+  background: linear-gradient(to bottom, #ff9a9e, #fecfef);
+  border-radius: 30px 30px 0 0;
+  transition: height 0.3s ease;
 }
 
 .scene-selector {
-    background: white;
-    border-radius: 15px;
-    padding: 20px;
-    box-shadow: 0 5px 20px rgba(0,0,0,0.1);
+  background: var(--card-bg);
+  border-radius: 15px;
+  padding: 20px;
+  box-shadow: 0 5px 20px rgba(0,0,0,0.1);
+  
+  h4 {
+    margin-bottom: 15px;
+    font-size: 16px;
+    color: var(--primary-dark);
+    display: flex;
+    align-items: center;
     
-    h4 {
-        margin-bottom: 15px;
-        font-size: 16px;
+    &::before {
+      content: '🌍';
+      margin-right: 8px;
+    }
+    
+    span {
+      margin-left: 8px;
+      font-weight: normal;
+      color: var(--light-text);
     }
+  }
 }
 
 .scenes {
-    display: flex;
-    gap: 10px;
-    overflow-x: auto;
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
+  gap: 12px;
 }
 
 .scene-item {
-    min-width: 80px;
-    height: 80px;
-    border-radius: 12px;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    font-size: 24px;
-    cursor: pointer;
-    transition: all 0.3s ease;
-    background: linear-gradient(45deg, var(--scene-bg-start, #ff9a9e), var(--scene-bg-end, #fecfef));
+  height: 120px;
+  border-radius: 12px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  position: relative;
+  overflow: hidden;
+  border: 2px solid transparent;
+  
+  &:hover {
+    transform: translateY(-5px);
+    box-shadow: 0 5px 15px rgba(0,0,0,0.1);
+  }
+  
+  &.active {
+    border-color: var(--primary-color);
+    box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.3);
     
-    &:hover {
-        transform: scale(1.05);
+    &::after {
+      content: '✓';
+      position: absolute;
+      top: 5px;
+      right: 5px;
+      width: 20px;
+      height: 20px;
+      background: var(--primary-color);
+      color: white;
+      border-radius: 50%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 12px;
     }
+  }
+}
+
+.scene-icon {
+  font-size: 32px;
+  margin-bottom: 8px;
+}
+
+.scene-name {
+  font-size: 14px;
+  font-weight: 500;
+}
+
+.custom-notification {
+  position: fixed;
+  bottom: 20px;
+  left: 50%;
+  transform: translateX(-50%) translateY(100px);
+  background: rgba(0,0,0,0.8);
+  color: white;
+  padding: 12px 20px;
+  border-radius: 8px;
+  z-index: 1000;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  transition: transform 0.3s ease;
+  
+  strong {
+    font-weight: 500;
+    margin-bottom: 4px;
+  }
+  
+  span {
+    font-size: 14px;
+    opacity: 0.9;
+  }
+  
+  &.show {
+    transform: translateX(-50%) translateY(0);
+  }
+}
+
+// 响应式调整
+@media (max-width: 480px) {
+  .ar-camera {
+    height: 300px;
+  }
+  
+  .scenes {
+    grid-template-columns: repeat(2, 1fr);
+  }
 }

+ 68 - 7
cloth-dit-web/src/modules/cloth/color/pages-fitting-room/pages-fitting-room/pages-fitting-room.ts

@@ -1,8 +1,9 @@
 import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
 
 @Component({
   selector: 'app-pages-fitting-room',
-  imports:[],
+  imports: [CommonModule],
   templateUrl: './pages-fitting-room.html',
   styleUrls: ['./pages-fitting-room.scss']
 })
@@ -10,7 +11,14 @@ export class PagesFittingRoom {
   // 身材参数
   height = 170;
   weight = 60;
-  
+  selectedScene: keyof typeof this.sceneNames | null = null;
+  isARCameraActive = false;
+  bodyMeasurements = {
+    chest: 90,
+    waist: 70,
+    hips: 95
+  };
+
   // 场景映射
   sceneNames = {
     'office': '办公场景',
@@ -27,31 +35,84 @@ export class PagesFittingRoom {
     'casual': { '--scene-bg-start': '#ffeaa7', '--scene-bg-end': '#fab1a0' }
   };
 
+  // 获取场景图标
+  getSceneIcon(scene: keyof typeof this.sceneNames): string {
+    const icons = {
+      'office': '🏢',
+      'date': '💕',
+      'party': '🎉',
+      'casual': '☕'
+    };
+    return icons[scene];
+  }
+
+  // 获取场景键数组
+  get sceneKeys(): (keyof typeof this.sceneNames)[] {
+    return Object.keys(this.sceneNames) as (keyof typeof this.sceneNames)[];
+  }
+
   // 更新身高
   updateHeight(event: Event) {
     this.height = parseInt((event.target as HTMLInputElement).value);
+    this.updateBodyMeasurements();
   }
 
   // 更新体重
   updateWeight(event: Event) {
     this.weight = parseInt((event.target as HTMLInputElement).value);
+    this.updateBodyMeasurements();
+  }
+
+  // 根据身高体重自动计算其他身体参数
+  updateBodyMeasurements() {
+    const heightRatio = this.height / 170;
+    const weightRatio = this.weight / 60;
+    
+    this.bodyMeasurements = {
+      chest: Math.round(90 * heightRatio * (0.7 + 0.3 * weightRatio)),
+      waist: Math.round(70 * heightRatio * (0.6 + 0.4 * weightRatio)),
+      hips: Math.round(95 * heightRatio * (0.8 + 0.2 * weightRatio))
+    };
   }
 
   // 选择场景
   selectScene(scene: keyof typeof this.sceneNames) {
-    console.log(`已切换到${this.sceneNames[scene]}`);
+    this.selectedScene = scene;
     this.showNotification('场景切换', `已切换到${this.sceneNames[scene]}`);
   }
 
   // 启动AR试衣
   startAR() {
-    console.log('开启AR试穿');
-    this.showNotification('AR试穿', '正在启动相机...');
+    this.isARCameraActive = true;
+    setTimeout(() => {
+      this.showNotification('AR试穿', '相机已就绪,请将摄像头对准全身');
+    }, 1500);
+  }
+
+  // 关闭AR试衣
+  stopAR() {
+    this.isARCameraActive = false;
   }
 
   // 显示通知
   showNotification(title: string, message: string) {
-    // 在实际项目中,这里可以使用Angular Material的Snackbar或Toast服务
-    console.log(`[${title}] ${message}`);
+    const notification = document.createElement('div');
+    notification.className = 'custom-notification';
+    notification.innerHTML = `
+      <strong>${title}</strong>
+      <span>${message}</span>
+    `;
+    document.body.appendChild(notification);
+    
+    setTimeout(() => {
+      notification.classList.add('show');
+    }, 10);
+    
+    setTimeout(() => {
+      notification.classList.remove('show');
+      setTimeout(() => {
+        document.body.removeChild(notification);
+      }, 300);
+    }, 3000);
   }
 }

+ 32 - 0
node_modules/.package-lock.json

@@ -0,0 +1,32 @@
+{
+  "name": "cloth-color11",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "node_modules/@types/swiper": {
+      "version": "5.4.3",
+      "resolved": "https://registry.npmjs.org/@types/swiper/-/swiper-5.4.3.tgz",
+      "integrity": "sha512-hJXpVeANf+XQXgbvmuFZdsnaSOKqOEZcaLDnHhZOJDRow+lfboatwubW+Ay9XiHobMGyEomkgpXSYRlDVn4gMQ==",
+      "license": "MIT"
+    },
+    "node_modules/swiper": {
+      "version": "11.2.10",
+      "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.2.10.tgz",
+      "integrity": "sha512-RMeVUUjTQH+6N3ckimK93oxz6Sn5la4aDlgPzB+rBrG/smPdCTicXyhxa+woIpopz+jewEloiEE3lKo1h9w2YQ==",
+      "funding": [
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/swiperjs"
+        },
+        {
+          "type": "open_collective",
+          "url": "http://opencollective.com/swiper"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4.7.0"
+      }
+    }
+  }
+}

+ 21 - 0
node_modules/@types/swiper/LICENSE

@@ -0,0 +1,21 @@
+    MIT License
+
+    Copyright (c) Microsoft Corporation.
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in all
+    copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+    SOFTWARE

+ 16 - 0
node_modules/@types/swiper/README.md

@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/swiper`
+
+# Summary
+This package contains type definitions for Swiper (https://github.com/nolimits4web/Swiper).
+
+# Details
+Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/swiper.
+
+### Additional Details
+ * Last updated: Fri, 02 Jul 2021 22:33:19 GMT
+ * Dependencies: none
+ * Global values: none
+
+# Credits
+These definitions were written by [Sebastián Galiano](https://github.com/sgaliano), [Luca Trazzi](https://github.com/lucax88x), [Eugene Matseruk](https://github.com/ematseruk), [Luiz M.](https://github.com/odahcam), [Justin Abene](https://github.com/jmca), [Asif Rahman](https://github.com/daem0ndev), [Liad Idan](https://github.com/LiadIdan), and [Sangwon Lee](https://github.com/john015).

+ 1684 - 0
node_modules/@types/swiper/index.d.ts

@@ -0,0 +1,1684 @@
+// Type definitions for Swiper 5.4
+// Project: https://github.com/nolimits4web/Swiper, http://www.idangero.us/swiper
+// Definitions by: Sebastián Galiano <https://github.com/sgaliano>
+//                 Luca Trazzi <https://github.com/lucax88x>
+//                 Eugene Matseruk <https://github.com/ematseruk>
+//                 Luiz M. <https://github.com/odahcam>
+//                 Justin Abene <https://github.com/jmca>
+//                 Asif Rahman <https://github.com/daem0ndev>
+//                 Liad Idan <https://github.com/LiadIdan>
+//                 Sangwon Lee <https://github.com/john015>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+// TypeScript Version: 2.9
+
+/**
+ * Common Swiper events.
+ */
+export type CommonEvent =
+    | 'init'
+    | 'beforeDestroy'
+    | 'slideChange'
+    | 'slideChangeTransitionStart'
+    | 'slideChangeTransitionEnd'
+    | 'slideNextTransitionStart'
+    | 'slideNextTransitionEnd'
+    | 'slidePrevTransitionStart'
+    | 'slidePrevTransitionEnd'
+    | 'transitionStart'
+    | 'transitionEnd'
+    | 'touchStart'
+    | 'touchMove'
+    | 'touchMoveOpposite'
+    | 'sliderMove'
+    | 'touchEnd'
+    | 'click'
+    | 'tap'
+    | 'doubleTap'
+    | 'imagesReady'
+    | 'progress'
+    | 'reachBeginning'
+    | 'reachEnd'
+    | 'fromEdge'
+    | 'setTranslate'
+    | 'setTransition'
+    | 'resize'
+    | 'observerUpdate'
+    | 'beforeLoopFix'
+    | 'loopFix';
+
+/**
+ * Swiper pagination event names.
+ */
+export type PaginationEvent = 'paginationRender' | 'paginationUpdate';
+
+/**
+ * Swiper autoplay event names.
+ */
+export type AutoplayEvent = 'autoplayStart' | 'autoplayStop' | 'autoplay';
+
+/**
+ * Swiper lazy-loading event names.
+ */
+export type LazyLoadingEvent = 'lazyImageLoad' | 'lazyImageReady';
+
+/**
+ * Swiper hash-navigation event names.
+ */
+export type HashNavigationEvent = 'hashChange' | 'hashSet';
+
+/**
+ * Swiper event names.
+ */
+export type SwiperEvent = CommonEvent | PaginationEvent | AutoplayEvent | LazyLoadingEvent | HashNavigationEvent;
+
+/**
+ * Swiper module types.
+ */
+export type SwiperModule =
+    | Navigation
+    | Pagination
+    | Scrollbar
+    | Autoplay
+    | Parallax
+    | Lazy
+    | EffectFade
+    | EffectCoverflow
+    | EffectFlip
+    | EffectCube
+    | Zoom
+    | Keyboard
+    | Mousewheel
+    | Virtual
+    | HashNavigation
+    | History
+    | Controller
+    | A11y;
+
+export type DOM7Element = any;
+export type SelectableElement = string | HTMLElement;
+
+/*
+ * Swiper options and events.
+ */
+
+/**
+ * Main constructor options.
+ */
+export interface SwiperOptions {
+    /**
+     * Whether Swiper should be initialised automatically when you create an instance.
+     * If disabled, then you need to init it manually by calling mySwiper.init()
+     *
+     * @default true
+     */
+    init?: boolean | undefined;
+
+    /**
+     * Swiper will recalculate slides position on window resize (orientationchange)
+     *
+     * @default true
+     */
+    updateOnWindowResize?: boolean | undefined;
+
+    /**
+     * Index number of initial slide.
+     *
+     * @default 0
+     */
+    initialSlide?: number | undefined;
+
+    /**
+     * Could be 'horizontal' or 'vertical' (for vertical slider).
+     *
+     * @default 'horizontal'
+     */
+    direction?: 'horizontal' | 'vertical' | undefined;
+
+    /**
+     * Duration of transition between slides (in ms)
+     *
+     * @default 300
+     */
+    speed?: number | undefined;
+
+    /**
+     * Enabled this option and plugin will set width/height on swiper wrapper equal to total size of all slides.
+     * Mostly should be used as compatibility fallback option for browser that don't support flexbox layout well
+     */
+    setWrapperSize?: boolean | undefined;
+
+    /**
+     * Enabled this option and swiper will be operated as usual except it will not move, real translate values on wrapper will not be set.
+     * Useful when you may need to create custom slide transition
+     */
+    virtualTranslate?: boolean | undefined;
+
+    /**
+     * Swiper width (in px). Parameter allows to force Swiper width.
+     * Useful only if you initialize Swiper when it is hidden.
+     *
+     * @note Setting this parameter will make Swiper not responsive
+     */
+    width?: number | undefined;
+
+    /**
+     * Swiper height (in px). Parameter allows to force Swiper height.
+     * Useful only if you initialize Swiper when it is hidden.
+     *
+     * @note Setting this parameter will make Swiper not responsive
+     */
+    height?: number | undefined;
+
+    /**
+     * Set to true and slider wrapper will adopt its height to the height of the currently active slide
+     *
+     * @default false
+     */
+    autoHeight?: boolean | undefined;
+
+    /**
+     * Set to true to round values of slides width and height to prevent blurry texts on usual
+     * resolution screens (if you have such)
+     *
+     * @default false
+     */
+    roundLengths?: boolean | undefined;
+
+    /**
+     * Set to true on  Swiper for correct touch events interception. Use only on
+     * swipers that use same direction as the parent one
+     *
+     * @default false
+     */
+    nested?: boolean | undefined;
+
+    /**
+     * If enabled (by default) and navigation elements' parameters passed as a string (like ".pagination")
+     * then Swiper will look for such elements through child elements first.
+     * Applies for pagination, prev/next buttons and scrollbar elements
+     *
+     * @default true
+     */
+    uniqueNavElements?: boolean | undefined;
+
+    /**
+     * Tranisition effect. Could be "slide", "fade", "cube", "coverflow" or "flip"
+     *
+     * @default 'slide'
+     */
+    effect?: 'slide' | 'fade' | 'cube' | 'coverflow' | 'flip' | undefined;
+
+    /**
+     * Fire [Transition/SlideChange][Start/End] events on swiper initialization.
+     * Such events will be fired on initialization in case of your initialSlide is not 0, or you use loop mode
+     *
+     * @default true
+     */
+    runCallbacksOnInit?: boolean | undefined;
+
+    /**
+     * When enabled Swiper will be disabled and hide navigation buttons on
+     * case there are not enough slides for sliding.
+     *
+     * @default false
+     */
+    watchOverflow?: boolean | undefined;
+
+    /**
+     * Register event handlers.
+     */
+    on?: {
+        [key in Exclude<SwiperEvent, LazyLoadingEvent>]?: (this: Swiper, swiper: Swiper) => void;
+    } & {
+        [key in LazyLoadingEvent]?: (this: Swiper, slideEl: HTMLElement, imageEl: HTMLImageElement) => void;
+    } | undefined;
+
+    // CSS Scroll Snap
+
+    /**
+     * When enabled it will use modern CSS Scroll Snap API.
+     * It doesn't support all of Swiper's features, but potentially should bring a much better performance in simple configurations.
+     *
+     * @default false
+     */
+    cssMode?: boolean | undefined;
+
+    // Slides grid
+
+    /**
+     * Distance between slides in px.
+     */
+    spaceBetween?: number | undefined;
+
+    /**
+     * Number of slides per view (slides visible at the same time on slider's container).
+     * If you use it with "auto" value and along with loop: true then you need to specify loopedSlides parameter with amount of slides to loop (duplicate)
+     * slidesPerView: 'auto' is currently not compatible with multirow mode, when slidesPerColumn > 1
+     */
+    slidesPerView?: number | 'auto' | undefined;
+
+    /**
+     * Number of slides per column, for multirow layout
+     * slidesPerColumn > 1 is currently not compatible with loop mode (loop: true)
+     */
+    slidesPerColumn?: number | undefined;
+
+    /**
+     * Could be 'column' or 'row'. Defines how slides should fill rows, by column or by row
+     */
+    slidesPerColumnFill?: 'row' | 'column' | undefined;
+
+    /**
+     * Set numbers of slides to define and enable group sliding. Useful to use with slidesPerView > 1
+     */
+    slidesPerGroup?: number | undefined;
+
+    /**
+     * The parameter works in the following way: If slidesPerGroupSkip equals 0 (default), no slides are excluded from grouping, and the resulting behaviour is the same as without this change.
+     * If slidesPerGroupSkip is equal or greater than 1 the first X slides are treated as single groups, whereas all following slides are grouped by the slidesPerGroup value.
+     *
+     * @default 0
+     */
+    slidesPerGroupSkip?: number | undefined;
+
+    /**
+     * If true, then active slide will be centered, not always on the left side.
+     */
+    centeredSlides?: boolean | undefined;
+
+    /**
+     * If true, then active slide will be centered without adding gaps at the beginning and end of slider.
+     * Required centeredSlides: true. Not intended to be used with loop or pagination
+     *
+     * @default false
+     */
+    centeredSlidesBounds?: boolean | undefined;
+
+    /**
+     * Add (in px) additional slide offset in the beginning of the container (before all slides)
+     */
+    slidesOffsetBefore?: number | undefined;
+
+    /**
+     * Add (in px) additional slide offset in the end of the container (after all slides)
+     */
+    slidesOffsetAfter?: number | undefined;
+
+    /**
+     * Normalize slide index.
+     */
+    normalizeSlideIndex?: boolean | undefined;
+
+    /**
+     * When enabled it center slides if the amount of slides less than `slidesPerView`. Not intended to be used loop mode and slidesPerColumn
+     */
+    centerInsufficientSlides?: boolean | undefined;
+
+    // Grab Cursor
+    grabCursor?: boolean | undefined;
+
+    // Touches
+
+    /**
+     * Target element to listen touch events on. Can be 'container' (to listen for touch events on swiper-container) or 'wrapper'
+     * (to listen for touch events on swiper-wrapper)
+     */
+    touchEventsTarget?: 'container' | 'wrapper' | undefined;
+
+    /**
+     * Touch ratio
+     */
+    touchRatio?: number | undefined;
+
+    /**
+     * Allowable angle (in degrees) to trigger touch move
+     */
+    touchAngle?: number | undefined;
+
+    /**
+     * If true, Swiper will accept mouse events like touch events (click and drag to change slides)
+     */
+    simulateTouch?: boolean | undefined;
+
+    /**
+     * Set to false if you want to disable short swipes
+     */
+    shortSwipes?: boolean | undefined;
+
+    /**
+     * Set to false if you want to disable long swipes
+     */
+    longSwipes?: boolean | undefined;
+
+    /**
+     * Ratio to trigger swipe to next/previous slide during long swipes
+     */
+    longSwipesRatio?: number | undefined;
+
+    /**
+     * Minimal duration (in ms) to trigger swipe to next/previous slide during long swipes
+     */
+    longSwipesMs?: number | undefined;
+
+    /**
+     * If disabled, then slider will be animated only when you release it, it will not move while you hold your finger on it
+     */
+    followFinger?: boolean | undefined;
+
+    /**
+     * If false, then the only way to switch the slide is use of external API functions like slidePrev or slideNext
+     */
+    allowTouchMove?: boolean | undefined;
+
+    /**
+     * Threshold value in px. If "touch distance" will be lower than this value then swiper will not move
+     */
+    threshold?: number | undefined;
+
+    /**
+     * If disabled, `touchstart` (`mousedown`) event won't be prevented
+     */
+    touchStartPreventDefault?: boolean | undefined;
+
+    /**
+     * Force to always prevent default for `touchstart` (`mousedown`) event
+     */
+    touchStartForcePreventDefault?: boolean | undefined;
+
+    /**
+     * If enabled, then propagation of "touchmove" will be stopped
+     */
+    touchMoveStopPropagation?: boolean | undefined;
+
+    /**
+     * Enable to release Swiper events for swipe-to-go-back work in iOS UIWebView
+     */
+    iOSEdgeSwipeDetection?: boolean | undefined;
+
+    /**
+     * Area (in px) from left edge of the screen to release touch events for swipe-to-go-back in iOS UIWebView
+     */
+    iOSEdgeSwipeThreshold?: number | undefined;
+
+    /**
+     * Enable to release touch events on slider edge position (beginning, end) to allow for further page scrolling
+     */
+    touchReleaseOnEdges?: boolean | undefined;
+
+    /**
+     * Passive event listeners will be used by default where possible to improve scrolling performance on mobile devices.
+     * But if you need to use `e.preventDefault` and you have conflict with it, then you should disable this parameter
+     */
+    passiveListeners?: boolean | undefined;
+
+    // Touch Resistance
+
+    /**
+     * Set to false if you want to disable resistant bounds
+     */
+    resistance?: boolean | undefined;
+
+    /**
+     * This option allows you to control resistance ratio
+     */
+    resistanceRatio?: number | undefined;
+
+    // Swiping / No swiping
+    preventInteractionOnTransition?: boolean | undefined;
+    allowSlidePrev?: boolean | undefined;
+    allowSlideNext?: boolean | undefined;
+    noSwiping?: boolean | undefined;
+    noSwipingClass?: string | undefined;
+    noSwipingSelector?: string | undefined;
+    swipeHandler?: SelectableElement | undefined;
+
+    // Clicks
+    preventClicks?: boolean | undefined;
+    preventClicksPropagation?: boolean | undefined;
+    slideToClickedSlide?: boolean | undefined;
+
+    // Freemode
+    freeMode?: boolean | undefined;
+    freeModeMomentum?: boolean | undefined;
+    freeModeMomentumRatio?: number | undefined;
+    freeModeMomentumVelocityRatio?: number | undefined;
+    freeModeMomentumBounce?: boolean | undefined;
+    freeModeMomentumBounceRatio?: number | undefined;
+    freeModeMinimumVelocity?: number | undefined;
+    freeModeSticky?: boolean | undefined;
+
+    // Progress
+    watchSlidesProgress?: boolean | undefined;
+    watchSlidesVisibility?: boolean | undefined;
+
+    // Images
+    preloadImages?: boolean | undefined;
+    updateOnImagesReady?: boolean | undefined;
+
+    // Loop
+    loop?: boolean | undefined;
+    loopAdditionalSlides?: number | undefined;
+    loopedSlides?: number | undefined;
+    loopFillGroupWithBlank?: boolean | undefined;
+
+    // Breakpoints
+    breakpoints?: {
+        [index: number]: SwiperOptions;
+    } | undefined;
+    breakpointsInverse?: boolean | undefined;
+
+    // Observer
+
+    /**
+     * Set to true if you also need to watch Mutations for Swiper slide children elements
+     *
+     * @default false
+     */
+    observeSlideChildren?: boolean | undefined;
+
+    observer?: boolean | undefined;
+    observeParents?: boolean | undefined;
+
+    // Namespace
+    containerModifierClass?: string | undefined;
+    slideClass?: string | undefined;
+    slideActiveClass?: string | undefined;
+    slideDuplicateActiveClass?: string | undefined;
+    slideVisibleClass?: string | undefined;
+    slideDuplicateClass?: string | undefined;
+    slideNextClass?: string | undefined;
+    slideDuplicateNextClass?: string | undefined;
+    slidePrevClass?: string | undefined;
+    slideDuplicatePrevClass?: string | undefined;
+    wrapperClass?: string | undefined;
+
+    // Components
+    controller?: ControllerOptions | boolean | undefined;
+    navigation?: NavigationOptions | undefined;
+    pagination?: PaginationOptions | undefined;
+    scrollbar?: ScrollbarOptions | undefined;
+    autoplay?: AutoplayOptions | boolean | undefined;
+    parallax?: boolean | undefined;
+    lazy?: LazyOptions | boolean | undefined;
+    fadeEffect?: FadeEffectOptions | undefined;
+    coverflowEffect?: CoverflowEffectOptions | undefined;
+    flipEffect?: FlipEffectOptions | undefined;
+    cubeEffect?: CubeEffectOptions | undefined;
+    thumbs?: ThumbsOptions | undefined;
+    zoom?: ZoomOptions | boolean | undefined;
+    keyboard?: KeyboardOptions | boolean | undefined;
+    mousewheel?: MousewheelOptions | boolean | undefined;
+    virtual?: VirtualOptions | boolean | undefined;
+    hashNavigation?: HashNavigationOptions | boolean | undefined;
+    history?: HistoryNavigationOptions | boolean | undefined;
+    a11y?: A11yOptions | boolean | undefined;
+}
+
+export interface EventsOptions {
+    /**
+     * Fired right after Swiper initialization.
+     * Note that with swiper.on('init') syntax it will
+     * work only in case you set init: false parameter.
+     *
+     * @example
+     * var swiper = new Swiper('.swiper-container', {
+     *   init: false,
+     *   // other parameters
+     * });
+     *
+     * @example
+     * swiper.on('init', function() {
+     *  // do something
+     * });
+     *
+     * @example
+     * // init Swiper
+     * swiper.init();
+     *
+     * @example
+     * // Otherwise use it as the parameter:
+     * var swiper = new Swiper('.swiper-container', {
+     *   // other parameters
+     *   on: {
+     *     init: function () {
+     *       // do something
+     *     },
+     *   }
+     * });
+     */
+    init?: (() => any) | undefined;
+
+    /**
+     * Triggered right beforey Swiper destoryed
+     */
+    beforeDestroy?: (() => any) | undefined;
+
+    /**
+     * Triggered when currently active slide is changed
+     */
+    slideChange?: (() => any) | undefined;
+
+    /**
+     * Triggered in the beginning of animation to other slide (next or previous).
+     */
+    slideChangeTransitionStart?: (() => any) | undefined;
+
+    /**
+     * Triggered after animation to other slide (next or previous).
+     */
+    slideChangeTransitionEnd?: (() => any) | undefined;
+
+    /**
+     * Same as "slideChangeTransitionStart" but for "forward" direction only
+     */
+    slideNextTransitionStart?: (() => any) | undefined;
+
+    /**
+     * Same as "slideChangeTransitionEnd" but for "forward" direction only
+     */
+    slideNextTransitionEnd?: (() => any) | undefined;
+
+    /**
+     * Same as "slideChangeTransitionStart" but for "backward" direction only
+     */
+    slidePrevTransitionStart?: (() => any) | undefined;
+
+    /**
+     * Same as "slideChangeTransitionEnd" but for "backward" direction only
+     */
+    slidePrevTransitionEnd?: (() => any) | undefined;
+
+    /**
+     * Triggered in the beginning of transition.
+     */
+    transitionStart?: (() => any) | undefined;
+
+    /**
+     * Triggered after transition.
+     */
+    transitionEnd?: (() => any) | undefined;
+
+    /**
+     * Triggered when user touch Swiper. Receives 'touchstart' event as an arguments.
+     */
+    touchStart?: ((event: any) => any) | undefined;
+
+    /**
+     * Triggered when user touch and move finger over Swiper. Receives 'touchmove' event as an arguments.
+     */
+    touchMove?: ((event: any) => any) | undefined;
+
+    /**
+     * Fired when user touch and move finger over
+     * Swiper in direction opposite to direction parameter.
+     * Receives 'touchmove' event as an arguments.
+     */
+    touchMoveOpposite?: ((event: any) => any) | undefined;
+
+    /**
+     * Triggered when user touch and move finger over Swiper and move it.
+     * Receives 'touchmove' event as an arguments.
+     */
+    sliderMove?: ((event: any) => any) | undefined;
+
+    /**
+     * Triggered when user release Swiper. Receives 'touchend' event as an arguments.
+     */
+    touchEnd?: ((event: any) => any) | undefined;
+
+    /**
+     * Triggered when user click/tap on Swiper after 300ms delay. Receives 'touchend' event as an arguments.
+     */
+    click?: ((event: any) => any) | undefined;
+
+    /**
+     * Triggered when user click/tap on Swiper. Receives 'touchend' event as an arguments.
+     */
+    tap?: ((event: any) => any) | undefined;
+
+    /**
+     * Triggered when user double tap on Swiper's container. Receives 'touchend' event as an arguments
+     */
+    doubleTap?: ((event: any) => any) | undefined;
+
+    /**
+     * Triggered right after all inner images are loaded. updateOnImagesReady should be also enabled
+     */
+    imagesReady?: (() => any) | undefined;
+
+    /**
+     * Triggered when Swiper progress is changed, as an arguments it receives
+     * progress that is always from 0 to 1
+     */
+    progress?: ((progress: any) => any) | undefined;
+
+    /**
+     * Triggered when Swiper reach its beginning (initial position)
+     */
+    reachBeginning?: (() => any) | undefined;
+
+    /**
+     * Triggered when Swiper reach last slide
+     */
+    reachEnd?: (() => any) | undefined;
+
+    /**
+     * Triggered when Swiper goes from beginning or end position
+     */
+    fromEdge?: (() => any) | undefined;
+
+    /**
+     * Triggered when swiper's wrapper change its position. Receives current translate value as an arguments
+     */
+    setTranslate?: ((translate: any) => any) | undefined;
+
+    /**
+     * Triggered everytime when swiper starts animation.
+     * Receives current transition duration (in ms) as an arguments,
+     */
+    setTransition?: ((transition: any) => any) | undefined;
+
+    /**
+     * Triggered on window resize right before swiper's onresize manipulation
+     */
+    resize?: (() => any) | undefined;
+
+    /**
+     * Event will be fired if observer is enabled and it detects DOM mutations
+     */
+    observerUpdate?: (() => any) | undefined;
+
+    /**
+     * Event will be fired right before "loop fix"
+     */
+    beforeLoopFix?: (() => any) | undefined;
+
+    /**
+     * Event will be fired after "loop fix"
+     */
+    loopFix?: (() => any) | undefined;
+}
+
+export interface NavigationOptions {
+    /**
+     * String with CSS selector or HTML element of the element that will work
+     * like "next" button after click on it
+     *
+     * @default null
+     */
+    nextEl?: SelectableElement | undefined;
+
+    /**
+     * String with CSS selector or HTML element of the element that will work
+     * like "prev" button after click on it
+     *
+     * @default null
+     */
+    prevEl?: SelectableElement | undefined;
+
+    /**
+     * buttons visibility after click on Slider's container
+     *
+     * @default false Toggle navigation
+     */
+    hideOnClick?: boolean | undefined;
+
+    /**
+     * CSS class name added to navigation button when it becomes disabled
+     *
+     * @default 'swiper-button-disabled'
+     */
+    disabledClass?: string | undefined;
+
+    /**
+     * CSS class name added to navigation button when it becomes hidden
+     *
+     * @default 'swiper-button-hidden'
+     */
+    hiddenClass?: string | undefined;
+}
+
+export interface PaginationOptions {
+    /**
+     * String with CSS selector or HTML element of the container with pagination
+     */
+    el: SelectableElement;
+
+    /**
+     * String with type of pagination. Can be "bullets", "fraction", "progressbar" or "custom"
+     */
+    type?: 'bullets' | 'fraction' | 'progressbar' | 'custom' | undefined;
+
+    /**
+     * Defines which HTML tag will be use to represent single pagination bullet. Only for bullets pagination type.
+     */
+    bulletElement?: string | undefined;
+
+    /**
+     * Good to enable if you use bullets pagination with a lot of slides. So it will keep only few bullets visible at the same time.
+     */
+    dynamicBullets?: boolean | undefined;
+
+    /**
+     * The number of main bullets visible when dynamicBullets enabled.
+     */
+    dynamicMainBullets?: number | undefined;
+
+    /**
+     * Toggle (hide/true) pagination container visibility after click on Slider's container
+     */
+    hideOnClick?: boolean | undefined;
+
+    /**
+     * If true then clicking on pagination button will cause transition to appropriate slide. Only for bullets pagination type
+     */
+    clickable?: boolean | undefined;
+
+    /**
+     * Makes pagination progressbar opposite to Swiper's `direction` parameter, means vertical progressbar for horizontal swiper
+     * direction and horizontal progressbar for vertical swiper direction
+     */
+    progressbarOpposite?: boolean | undefined;
+
+    /**
+     * format fraction pagination current number. Function receives current number,
+     * and you need to return formatted value
+     */
+    formatFractionCurrent?: ((number: number) => number) | undefined;
+
+    /**
+     * format fraction pagination total number. Function receives total number, and you
+     * need to return formatted value
+     */
+    formatFractionTotal?: ((number: number) => number) | undefined;
+
+    /**
+     * This parameter allows totally customize pagination bullets, you need to pass here a function that accepts index number of
+     * pagination bullet and required element class name (className). Only for bullets pagination type
+     */
+    renderBullet?: ((index: number, className: string) => void) | undefined;
+
+    /**
+     * This parameter allows to customize "fraction" pagination html. Only for fraction pagination type
+     */
+    renderFraction?: ((currentClass: string, totalClass: string) => void) | undefined;
+
+    /**
+     * This parameter allows to customize "progress" pagination. Only for progress pagination type
+     */
+    renderProgressbar?: ((progressbarFillClass: string) => void) | undefined;
+
+    /**
+     * This parameter is required for custom pagination type where you have to specify
+     * how it should be rendered.
+     *
+     * @example
+     * var swiper = new Swiper('.swiper-container', {
+     *   //...
+     *   renderCustom: function (swiper, current, total) {
+     *     return current + ' of ' + total;
+     *   }
+     * });
+     */
+    renderCustom?: ((swiper: Swiper, current: number, total: number) => void) | undefined;
+
+    /**
+     * CSS class name of single pagination bullet
+     */
+    bulletClass?: string | undefined;
+
+    /**
+     * CSS class name of currently active pagination bullet
+     */
+    bulletActiveClass?: string | undefined;
+
+    /**
+     * The beginning of the modifier CSS class name that will be added to pagination depending on parameters
+     */
+    modifierClass?: string | undefined;
+
+    /**
+     * CSS class name of the element with currently active index in "fraction" pagination
+     */
+    currentClass?: string | undefined;
+
+    /**
+     * CSS class name of the element with total number of "snaps" in "fraction" pagination
+     */
+    totalClass?: string | undefined;
+
+    /**
+     * CSS class name of pagination when it becomes inactive
+     */
+    hiddenClass?: string | undefined;
+
+    /**
+     * CSS class name of pagination progressbar fill element
+     */
+    progressbarFillClass?: string | undefined;
+
+    /**
+     * CSS class name set to pagination when it is clickable
+     */
+    clickableClass?: string | undefined;
+}
+
+/**
+ * Object with scrollbar parameters.
+ *
+ * @example
+ * var mySwiper = new Swiper('.swiper-container', {
+ *   scrollbar: {
+ *     el: '.swiper-scrollbar',
+ *     draggable: true,
+ *   },
+ * });
+ */
+export interface ScrollbarOptions {
+    /**
+     * String with CSS selector or HTML element of the container with scrollbar.
+     */
+    el: SelectableElement;
+
+    /**
+     * Hide scrollbar automatically after user interaction
+     *
+     * @default true
+     */
+    hide?: boolean | undefined;
+
+    /**
+     * Set to true to enable make scrollbar draggable that allows you to control slider position
+     *
+     * @default true
+     */
+    draggable?: boolean | undefined;
+
+    /**
+     * Set to true to snap slider position to slides when you release scrollbar
+     *
+     * @default false
+     */
+    snapOnRelease?: boolean | undefined;
+
+    /**
+     * Size of scrollbar draggable element in px
+     *
+     * @default 'auto'
+     */
+    dragSize?: 'auto' | number | undefined;
+
+    /**
+     * Scrollbar element additional CSS class when it is disabled
+     *
+     * @default 'swiper-scrollbar-lock'
+     */
+    lockClass?: string | undefined;
+
+    /**
+     *     Scrollbar draggable element CSS class
+     *
+     * @default 'swiper-scrollbar-drag'
+     */
+    dragClass?: string | undefined;
+}
+
+/**
+ * Object with autoplay parameters or boolean true to enable with default settings.
+ *
+ * @example
+ * var mySwiper = new Swiper('.swiper-container', {
+ *   autoplay: {
+ *     delay: 5000,
+ *   },
+ * });
+ */
+export interface AutoplayOptions {
+    /**
+     * Delay between transitions (in ms). If this parameter is not specified, auto play will be disabled
+     *
+     * If you need to specify different delay for specifi slides you can do it by using
+     * data-swiper-autoplay (in ms) attribute on slide.
+     *
+     * @example
+     * <!-- hold this slide for 2 seconds -->
+     * <div class="swiper-slide" data-swiper-autoplay="2000">
+     *
+     * @default 3000
+     */
+    delay?: number | undefined;
+
+    /**
+     * Enable this parameter and autoplay will be stopped when it reaches last slide (has no effect in loop mode)
+     *
+     * @default false
+     */
+    stopOnLastSlide?: boolean | undefined;
+
+    /**
+     * Set to false and autoplay will not be disabled after
+     * user interactions (swipes), it will be restarted
+     * every time after interaction
+     *
+     * @default true
+     */
+    disableOnInteraction?: boolean | undefined;
+
+    /**
+     * Enables autoplay in reverse direction
+     *
+     * @default false
+     */
+    reverseDirection?: boolean | undefined;
+
+    /**
+     * When enabled autoplay will wait for wrapper transition to continue.
+     * Can be disabled in case of using Virtual Translate when your
+     * slider may not have transition
+     *
+     * @default true
+     */
+    waitForTransition?: boolean | undefined;
+}
+
+export interface LazyOptions {
+    loadPrevNext?: boolean | undefined;
+    loadPrevNextAmount?: number | undefined;
+    loadOnTransitionStart?: boolean | undefined;
+    elementClass?: string | undefined;
+    loadingClass?: string | undefined;
+    loadedClass?: string | undefined;
+    preloaderClass?: string | undefined;
+}
+
+/*
+ * Options - Effect
+ */
+
+export interface FadeEffectOptions {
+    crossFade?: boolean | undefined;
+}
+
+export interface CoverflowEffectOptions {
+    slideShadows?: boolean | undefined;
+    rotate?: number | undefined;
+    stretch?: number | undefined;
+    depth?: number | undefined;
+    modifier?: number | undefined;
+}
+
+export interface FlipEffectOptions {
+    slideShadows?: boolean | undefined;
+    limitRotation?: boolean | undefined;
+}
+
+export interface CubeEffectOptions {
+    slideShadows?: boolean | undefined;
+    shadow?: boolean | undefined;
+    shadowOffset?: number | undefined;
+    shadowScale?: number | undefined;
+}
+
+export interface ThumbsOptions {
+    swiper?: Swiper | undefined;
+    slideThumbActiveClass?: string | undefined;
+    thumbsContainerClass?: string | undefined;
+    multipleActiveThumbs?: boolean | undefined;
+    autoScrollOffset?: number | undefined;
+}
+
+export interface ZoomOptions {
+    maxRatio?: number | undefined;
+    minRatio?: number | undefined;
+    toggle?: boolean | undefined;
+    containerClass?: string | undefined;
+    zoomedSlideClass?: string | undefined;
+}
+
+export interface KeyboardOptions {
+    enabled?: boolean | undefined;
+    onlyInViewport?: boolean | undefined;
+}
+
+export interface MousewheelOptions {
+    forceToAxis?: boolean | undefined;
+    releaseOnEdges?: boolean | undefined;
+    invert?: boolean | undefined;
+    sensitivity?: number | undefined;
+    eventsTarged?: SelectableElement | undefined;
+}
+
+export interface VirtualOptions {
+    slides?: any[] | undefined;
+    cache?: boolean | undefined;
+    addSlidesBefore?: number | undefined;
+    addSlidesAfter?: number | undefined;
+    renderSlide?: ((slide: any, index: any) => any) | undefined;
+    renderExternal?: ((data: any) => any) | undefined;
+}
+
+export interface HashNavigationOptions {
+    /**
+     * Set to true to enable also navigation through slides (when hashnav
+     * is enabled) by browser history or by setting directly hash on document location
+     *
+     * @default false
+     */
+    watchState?: boolean | undefined;
+
+    /**
+     * Works in addition to hashnav to replace current url state with the
+     * new one instead of adding it to history
+     *
+     * @default     false
+     */
+    replaceState?: boolean | undefined;
+}
+
+export interface HistoryNavigationOptions {
+    /**
+     * Works in addition to hashnav or history to replace current url state with the
+     * new one instead of adding it to history
+     *
+     * @default false
+     */
+    replaceState?: boolean | undefined;
+
+    /**
+     * Url key for slides
+     *
+     * @default 'slides'
+     */
+    key?: string | undefined;
+}
+
+/**
+ * Object with controller parameters or boolean true to enable with default settings. For example:
+ *
+ * @example
+ * var mySwiper = new Swiper('.swiper-container', {
+ *   controller: {
+ *     inverse: true,
+ *   },
+ * });
+ */
+export interface ControllerOptions {
+    /**
+     * Pass here another Swiper instance or array with Swiper instances that should be controlled
+     * by this Swiper
+     */
+    control?: Swiper | undefined;
+
+    /**
+     * Set to true and controlling will be in inverse direction
+     *
+     * @default false
+     */
+    inverse?: boolean | undefined;
+
+    /**
+     * Can be 'slide' or 'container'. Defines a way how to control another slider: slide by slide
+     * (with respect to other slider's grid) or depending on all slides/container
+     * (depending on total slider percentage).
+     *
+     * @default 'slide'
+     */
+    by?: 'slide' | 'container' | undefined;
+}
+
+export interface A11yOptions {
+    /**
+     * Enables A11y
+     *
+     * @default true
+     */
+    enabled?: boolean | undefined;
+
+    /**
+     * Message for screen readers for previous button
+     *
+     * @default 'Previous slide'
+     */
+    prevSlideMessage?: string | undefined;
+
+    /**
+     * Message for screen readers for next button
+     *
+     * @default 'Next slide'
+     */
+    nextSlideMessage?: string | undefined;
+
+    /**
+     * Message for screen readers for previous button when swiper is on first slide
+     *
+     * @default 'This is the first slide'
+     */
+    firstSlideMessage?: string | undefined;
+
+    /**
+     * Message for screen readers for previous button when swiper is on last slide
+     *
+     * @default 'This is the last slide'
+     */
+    lastSlideMessage?: string | undefined;
+
+    /**
+     * Message for screen readers for single pagination bullet
+     *
+     * @default 'Go to slide {{index}}'
+     */
+    paginationBulletMessage?: string | undefined;
+
+    /**
+     * CSS class name of a11 notification
+     *
+     * @default 'swiper-notification'
+     */
+    notificationClass?: string | undefined;
+}
+
+import {
+    Virtual,
+    Keyboard,
+    Mousewheel,
+    Navigation,
+    Pagination,
+    Scrollbar,
+    Parallax,
+    Zoom,
+    Lazy,
+    Controller,
+    A11y,
+    History,
+    HashNavigation,
+    Autoplay,
+    EffectFade,
+    EffectCube,
+    EffectFlip,
+    EffectCoverflow
+} from './js/swiper.esm';
+
+/**
+ * Core module
+ */
+// XXX: This is an export assignment in `dist/js/swiper.js` (referenced by
+// the "main" field of package.json) but a default export in
+// `dist/js/swiper.esm.bundle.js` (referenced by the "module" field).  Short
+// of trying to convince upstream to change their packaging, the best we can
+// do is choose one or the other and hope that users use `esModuleInterop`.
+export default class Swiper {
+    /**
+     * Constructs a new Swiper instance.
+     *
+     * @param container Where Swiper applies to.
+     * @param options   Instance options.
+     */
+    constructor(container: SelectableElement, options?: SwiperOptions);
+
+    /**
+     * Object with passed initialization parameters
+     */
+    params: SwiperOptions;
+
+    /**
+     * Element with slider container.
+     */
+    el: HTMLElement;
+
+    /**
+     * Dom7 element with slider container HTML element. To get vanilla HTMLElement use el
+     */
+    $el: DOM7Element;
+
+    /**
+     * Slider wrapper HTML element.
+     */
+    wrapperEl: HTMLElement;
+
+    /**
+     * Dom7 element with slider wrapper HTML element. To get vanilla HTMLElement use wrapperEl
+     */
+    $wrapperEl: DOM7Element;
+
+    /**
+     * Dom7 array-like collection of slides HTML elements. To get specific slide HTMLElement use slides[1]
+     */
+    slides: DOM7Element[];
+
+    /**
+     * Width of container
+     */
+    width: number;
+
+    /**
+     * Height of container
+     */
+    height: number;
+
+    /**
+     * Current value of wrapper translate
+     */
+    translate: number;
+
+    /**
+     * Current progress of wrapper translate (from 0 to 1)
+     */
+    progress: number;
+
+    /**
+     * Index number of currently active slide.
+     *
+     * @note Note, that in loop mode active index value will be always shifted
+     * on a number of looped/duplicated slides.
+     */
+    activeIndex: number;
+
+    /**
+     * Index number of currently active slide considering duplicated slides in loop mode
+     */
+    realIndex: number;
+
+    /**
+     * Index number of previously active slide
+     */
+    previousIndex: number;
+
+    /**
+     * true if slider on most "left"/"top" position
+     */
+    isBeginning: true;
+
+    /**
+     * true if slider on most "right"/"bottom" position
+     */
+    isEnd: boolean;
+
+    /**
+     * true if swiper is in transition
+     */
+    animating: boolean;
+
+    /**
+     * Object with the following touch event properties:
+     */
+    touches: {
+        startX: number;
+        startY: number;
+        currentX: number;
+        currentY: number;
+        diff: number;
+    };
+
+    /**
+     * Index number of last clicked slide
+     */
+    clickedIndex: number;
+
+    /**
+     * Link to last clicked slide (HTMLElement)
+     */
+    clickedSlide: HTMLElement;
+
+    /**
+     * Disable/enable ability to slide to the next slides by assigning false/true to this property
+     *
+     * @default true
+     */
+    allowSlideNext: boolean;
+
+    /**
+     * Disable/enable ability to slide to the previous slides by assigning false/true to this property
+     *
+     * @default true
+     */
+    allowSlidePrev: boolean;
+
+    /**
+     * Disable/enable ability move slider by grabbing it with
+     * mouse or by touching it with finger (on touch screens)
+     * by assigning false/true to this property
+     *
+     * @default true
+     */
+    allowTouchMove: boolean;
+
+    // Methods
+    /**
+     * Run transition to next slide.
+     *
+     * @param speed Transition duration (in ms).
+     * @param runCallbacks Set it to false (by default it is true) and transition will
+     *  not produce transition events.
+     */
+    slideNext(speed?: number, runCallbacks?: boolean): void;
+
+    /**
+     * Run transition to previous slide.
+     *
+     * @param speed Transition duration (in ms).
+     * @param runCallbacks Set it to false (by default it is true) and transition will
+     *  not produce transition events.
+     */
+    slidePrev(speed?: number, runCallbacks?: boolean): void;
+
+    /**
+     * Run transition to the slide with index number equal to 'index' parameter for the
+     *  duration equal to 'speed' parameter.
+     *
+     * @param index Index number of slide.
+     * @param speed Transition duration (in ms).
+     * @param runCallbacks Set it to false (by default it is true) and transition will
+     *  not produce transition events.
+     */
+    slideTo(index: number, speed?: number, runCallbacks?: boolean): void;
+
+    /**
+     * Does the same as .slideTo but for the case when used with enabled loop. So this
+     * method will slide to slides with realIndex matching to passed index
+     *
+     * @param index Index number of slide.
+     * @param speed Transition duration (in ms).
+     * @param runCallbacks Set it to false (by default it is true) and transition will
+     *  not produce transition events.
+     */
+    slideToLoop(index: number, speed?: number, runCallbacks?: boolean): void;
+
+    /**
+     * Reset swiper position to currently active slide for the duration equal to 'speed'
+     * parameter.
+     *
+     * @param speed Transition duration (in ms).
+     * @param runCallbacks Set it to false (by default it is true) and transition will
+     *  not produce transition events.
+     */
+    slideReset(speed?: number, runCallbacks?: boolean): void;
+
+    /**
+     * Reset swiper position to closest slide/snap point for the duration equal to 'speed' parameter.
+     *
+     * @param speed Transition duration (in ms).
+     * @param runCallbacks Set it to false (by default it is true) and transition will
+     *  not produce transition events.
+     */
+    slideToClosest(speed?: number, runCallbacks?: boolean): void;
+
+    /**
+     * Force swiper to update its height (when autoHeight enabled) for the duration equal to
+     * 'speed' parameter
+     *
+     * @param speed Transition duration (in ms).
+     */
+    updateAutoHeight(speed?: number): void;
+
+    /**
+     * You should call it after you add/remove slides
+     * manually, or after you hide/show it, or do any
+     * custom DOM modifications with Swiper
+     * This method also includes subcall of the following
+     * methods which you can use separately:
+     */
+    update(): void;
+
+    /**
+     * recalculate size of swiper container
+     */
+    updateSize(): void;
+
+    /**
+     * recalculate number of slides and their offsets. Useful after you add/remove slides with JavaScript
+     */
+    updateSlides(): void;
+
+    /**
+     * recalculate swiper progress
+     */
+    updateProgress(): void;
+
+    /**
+     * update active/prev/next classes on slides and bullets
+     */
+    updateSlidesClasses(): void;
+
+    /**
+     * tach all events listeners
+     */
+    detachEvents(): void;
+
+    /**
+     * Atach all events listeners again
+     */
+    attachEvents(): void;
+
+    /**
+     * Destroy slider instance and detach all events listeners, where
+     */
+    destroy(deleteInstance: boolean, cleanupStyles: boolean): void;
+
+    /**
+     * Set it to false (by default it is true) to not to delete Swiper instance
+     */
+    deleteInstance: boolean;
+
+    /**
+     * Set it to true (by default it is true) and all
+     * custom styles will be removed from slides,
+     * wrapper and container. Useful if you need to
+     * destroy Swiper and to init again with new
+     * options or in different direction
+     */
+    cleanStyles: boolean;
+
+    /**
+     * Installs modules on Swiper in runtime.
+     */
+    static use(modules: SwiperModule[]): void;
+
+    /**
+     * Add new slides to the end. slides could be
+     * HTMLElement or HTML string with new slide or
+     * array with such slides, for example:
+     *
+     * @example appendSlide('<div class="swiper-slide">Slide 10"</div>')
+     * @example
+     * appendSlide([
+     *  '<div class="swiper-slide">Slide 10"</div>',
+     *  '<div class="swiper-slide">Slide 11"</div>'
+     * ]);
+     */
+    appendSlide(slides: HTMLElement | string | string[]): void;
+
+    /**
+     * Add new slides to the beginning. slides could be
+     * HTMLElement or HTML string with new slide or array with such slides, for example:
+     *
+     * @example prependSlide('<div class="swiper-slide">Slide 0"</div>')
+     * @example prependSlide([
+     *  '<div class="swiper-slide">Slide 1"</div>',
+     *  '<div class="swiper-slide">Slide 2"</div>'
+     * ]);
+     */
+    prependSlide(slides: HTMLElement | string | string[]): void;
+
+    /**
+     * Add new slides to the required index. slides could be HTMLElement or HTML string with new slide or array with such slides, for example:
+     *
+     * @example addSlide(1, '<div class="swiper-slide">Slide 10"</div>')
+     * @example addSlide(1, [
+     *  '<div class="swiper-slide">Slide 10"</div>',
+     *  '<div class="swiper-slide">Slide 11"</div>'
+     * ]);
+     */
+    addSlide(index: number, slides: HTMLElement | string | string[]): void;
+
+    /**
+     * Remove selected slides. slideIndex could be a number with slide index to remove or array with indexes.
+     *
+     * @example removeSlide(0); // remove first slide
+     * @example removeSlide([0, 1]); // remove first and second slides
+     * @example removeAllSlides();    // Remove all slides
+     */
+    removeSlide(slideIndex: number | number[]): void;
+
+    /**
+     * Remove all slides
+     */
+    removeAllSlides(): void;
+
+    /**
+     * Set custom css3 transform's translate value for swiper wrapper
+     */
+    setTranslate(translate: any): void;
+
+    /**
+     * Get current value of swiper wrapper css3 transform translate
+     */
+    getTranslate(): any;
+
+    /**
+     * Animate custom css3 transform's translate value for swiper wrapper
+     */
+    translateTo(translate: number, speed: number, runCallbacks?: boolean, translateBounds?: boolean): any;
+
+    /**
+     * Add event listener
+     */
+    on(event: SwiperEvent, handler: () => void): void;
+
+    /**
+     * Add event listener that will be executed only once
+     */
+    once(event: SwiperEvent, handler: () => void): void;
+
+    /**
+     * Remove event listener for specified event
+     * If no handler specified, removes all listeners for specified event
+     */
+    off(event: SwiperEvent, handler?: () => void): void;
+
+    /**
+     * Disable mousewheel control
+     */
+    disableMousewheelControl(): void;
+
+    /**
+     * Enable mousewheel control
+     */
+    enableMousewheelControl(): void;
+
+    /**
+     * Disable keyboard control
+     */
+    disableKeyboardControl(): void;
+
+    /**
+     * Enable keyboard control
+     */
+    enableKeyboardControl(): void;
+
+    /**
+     * Unset grab cursor
+     */
+    unsetGrabCursor(): void;
+
+    /**
+     * Set grab cursor
+     */
+    setGrabCursor(): void;
+
+    // Components
+
+    /**
+     * Swiper Navigation module.
+     */
+    navigation?: Navigation | undefined;
+
+    /**
+     * Swiper Pagination module.
+     */
+    pagination?: Pagination | undefined;
+
+    /**
+     * Swiper Scrollbar module.
+     */
+    scrollbar?: Scrollbar | undefined;
+
+    /**
+     * Swiper Autoplay module.
+     */
+    autoplay?: Autoplay | undefined;
+
+    /**
+     * Swiper Parallax module.
+     */
+    parallax?: Parallax | undefined;
+
+    /**
+     * Swiper Lazy module.
+     */
+    lazy?: Lazy | undefined;
+
+    /**
+     * Swiper FadeEffect module.
+     */
+    fadeEffect?: EffectFade | undefined;
+
+    /**
+     * Swiper CoverflowEffect module.
+     */
+    coverflowEffect?: EffectCoverflow | undefined;
+
+    /**
+     * Swiper FlipEffect module.
+     */
+    flipEffect?: EffectFlip | undefined;
+
+    /**
+     * Swiper CubeEffect module.
+     */
+    cubeEffect?: EffectCube | undefined;
+
+    /**
+     * Swiper Thumbs module.
+     */
+    thumbs?: object | undefined;
+
+    /**
+     * Swiper Zoom module.
+     */
+    zoom?: Zoom | undefined;
+
+    /**
+     * Swiper Keyboard module.
+     */
+    keyboard?: Keyboard | undefined;
+
+    /**
+     * Swiper Mousewheel module.
+     */
+    mousewheel?: Mousewheel | undefined;
+
+    /**
+     * Swiper Virtual module.
+     */
+    virtual?: Virtual | undefined;
+
+    /**
+     * Swiper HashNavigation module.
+     */
+    hashNavigation?: HashNavigation | undefined;
+
+    /**
+     * Swiper History module.
+     */
+    history?: History | undefined;
+
+    /**
+     * Swiper Controller module.
+     */
+    controller?: Controller | undefined;
+
+    /**
+     * Swiper A11y module.
+     */
+    a11y?: A11y | undefined;
+}

+ 312 - 0
node_modules/@types/swiper/js/swiper.esm.d.ts

@@ -0,0 +1,312 @@
+import Swiper, { DOM7Element } from '../index';
+
+// Reexport everything from `swiper` except the default export of the
+// `Swiper` class, which is instead provided as a named export by
+// `swiper.esm`.
+export * from '../index';
+export { Swiper };
+
+/*
+ * Swiper exports the following as ES5 module (in swiper.esm.js).
+ */
+
+/**
+ * Virtual Slides module.
+ */
+export class Virtual {
+    /**
+     * Object with cached slides HTML elements
+     */
+    cache: object;
+
+    /**
+     * Index of first rendered slide
+     */
+    from: number;
+
+    /**
+     * Index of last rendered slide
+     */
+    to: number;
+
+    /**
+     * Array with slide items passed by virtual.slides parameter
+     */
+    slides: any[];
+
+    /*
+     * Methods
+     */
+
+    /**
+     * Add new slides to the end. slides could be HTMLElement or HTML string with new slide or array
+     * with such slides, for example:
+     *
+     * @example
+     * mySwiper.appendSlide('<div class="swiper-slide">Slide 10"</div>')
+     * mySwiper.appendSlide([
+     *   '<div class="swiper-slide">Slide 10"</div>',
+     *   '<div class="swiper-slide">Slide 11"</div>'
+     * ]);
+     */
+    appendSlide(slide: HTMLElement | string): void;
+
+    /**
+     * Add new slides to the beginning. slides could be HTMLElement or HTML string with new slide or
+     * array with such slides, for example:
+     *
+     * @example
+     * mySwiper.prependSlide('<div class="swiper-slide">Slide 0"</div>')
+     * mySwiper.prependSlide([
+     * '<div class="swiper-slide">Slide 1"</div>',
+     * '<div class="swiper-slide">Slide 2"</div>'
+     * ]);
+     */
+    prependSlide(slide: HTMLElement | string): void;
+
+    /**
+     * Update virutal slides state
+     */
+    update(): void;
+}
+
+/**
+ * Keyboard Control module.
+ */
+export class Keyboard {
+    /**
+     * Whether the keyboard control is enabled
+     */
+    enabled: boolean;
+
+    // Methods
+    /**
+     * Enable keyboard control
+     */
+    enable(): void;
+
+    /**
+     * Disable keyboard control
+     */
+    disable(): void;
+}
+
+/**
+ * Mousewheel Control module.
+ */
+export class Mousewheel {
+    /**
+     * Whether the mousewheel control is enabled
+     */
+    enabled: boolean;
+
+    // Methods
+    /**
+     * Enable mousewheel control
+     */
+    enable(): void;
+
+    /**
+     * Disable mousewheel control
+     */
+    disable(): void;
+}
+
+/**
+ * Navigation module.
+ */
+export class Navigation {
+    /**
+     * HTMLElement of "next" navigation button
+     */
+    nextEl: HTMLElement;
+
+    /**
+     * HTMLElement of "previous" navigation button
+     */
+    prevEl: HTMLElement;
+
+    /**
+     * Update navigation buttons state (enabled/disabled)
+     */
+    update(): void;
+}
+
+/**
+ * Pagination module.
+ */
+export class Pagination {
+    /**
+     * HTMLElement of pagination container element
+     */
+    el: HTMLElement;
+
+    /**
+     * Dom7 array-like collection of pagination bullets
+     * HTML elements. To get specific slide HTMLElement
+     * use `mySwiper.pagination.bullets[1]`.
+     */
+    bullets: DOM7Element[];
+
+    /**
+     * Render pagination layout
+     */
+    render(): void;
+
+    /**
+     * Update pagination state (enabled/disabled/active)
+     */
+    update(): void;
+}
+
+/**
+ * Scrollbar module.
+ */
+export class Scrollbar {
+    // Properties
+    /**
+     * HTMLElement of Scrollbar container element
+     */
+    el: HTMLElement;
+
+    /**
+     * HTMLElement of Scrollbar draggable handler element
+     */
+    dragEl: HTMLElement;
+
+    // Methods
+    /**
+     * Updates scrollbar track and handler sizes
+     */
+    updateSize(): void;
+}
+
+/**
+ * Parallax module.
+ */
+export class Parallax { }
+
+/**
+ * Zoom module.
+ */
+export class Zoom {
+    /**
+     * Whether the zoom module is enabled
+     */
+    enabled: boolean;
+
+    /**
+     * Current image scale ratio
+     */
+    scale: number;
+
+    /**
+     * Enable zoom module
+     */
+    enable(): void;
+
+    /**
+     * Disable zoom module
+     */
+    disable(): void;
+
+    /**
+     * Zoom in image of the currently active slide
+     */
+    in(): void;
+
+    /**
+     * Zoom out image of the currently active slide
+     */
+    out(): void;
+
+    /**
+     * Toggle image zoom of the currently active slide
+     */
+    toggle(): void;
+}
+
+/**
+ * Lazy module.
+ */
+export class Lazy {
+    /**
+     * Load/update lazy images based on current slider state (position)
+     */
+    load(): void;
+
+    /**
+     * Force to load lazy images in slide by specified index
+     * @param number index number of slide to load lazy images in
+     */
+    loadInSlide(index: number): void;
+}
+
+/**
+ * Controller module.
+ */
+export class Controller {
+    /**
+     * Pass here another Swiper instance or array with Swiper instances that should be controlled
+     * by this Swiper
+     */
+    control?: Swiper | Swiper[] | undefined;
+}
+
+/**
+ * Accessibility module (a11y$)
+ */
+export class A11y { }
+
+/**
+ * History Navigation module.
+ */
+export class History { }
+
+/**
+ * Hash Navigation module.
+ */
+export class HashNavigation {
+}
+
+/**
+ * Autoplay module.
+ */
+export class Autoplay {
+    // Properties
+    /**
+     * Whether autoplay enabled and running
+     */
+    running: boolean;
+
+    // Methods
+    /**
+     * Start autoplay
+     */
+    start(): boolean;
+
+    /**
+     * Stop autoplay
+     */
+    stop(): boolean;
+}
+
+/**
+ * Fade Effect module.
+ */
+export class EffectFade { }
+
+/**
+ * Cube Effect module.
+ */
+export class EffectCube { }
+
+/**
+ * Flip Effect module.
+ */
+export class EffectFlip { }
+
+/**
+ * Coverflow Effect module.
+ */
+export class EffectCoverflow { }

+ 60 - 0
node_modules/@types/swiper/package.json

@@ -0,0 +1,60 @@
+{
+    "name": "@types/swiper",
+    "version": "5.4.3",
+    "description": "TypeScript definitions for Swiper",
+    "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/swiper",
+    "license": "MIT",
+    "contributors": [
+        {
+            "name": "Sebastián Galiano",
+            "url": "https://github.com/sgaliano",
+            "githubUsername": "sgaliano"
+        },
+        {
+            "name": "Luca Trazzi",
+            "url": "https://github.com/lucax88x",
+            "githubUsername": "lucax88x"
+        },
+        {
+            "name": "Eugene Matseruk",
+            "url": "https://github.com/ematseruk",
+            "githubUsername": "ematseruk"
+        },
+        {
+            "name": "Luiz M.",
+            "url": "https://github.com/odahcam",
+            "githubUsername": "odahcam"
+        },
+        {
+            "name": "Justin Abene",
+            "url": "https://github.com/jmca",
+            "githubUsername": "jmca"
+        },
+        {
+            "name": "Asif Rahman",
+            "url": "https://github.com/daem0ndev",
+            "githubUsername": "daem0ndev"
+        },
+        {
+            "name": "Liad Idan",
+            "url": "https://github.com/LiadIdan",
+            "githubUsername": "LiadIdan"
+        },
+        {
+            "name": "Sangwon Lee",
+            "url": "https://github.com/john015",
+            "githubUsername": "john015"
+        }
+    ],
+    "main": "",
+    "types": "index.d.ts",
+    "repository": {
+        "type": "git",
+        "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
+        "directory": "types/swiper"
+    },
+    "scripts": {},
+    "dependencies": {},
+    "typesPublisherContentHash": "d45848bad7490dc6713c80e383953000999cf2bb73b18280b9f95371c6388741",
+    "typeScriptVersion": "3.6"
+}

+ 20 - 0
node_modules/swiper/LICENSE

@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 Vladimir Kharlampidi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 11 - 0
node_modules/swiper/README.md

@@ -0,0 +1,11 @@
+Swiper
+==========
+
+Swiper - is the free and most modern mobile touch slider with hardware accelerated transitions and amazing native behavior. It is intended to be used in mobile websites, mobile web apps, and mobile native/hybrid apps.
+
+Swiper is not compatible with all platforms, it is a modern touch slider which is focused only on modern apps/platforms to bring the best experience and simplicity.
+
+# Getting Started
+  * [Getting Started Guide](https://swiperjs.com/get-started/)
+  * [API](https://swiperjs.com/swiper-api/)
+  * [Demos](https://swiperjs.com/demos/)

+ 9 - 0
node_modules/swiper/modules/a11y-element.css

@@ -0,0 +1,9 @@
+/* a11y */
+.swiper .swiper-notification {
+  position: absolute;
+  left: 0;
+  top: 0;
+  pointer-events: none;
+  opacity: 0;
+  z-index: -1000;
+}

+ 1 - 0
node_modules/swiper/modules/a11y-element.min.css

@@ -0,0 +1 @@
+.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}

+ 9 - 0
node_modules/swiper/modules/a11y.css

@@ -0,0 +1,9 @@
+/* a11y */
+.swiper .swiper-notification {
+  position: absolute;
+  left: 0;
+  top: 0;
+  pointer-events: none;
+  opacity: 0;
+  z-index: -1000;
+}

+ 9 - 0
node_modules/swiper/modules/a11y.less

@@ -0,0 +1,9 @@
+/* a11y */
+.swiper .swiper-notification {
+  position: absolute;
+  left: 0;
+  top: 0;
+  pointer-events: none;
+  opacity: 0;
+  z-index: -1000;
+}

+ 1 - 0
node_modules/swiper/modules/a11y.min.css

@@ -0,0 +1 @@
+.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}

Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/a11y.min.mjs


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/a11y.min.mjs.map


+ 377 - 0
node_modules/swiper/modules/a11y.mjs

@@ -0,0 +1,377 @@
+import { g as getDocument } from '../shared/ssr-window.esm.mjs';
+import { c as classesToSelector } from '../shared/classes-to-selector.mjs';
+import { c as createElement, i as elementIndex, m as makeElementsArray, s as setInnerHTML } from '../shared/utils.mjs';
+
+function A11y(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on
+  } = _ref;
+  extendParams({
+    a11y: {
+      enabled: true,
+      notificationClass: 'swiper-notification',
+      prevSlideMessage: 'Previous slide',
+      nextSlideMessage: 'Next slide',
+      firstSlideMessage: 'This is the first slide',
+      lastSlideMessage: 'This is the last slide',
+      paginationBulletMessage: 'Go to slide {{index}}',
+      slideLabelMessage: '{{index}} / {{slidesLength}}',
+      containerMessage: null,
+      containerRoleDescriptionMessage: null,
+      containerRole: null,
+      itemRoleDescriptionMessage: null,
+      slideRole: 'group',
+      id: null,
+      scrollOnFocus: true
+    }
+  });
+  swiper.a11y = {
+    clicked: false
+  };
+  let liveRegion = null;
+  let preventFocusHandler;
+  let focusTargetSlideEl;
+  let visibilityChangedTimestamp = new Date().getTime();
+  function notify(message) {
+    const notification = liveRegion;
+    if (notification.length === 0) return;
+    setInnerHTML(notification, message);
+  }
+  function getRandomNumber(size) {
+    if (size === void 0) {
+      size = 16;
+    }
+    const randomChar = () => Math.round(16 * Math.random()).toString(16);
+    return 'x'.repeat(size).replace(/x/g, randomChar);
+  }
+  function makeElFocusable(el) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('tabIndex', '0');
+    });
+  }
+  function makeElNotFocusable(el) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('tabIndex', '-1');
+    });
+  }
+  function addElRole(el, role) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('role', role);
+    });
+  }
+  function addElRoleDescription(el, description) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('aria-roledescription', description);
+    });
+  }
+  function addElControls(el, controls) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('aria-controls', controls);
+    });
+  }
+  function addElLabel(el, label) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('aria-label', label);
+    });
+  }
+  function addElId(el, id) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('id', id);
+    });
+  }
+  function addElLive(el, live) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('aria-live', live);
+    });
+  }
+  function disableEl(el) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('aria-disabled', true);
+    });
+  }
+  function enableEl(el) {
+    el = makeElementsArray(el);
+    el.forEach(subEl => {
+      subEl.setAttribute('aria-disabled', false);
+    });
+  }
+  function onEnterOrSpaceKey(e) {
+    if (e.keyCode !== 13 && e.keyCode !== 32) return;
+    const params = swiper.params.a11y;
+    const targetEl = e.target;
+    if (swiper.pagination && swiper.pagination.el && (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))) {
+      if (!e.target.matches(classesToSelector(swiper.params.pagination.bulletClass))) return;
+    }
+    if (swiper.navigation && swiper.navigation.prevEl && swiper.navigation.nextEl) {
+      const prevEls = makeElementsArray(swiper.navigation.prevEl);
+      const nextEls = makeElementsArray(swiper.navigation.nextEl);
+      if (nextEls.includes(targetEl)) {
+        if (!(swiper.isEnd && !swiper.params.loop)) {
+          swiper.slideNext();
+        }
+        if (swiper.isEnd) {
+          notify(params.lastSlideMessage);
+        } else {
+          notify(params.nextSlideMessage);
+        }
+      }
+      if (prevEls.includes(targetEl)) {
+        if (!(swiper.isBeginning && !swiper.params.loop)) {
+          swiper.slidePrev();
+        }
+        if (swiper.isBeginning) {
+          notify(params.firstSlideMessage);
+        } else {
+          notify(params.prevSlideMessage);
+        }
+      }
+    }
+    if (swiper.pagination && targetEl.matches(classesToSelector(swiper.params.pagination.bulletClass))) {
+      targetEl.click();
+    }
+  }
+  function updateNavigation() {
+    if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;
+    const {
+      nextEl,
+      prevEl
+    } = swiper.navigation;
+    if (prevEl) {
+      if (swiper.isBeginning) {
+        disableEl(prevEl);
+        makeElNotFocusable(prevEl);
+      } else {
+        enableEl(prevEl);
+        makeElFocusable(prevEl);
+      }
+    }
+    if (nextEl) {
+      if (swiper.isEnd) {
+        disableEl(nextEl);
+        makeElNotFocusable(nextEl);
+      } else {
+        enableEl(nextEl);
+        makeElFocusable(nextEl);
+      }
+    }
+  }
+  function hasPagination() {
+    return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;
+  }
+  function hasClickablePagination() {
+    return hasPagination() && swiper.params.pagination.clickable;
+  }
+  function updatePagination() {
+    const params = swiper.params.a11y;
+    if (!hasPagination()) return;
+    swiper.pagination.bullets.forEach(bulletEl => {
+      if (swiper.params.pagination.clickable) {
+        makeElFocusable(bulletEl);
+        if (!swiper.params.pagination.renderBullet) {
+          addElRole(bulletEl, 'button');
+          addElLabel(bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, elementIndex(bulletEl) + 1));
+        }
+      }
+      if (bulletEl.matches(classesToSelector(swiper.params.pagination.bulletActiveClass))) {
+        bulletEl.setAttribute('aria-current', 'true');
+      } else {
+        bulletEl.removeAttribute('aria-current');
+      }
+    });
+  }
+  const initNavEl = (el, wrapperId, message) => {
+    makeElFocusable(el);
+    if (el.tagName !== 'BUTTON') {
+      addElRole(el, 'button');
+      el.addEventListener('keydown', onEnterOrSpaceKey);
+    }
+    addElLabel(el, message);
+    addElControls(el, wrapperId);
+  };
+  const handlePointerDown = e => {
+    if (focusTargetSlideEl && focusTargetSlideEl !== e.target && !focusTargetSlideEl.contains(e.target)) {
+      preventFocusHandler = true;
+    }
+    swiper.a11y.clicked = true;
+  };
+  const handlePointerUp = () => {
+    preventFocusHandler = false;
+    requestAnimationFrame(() => {
+      requestAnimationFrame(() => {
+        if (!swiper.destroyed) {
+          swiper.a11y.clicked = false;
+        }
+      });
+    });
+  };
+  const onVisibilityChange = e => {
+    visibilityChangedTimestamp = new Date().getTime();
+  };
+  const handleFocus = e => {
+    if (swiper.a11y.clicked || !swiper.params.a11y.scrollOnFocus) return;
+    if (new Date().getTime() - visibilityChangedTimestamp < 100) return;
+    const slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
+    if (!slideEl || !swiper.slides.includes(slideEl)) return;
+    focusTargetSlideEl = slideEl;
+    const isActive = swiper.slides.indexOf(slideEl) === swiper.activeIndex;
+    const isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl);
+    if (isActive || isVisible) return;
+    if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;
+    if (swiper.isHorizontal()) {
+      swiper.el.scrollLeft = 0;
+    } else {
+      swiper.el.scrollTop = 0;
+    }
+    requestAnimationFrame(() => {
+      if (preventFocusHandler) return;
+      if (swiper.params.loop) {
+        swiper.slideToLoop(swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'))), 0);
+      } else {
+        swiper.slideTo(swiper.getSlideIndexWhenGrid(swiper.slides.indexOf(slideEl)), 0);
+      }
+      preventFocusHandler = false;
+    });
+  };
+  const initSlides = () => {
+    const params = swiper.params.a11y;
+    if (params.itemRoleDescriptionMessage) {
+      addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage);
+    }
+    if (params.slideRole) {
+      addElRole(swiper.slides, params.slideRole);
+    }
+    const slidesLength = swiper.slides.length;
+    if (params.slideLabelMessage) {
+      swiper.slides.forEach((slideEl, index) => {
+        const slideIndex = swiper.params.loop ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : index;
+        const ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength);
+        addElLabel(slideEl, ariaLabelMessage);
+      });
+    }
+  };
+  const init = () => {
+    const params = swiper.params.a11y;
+    swiper.el.append(liveRegion);
+
+    // Container
+    const containerEl = swiper.el;
+    if (params.containerRoleDescriptionMessage) {
+      addElRoleDescription(containerEl, params.containerRoleDescriptionMessage);
+    }
+    if (params.containerMessage) {
+      addElLabel(containerEl, params.containerMessage);
+    }
+    if (params.containerRole) {
+      addElRole(containerEl, params.containerRole);
+    }
+
+    // Wrapper
+    const wrapperEl = swiper.wrapperEl;
+    const wrapperId = params.id || wrapperEl.getAttribute('id') || `swiper-wrapper-${getRandomNumber(16)}`;
+    const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';
+    addElId(wrapperEl, wrapperId);
+    addElLive(wrapperEl, live);
+
+    // Slide
+    initSlides();
+
+    // Navigation
+    let {
+      nextEl,
+      prevEl
+    } = swiper.navigation ? swiper.navigation : {};
+    nextEl = makeElementsArray(nextEl);
+    prevEl = makeElementsArray(prevEl);
+    if (nextEl) {
+      nextEl.forEach(el => initNavEl(el, wrapperId, params.nextSlideMessage));
+    }
+    if (prevEl) {
+      prevEl.forEach(el => initNavEl(el, wrapperId, params.prevSlideMessage));
+    }
+
+    // Pagination
+    if (hasClickablePagination()) {
+      const paginationEl = makeElementsArray(swiper.pagination.el);
+      paginationEl.forEach(el => {
+        el.addEventListener('keydown', onEnterOrSpaceKey);
+      });
+    }
+
+    // Tab focus
+    const document = getDocument();
+    document.addEventListener('visibilitychange', onVisibilityChange);
+    swiper.el.addEventListener('focus', handleFocus, true);
+    swiper.el.addEventListener('focus', handleFocus, true);
+    swiper.el.addEventListener('pointerdown', handlePointerDown, true);
+    swiper.el.addEventListener('pointerup', handlePointerUp, true);
+  };
+  function destroy() {
+    if (liveRegion) liveRegion.remove();
+    let {
+      nextEl,
+      prevEl
+    } = swiper.navigation ? swiper.navigation : {};
+    nextEl = makeElementsArray(nextEl);
+    prevEl = makeElementsArray(prevEl);
+    if (nextEl) {
+      nextEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));
+    }
+    if (prevEl) {
+      prevEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));
+    }
+
+    // Pagination
+    if (hasClickablePagination()) {
+      const paginationEl = makeElementsArray(swiper.pagination.el);
+      paginationEl.forEach(el => {
+        el.removeEventListener('keydown', onEnterOrSpaceKey);
+      });
+    }
+    const document = getDocument();
+    document.removeEventListener('visibilitychange', onVisibilityChange);
+    // Tab focus
+    if (swiper.el && typeof swiper.el !== 'string') {
+      swiper.el.removeEventListener('focus', handleFocus, true);
+      swiper.el.removeEventListener('pointerdown', handlePointerDown, true);
+      swiper.el.removeEventListener('pointerup', handlePointerUp, true);
+    }
+  }
+  on('beforeInit', () => {
+    liveRegion = createElement('span', swiper.params.a11y.notificationClass);
+    liveRegion.setAttribute('aria-live', 'assertive');
+    liveRegion.setAttribute('aria-atomic', 'true');
+  });
+  on('afterInit', () => {
+    if (!swiper.params.a11y.enabled) return;
+    init();
+  });
+  on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => {
+    if (!swiper.params.a11y.enabled) return;
+    initSlides();
+  });
+  on('fromEdge toEdge afterInit lock unlock', () => {
+    if (!swiper.params.a11y.enabled) return;
+    updateNavigation();
+  });
+  on('paginationUpdate', () => {
+    if (!swiper.params.a11y.enabled) return;
+    updatePagination();
+  });
+  on('destroy', () => {
+    if (!swiper.params.a11y.enabled) return;
+    destroy();
+  });
+}
+
+export { A11y as default };

+ 9 - 0
node_modules/swiper/modules/a11y.scss

@@ -0,0 +1,9 @@
+/* a11y */
+.swiper .swiper-notification {
+  position: absolute;
+  left: 0;
+  top: 0;
+  pointer-events: none;
+  opacity: 0;
+  z-index: -1000;
+}

+ 0 - 0
node_modules/swiper/modules/autoplay-element.css


+ 0 - 0
node_modules/swiper/modules/autoplay-element.min.css


+ 0 - 0
node_modules/swiper/modules/autoplay.css


+ 0 - 0
node_modules/swiper/modules/autoplay.less


+ 0 - 0
node_modules/swiper/modules/autoplay.min.css


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/autoplay.min.mjs


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/autoplay.min.mjs.map


+ 304 - 0
node_modules/swiper/modules/autoplay.mjs

@@ -0,0 +1,304 @@
+import { g as getDocument } from '../shared/ssr-window.esm.mjs';
+
+/* eslint no-underscore-dangle: "off" */
+/* eslint no-use-before-define: "off" */
+function Autoplay(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on,
+    emit,
+    params
+  } = _ref;
+  swiper.autoplay = {
+    running: false,
+    paused: false,
+    timeLeft: 0
+  };
+  extendParams({
+    autoplay: {
+      enabled: false,
+      delay: 3000,
+      waitForTransition: true,
+      disableOnInteraction: false,
+      stopOnLastSlide: false,
+      reverseDirection: false,
+      pauseOnMouseEnter: false
+    }
+  });
+  let timeout;
+  let raf;
+  let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000;
+  let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000;
+  let autoplayTimeLeft;
+  let autoplayStartTime = new Date().getTime();
+  let wasPaused;
+  let isTouched;
+  let pausedByTouch;
+  let touchStartTimeout;
+  let slideChanged;
+  let pausedByInteraction;
+  let pausedByPointerEnter;
+  function onTransitionEnd(e) {
+    if (!swiper || swiper.destroyed || !swiper.wrapperEl) return;
+    if (e.target !== swiper.wrapperEl) return;
+    swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd);
+    if (pausedByPointerEnter || e.detail && e.detail.bySwiperTouchMove) {
+      return;
+    }
+    resume();
+  }
+  const calcTimeLeft = () => {
+    if (swiper.destroyed || !swiper.autoplay.running) return;
+    if (swiper.autoplay.paused) {
+      wasPaused = true;
+    } else if (wasPaused) {
+      autoplayDelayCurrent = autoplayTimeLeft;
+      wasPaused = false;
+    }
+    const timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - new Date().getTime();
+    swiper.autoplay.timeLeft = timeLeft;
+    emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal);
+    raf = requestAnimationFrame(() => {
+      calcTimeLeft();
+    });
+  };
+  const getSlideDelay = () => {
+    let activeSlideEl;
+    if (swiper.virtual && swiper.params.virtual.enabled) {
+      activeSlideEl = swiper.slides.find(slideEl => slideEl.classList.contains('swiper-slide-active'));
+    } else {
+      activeSlideEl = swiper.slides[swiper.activeIndex];
+    }
+    if (!activeSlideEl) return undefined;
+    const currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10);
+    return currentSlideDelay;
+  };
+  const run = delayForce => {
+    if (swiper.destroyed || !swiper.autoplay.running) return;
+    cancelAnimationFrame(raf);
+    calcTimeLeft();
+    let delay = typeof delayForce === 'undefined' ? swiper.params.autoplay.delay : delayForce;
+    autoplayDelayTotal = swiper.params.autoplay.delay;
+    autoplayDelayCurrent = swiper.params.autoplay.delay;
+    const currentSlideDelay = getSlideDelay();
+    if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0 && typeof delayForce === 'undefined') {
+      delay = currentSlideDelay;
+      autoplayDelayTotal = currentSlideDelay;
+      autoplayDelayCurrent = currentSlideDelay;
+    }
+    autoplayTimeLeft = delay;
+    const speed = swiper.params.speed;
+    const proceed = () => {
+      if (!swiper || swiper.destroyed) return;
+      if (swiper.params.autoplay.reverseDirection) {
+        if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {
+          swiper.slidePrev(speed, true, true);
+          emit('autoplay');
+        } else if (!swiper.params.autoplay.stopOnLastSlide) {
+          swiper.slideTo(swiper.slides.length - 1, speed, true, true);
+          emit('autoplay');
+        }
+      } else {
+        if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {
+          swiper.slideNext(speed, true, true);
+          emit('autoplay');
+        } else if (!swiper.params.autoplay.stopOnLastSlide) {
+          swiper.slideTo(0, speed, true, true);
+          emit('autoplay');
+        }
+      }
+      if (swiper.params.cssMode) {
+        autoplayStartTime = new Date().getTime();
+        requestAnimationFrame(() => {
+          run();
+        });
+      }
+    };
+    if (delay > 0) {
+      clearTimeout(timeout);
+      timeout = setTimeout(() => {
+        proceed();
+      }, delay);
+    } else {
+      requestAnimationFrame(() => {
+        proceed();
+      });
+    }
+
+    // eslint-disable-next-line
+    return delay;
+  };
+  const start = () => {
+    autoplayStartTime = new Date().getTime();
+    swiper.autoplay.running = true;
+    run();
+    emit('autoplayStart');
+  };
+  const stop = () => {
+    swiper.autoplay.running = false;
+    clearTimeout(timeout);
+    cancelAnimationFrame(raf);
+    emit('autoplayStop');
+  };
+  const pause = (internal, reset) => {
+    if (swiper.destroyed || !swiper.autoplay.running) return;
+    clearTimeout(timeout);
+    if (!internal) {
+      pausedByInteraction = true;
+    }
+    const proceed = () => {
+      emit('autoplayPause');
+      if (swiper.params.autoplay.waitForTransition) {
+        swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd);
+      } else {
+        resume();
+      }
+    };
+    swiper.autoplay.paused = true;
+    if (reset) {
+      if (slideChanged) {
+        autoplayTimeLeft = swiper.params.autoplay.delay;
+      }
+      slideChanged = false;
+      proceed();
+      return;
+    }
+    const delay = autoplayTimeLeft || swiper.params.autoplay.delay;
+    autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime);
+    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return;
+    if (autoplayTimeLeft < 0) autoplayTimeLeft = 0;
+    proceed();
+  };
+  const resume = () => {
+    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) return;
+    autoplayStartTime = new Date().getTime();
+    if (pausedByInteraction) {
+      pausedByInteraction = false;
+      run(autoplayTimeLeft);
+    } else {
+      run();
+    }
+    swiper.autoplay.paused = false;
+    emit('autoplayResume');
+  };
+  const onVisibilityChange = () => {
+    if (swiper.destroyed || !swiper.autoplay.running) return;
+    const document = getDocument();
+    if (document.visibilityState === 'hidden') {
+      pausedByInteraction = true;
+      pause(true);
+    }
+    if (document.visibilityState === 'visible') {
+      resume();
+    }
+  };
+  const onPointerEnter = e => {
+    if (e.pointerType !== 'mouse') return;
+    pausedByInteraction = true;
+    pausedByPointerEnter = true;
+    if (swiper.animating || swiper.autoplay.paused) return;
+    pause(true);
+  };
+  const onPointerLeave = e => {
+    if (e.pointerType !== 'mouse') return;
+    pausedByPointerEnter = false;
+    if (swiper.autoplay.paused) {
+      resume();
+    }
+  };
+  const attachMouseEvents = () => {
+    if (swiper.params.autoplay.pauseOnMouseEnter) {
+      swiper.el.addEventListener('pointerenter', onPointerEnter);
+      swiper.el.addEventListener('pointerleave', onPointerLeave);
+    }
+  };
+  const detachMouseEvents = () => {
+    if (swiper.el && typeof swiper.el !== 'string') {
+      swiper.el.removeEventListener('pointerenter', onPointerEnter);
+      swiper.el.removeEventListener('pointerleave', onPointerLeave);
+    }
+  };
+  const attachDocumentEvents = () => {
+    const document = getDocument();
+    document.addEventListener('visibilitychange', onVisibilityChange);
+  };
+  const detachDocumentEvents = () => {
+    const document = getDocument();
+    document.removeEventListener('visibilitychange', onVisibilityChange);
+  };
+  on('init', () => {
+    if (swiper.params.autoplay.enabled) {
+      attachMouseEvents();
+      attachDocumentEvents();
+      start();
+    }
+  });
+  on('destroy', () => {
+    detachMouseEvents();
+    detachDocumentEvents();
+    if (swiper.autoplay.running) {
+      stop();
+    }
+  });
+  on('_freeModeStaticRelease', () => {
+    if (pausedByTouch || pausedByInteraction) {
+      resume();
+    }
+  });
+  on('_freeModeNoMomentumRelease', () => {
+    if (!swiper.params.autoplay.disableOnInteraction) {
+      pause(true, true);
+    } else {
+      stop();
+    }
+  });
+  on('beforeTransitionStart', (_s, speed, internal) => {
+    if (swiper.destroyed || !swiper.autoplay.running) return;
+    if (internal || !swiper.params.autoplay.disableOnInteraction) {
+      pause(true, true);
+    } else {
+      stop();
+    }
+  });
+  on('sliderFirstMove', () => {
+    if (swiper.destroyed || !swiper.autoplay.running) return;
+    if (swiper.params.autoplay.disableOnInteraction) {
+      stop();
+      return;
+    }
+    isTouched = true;
+    pausedByTouch = false;
+    pausedByInteraction = false;
+    touchStartTimeout = setTimeout(() => {
+      pausedByInteraction = true;
+      pausedByTouch = true;
+      pause(true);
+    }, 200);
+  });
+  on('touchEnd', () => {
+    if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return;
+    clearTimeout(touchStartTimeout);
+    clearTimeout(timeout);
+    if (swiper.params.autoplay.disableOnInteraction) {
+      pausedByTouch = false;
+      isTouched = false;
+      return;
+    }
+    if (pausedByTouch && swiper.params.cssMode) resume();
+    pausedByTouch = false;
+    isTouched = false;
+  });
+  on('slideChange', () => {
+    if (swiper.destroyed || !swiper.autoplay.running) return;
+    slideChanged = true;
+  });
+  Object.assign(swiper.autoplay, {
+    start,
+    stop,
+    pause,
+    resume
+  });
+}
+
+export { Autoplay as default };

+ 0 - 0
node_modules/swiper/modules/autoplay.scss


+ 0 - 0
node_modules/swiper/modules/controller-element.css


+ 0 - 0
node_modules/swiper/modules/controller-element.min.css


+ 0 - 0
node_modules/swiper/modules/controller.css


+ 0 - 0
node_modules/swiper/modules/controller.less


+ 0 - 0
node_modules/swiper/modules/controller.min.css


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/controller.min.mjs


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/controller.min.mjs.map


+ 191 - 0
node_modules/swiper/modules/controller.mjs

@@ -0,0 +1,191 @@
+import { n as nextTick, l as elementTransitionEnd } from '../shared/utils.mjs';
+
+/* eslint no-bitwise: ["error", { "allow": [">>"] }] */
+function Controller(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on
+  } = _ref;
+  extendParams({
+    controller: {
+      control: undefined,
+      inverse: false,
+      by: 'slide' // or 'container'
+    }
+  });
+
+  swiper.controller = {
+    control: undefined
+  };
+  function LinearSpline(x, y) {
+    const binarySearch = function search() {
+      let maxIndex;
+      let minIndex;
+      let guess;
+      return (array, val) => {
+        minIndex = -1;
+        maxIndex = array.length;
+        while (maxIndex - minIndex > 1) {
+          guess = maxIndex + minIndex >> 1;
+          if (array[guess] <= val) {
+            minIndex = guess;
+          } else {
+            maxIndex = guess;
+          }
+        }
+        return maxIndex;
+      };
+    }();
+    this.x = x;
+    this.y = y;
+    this.lastIndex = x.length - 1;
+    // Given an x value (x2), return the expected y2 value:
+    // (x1,y1) is the known point before given value,
+    // (x3,y3) is the known point after given value.
+    let i1;
+    let i3;
+    this.interpolate = function interpolate(x2) {
+      if (!x2) return 0;
+
+      // Get the indexes of x1 and x3 (the array indexes before and after given x2):
+      i3 = binarySearch(this.x, x2);
+      i1 = i3 - 1;
+
+      // We have our indexes i1 & i3, so we can calculate already:
+      // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
+      return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];
+    };
+    return this;
+  }
+  function getInterpolateFunction(c) {
+    swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid);
+  }
+  function setTranslate(_t, byController) {
+    const controlled = swiper.controller.control;
+    let multiplier;
+    let controlledTranslate;
+    const Swiper = swiper.constructor;
+    function setControlledTranslate(c) {
+      if (c.destroyed) return;
+
+      // this will create an Interpolate function based on the snapGrids
+      // x is the Grid of the scrolled scroller and y will be the controlled scroller
+      // it makes sense to create this only once and recall it for the interpolation
+      // the function does a lot of value caching for performance
+      const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
+      if (swiper.params.controller.by === 'slide') {
+        getInterpolateFunction(c);
+        // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
+        // but it did not work out
+        controlledTranslate = -swiper.controller.spline.interpolate(-translate);
+      }
+      if (!controlledTranslate || swiper.params.controller.by === 'container') {
+        multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
+        if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) {
+          multiplier = 1;
+        }
+        controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();
+      }
+      if (swiper.params.controller.inverse) {
+        controlledTranslate = c.maxTranslate() - controlledTranslate;
+      }
+      c.updateProgress(controlledTranslate);
+      c.setTranslate(controlledTranslate, swiper);
+      c.updateActiveIndex();
+      c.updateSlidesClasses();
+    }
+    if (Array.isArray(controlled)) {
+      for (let i = 0; i < controlled.length; i += 1) {
+        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
+          setControlledTranslate(controlled[i]);
+        }
+      }
+    } else if (controlled instanceof Swiper && byController !== controlled) {
+      setControlledTranslate(controlled);
+    }
+  }
+  function setTransition(duration, byController) {
+    const Swiper = swiper.constructor;
+    const controlled = swiper.controller.control;
+    let i;
+    function setControlledTransition(c) {
+      if (c.destroyed) return;
+      c.setTransition(duration, swiper);
+      if (duration !== 0) {
+        c.transitionStart();
+        if (c.params.autoHeight) {
+          nextTick(() => {
+            c.updateAutoHeight();
+          });
+        }
+        elementTransitionEnd(c.wrapperEl, () => {
+          if (!controlled) return;
+          c.transitionEnd();
+        });
+      }
+    }
+    if (Array.isArray(controlled)) {
+      for (i = 0; i < controlled.length; i += 1) {
+        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
+          setControlledTransition(controlled[i]);
+        }
+      }
+    } else if (controlled instanceof Swiper && byController !== controlled) {
+      setControlledTransition(controlled);
+    }
+  }
+  function removeSpline() {
+    if (!swiper.controller.control) return;
+    if (swiper.controller.spline) {
+      swiper.controller.spline = undefined;
+      delete swiper.controller.spline;
+    }
+  }
+  on('beforeInit', () => {
+    if (typeof window !== 'undefined' && (
+    // eslint-disable-line
+    typeof swiper.params.controller.control === 'string' || swiper.params.controller.control instanceof HTMLElement)) {
+      const controlElements = typeof swiper.params.controller.control === 'string' ? [...document.querySelectorAll(swiper.params.controller.control)] : [swiper.params.controller.control];
+      controlElements.forEach(controlElement => {
+        if (!swiper.controller.control) swiper.controller.control = [];
+        if (controlElement && controlElement.swiper) {
+          swiper.controller.control.push(controlElement.swiper);
+        } else if (controlElement) {
+          const eventName = `${swiper.params.eventsPrefix}init`;
+          const onControllerSwiper = e => {
+            swiper.controller.control.push(e.detail[0]);
+            swiper.update();
+            controlElement.removeEventListener(eventName, onControllerSwiper);
+          };
+          controlElement.addEventListener(eventName, onControllerSwiper);
+        }
+      });
+      return;
+    }
+    swiper.controller.control = swiper.params.controller.control;
+  });
+  on('update', () => {
+    removeSpline();
+  });
+  on('resize', () => {
+    removeSpline();
+  });
+  on('observerUpdate', () => {
+    removeSpline();
+  });
+  on('setTranslate', (_s, translate, byController) => {
+    if (!swiper.controller.control || swiper.controller.control.destroyed) return;
+    swiper.controller.setTranslate(translate, byController);
+  });
+  on('setTransition', (_s, duration, byController) => {
+    if (!swiper.controller.control || swiper.controller.control.destroyed) return;
+    swiper.controller.setTransition(duration, byController);
+  });
+  Object.assign(swiper.controller, {
+    setTranslate,
+    setTransition
+  });
+}
+
+export { Controller as default };

+ 0 - 0
node_modules/swiper/modules/controller.scss


+ 9 - 0
node_modules/swiper/modules/effect-cards-element.css

@@ -0,0 +1,9 @@
+.swiper.swiper-cards {
+  overflow: visible;
+}
+.swiper-cards ::slotted(swiper-slide) {
+  transform-origin: center bottom;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  overflow: hidden;
+}

+ 1 - 0
node_modules/swiper/modules/effect-cards-element.min.css

@@ -0,0 +1 @@
+.swiper.swiper-cards{overflow:visible}.swiper-cards ::slotted(swiper-slide){transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden}

+ 9 - 0
node_modules/swiper/modules/effect-cards.css

@@ -0,0 +1,9 @@
+.swiper.swiper-cards {
+  overflow: visible;
+}
+.swiper-cards .swiper-slide {
+  transform-origin: center bottom;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  overflow: hidden;
+}

+ 10 - 0
node_modules/swiper/modules/effect-cards.less

@@ -0,0 +1,10 @@
+.swiper.swiper-cards {
+  overflow: visible;
+}
+.swiper-cards {
+  .swiper-slide {
+    transform-origin: center bottom;
+    backface-visibility: hidden;
+    overflow: hidden;
+  }
+}

+ 1 - 0
node_modules/swiper/modules/effect-cards.min.css

@@ -0,0 +1 @@
+.swiper.swiper-cards{overflow:visible}.swiper-cards .swiper-slide{transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden}

Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-cards.min.mjs


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-cards.min.mjs.map


+ 128 - 0
node_modules/swiper/modules/effect-cards.mjs

@@ -0,0 +1,128 @@
+import { c as createShadow } from '../shared/create-shadow.mjs';
+import { e as effectInit } from '../shared/effect-init.mjs';
+import { e as effectTarget } from '../shared/effect-target.mjs';
+import { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';
+import { g as getSlideTransformEl } from '../shared/utils.mjs';
+
+function EffectCards(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on
+  } = _ref;
+  extendParams({
+    cardsEffect: {
+      slideShadows: true,
+      rotate: true,
+      perSlideRotate: 2,
+      perSlideOffset: 8
+    }
+  });
+  const setTranslate = () => {
+    const {
+      slides,
+      activeIndex,
+      rtlTranslate: rtl
+    } = swiper;
+    const params = swiper.params.cardsEffect;
+    const {
+      startTranslate,
+      isTouched
+    } = swiper.touchEventsData;
+    const currentTranslate = rtl ? -swiper.translate : swiper.translate;
+    for (let i = 0; i < slides.length; i += 1) {
+      const slideEl = slides[i];
+      const slideProgress = slideEl.progress;
+      const progress = Math.min(Math.max(slideProgress, -4), 4);
+      let offset = slideEl.swiperSlideOffset;
+      if (swiper.params.centeredSlides && !swiper.params.cssMode) {
+        swiper.wrapperEl.style.transform = `translateX(${swiper.minTranslate()}px)`;
+      }
+      if (swiper.params.centeredSlides && swiper.params.cssMode) {
+        offset -= slides[0].swiperSlideOffset;
+      }
+      let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;
+      let tY = 0;
+      const tZ = -100 * Math.abs(progress);
+      let scale = 1;
+      let rotate = -params.perSlideRotate * progress;
+      let tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;
+      const slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;
+      const isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate;
+      const isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate;
+      if (isSwipeToNext || isSwipeToPrev) {
+        const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;
+        rotate += -28 * progress * subProgress;
+        scale += -0.5 * subProgress;
+        tXAdd += 96 * subProgress;
+        tY = `${-25 * subProgress * Math.abs(progress)}%`;
+      }
+      if (progress < 0) {
+        // next
+        tX = `calc(${tX}px ${rtl ? '-' : '+'} (${tXAdd * Math.abs(progress)}%))`;
+      } else if (progress > 0) {
+        // prev
+        tX = `calc(${tX}px ${rtl ? '-' : '+'} (-${tXAdd * Math.abs(progress)}%))`;
+      } else {
+        tX = `${tX}px`;
+      }
+      if (!swiper.isHorizontal()) {
+        const prevY = tY;
+        tY = tX;
+        tX = prevY;
+      }
+      const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;
+
+      /* eslint-disable */
+      const transform = `
+        translate3d(${tX}, ${tY}, ${tZ}px)
+        rotateZ(${params.rotate ? rtl ? -rotate : rotate : 0}deg)
+        scale(${scaleString})
+      `;
+      /* eslint-enable */
+
+      if (params.slideShadows) {
+        // Set shadows
+        let shadowEl = slideEl.querySelector('.swiper-slide-shadow');
+        if (!shadowEl) {
+          shadowEl = createShadow('cards', slideEl);
+        }
+        if (shadowEl) shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);
+      }
+      slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
+      const targetEl = effectTarget(params, slideEl);
+      targetEl.style.transform = transform;
+    }
+  };
+  const setTransition = duration => {
+    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
+    transformElements.forEach(el => {
+      el.style.transitionDuration = `${duration}ms`;
+      el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {
+        shadowEl.style.transitionDuration = `${duration}ms`;
+      });
+    });
+    effectVirtualTransitionEnd({
+      swiper,
+      duration,
+      transformElements
+    });
+  };
+  effectInit({
+    effect: 'cards',
+    swiper,
+    on,
+    setTranslate,
+    setTransition,
+    perspective: () => true,
+    overwriteParams: () => ({
+      _loopSwapReset: false,
+      watchSlidesProgress: true,
+      loopAdditionalSlides: swiper.params.cardsEffect.rotate ? 3 : 2,
+      centeredSlides: true,
+      virtualTranslate: !swiper.params.cssMode
+    })
+  });
+}
+
+export { EffectCards as default };

+ 10 - 0
node_modules/swiper/modules/effect-cards.scss

@@ -0,0 +1,10 @@
+.swiper.swiper-cards {
+  overflow: visible;
+}
+.swiper-cards {
+  .swiper-slide {
+    transform-origin: center bottom;
+    backface-visibility: hidden;
+    overflow: hidden;
+  }
+}

+ 0 - 0
node_modules/swiper/modules/effect-coverflow-element.css


+ 0 - 0
node_modules/swiper/modules/effect-coverflow-element.min.css


+ 0 - 0
node_modules/swiper/modules/effect-coverflow.css


+ 2 - 0
node_modules/swiper/modules/effect-coverflow.less

@@ -0,0 +1,2 @@
+.swiper-coverflow {
+}

+ 0 - 0
node_modules/swiper/modules/effect-coverflow.min.css


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-coverflow.min.mjs


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-coverflow.min.mjs.map


+ 104 - 0
node_modules/swiper/modules/effect-coverflow.mjs

@@ -0,0 +1,104 @@
+import { c as createShadow } from '../shared/create-shadow.mjs';
+import { e as effectInit } from '../shared/effect-init.mjs';
+import { e as effectTarget } from '../shared/effect-target.mjs';
+import { g as getSlideTransformEl, p as getRotateFix } from '../shared/utils.mjs';
+
+function EffectCoverflow(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on
+  } = _ref;
+  extendParams({
+    coverflowEffect: {
+      rotate: 50,
+      stretch: 0,
+      depth: 100,
+      scale: 1,
+      modifier: 1,
+      slideShadows: true
+    }
+  });
+  const setTranslate = () => {
+    const {
+      width: swiperWidth,
+      height: swiperHeight,
+      slides,
+      slidesSizesGrid
+    } = swiper;
+    const params = swiper.params.coverflowEffect;
+    const isHorizontal = swiper.isHorizontal();
+    const transform = swiper.translate;
+    const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;
+    const rotate = isHorizontal ? params.rotate : -params.rotate;
+    const translate = params.depth;
+    const r = getRotateFix(swiper);
+    // Each slide offset from center
+    for (let i = 0, length = slides.length; i < length; i += 1) {
+      const slideEl = slides[i];
+      const slideSize = slidesSizesGrid[i];
+      const slideOffset = slideEl.swiperSlideOffset;
+      const centerOffset = (center - slideOffset - slideSize / 2) / slideSize;
+      const offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier;
+      let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
+      let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
+      // var rotateZ = 0
+      let translateZ = -translate * Math.abs(offsetMultiplier);
+      let stretch = params.stretch;
+      // Allow percentage to make a relative stretch for responsive sliders
+      if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
+        stretch = parseFloat(params.stretch) / 100 * slideSize;
+      }
+      let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;
+      let translateX = isHorizontal ? stretch * offsetMultiplier : 0;
+      let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);
+
+      // Fix for ultra small values
+      if (Math.abs(translateX) < 0.001) translateX = 0;
+      if (Math.abs(translateY) < 0.001) translateY = 0;
+      if (Math.abs(translateZ) < 0.001) translateZ = 0;
+      if (Math.abs(rotateY) < 0.001) rotateY = 0;
+      if (Math.abs(rotateX) < 0.001) rotateX = 0;
+      if (Math.abs(scale) < 0.001) scale = 0;
+      const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px)  rotateX(${r(rotateX)}deg) rotateY(${r(rotateY)}deg) scale(${scale})`;
+      const targetEl = effectTarget(params, slideEl);
+      targetEl.style.transform = slideTransform;
+      slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
+      if (params.slideShadows) {
+        // Set shadows
+        let shadowBeforeEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
+        let shadowAfterEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
+        if (!shadowBeforeEl) {
+          shadowBeforeEl = createShadow('coverflow', slideEl, isHorizontal ? 'left' : 'top');
+        }
+        if (!shadowAfterEl) {
+          shadowAfterEl = createShadow('coverflow', slideEl, isHorizontal ? 'right' : 'bottom');
+        }
+        if (shadowBeforeEl) shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;
+        if (shadowAfterEl) shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;
+      }
+    }
+  };
+  const setTransition = duration => {
+    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
+    transformElements.forEach(el => {
+      el.style.transitionDuration = `${duration}ms`;
+      el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {
+        shadowEl.style.transitionDuration = `${duration}ms`;
+      });
+    });
+  };
+  effectInit({
+    effect: 'coverflow',
+    swiper,
+    on,
+    setTranslate,
+    setTransition,
+    perspective: () => true,
+    overwriteParams: () => ({
+      watchSlidesProgress: true
+    })
+  });
+}
+
+export { EffectCoverflow as default };

+ 2 - 0
node_modules/swiper/modules/effect-coverflow.scss

@@ -0,0 +1,2 @@
+.swiper-coverflow {
+}

+ 6 - 0
node_modules/swiper/modules/effect-creative-element.css

@@ -0,0 +1,6 @@
+.swiper-creative ::slotted(swiper-slide) {
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  overflow: hidden;
+  transition-property: transform, opacity, height;
+}

+ 1 - 0
node_modules/swiper/modules/effect-creative-element.min.css

@@ -0,0 +1 @@
+.swiper-creative ::slotted(swiper-slide){-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}

+ 6 - 0
node_modules/swiper/modules/effect-creative.css

@@ -0,0 +1,6 @@
+.swiper-creative .swiper-slide {
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  overflow: hidden;
+  transition-property: transform, opacity, height;
+}

+ 7 - 0
node_modules/swiper/modules/effect-creative.less

@@ -0,0 +1,7 @@
+.swiper-creative {
+  .swiper-slide {
+    backface-visibility: hidden;
+    overflow: hidden;
+    transition-property: transform, opacity, height;
+  }
+}

+ 1 - 0
node_modules/swiper/modules/effect-creative.min.css

@@ -0,0 +1 @@
+.swiper-creative .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}

Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-creative.min.mjs


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-creative.min.mjs.map


+ 146 - 0
node_modules/swiper/modules/effect-creative.mjs

@@ -0,0 +1,146 @@
+import { c as createShadow } from '../shared/create-shadow.mjs';
+import { e as effectInit } from '../shared/effect-init.mjs';
+import { e as effectTarget } from '../shared/effect-target.mjs';
+import { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';
+import { g as getSlideTransformEl, p as getRotateFix } from '../shared/utils.mjs';
+
+function EffectCreative(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on
+  } = _ref;
+  extendParams({
+    creativeEffect: {
+      limitProgress: 1,
+      shadowPerProgress: false,
+      progressMultiplier: 1,
+      perspective: true,
+      prev: {
+        translate: [0, 0, 0],
+        rotate: [0, 0, 0],
+        opacity: 1,
+        scale: 1
+      },
+      next: {
+        translate: [0, 0, 0],
+        rotate: [0, 0, 0],
+        opacity: 1,
+        scale: 1
+      }
+    }
+  });
+  const getTranslateValue = value => {
+    if (typeof value === 'string') return value;
+    return `${value}px`;
+  };
+  const setTranslate = () => {
+    const {
+      slides,
+      wrapperEl,
+      slidesSizesGrid
+    } = swiper;
+    const params = swiper.params.creativeEffect;
+    const {
+      progressMultiplier: multiplier
+    } = params;
+    const isCenteredSlides = swiper.params.centeredSlides;
+    const rotateFix = getRotateFix(swiper);
+    if (isCenteredSlides) {
+      const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;
+      wrapperEl.style.transform = `translateX(calc(50% - ${margin}px))`;
+    }
+    for (let i = 0; i < slides.length; i += 1) {
+      const slideEl = slides[i];
+      const slideProgress = slideEl.progress;
+      const progress = Math.min(Math.max(slideEl.progress, -params.limitProgress), params.limitProgress);
+      let originalProgress = progress;
+      if (!isCenteredSlides) {
+        originalProgress = Math.min(Math.max(slideEl.originalProgress, -params.limitProgress), params.limitProgress);
+      }
+      const offset = slideEl.swiperSlideOffset;
+      const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];
+      const r = [0, 0, 0];
+      let custom = false;
+      if (!swiper.isHorizontal()) {
+        t[1] = t[0];
+        t[0] = 0;
+      }
+      let data = {
+        translate: [0, 0, 0],
+        rotate: [0, 0, 0],
+        scale: 1,
+        opacity: 1
+      };
+      if (progress < 0) {
+        data = params.next;
+        custom = true;
+      } else if (progress > 0) {
+        data = params.prev;
+        custom = true;
+      }
+      // set translate
+      t.forEach((value, index) => {
+        t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`;
+      });
+      // set rotates
+      r.forEach((value, index) => {
+        let val = data.rotate[index] * Math.abs(progress * multiplier);
+        r[index] = val;
+      });
+      slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
+      const translateString = t.join(', ');
+      const rotateString = `rotateX(${rotateFix(r[0])}deg) rotateY(${rotateFix(r[1])}deg) rotateZ(${rotateFix(r[2])}deg)`;
+      const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;
+      const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier;
+      const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;
+
+      // Set shadows
+      if (custom && data.shadow || !custom) {
+        let shadowEl = slideEl.querySelector('.swiper-slide-shadow');
+        if (!shadowEl && data.shadow) {
+          shadowEl = createShadow('creative', slideEl);
+        }
+        if (shadowEl) {
+          const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress;
+          shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);
+        }
+      }
+      const targetEl = effectTarget(params, slideEl);
+      targetEl.style.transform = transform;
+      targetEl.style.opacity = opacityString;
+      if (data.origin) {
+        targetEl.style.transformOrigin = data.origin;
+      }
+    }
+  };
+  const setTransition = duration => {
+    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
+    transformElements.forEach(el => {
+      el.style.transitionDuration = `${duration}ms`;
+      el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {
+        shadowEl.style.transitionDuration = `${duration}ms`;
+      });
+    });
+    effectVirtualTransitionEnd({
+      swiper,
+      duration,
+      transformElements,
+      allSlides: true
+    });
+  };
+  effectInit({
+    effect: 'creative',
+    swiper,
+    on,
+    setTranslate,
+    setTransition,
+    perspective: () => swiper.params.creativeEffect.perspective,
+    overwriteParams: () => ({
+      watchSlidesProgress: true,
+      virtualTranslate: !swiper.params.cssMode
+    })
+  });
+}
+
+export { EffectCreative as default };

+ 7 - 0
node_modules/swiper/modules/effect-creative.scss

@@ -0,0 +1,7 @@
+.swiper-creative {
+  .swiper-slide {
+    backface-visibility: hidden;
+    overflow: hidden;
+    transition-property: transform, opacity, height;
+  }
+}

+ 53 - 0
node_modules/swiper/modules/effect-cube-element.css

@@ -0,0 +1,53 @@
+.swiper.swiper-cube {
+  overflow: visible;
+}
+.swiper-cube ::slotted(swiper-slide) {
+  pointer-events: none;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  z-index: 1;
+  visibility: hidden;
+  transform-origin: 0 0;
+  width: 100%;
+  height: 100%;
+}
+.swiper-cube ::slotted(swiper-slide) ::slotted(swiper-slide) {
+  pointer-events: none;
+}
+.swiper-cube.swiper-rtl ::slotted(swiper-slide) {
+  transform-origin: 100% 0;
+}
+.swiper-cube ::slotted(.swiper-slide-active),
+.swiper-cube ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active) {
+  pointer-events: auto;
+}
+.swiper-cube ::slotted(.swiper-slide-active),
+.swiper-cube ::slotted(.swiper-slide-next),
+.swiper-cube ::slotted(.swiper-slide-prev) {
+  pointer-events: auto;
+  visibility: visible;
+}
+.swiper-cube .swiper-cube-shadow {
+  position: absolute;
+  left: 0;
+  bottom: 0px;
+  width: 100%;
+  height: 100%;
+  opacity: 0.6;
+  z-index: 0;
+}
+.swiper-cube .swiper-cube-shadow:before {
+  content: '';
+  background: #000;
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  filter: blur(50px);
+}
+.swiper-cube ::slotted(.swiper-slide-next) + ::slotted(swiper-slide) {
+  pointer-events: auto;
+  visibility: visible;
+}
+/* Cube slide shadows start *//* Cube slide shadows end */

+ 1 - 0
node_modules/swiper/modules/effect-cube-element.min.css

@@ -0,0 +1 @@
+.swiper.swiper-cube{overflow:visible}.swiper-cube ::slotted(swiper-slide){pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube ::slotted(swiper-slide) ::slotted(swiper-slide){pointer-events:none}.swiper-cube.swiper-rtl ::slotted(swiper-slide){transform-origin:100% 0}.swiper-cube ::slotted(.swiper-slide-active),.swiper-cube ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active){pointer-events:auto}.swiper-cube ::slotted(.swiper-slide-active),.swiper-cube ::slotted(.swiper-slide-next),.swiper-cube ::slotted(.swiper-slide-prev){pointer-events:auto;visibility:visible}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-cube ::slotted(.swiper-slide-next)+::slotted(swiper-slide){pointer-events:auto;visibility:visible}

+ 62 - 0
node_modules/swiper/modules/effect-cube.css

@@ -0,0 +1,62 @@
+.swiper.swiper-cube {
+  overflow: visible;
+}
+.swiper-cube .swiper-slide {
+  pointer-events: none;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  z-index: 1;
+  visibility: hidden;
+  transform-origin: 0 0;
+  width: 100%;
+  height: 100%;
+}
+.swiper-cube .swiper-slide .swiper-slide {
+  pointer-events: none;
+}
+.swiper-cube.swiper-rtl .swiper-slide {
+  transform-origin: 100% 0;
+}
+.swiper-cube .swiper-slide-active,
+.swiper-cube .swiper-slide-active .swiper-slide-active {
+  pointer-events: auto;
+}
+.swiper-cube .swiper-slide-active,
+.swiper-cube .swiper-slide-next,
+.swiper-cube .swiper-slide-prev {
+  pointer-events: auto;
+  visibility: visible;
+}
+.swiper-cube .swiper-cube-shadow {
+  position: absolute;
+  left: 0;
+  bottom: 0px;
+  width: 100%;
+  height: 100%;
+  opacity: 0.6;
+  z-index: 0;
+}
+.swiper-cube .swiper-cube-shadow:before {
+  content: '';
+  background: #000;
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  filter: blur(50px);
+}
+.swiper-cube .swiper-slide-next + .swiper-slide {
+  pointer-events: auto;
+  visibility: visible;
+}
+/* Cube slide shadows start */
+.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-top,
+.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,
+.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-left,
+.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-right {
+  z-index: 0;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+}
+/* Cube slide shadows end */

+ 71 - 0
node_modules/swiper/modules/effect-cube.less

@@ -0,0 +1,71 @@
+.swiper.swiper-cube {
+  overflow: visible;
+}
+.swiper-cube {
+  .swiper-slide {
+    pointer-events: none;
+    backface-visibility: hidden;
+    z-index: 1;
+    visibility: hidden;
+    transform-origin: 0 0;
+    width: 100%;
+    height: 100%;
+    .swiper-slide {
+      pointer-events: none;
+    }
+  }
+  &.swiper-rtl .swiper-slide {
+    transform-origin: 100% 0;
+  }
+  .swiper-slide-active {
+    &,
+    & .swiper-slide-active {
+      pointer-events: auto;
+    }
+  }
+  .swiper-slide-active,
+  .swiper-slide-next,
+  .swiper-slide-prev {
+    pointer-events: auto;
+    visibility: visible;
+  }
+
+  .swiper-cube-shadow {
+    position: absolute;
+    left: 0;
+    bottom: 0px;
+    width: 100%;
+    height: 100%;
+    opacity: 0.6;
+    z-index: 0;
+
+    &:before {
+      content: '';
+      background: #000;
+      position: absolute;
+      left: 0;
+      top: 0;
+      bottom: 0;
+      right: 0;
+      -webkit-filter: blur(50px);
+      filter: blur(50px);
+    }
+  }
+}
+.swiper-cube {
+  .swiper-slide-next + .swiper-slide {
+    pointer-events: auto;
+    visibility: visible;
+  }
+}
+/* Cube slide shadows start */
+.swiper-cube {
+  .swiper-slide-shadow-cube.swiper-slide-shadow-top,
+  .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,
+  .swiper-slide-shadow-cube.swiper-slide-shadow-left,
+  .swiper-slide-shadow-cube.swiper-slide-shadow-right {
+    z-index: 0;
+    backface-visibility: hidden;
+  }
+}
+/* Cube slide shadows end */

+ 1 - 0
node_modules/swiper/modules/effect-cube.min.css

@@ -0,0 +1 @@
+.swiper.swiper-cube{overflow:visible}.swiper-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-cube .swiper-slide-next+.swiper-slide{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}

Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-cube.min.mjs


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-cube.min.mjs.map


+ 174 - 0
node_modules/swiper/modules/effect-cube.mjs

@@ -0,0 +1,174 @@
+import { e as effectInit } from '../shared/effect-init.mjs';
+import { c as createElement, p as getRotateFix } from '../shared/utils.mjs';
+
+function EffectCube(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on
+  } = _ref;
+  extendParams({
+    cubeEffect: {
+      slideShadows: true,
+      shadow: true,
+      shadowOffset: 20,
+      shadowScale: 0.94
+    }
+  });
+  const createSlideShadows = (slideEl, progress, isHorizontal) => {
+    let shadowBefore = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
+    let shadowAfter = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
+    if (!shadowBefore) {
+      shadowBefore = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}`.split(' '));
+      slideEl.append(shadowBefore);
+    }
+    if (!shadowAfter) {
+      shadowAfter = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}`.split(' '));
+      slideEl.append(shadowAfter);
+    }
+    if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
+    if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
+  };
+  const recreateShadows = () => {
+    // create new ones
+    const isHorizontal = swiper.isHorizontal();
+    swiper.slides.forEach(slideEl => {
+      const progress = Math.max(Math.min(slideEl.progress, 1), -1);
+      createSlideShadows(slideEl, progress, isHorizontal);
+    });
+  };
+  const setTranslate = () => {
+    const {
+      el,
+      wrapperEl,
+      slides,
+      width: swiperWidth,
+      height: swiperHeight,
+      rtlTranslate: rtl,
+      size: swiperSize,
+      browser
+    } = swiper;
+    const r = getRotateFix(swiper);
+    const params = swiper.params.cubeEffect;
+    const isHorizontal = swiper.isHorizontal();
+    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
+    let wrapperRotate = 0;
+    let cubeShadowEl;
+    if (params.shadow) {
+      if (isHorizontal) {
+        cubeShadowEl = swiper.wrapperEl.querySelector('.swiper-cube-shadow');
+        if (!cubeShadowEl) {
+          cubeShadowEl = createElement('div', 'swiper-cube-shadow');
+          swiper.wrapperEl.append(cubeShadowEl);
+        }
+        cubeShadowEl.style.height = `${swiperWidth}px`;
+      } else {
+        cubeShadowEl = el.querySelector('.swiper-cube-shadow');
+        if (!cubeShadowEl) {
+          cubeShadowEl = createElement('div', 'swiper-cube-shadow');
+          el.append(cubeShadowEl);
+        }
+      }
+    }
+    for (let i = 0; i < slides.length; i += 1) {
+      const slideEl = slides[i];
+      let slideIndex = i;
+      if (isVirtual) {
+        slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10);
+      }
+      let slideAngle = slideIndex * 90;
+      let round = Math.floor(slideAngle / 360);
+      if (rtl) {
+        slideAngle = -slideAngle;
+        round = Math.floor(-slideAngle / 360);
+      }
+      const progress = Math.max(Math.min(slideEl.progress, 1), -1);
+      let tx = 0;
+      let ty = 0;
+      let tz = 0;
+      if (slideIndex % 4 === 0) {
+        tx = -round * 4 * swiperSize;
+        tz = 0;
+      } else if ((slideIndex - 1) % 4 === 0) {
+        tx = 0;
+        tz = -round * 4 * swiperSize;
+      } else if ((slideIndex - 2) % 4 === 0) {
+        tx = swiperSize + round * 4 * swiperSize;
+        tz = swiperSize;
+      } else if ((slideIndex - 3) % 4 === 0) {
+        tx = -swiperSize;
+        tz = 3 * swiperSize + swiperSize * 4 * round;
+      }
+      if (rtl) {
+        tx = -tx;
+      }
+      if (!isHorizontal) {
+        ty = tx;
+        tx = 0;
+      }
+      const transform = `rotateX(${r(isHorizontal ? 0 : -slideAngle)}deg) rotateY(${r(isHorizontal ? slideAngle : 0)}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;
+      if (progress <= 1 && progress > -1) {
+        wrapperRotate = slideIndex * 90 + progress * 90;
+        if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;
+      }
+      slideEl.style.transform = transform;
+      if (params.slideShadows) {
+        createSlideShadows(slideEl, progress, isHorizontal);
+      }
+    }
+    wrapperEl.style.transformOrigin = `50% 50% -${swiperSize / 2}px`;
+    wrapperEl.style['-webkit-transform-origin'] = `50% 50% -${swiperSize / 2}px`;
+    if (params.shadow) {
+      if (isHorizontal) {
+        cubeShadowEl.style.transform = `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(89.99deg) rotateZ(0deg) scale(${params.shadowScale})`;
+      } else {
+        const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;
+        const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);
+        const scale1 = params.shadowScale;
+        const scale2 = params.shadowScale / multiplier;
+        const offset = params.shadowOffset;
+        cubeShadowEl.style.transform = `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-89.99deg)`;
+      }
+    }
+    const zFactor = (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0;
+    wrapperEl.style.transform = `translate3d(0px,0,${zFactor}px) rotateX(${r(swiper.isHorizontal() ? 0 : wrapperRotate)}deg) rotateY(${r(swiper.isHorizontal() ? -wrapperRotate : 0)}deg)`;
+    wrapperEl.style.setProperty('--swiper-cube-translate-z', `${zFactor}px`);
+  };
+  const setTransition = duration => {
+    const {
+      el,
+      slides
+    } = swiper;
+    slides.forEach(slideEl => {
+      slideEl.style.transitionDuration = `${duration}ms`;
+      slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(subEl => {
+        subEl.style.transitionDuration = `${duration}ms`;
+      });
+    });
+    if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
+      const shadowEl = el.querySelector('.swiper-cube-shadow');
+      if (shadowEl) shadowEl.style.transitionDuration = `${duration}ms`;
+    }
+  };
+  effectInit({
+    effect: 'cube',
+    swiper,
+    on,
+    setTranslate,
+    setTransition,
+    recreateShadows,
+    getEffectParams: () => swiper.params.cubeEffect,
+    perspective: () => true,
+    overwriteParams: () => ({
+      slidesPerView: 1,
+      slidesPerGroup: 1,
+      watchSlidesProgress: true,
+      resistanceRatio: 0,
+      spaceBetween: 0,
+      centeredSlides: false,
+      virtualTranslate: true
+    })
+  });
+}
+
+export { EffectCube as default };

+ 71 - 0
node_modules/swiper/modules/effect-cube.scss

@@ -0,0 +1,71 @@
+.swiper.swiper-cube {
+  overflow: visible;
+}
+.swiper-cube {
+  .swiper-slide {
+    pointer-events: none;
+    backface-visibility: hidden;
+    z-index: 1;
+    visibility: hidden;
+    transform-origin: 0 0;
+    width: 100%;
+    height: 100%;
+    .swiper-slide {
+      pointer-events: none;
+    }
+  }
+  &.swiper-rtl .swiper-slide {
+    transform-origin: 100% 0;
+  }
+  .swiper-slide-active {
+    &,
+    & .swiper-slide-active {
+      pointer-events: auto;
+    }
+  }
+  .swiper-slide-active,
+  .swiper-slide-next,
+  .swiper-slide-prev {
+    pointer-events: auto;
+    visibility: visible;
+  }
+
+  .swiper-cube-shadow {
+    position: absolute;
+    left: 0;
+    bottom: 0px;
+    width: 100%;
+    height: 100%;
+    opacity: 0.6;
+    z-index: 0;
+
+    &:before {
+      content: '';
+      background: #000;
+      position: absolute;
+      left: 0;
+      top: 0;
+      bottom: 0;
+      right: 0;
+      -webkit-filter: blur(50px);
+      filter: blur(50px);
+    }
+  }
+}
+.swiper-cube {
+  .swiper-slide-next + .swiper-slide {
+    pointer-events: auto;
+    visibility: visible;
+  }
+}
+/* Cube slide shadows start */
+.swiper-cube {
+  .swiper-slide-shadow-cube.swiper-slide-shadow-top,
+  .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,
+  .swiper-slide-shadow-cube.swiper-slide-shadow-left,
+  .swiper-slide-shadow-cube.swiper-slide-shadow-right {
+    z-index: 0;
+    backface-visibility: hidden;
+  }
+}
+/* Cube slide shadows end */

+ 16 - 0
node_modules/swiper/modules/effect-fade-element.css

@@ -0,0 +1,16 @@
+.swiper-fade.swiper-free-mode ::slotted(swiper-slide) {
+  transition-timing-function: ease-out;
+}
+.swiper-fade ::slotted(swiper-slide) {
+  pointer-events: none;
+  transition-property: opacity;
+}
+.swiper-fade ::slotted(swiper-slide) ::slotted(swiper-slide) {
+  pointer-events: none;
+}
+.swiper-fade ::slotted(.swiper-slide-active) {
+  pointer-events: auto;
+}
+.swiper-fade ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active) {
+  pointer-events: auto;
+}

+ 1 - 0
node_modules/swiper/modules/effect-fade-element.min.css

@@ -0,0 +1 @@
+.swiper-fade.swiper-free-mode ::slotted(swiper-slide){transition-timing-function:ease-out}.swiper-fade ::slotted(swiper-slide){pointer-events:none;transition-property:opacity}.swiper-fade ::slotted(swiper-slide) ::slotted(swiper-slide){pointer-events:none}.swiper-fade ::slotted(.swiper-slide-active){pointer-events:auto}.swiper-fade ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active){pointer-events:auto}

+ 16 - 0
node_modules/swiper/modules/effect-fade.css

@@ -0,0 +1,16 @@
+.swiper-fade.swiper-free-mode .swiper-slide {
+  transition-timing-function: ease-out;
+}
+.swiper-fade .swiper-slide {
+  pointer-events: none;
+  transition-property: opacity;
+}
+.swiper-fade .swiper-slide .swiper-slide {
+  pointer-events: none;
+}
+.swiper-fade .swiper-slide-active {
+  pointer-events: auto;
+}
+.swiper-fade .swiper-slide-active .swiper-slide-active {
+  pointer-events: auto;
+}

+ 20 - 0
node_modules/swiper/modules/effect-fade.less

@@ -0,0 +1,20 @@
+.swiper-fade {
+  &.swiper-free-mode {
+    .swiper-slide {
+      transition-timing-function: ease-out;
+    }
+  }
+  .swiper-slide {
+    pointer-events: none;
+    transition-property: opacity;
+    .swiper-slide {
+      pointer-events: none;
+    }
+  }
+  .swiper-slide-active {
+    pointer-events: auto;
+    & .swiper-slide-active {
+      pointer-events: auto;
+    }
+  }
+}

+ 1 - 0
node_modules/swiper/modules/effect-fade.min.css

@@ -0,0 +1 @@
+.swiper-fade.swiper-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active{pointer-events:auto}.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}

+ 2 - 0
node_modules/swiper/modules/effect-fade.min.mjs

@@ -0,0 +1,2 @@
+import{e as effectInit}from"../shared/effect-init.min.mjs";import{e as effectTarget}from"../shared/effect-target.min.mjs";import{e as effectVirtualTransitionEnd}from"../shared/effect-virtual-transition-end.min.mjs";import{g as getSlideTransformEl}from"../shared/utils.min.mjs";function EffectFade(e){let{swiper:t,extendParams:s,on:a}=e;s({fadeEffect:{crossFade:!1}});effectInit({effect:"fade",swiper:t,on:a,setTranslate:()=>{const{slides:e}=t,s=t.params.fadeEffect;for(let a=0;a<e.length;a+=1){const e=t.slides[a];let r=-e.swiperSlideOffset;t.params.virtualTranslate||(r-=t.translate);let i=0;t.isHorizontal()||(i=r,r=0);const f=t.params.fadeEffect.crossFade?Math.max(1-Math.abs(e.progress),0):1+Math.min(Math.max(e.progress,-1),0),n=effectTarget(s,e);n.style.opacity=f,n.style.transform=`translate3d(${r}px, ${i}px, 0px)`}},setTransition:e=>{const s=t.slides.map((e=>getSlideTransformEl(e)));s.forEach((t=>{t.style.transitionDuration=`${e}ms`})),effectVirtualTransitionEnd({swiper:t,duration:e,transformElements:s,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!t.params.cssMode})})}export{EffectFade as default};
+//# sourceMappingURL=effect-fade.min.mjs.map

+ 1 - 0
node_modules/swiper/modules/effect-fade.min.mjs.map

@@ -0,0 +1 @@
+{"version":3,"file":"effect-fade.mjs.mjs","names":["effectInit","effectTarget","effectVirtualTransitionEnd","getSlideTransformEl","EffectFade","_ref","swiper","extendParams","on","fadeEffect","crossFade","effect","setTranslate","slides","params","i","length","slideEl","tx","swiperSlideOffset","virtualTranslate","translate","ty","isHorizontal","slideOpacity","Math","max","abs","progress","min","targetEl","style","opacity","transform","setTransition","duration","transformElements","map","forEach","el","transitionDuration","allSlides","overwriteParams","slidesPerView","slidesPerGroup","watchSlidesProgress","spaceBetween","cssMode"],"sources":["0"],"mappings":"YAAcA,eAAkB,4CAClBC,iBAAoB,8CACpBC,+BAAkC,8DAClCC,wBAA2B,0BAEzC,SAASC,WAAWC,GAClB,IAAIC,OACFA,EAAMC,aACNA,EAAYC,GACZA,GACEH,EACJE,EAAa,CACXE,WAAY,CACVC,WAAW,KAoCfV,WAAW,CACTW,OAAQ,OACRL,SACAE,KACAI,aArCmB,KACnB,MAAMC,OACJA,GACEP,EACEQ,EAASR,EAAOQ,OAAOL,WAC7B,IAAK,IAAIM,EAAI,EAAGA,EAAIF,EAAOG,OAAQD,GAAK,EAAG,CACzC,MAAME,EAAUX,EAAOO,OAAOE,GAE9B,IAAIG,GADWD,EAAQE,kBAElBb,EAAOQ,OAAOM,mBAAkBF,GAAMZ,EAAOe,WAClD,IAAIC,EAAK,EACJhB,EAAOiB,iBACVD,EAAKJ,EACLA,EAAK,GAEP,MAAMM,EAAelB,EAAOQ,OAAOL,WAAWC,UAAYe,KAAKC,IAAI,EAAID,KAAKE,IAAIV,EAAQW,UAAW,GAAK,EAAIH,KAAKI,IAAIJ,KAAKC,IAAIT,EAAQW,UAAW,GAAI,GAC/IE,EAAW7B,aAAaa,EAAQG,GACtCa,EAASC,MAAMC,QAAUR,EACzBM,EAASC,MAAME,UAAY,eAAef,QAASI,WACrD,GAmBAY,cAjBoBC,IACpB,MAAMC,EAAoB9B,EAAOO,OAAOwB,KAAIpB,GAAWd,oBAAoBc,KAC3EmB,EAAkBE,SAAQC,IACxBA,EAAGR,MAAMS,mBAAqB,GAAGL,KAAY,IAE/CjC,2BAA2B,CACzBI,SACA6B,WACAC,oBACAK,WAAW,GACX,EAQFC,gBAAiB,KAAM,CACrBC,cAAe,EACfC,eAAgB,EAChBC,qBAAqB,EACrBC,aAAc,EACd1B,kBAAmBd,EAAOQ,OAAOiC,WAGvC,QAES3C"}

+ 66 - 0
node_modules/swiper/modules/effect-fade.mjs

@@ -0,0 +1,66 @@
+import { e as effectInit } from '../shared/effect-init.mjs';
+import { e as effectTarget } from '../shared/effect-target.mjs';
+import { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';
+import { g as getSlideTransformEl } from '../shared/utils.mjs';
+
+function EffectFade(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on
+  } = _ref;
+  extendParams({
+    fadeEffect: {
+      crossFade: false
+    }
+  });
+  const setTranslate = () => {
+    const {
+      slides
+    } = swiper;
+    const params = swiper.params.fadeEffect;
+    for (let i = 0; i < slides.length; i += 1) {
+      const slideEl = swiper.slides[i];
+      const offset = slideEl.swiperSlideOffset;
+      let tx = -offset;
+      if (!swiper.params.virtualTranslate) tx -= swiper.translate;
+      let ty = 0;
+      if (!swiper.isHorizontal()) {
+        ty = tx;
+        tx = 0;
+      }
+      const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(slideEl.progress), 0) : 1 + Math.min(Math.max(slideEl.progress, -1), 0);
+      const targetEl = effectTarget(params, slideEl);
+      targetEl.style.opacity = slideOpacity;
+      targetEl.style.transform = `translate3d(${tx}px, ${ty}px, 0px)`;
+    }
+  };
+  const setTransition = duration => {
+    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
+    transformElements.forEach(el => {
+      el.style.transitionDuration = `${duration}ms`;
+    });
+    effectVirtualTransitionEnd({
+      swiper,
+      duration,
+      transformElements,
+      allSlides: true
+    });
+  };
+  effectInit({
+    effect: 'fade',
+    swiper,
+    on,
+    setTranslate,
+    setTransition,
+    overwriteParams: () => ({
+      slidesPerView: 1,
+      slidesPerGroup: 1,
+      watchSlidesProgress: true,
+      spaceBetween: 0,
+      virtualTranslate: !swiper.params.cssMode
+    })
+  });
+}
+
+export { EffectFade as default };

+ 20 - 0
node_modules/swiper/modules/effect-fade.scss

@@ -0,0 +1,20 @@
+.swiper-fade {
+  &.swiper-free-mode {
+    .swiper-slide {
+      transition-timing-function: ease-out;
+    }
+  }
+  .swiper-slide {
+    pointer-events: none;
+    transition-property: opacity;
+    .swiper-slide {
+      pointer-events: none;
+    }
+  }
+  .swiper-slide-active {
+    &,
+    & .swiper-slide-active {
+      pointer-events: auto;
+    }
+  }
+}

+ 17 - 0
node_modules/swiper/modules/effect-flip-element.css

@@ -0,0 +1,17 @@
+.swiper.swiper-flip {
+  overflow: visible;
+}
+.swiper-flip ::slotted(swiper-slide) {
+  pointer-events: none;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  z-index: 1;
+}
+.swiper-flip ::slotted(swiper-slide) ::slotted(swiper-slide) {
+  pointer-events: none;
+}
+.swiper-flip ::slotted(.swiper-slide-active),
+.swiper-flip ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active) {
+  pointer-events: auto;
+}
+/* Flip slide shadows start *//* Flip slide shadows end */

+ 1 - 0
node_modules/swiper/modules/effect-flip-element.min.css

@@ -0,0 +1 @@
+.swiper.swiper-flip{overflow:visible}.swiper-flip ::slotted(swiper-slide){pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip ::slotted(swiper-slide) ::slotted(swiper-slide){pointer-events:none}.swiper-flip ::slotted(.swiper-slide-active),.swiper-flip ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active){pointer-events:auto}

+ 26 - 0
node_modules/swiper/modules/effect-flip.css

@@ -0,0 +1,26 @@
+.swiper.swiper-flip {
+  overflow: visible;
+}
+.swiper-flip .swiper-slide {
+  pointer-events: none;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  z-index: 1;
+}
+.swiper-flip .swiper-slide .swiper-slide {
+  pointer-events: none;
+}
+.swiper-flip .swiper-slide-active,
+.swiper-flip .swiper-slide-active .swiper-slide-active {
+  pointer-events: auto;
+}
+/* Flip slide shadows start */
+.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-top,
+.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,
+.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-left,
+.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-right {
+  z-index: 0;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+}
+/* Flip slide shadows end */

+ 30 - 0
node_modules/swiper/modules/effect-flip.less

@@ -0,0 +1,30 @@
+.swiper.swiper-flip {
+  overflow: visible;
+}
+.swiper-flip {
+  .swiper-slide {
+    pointer-events: none;
+    backface-visibility: hidden;
+    z-index: 1;
+    .swiper-slide {
+      pointer-events: none;
+    }
+  }
+  .swiper-slide-active {
+    &,
+    & .swiper-slide-active {
+      pointer-events: auto;
+    }
+  }
+}
+/* Flip slide shadows start */
+.swiper-flip {
+  .swiper-slide-shadow-flip.swiper-slide-shadow-top,
+  .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,
+  .swiper-slide-shadow-flip.swiper-slide-shadow-left,
+  .swiper-slide-shadow-flip.swiper-slide-shadow-right {
+    z-index: 0;
+    backface-visibility: hidden;
+  }
+}
+/* Flip slide shadows end */

+ 1 - 0
node_modules/swiper/modules/effect-flip.min.css

@@ -0,0 +1 @@
+.swiper.swiper-flip{overflow:visible}.swiper-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}

Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-flip.min.mjs


Plik diff jest za duży
+ 0 - 0
node_modules/swiper/modules/effect-flip.min.mjs.map


+ 111 - 0
node_modules/swiper/modules/effect-flip.mjs

@@ -0,0 +1,111 @@
+import { c as createShadow } from '../shared/create-shadow.mjs';
+import { e as effectInit } from '../shared/effect-init.mjs';
+import { e as effectTarget } from '../shared/effect-target.mjs';
+import { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';
+import { g as getSlideTransformEl, p as getRotateFix } from '../shared/utils.mjs';
+
+function EffectFlip(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on
+  } = _ref;
+  extendParams({
+    flipEffect: {
+      slideShadows: true,
+      limitRotation: true
+    }
+  });
+  const createSlideShadows = (slideEl, progress) => {
+    let shadowBefore = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
+    let shadowAfter = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
+    if (!shadowBefore) {
+      shadowBefore = createShadow('flip', slideEl, swiper.isHorizontal() ? 'left' : 'top');
+    }
+    if (!shadowAfter) {
+      shadowAfter = createShadow('flip', slideEl, swiper.isHorizontal() ? 'right' : 'bottom');
+    }
+    if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
+    if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
+  };
+  const recreateShadows = () => {
+    // Set shadows
+    swiper.params.flipEffect;
+    swiper.slides.forEach(slideEl => {
+      let progress = slideEl.progress;
+      if (swiper.params.flipEffect.limitRotation) {
+        progress = Math.max(Math.min(slideEl.progress, 1), -1);
+      }
+      createSlideShadows(slideEl, progress);
+    });
+  };
+  const setTranslate = () => {
+    const {
+      slides,
+      rtlTranslate: rtl
+    } = swiper;
+    const params = swiper.params.flipEffect;
+    const rotateFix = getRotateFix(swiper);
+    for (let i = 0; i < slides.length; i += 1) {
+      const slideEl = slides[i];
+      let progress = slideEl.progress;
+      if (swiper.params.flipEffect.limitRotation) {
+        progress = Math.max(Math.min(slideEl.progress, 1), -1);
+      }
+      const offset = slideEl.swiperSlideOffset;
+      const rotate = -180 * progress;
+      let rotateY = rotate;
+      let rotateX = 0;
+      let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;
+      let ty = 0;
+      if (!swiper.isHorizontal()) {
+        ty = tx;
+        tx = 0;
+        rotateX = -rotateY;
+        rotateY = 0;
+      } else if (rtl) {
+        rotateY = -rotateY;
+      }
+      slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
+      if (params.slideShadows) {
+        createSlideShadows(slideEl, progress);
+      }
+      const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateFix(rotateX)}deg) rotateY(${rotateFix(rotateY)}deg)`;
+      const targetEl = effectTarget(params, slideEl);
+      targetEl.style.transform = transform;
+    }
+  };
+  const setTransition = duration => {
+    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
+    transformElements.forEach(el => {
+      el.style.transitionDuration = `${duration}ms`;
+      el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {
+        shadowEl.style.transitionDuration = `${duration}ms`;
+      });
+    });
+    effectVirtualTransitionEnd({
+      swiper,
+      duration,
+      transformElements
+    });
+  };
+  effectInit({
+    effect: 'flip',
+    swiper,
+    on,
+    setTranslate,
+    setTransition,
+    recreateShadows,
+    getEffectParams: () => swiper.params.flipEffect,
+    perspective: () => true,
+    overwriteParams: () => ({
+      slidesPerView: 1,
+      slidesPerGroup: 1,
+      watchSlidesProgress: true,
+      spaceBetween: 0,
+      virtualTranslate: !swiper.params.cssMode
+    })
+  });
+}
+
+export { EffectFlip as default };

+ 30 - 0
node_modules/swiper/modules/effect-flip.scss

@@ -0,0 +1,30 @@
+.swiper.swiper-flip {
+  overflow: visible;
+}
+.swiper-flip {
+  .swiper-slide {
+    pointer-events: none;
+    backface-visibility: hidden;
+    z-index: 1;
+    .swiper-slide {
+      pointer-events: none;
+    }
+  }
+  .swiper-slide-active {
+    &,
+    & .swiper-slide-active {
+      pointer-events: auto;
+    }
+  }
+}
+/* Flip slide shadows start */
+.swiper-flip {
+  .swiper-slide-shadow-flip.swiper-slide-shadow-top,
+  .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,
+  .swiper-slide-shadow-flip.swiper-slide-shadow-left,
+  .swiper-slide-shadow-flip.swiper-slide-shadow-right {
+    z-index: 0;
+    backface-visibility: hidden;
+  }
+}
+/* Flip slide shadows end */

+ 4 - 0
node_modules/swiper/modules/free-mode-element.css

@@ -0,0 +1,4 @@
+.swiper-free-mode > .swiper-wrapper {
+  transition-timing-function: ease-out;
+  margin: 0 auto;
+}

+ 1 - 0
node_modules/swiper/modules/free-mode-element.min.css

@@ -0,0 +1 @@
+.swiper-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików