瀏覽代碼

fix: save

gemercheung 1 年之前
父節點
當前提交
d7e2306ec1
共有 100 個文件被更改,包括 725 次插入35 次删除
  1. 1 0
      .env
  2. 1 0
      .env.development
  3. 1 0
      .env.production
  4. 506 0
      c1.js
  5. 2 2
      getWebp.sh
  6. 4 0
      package.json
  7. 210 31
      pnpm-lock.yaml
  8. 0 2
      public/cone-steadi-10fps-873-rev1/0000.webp
  9. 二進制
      public/cone-steadi-10fps-873-rev1/0001.webp
  10. 二進制
      public/cone-steadi-10fps-873-rev1/0002.webp
  11. 二進制
      public/cone-steadi-10fps-873-rev1/0003.webp
  12. 二進制
      public/cone-steadi-10fps-873-rev1/0004.webp
  13. 二進制
      public/cone-steadi-10fps-873-rev1/0005.webp
  14. 二進制
      public/cone-steadi-10fps-873-rev1/0006.webp
  15. 二進制
      public/cone-steadi-10fps-873-rev1/0007.webp
  16. 二進制
      public/cone-steadi-10fps-873-rev1/0008.webp
  17. 二進制
      public/cone-steadi-10fps-873-rev1/0009.webp
  18. 二進制
      public/cone-steadi-10fps-873-rev1/0010.webp
  19. 二進制
      public/cone-steadi-10fps-873-rev1/0011.webp
  20. 二進制
      public/cone-steadi-10fps-873-rev1/0012.webp
  21. 二進制
      public/cone-steadi-10fps-873-rev1/0013.webp
  22. 二進制
      public/cone-steadi-10fps-873-rev1/0014.webp
  23. 二進制
      public/cone-steadi-10fps-873-rev1/0015.webp
  24. 二進制
      public/cone-steadi-10fps-873-rev1/0016.webp
  25. 二進制
      public/cone-steadi-10fps-873-rev1/0017.webp
  26. 二進制
      public/cone-steadi-10fps-873-rev1/0018.webp
  27. 二進制
      public/cone-steadi-10fps-873-rev1/0019.webp
  28. 二進制
      public/cone-steadi-10fps-873-rev1/0020.webp
  29. 二進制
      public/cone-steadi-10fps-873-rev1/0021.webp
  30. 二進制
      public/cone-steadi-10fps-873-rev1/0022.webp
  31. 二進制
      public/cone-steadi-10fps-873-rev1/0023.webp
  32. 二進制
      public/cone-steadi-10fps-873-rev1/0024.webp
  33. 二進制
      public/cone-steadi-10fps-873-rev1/0025.webp
  34. 二進制
      public/cone-steadi-10fps-873-rev1/0026.webp
  35. 二進制
      public/cone-steadi-10fps-873-rev1/0027.webp
  36. 二進制
      public/cone-steadi-10fps-873-rev1/0028.webp
  37. 二進制
      public/cone-steadi-10fps-873-rev1/0029.webp
  38. 二進制
      public/cone-steadi-10fps-873-rev1/0030.webp
  39. 二進制
      public/cone-steadi-10fps-873-rev1/0031.webp
  40. 二進制
      public/cone-steadi-10fps-873-rev1/0032.webp
  41. 二進制
      public/cone-steadi-10fps-873-rev1/0033.webp
  42. 二進制
      public/cone-steadi-10fps-873-rev1/0034.webp
  43. 二進制
      public/cone-steadi-10fps-873-rev1/0035.webp
  44. 二進制
      public/cone-steadi-10fps-873-rev1/0036.webp
  45. 二進制
      public/cone-steadi-10fps-873-rev1/0037.webp
  46. 二進制
      public/cone-steadi-10fps-873-rev1/0038.webp
  47. 二進制
      public/cone-steadi-10fps-873-rev1/0039.webp
  48. 二進制
      public/cone-steadi-10fps-873-rev1/0040.webp
  49. 二進制
      public/cone-steadi-10fps-873-rev1/0041.webp
  50. 二進制
      public/cone-steadi-10fps-873-rev1/0042.webp
  51. 二進制
      public/cone-steadi-10fps-873-rev1/0043.webp
  52. 二進制
      public/cone-steadi-10fps-873-rev1/0044.webp
  53. 二進制
      public/cone-steadi-10fps-873-rev1/0045.webp
  54. 二進制
      public/cone-steadi-10fps-873-rev1/0046.webp
  55. 二進制
      public/cone-steadi-10fps-873-rev1/0047.webp
  56. 二進制
      public/cone-steadi-10fps-873-rev1/0048.webp
  57. 二進制
      public/cone-steadi-10fps-873-rev1/0049.webp
  58. 二進制
      public/cone-steadi-10fps-873-rev1/0050.webp
  59. 二進制
      public/cone-steadi-10fps-873-rev1/0051.webp
  60. 二進制
      public/cone-steadi-10fps-873-rev1/0052.webp
  61. 二進制
      public/cone-steadi-10fps-873-rev1/0053.webp
  62. 二進制
      public/cone-steadi-10fps-873-rev1/0054.webp
  63. 二進制
      public/cone-steadi-10fps-873-rev1/0055.webp
  64. 二進制
      public/cone-steadi-10fps-873-rev1/0056.webp
  65. 二進制
      public/cone-steadi-10fps-873-rev1/0057.webp
  66. 二進制
      public/cone-steadi-10fps-873-rev1/0058.webp
  67. 二進制
      public/cone-steadi-10fps-873-rev1/0059.webp
  68. 二進制
      public/cone-steadi-10fps-873-rev1/0060.webp
  69. 二進制
      public/cone-steadi-10fps-873-rev1/0061.webp
  70. 二進制
      public/cone-steadi-10fps-873-rev1/0062.webp
  71. 二進制
      public/cone-steadi-10fps-873-rev1/0063.webp
  72. 二進制
      public/cone-steadi-10fps-873-rev1/0064.webp
  73. 二進制
      public/cone-steadi-10fps-873-rev1/0065.webp
  74. 二進制
      public/cone-steadi-10fps-873-rev1/0066.webp
  75. 二進制
      public/cone-steadi-10fps-873-rev1/0067.webp
  76. 二進制
      public/cone-steadi-10fps-873-rev1/0068.webp
  77. 二進制
      public/cone-steadi-10fps-873-rev1/0069.webp
  78. 二進制
      public/cone-steadi-10fps-873-rev1/0070.webp
  79. 二進制
      public/cone-steadi-10fps-873-rev1/0071.webp
  80. 二進制
      public/cone-steadi-10fps-873-rev1/0072.webp
  81. 二進制
      public/cone-steadi-10fps-873-rev1/0073.webp
  82. 二進制
      public/cone-steadi-10fps-873-rev1/0074.webp
  83. 二進制
      public/cone-steadi-10fps-873-rev1/0075.webp
  84. 二進制
      public/cone-steadi-10fps-873-rev1/0076.webp
  85. 二進制
      public/cone-steadi-10fps-873-rev1/0077.webp
  86. 二進制
      public/cone-steadi-10fps-873-rev1/0078.webp
  87. 二進制
      public/cone-steadi-10fps-873-rev1/0079.webp
  88. 二進制
      public/cone-steadi-10fps-873-rev1/0080.webp
  89. 二進制
      public/cone-steadi-10fps-873-rev1/0081.webp
  90. 二進制
      public/cone-steadi-10fps-873-rev1/0082.webp
  91. 二進制
      public/cone-steadi-10fps-873-rev1/0083.webp
  92. 二進制
      public/cone-steadi-10fps-873-rev1/0084.webp
  93. 二進制
      public/cone-steadi-10fps-873-rev1/0085.webp
  94. 二進制
      public/cone-steadi-10fps-873-rev1/0086.webp
  95. 二進制
      public/cone-steadi-10fps-873-rev1/0087.webp
  96. 二進制
      public/cone-steadi-10fps-873-rev1/0088.webp
  97. 二進制
      public/cone-steadi-10fps-873-rev1/0089.webp
  98. 二進制
      public/cone-steadi-10fps-873-rev1/0090.webp
  99. 二進制
      public/cone-steadi-10fps-873-rev1/0091.webp
  100. 0 0
      public/cone-steadi-10fps-873-rev1/0092.webp

+ 1 - 0
.env

@@ -0,0 +1 @@
+VITE_APP_SOURCE=https://houseoss.4dkankan.com/project/nanjinbwg-demo/getty-image/

+ 1 - 0
.env.development

@@ -0,0 +1 @@
+VITE_APP_SOURCE=https://houseoss.4dkankan.com/project/nanjinbwg-demo/getty-image/

+ 1 - 0
.env.production

@@ -0,0 +1 @@
+VITE_APP_SOURCE=https://houseoss.4dkankan.com/project/nanjinbwg-demo/getty-image/

+ 506 - 0
c1.js

@@ -0,0 +1,506 @@
+const no = (function (e) {
+  $i(a, e);
+  var t,
+    n,
+    r =
+      ((t = a),
+      (n = (function () {
+        if ("undefined" == typeof Reflect || !Reflect.construct) return !1;
+        if (Reflect.construct.sham) return !1;
+        if ("function" == typeof Proxy) return !0;
+        try {
+          return (
+            Boolean.prototype.valueOf.call(
+              Reflect.construct(Boolean, [], function () {})
+            ),
+            !0
+          );
+        } catch (e) {
+          return !1;
+        }
+      })()),
+      function () {
+        var e,
+          r = Zi(t);
+        if (n) {
+          var a = Zi(this).constructor;
+          e = Reflect.construct(r, arguments, a);
+        } else e = r.apply(this, arguments);
+        return Ki(this, e);
+      });
+  function a(e) {
+    var t;
+    if (
+      (Gi(this, a),
+      ((t = r.call(this, e)).format = ".jpg"),
+      document.body.classList.contains("webp-supported") &&
+        (t.format = ".webp"),
+      document.body.classList.contains("avif-supported") &&
+        (t.format = ".avif"),
+      (t.containerRef = (0, i.createRef)(null)),
+      (t.viewerRef = (0, i.createRef)(null)),
+      (t.viewerOffsetRef = (0, i.createRef)(null)),
+      (t.canvasRef = (0, i.createRef)(null)),
+      (t.loadingWrap = (0, i.createRef)(null)),
+      (t.loadingProgress = (0, i.createRef)(null)),
+      (t.playHead = (0, i.createRef)(null)),
+      (t.playHeadProgress = (0, i.createRef)(null)),
+      (t.context = !1),
+      (t.width = 1552),
+      (t.height = 873),
+      t.props.canvasSize)
+    ) {
+      var n = c(t.props.canvasSize, 2);
+      (t.width = n[0]), (t.height = n[1]);
+    }
+    return (
+      (t.lastFrame = -1),
+      (t.floatFrame = 0),
+      (t.frame = t.props.startFrame || 0),
+      (t.fullFrameCount = t.props.frameCount),
+      (t.loadedCount = 0),
+      (t.loadComplete = !1),
+      (t.sequence = []),
+      (t.loadedRenderPool = []),
+      (t.loadedRenderTimeout = null),
+      (t.poolAnimateDelay = 40),
+      (t.timeline = !1),
+      (t.progress = 0),
+      t.props.pause &&
+        Object.keys(t.props.pause).forEach(function (e) {
+          t.fullFrameCount += t.props.pause[e];
+        }),
+      (t.enterTimeline = !1),
+      (t.exitTimeline = !1),
+      (t.notLoadedTween = {
+        isActive: !1,
+      }),
+      (t.isAbove = !1),
+      (t.isBelow = !0),
+      (t.lastProgress = !1),
+      (t.justScrolled = !1),
+      t
+    );
+  }
+  return (
+    Yi(a, [
+      {
+        key: "componentDidMount",
+        value: function () {
+          this.loadAssets(),
+            this.canvasRef.current && this.initializeContext(),
+            !this.enterTimeline &&
+              this.props.enterTween &&
+              this.initializeEnterTween(),
+            this.timeline || (this.initializeTimeline(), this.setTimeline()),
+            !this.exitTimeline &&
+              this.props.exitTween &&
+              this.initializeExitTween(),
+            Ci.refresh();
+        },
+      },
+      {
+        key: "getImagePath",
+        value: function (e) {
+          return (
+            "https://static.getty.edu/mesopotamia/" +
+            this.props.path +
+            "/" +
+            "".concat(e.toString().padStart(4, "0")) +
+            this.format
+          );
+        },
+      },
+      {
+        key: "loadAssets",
+        value: function () {
+          var e = this;
+          this.loadImage(1),
+            setTimeout(function () {
+              for (var t = 2; t <= e.props.frameCount; t += 1) e.loadImage(t);
+            }, 60);
+        },
+      },
+      {
+        key: "loadImage",
+        value: function (e) {
+          var t = this,
+            n = new Image();
+          if (
+            ((n.retried = 0),
+            (n.src = this.getImagePath(e)),
+            (n.ogSrc = n.src),
+            this.props.pause && e + "" in this.props.pause)
+          )
+            for (var r = this.props.pause[e]; r--; ) this.sequence.push(n);
+          this.sequence.push(n),
+            (n.onerror = function () {
+              var e = Math.floor(Date.now() * Math.random())
+                .toString()
+                .substring(0, 8);
+              n.retried < 2
+                ? setTimeout(function () {
+                    n.src = n.ogSrc + "?" + e;
+                  }, 80)
+                : n.retried < 3 &&
+                  setTimeout(function () {
+                    n.src = n.ogSrc.slice(0, -4) + ".jpg?" + e;
+                  }, 80),
+                n.retried++;
+            }),
+            (n.onload = function () {
+              1 === e && t.renderImageToCanvas(0),
+                t.frame > e &&
+                  t.timeline.scrollTrigger.isActive &&
+                  t.poolNewFrames(e - 1),
+                (t.loadedCount += 1),
+                (t.loadingProgress.current.style.width =
+                  (t.loadedCount / (parseFloat(t.props.frameCount) - 1)) * 100 +
+                  "%"),
+                t.loadedCount === parseFloat(t.props.frameCount) - 1 &&
+                  t.loadingComplete();
+            });
+        },
+      },
+      {
+        key: "loadingComplete",
+        value: function () {
+          console.log(this.props.path, "loading complete"),
+            (this.loadComplete = !0),
+            this.isAbove && this.renderImageToCanvas(this.loadedCount - 1);
+        },
+      },
+      {
+        key: "poolNewFrames",
+        value: function (e) {
+          this.loadedRenderPool.unshift(e),
+            this.loadedRenderPool.sort(function (e, t) {
+              return t - e;
+            }),
+            this.animatePool();
+        },
+      },
+      {
+        key: "animatePool",
+        value: function () {
+          var e = this;
+          !this.loadedRenderTimeout &&
+            this.loadedRenderPool.length &&
+            (this.loadedRenderTimeout = setTimeout(function () {
+              e.loadedRenderTimeout = !1;
+              var t = e.loadedRenderPool[e.loadedRenderPool.length - 1];
+              if (t <= e.frame) {
+                var n = e.loadedRenderPool.pop();
+                e.renderImageToCanvas(n), e.animatePool();
+              }
+              e.frame < t && (e.loadedRenderPool = []);
+            }, this.poolAnimateDelay));
+        },
+      },
+      {
+        key: "componentWillUnmount",
+        value: function () {
+          this.timeline && this.timeline.kill(!0);
+        },
+      },
+      {
+        key: "initializeContext",
+        value: function () {
+          (this.context = this.canvasRef.current.getContext("2d", {
+            alpha: !1,
+            desynchronized: !0,
+            powerPreference: "high-performance",
+          })),
+            (this.context.imageSmoothingEnabled = !0),
+            (this.context.imageSmoothingQuality = "high");
+        },
+      },
+      {
+        key: "initializeTimeline",
+        value: function () {
+          var e = this,
+            t = null,
+            n = function () {
+              ra.to(e.loadingWrap.current, {
+                autoAlpha: 1,
+              });
+            },
+            r = function () {
+              ra.to(e.loadingWrap.current, {
+                autoAlpha: 0,
+              });
+            };
+          r(),
+            (this.timeline = ra.timeline({
+              scrollTrigger: {
+                trigger: this.containerRef.current,
+                pin: this.viewerRef.current,
+                scrub: 0.66,
+                start: "top top",
+                end: "bottom bottom",
+                ease: "none",
+                markers: this.props.debug && false,
+                onUpdate: function (n) {
+                  e.props.debug,
+                    !1 === e.lastProgress && (e.lastProgress = n.progress),
+                    e.lastProgress !== n.progress &&
+                      ((e.justScrolled = !0),
+                      clearTimeout(t),
+                      (t = setTimeout(function () {
+                        e.frame > e.loadedCount &&
+                          !e.notLoadedTween.isActive &&
+                          (e.notLoadedTween = ra.to(e.loadingWrap.current, {
+                            backgroundColor: "#8888a0",
+                            duration: 0.33,
+                            repeat: 1,
+                            yoyo: !0,
+                          }));
+                      }, 100)),
+                      (e.lastProgress = n.progress));
+                },
+                onScrubComplete: function () {
+                  e.justScrolled = !1;
+                },
+                onEnter: function () {
+                  n(), (e.isAbove = !1);
+                },
+                onEnterBack: function () {
+                  n(), (e.isBelow = !1);
+                },
+                onLeave: function () {
+                  r(), (e.isAbove = !0);
+                },
+                onLeaveBack: function () {
+                  r(), (e.isBelow = !0);
+                },
+              },
+            }));
+        },
+      },
+      {
+        key: "setTimeline",
+        value: function () {
+          var e = this;
+          this.timeline.to(this, {
+            floatFrame: this.fullFrameCount - 1,
+            ease: "none",
+            onUpdate: function () {
+              (e.frame = Math.floor(e.floatFrame)),
+                e.lastFrame === e.frame ||
+                  e.loadedRenderPool.length ||
+                  e.renderImageToCanvas(e.frame);
+            },
+          });
+        },
+      },
+      {
+        key: "initializeEnterTween",
+        value: function () {
+          var e = this.props.enterTween.duration || 1;
+          ra.set(this.viewerRef.current, {
+            yPercent: -100 * e,
+          });
+          var t = !0;
+          if (
+            (void 0 !== this.props.enterTween.pin &&
+              (t = this.props.enterTween.pin),
+            (this.enterTimeline = ra.timeline({
+              scrollTrigger: {
+                trigger: this.viewerRef.current,
+                scrub: !0,
+                pin: t,
+                start: function () {
+                  return "top top";
+                },
+                end: function () {
+                  return "top top-=" + window.innerHeight * e;
+                },
+              },
+            })),
+            this.props.enterTween.to &&
+              this.enterTimeline.to(
+                this.viewerRef.current,
+                to(
+                  {
+                    ease: "none",
+                  },
+                  this.props.enterTween.to
+                )
+              ),
+            this.props.enterTween.from &&
+              this.enterTimeline.from(
+                this.viewerRef.current,
+                to(
+                  {
+                    ease: "none",
+                  },
+                  this.props.enterTween.from
+                )
+              ),
+            this.props.enterTween.fromTo)
+          ) {
+            var n = this.props.enterTween.fromTo[0],
+              r = this.props.enterTween.fromTo[1];
+            this.enterTimeline.fromTo(
+              this.viewerRef.current,
+              n,
+              to(
+                {
+                  ease: "none",
+                },
+                r
+              )
+            );
+          }
+        },
+      },
+      {
+        key: "initializeExitTween",
+        value: function () {
+          if (
+            (console.log(this.props.path, "initializing exit tween "),
+            (this.exitTimeline = ra.timeline({
+              scrollTrigger: {
+                scrub: !0,
+                trigger: this.containerRef.current,
+                pin: this.viewerRef.current,
+                onLeave: this.props.exitTween.onLeave,
+                onLeaveBack: this.props.exitTween.onLeaveBack,
+                onEnterBack: this.props.exitTween.onEnterBack,
+                start: function () {
+                  return "bottom bottom";
+                },
+                end: function () {
+                  return "bottom top";
+                },
+              },
+            })),
+            this.props.exitTween.to &&
+              this.exitTimeline.to(
+                this.viewerRef.current,
+                to(
+                  {
+                    ease: "none",
+                  },
+                  this.props.exitTween.to
+                )
+              ),
+            this.props.exitTween.from &&
+              this.exitTimeline.from(
+                this.viewerRef.current,
+                to(
+                  {
+                    ease: "none",
+                  },
+                  this.props.exitTween.from
+                )
+              ),
+            this.props.exitTween.fromTo)
+          ) {
+            var e = this.props.exitTween.fromTo[0],
+              t = this.props.exitTween.fromTo[1];
+            this.exitTimeline.fromTo(
+              this.viewerRef.current,
+              e,
+              to(
+                to({}, t),
+                {},
+                {
+                  ease: "none",
+                }
+              )
+            );
+          }
+        },
+      },
+      {
+        key: "renderImageToCanvas",
+        value: function (e) {
+          if (this.sequence[e])
+            if (this.context.drawImage) {
+              this.props.debug,
+                this.context.drawImage(this.sequence[e], 0, 0),
+                (this.lastFrame = e);
+              var t = 100 - (this.frame / this.fullFrameCount) * 100 + "%",
+                n = 100 - (e / this.fullFrameCount) * 100 + "%";
+              (this.playHeadTween = ra.to(this.playHead.current, {
+                duration: 0.05,
+                right: n,
+                ease: "none",
+              })),
+                (this.playHeadProgressTween = ra.to(
+                  this.playHeadProgress.current,
+                  {
+                    duration: 0.05,
+                    right: t,
+                    ease: "none",
+                  }
+                ));
+            } else this.initializeContext();
+        },
+      },
+      {
+        key: "render",
+        value: function () {
+          var e = {
+            height: this.props.height || "500vh",
+          };
+          return (0, l.jsxs)(l.Fragment, {
+            children: [
+              (0, l.jsxs)("div", {
+                ref: this.loadingWrap,
+                className: o["load-progress-wrap"],
+                children: [
+                  (0, l.jsxs)("div", {
+                    className: o["playhead-wrap"],
+                    children: [
+                      (0, l.jsx)("div", {
+                        ref: this.playHead,
+                        className: o.playhead,
+                      }),
+                      (0, l.jsx)("div", {
+                        ref: this.playHeadProgress,
+                        className: o["playhead-progress"],
+                      }),
+                    ],
+                  }),
+                  (0, l.jsx)("div", {
+                    ref: this.loadingProgress,
+                    className: o["load-progress"],
+                    style: {
+                      width: "0%",
+                    },
+                  }),
+                ],
+              }),
+              (0, l.jsxs)("div", {
+                ref: this.containerRef,
+                className: o.sequence,
+                style: e,
+                children: [
+                  (0, l.jsx)("div", {
+                    ref: this.viewerRef,
+                    className: o["canvas-viewer"],
+                    children: (0, l.jsx)("div", {
+                      style: {
+                        overflow: "hidden",
+                      },
+                      children: (0, l.jsx)("canvas", {
+                        ref: this.canvasRef,
+                        className: o["sequence-canvas"],
+                        width: this.width,
+                        height: this.height,
+                      }),
+                    }),
+                  }),
+                  this.props.children,
+                ],
+              }),
+            ],
+          });
+        },
+      },
+    ]),
+    a
+  );
+})(i.Component);

+ 2 - 2
getWebp.sh

@@ -1,10 +1,10 @@
 
 #!/bin/sh
 
-for i in {0..256}
+for i in {1..184}
 do
     item=$(printf %04d $i)
-    projectID="cone-steadi-10fps-873-rev1"
+    projectID="gudea-render-10fps-873-rev1"
     url="https://static.getty.edu/mesopotamia/$projectID/$item.webp"
     mkdir -p ./public/$projectID
     curl $url --output ./public/$projectID/$item.webp

+ 4 - 0
package.json

@@ -10,13 +10,17 @@
     "preview": "vite preview"
   },
   "dependencies": {
+    "@emotion/react": "^11.11.4",
+    "@emotion/styled": "^11.11.0",
     "@gsap/react": "^2.1.0",
     "gsap": "^3.12.5",
+    "prop-types": "^15.8.1",
     "react": "^18.2.0",
     "react-dom": "^18.2.0",
     "react-lazyload": "^3.2.0"
   },
   "devDependencies": {
+    "@emotion/babel-plugin": "^11.11.0",
     "@types/react": "^18.2.64",
     "@types/react-dom": "^18.2.21",
     "@vitejs/plugin-react": "^4.2.1",

+ 210 - 31
pnpm-lock.yaml

@@ -5,12 +5,21 @@ settings:
   excludeLinksFromLockfile: false
 
 dependencies:
+  '@emotion/react':
+    specifier: ^11.11.4
+    version: 11.11.4(@types/react@18.2.67)(react@18.2.0)
+  '@emotion/styled':
+    specifier: ^11.11.0
+    version: 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0)
   '@gsap/react':
     specifier: ^2.1.0
     version: 2.1.0
   gsap:
     specifier: ^3.12.5
     version: 3.12.5
+  prop-types:
+    specifier: ^15.8.1
+    version: 15.8.1
   react:
     specifier: ^18.2.0
     version: 18.2.0
@@ -22,6 +31,9 @@ dependencies:
     version: 3.2.0(react-dom@18.2.0)(react@18.2.0)
 
 devDependencies:
+  '@emotion/babel-plugin':
+    specifier: ^11.11.0
+    version: 11.11.0
   '@types/react':
     specifier: ^18.2.64
     version: 18.2.67
@@ -68,7 +80,6 @@ packages:
     dependencies:
       '@babel/highlight': 7.23.4
       chalk: 2.4.2
-    dev: true
 
   /@babel/compat-data@7.23.5:
     resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==}
@@ -144,7 +155,6 @@ packages:
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/types': 7.24.0
-    dev: true
 
   /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0):
     resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
@@ -182,12 +192,10 @@ packages:
   /@babel/helper-string-parser@7.23.4:
     resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
     engines: {node: '>=6.9.0'}
-    dev: true
 
   /@babel/helper-validator-identifier@7.22.20:
     resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
     engines: {node: '>=6.9.0'}
-    dev: true
 
   /@babel/helper-validator-option@7.23.5:
     resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
@@ -212,7 +220,6 @@ packages:
       '@babel/helper-validator-identifier': 7.22.20
       chalk: 2.4.2
       js-tokens: 4.0.0
-    dev: true
 
   /@babel/parser@7.24.0:
     resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==}
@@ -242,6 +249,12 @@ packages:
       '@babel/helper-plugin-utils': 7.24.0
     dev: true
 
+  /@babel/runtime@7.24.1:
+    resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      regenerator-runtime: 0.14.1
+
   /@babel/template@7.24.0:
     resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==}
     engines: {node: '>=6.9.0'}
@@ -276,7 +289,116 @@ packages:
       '@babel/helper-string-parser': 7.23.4
       '@babel/helper-validator-identifier': 7.22.20
       to-fast-properties: 2.0.0
-    dev: true
+
+  /@emotion/babel-plugin@11.11.0:
+    resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==}
+    dependencies:
+      '@babel/helper-module-imports': 7.22.15
+      '@babel/runtime': 7.24.1
+      '@emotion/hash': 0.9.1
+      '@emotion/memoize': 0.8.1
+      '@emotion/serialize': 1.1.3
+      babel-plugin-macros: 3.1.0
+      convert-source-map: 1.9.0
+      escape-string-regexp: 4.0.0
+      find-root: 1.1.0
+      source-map: 0.5.7
+      stylis: 4.2.0
+
+  /@emotion/cache@11.11.0:
+    resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==}
+    dependencies:
+      '@emotion/memoize': 0.8.1
+      '@emotion/sheet': 1.2.2
+      '@emotion/utils': 1.2.1
+      '@emotion/weak-memoize': 0.3.1
+      stylis: 4.2.0
+    dev: false
+
+  /@emotion/hash@0.9.1:
+    resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
+
+  /@emotion/is-prop-valid@1.2.2:
+    resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==}
+    dependencies:
+      '@emotion/memoize': 0.8.1
+    dev: false
+
+  /@emotion/memoize@0.8.1:
+    resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
+
+  /@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0):
+    resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==}
+    peerDependencies:
+      '@types/react': '*'
+      react: '>=16.8.0'
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+    dependencies:
+      '@babel/runtime': 7.24.1
+      '@emotion/babel-plugin': 11.11.0
+      '@emotion/cache': 11.11.0
+      '@emotion/serialize': 1.1.3
+      '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0)
+      '@emotion/utils': 1.2.1
+      '@emotion/weak-memoize': 0.3.1
+      '@types/react': 18.2.67
+      hoist-non-react-statics: 3.3.2
+      react: 18.2.0
+    dev: false
+
+  /@emotion/serialize@1.1.3:
+    resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==}
+    dependencies:
+      '@emotion/hash': 0.9.1
+      '@emotion/memoize': 0.8.1
+      '@emotion/unitless': 0.8.1
+      '@emotion/utils': 1.2.1
+      csstype: 3.1.3
+
+  /@emotion/sheet@1.2.2:
+    resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==}
+    dev: false
+
+  /@emotion/styled@11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0):
+    resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==}
+    peerDependencies:
+      '@emotion/react': ^11.0.0-rc.0
+      '@types/react': '*'
+      react: '>=16.8.0'
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+    dependencies:
+      '@babel/runtime': 7.24.1
+      '@emotion/babel-plugin': 11.11.0
+      '@emotion/is-prop-valid': 1.2.2
+      '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0)
+      '@emotion/serialize': 1.1.3
+      '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0)
+      '@emotion/utils': 1.2.1
+      '@types/react': 18.2.67
+      react: 18.2.0
+    dev: false
+
+  /@emotion/unitless@0.8.1:
+    resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
+
+  /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0):
+    resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==}
+    peerDependencies:
+      react: '>=16.8.0'
+    dependencies:
+      react: 18.2.0
+    dev: false
+
+  /@emotion/utils@1.2.1:
+    resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==}
+
+  /@emotion/weak-memoize@0.3.1:
+    resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==}
+    dev: false
 
   /@esbuild/aix-ppc64@0.19.12:
     resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
@@ -742,9 +864,11 @@ packages:
     resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
     dev: true
 
+  /@types/parse-json@4.0.2:
+    resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
   /@types/prop-types@15.7.11:
     resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
-    dev: true
 
   /@types/react-dom@18.2.22:
     resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==}
@@ -758,11 +882,9 @@ packages:
       '@types/prop-types': 15.7.11
       '@types/scheduler': 0.16.8
       csstype: 3.1.3
-    dev: true
 
   /@types/scheduler@0.16.8:
     resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
-    dev: true
 
   /@ungap/structured-clone@1.2.0:
     resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
@@ -817,7 +939,6 @@ packages:
     engines: {node: '>=4'}
     dependencies:
       color-convert: 1.9.3
-    dev: true
 
   /ansi-styles@4.3.0:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
@@ -920,6 +1041,14 @@ packages:
       possible-typed-array-names: 1.0.0
     dev: true
 
+  /babel-plugin-macros@3.1.0:
+    resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+    engines: {node: '>=10', npm: '>=6'}
+    dependencies:
+      '@babel/runtime': 7.24.1
+      cosmiconfig: 7.1.0
+      resolve: 1.22.8
+
   /balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
     dev: true
@@ -956,7 +1085,6 @@ packages:
   /callsites@3.1.0:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     engines: {node: '>=6'}
-    dev: true
 
   /caniuse-lite@1.0.30001599:
     resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==}
@@ -969,7 +1097,6 @@ packages:
       ansi-styles: 3.2.1
       escape-string-regexp: 1.0.5
       supports-color: 5.5.0
-    dev: true
 
   /chalk@4.1.2:
     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@@ -983,7 +1110,6 @@ packages:
     resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
     dependencies:
       color-name: 1.1.3
-    dev: true
 
   /color-convert@2.0.1:
     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
@@ -994,7 +1120,6 @@ packages:
 
   /color-name@1.1.3:
     resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-    dev: true
 
   /color-name@1.1.4:
     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
@@ -1004,10 +1129,23 @@ packages:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
     dev: true
 
+  /convert-source-map@1.9.0:
+    resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
   /convert-source-map@2.0.0:
     resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
     dev: true
 
+  /cosmiconfig@7.1.0:
+    resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+    engines: {node: '>=10'}
+    dependencies:
+      '@types/parse-json': 4.0.2
+      import-fresh: 3.3.0
+      parse-json: 5.2.0
+      path-type: 4.0.0
+      yaml: 1.10.2
+
   /cross-spawn@7.0.3:
     resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
     engines: {node: '>= 8'}
@@ -1019,7 +1157,6 @@ packages:
 
   /csstype@3.1.3:
     resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
-    dev: true
 
   /data-view-buffer@1.0.1:
     resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
@@ -1100,6 +1237,11 @@ packages:
     resolution: {integrity: sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA==}
     dev: true
 
+  /error-ex@1.3.2:
+    resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+    dependencies:
+      is-arrayish: 0.2.1
+
   /es-abstract@1.22.5:
     resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==}
     engines: {node: '>= 0.4'}
@@ -1301,12 +1443,10 @@ packages:
   /escape-string-regexp@1.0.5:
     resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
     engines: {node: '>=0.8.0'}
-    dev: true
 
   /escape-string-regexp@4.0.0:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
-    dev: true
 
   /eslint-plugin-react-hooks@4.6.0(eslint@8.57.0):
     resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
@@ -1470,6 +1610,9 @@ packages:
       flat-cache: 3.2.0
     dev: true
 
+  /find-root@1.1.0:
+    resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+
   /find-up@5.0.0:
     resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
     engines: {node: '>=10'}
@@ -1511,7 +1654,6 @@ packages:
 
   /function-bind@1.1.2:
     resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-    dev: true
 
   /function.prototype.name@1.1.6:
     resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
@@ -1610,7 +1752,6 @@ packages:
   /has-flag@3.0.0:
     resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
     engines: {node: '>=4'}
-    dev: true
 
   /has-flag@4.0.0:
     resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
@@ -1645,7 +1786,12 @@ packages:
     engines: {node: '>= 0.4'}
     dependencies:
       function-bind: 1.1.2
-    dev: true
+
+  /hoist-non-react-statics@3.3.2:
+    resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+    dependencies:
+      react-is: 16.13.1
+    dev: false
 
   /ignore@5.3.1:
     resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
@@ -1658,7 +1804,6 @@ packages:
     dependencies:
       parent-module: 1.0.1
       resolve-from: 4.0.0
-    dev: true
 
   /imurmurhash@0.1.4:
     resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
@@ -1693,6 +1838,9 @@ packages:
       get-intrinsic: 1.2.4
     dev: true
 
+  /is-arrayish@0.2.1:
+    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
   /is-async-function@2.0.0:
     resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
     engines: {node: '>= 0.4'}
@@ -1723,7 +1871,6 @@ packages:
     resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
     dependencies:
       hasown: 2.0.2
-    dev: true
 
   /is-data-view@1.0.1:
     resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
@@ -1884,6 +2031,9 @@ packages:
     resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
     dev: true
 
+  /json-parse-even-better-errors@2.3.1:
+    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
   /json-schema-traverse@0.4.1:
     resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
     dev: true
@@ -1922,6 +2072,9 @@ packages:
       type-check: 0.4.0
     dev: true
 
+  /lines-and-columns@1.2.4:
+    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
   /locate-path@6.0.0:
     resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
     engines: {node: '>=10'}
@@ -1972,7 +2125,6 @@ packages:
   /object-assign@4.1.1:
     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
     engines: {node: '>=0.10.0'}
-    dev: true
 
   /object-inspect@1.13.1:
     resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
@@ -2065,7 +2217,15 @@ packages:
     engines: {node: '>=6'}
     dependencies:
       callsites: 3.1.0
-    dev: true
+
+  /parse-json@5.2.0:
+    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+    engines: {node: '>=8'}
+    dependencies:
+      '@babel/code-frame': 7.23.5
+      error-ex: 1.3.2
+      json-parse-even-better-errors: 2.3.1
+      lines-and-columns: 1.2.4
 
   /path-exists@4.0.0:
     resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
@@ -2084,7 +2244,10 @@ packages:
 
   /path-parse@1.0.7:
     resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
-    dev: true
+
+  /path-type@4.0.0:
+    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+    engines: {node: '>=8'}
 
   /picocolors@1.0.0:
     resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
@@ -2115,7 +2278,6 @@ packages:
       loose-envify: 1.4.0
       object-assign: 4.1.1
       react-is: 16.13.1
-    dev: true
 
   /punycode@2.3.1:
     resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
@@ -2138,7 +2300,6 @@ packages:
 
   /react-is@16.13.1:
     resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
-    dev: true
 
   /react-lazyload@3.2.0(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==}
@@ -2175,6 +2336,9 @@ packages:
       which-builtin-type: 1.1.3
     dev: true
 
+  /regenerator-runtime@0.14.1:
+    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
   /regexp.prototype.flags@1.5.2:
     resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
     engines: {node: '>= 0.4'}
@@ -2188,7 +2352,14 @@ packages:
   /resolve-from@4.0.0:
     resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
     engines: {node: '>=4'}
-    dev: true
+
+  /resolve@1.22.8:
+    resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+    hasBin: true
+    dependencies:
+      is-core-module: 2.13.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
 
   /resolve@2.0.0-next.5:
     resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
@@ -2319,6 +2490,10 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
+  /source-map@0.5.7:
+    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+    engines: {node: '>=0.10.0'}
+
   /string.prototype.matchall@4.0.10:
     resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==}
     dependencies:
@@ -2371,12 +2546,14 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /stylis@4.2.0:
+    resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+
   /supports-color@5.5.0:
     resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
     engines: {node: '>=4'}
     dependencies:
       has-flag: 3.0.0
-    dev: true
 
   /supports-color@7.2.0:
     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
@@ -2388,7 +2565,6 @@ packages:
   /supports-preserve-symlinks-flag@1.0.0:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
-    dev: true
 
   /text-table@0.2.0:
     resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
@@ -2397,7 +2573,6 @@ packages:
   /to-fast-properties@2.0.0:
     resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
     engines: {node: '>=4'}
-    dev: true
 
   /type-check@0.4.0:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
@@ -2581,6 +2756,10 @@ packages:
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
     dev: true
 
+  /yaml@1.10.2:
+    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+    engines: {node: '>= 6'}
+
   /yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}

+ 0 - 2
public/cone-steadi-10fps-873-rev1/0000.webp

@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>PEV3RS4R6R6D7CNR</RequestId><HostId>EGY1+DkK+S6Nl1npixPslrlV+akn4QUYQxkXqcQjBUaxB6lJOO/K6sz1qzShsozc1wpDDS/oEx8=</HostId></Error>

二進制
public/cone-steadi-10fps-873-rev1/0001.webp


二進制
public/cone-steadi-10fps-873-rev1/0002.webp


二進制
public/cone-steadi-10fps-873-rev1/0003.webp


二進制
public/cone-steadi-10fps-873-rev1/0004.webp


二進制
public/cone-steadi-10fps-873-rev1/0005.webp


二進制
public/cone-steadi-10fps-873-rev1/0006.webp


二進制
public/cone-steadi-10fps-873-rev1/0007.webp


二進制
public/cone-steadi-10fps-873-rev1/0008.webp


二進制
public/cone-steadi-10fps-873-rev1/0009.webp


二進制
public/cone-steadi-10fps-873-rev1/0010.webp


二進制
public/cone-steadi-10fps-873-rev1/0011.webp


二進制
public/cone-steadi-10fps-873-rev1/0012.webp


二進制
public/cone-steadi-10fps-873-rev1/0013.webp


二進制
public/cone-steadi-10fps-873-rev1/0014.webp


二進制
public/cone-steadi-10fps-873-rev1/0015.webp


二進制
public/cone-steadi-10fps-873-rev1/0016.webp


二進制
public/cone-steadi-10fps-873-rev1/0017.webp


二進制
public/cone-steadi-10fps-873-rev1/0018.webp


二進制
public/cone-steadi-10fps-873-rev1/0019.webp


二進制
public/cone-steadi-10fps-873-rev1/0020.webp


二進制
public/cone-steadi-10fps-873-rev1/0021.webp


二進制
public/cone-steadi-10fps-873-rev1/0022.webp


二進制
public/cone-steadi-10fps-873-rev1/0023.webp


二進制
public/cone-steadi-10fps-873-rev1/0024.webp


二進制
public/cone-steadi-10fps-873-rev1/0025.webp


二進制
public/cone-steadi-10fps-873-rev1/0026.webp


二進制
public/cone-steadi-10fps-873-rev1/0027.webp


二進制
public/cone-steadi-10fps-873-rev1/0028.webp


二進制
public/cone-steadi-10fps-873-rev1/0029.webp


二進制
public/cone-steadi-10fps-873-rev1/0030.webp


二進制
public/cone-steadi-10fps-873-rev1/0031.webp


二進制
public/cone-steadi-10fps-873-rev1/0032.webp


二進制
public/cone-steadi-10fps-873-rev1/0033.webp


二進制
public/cone-steadi-10fps-873-rev1/0034.webp


二進制
public/cone-steadi-10fps-873-rev1/0035.webp


二進制
public/cone-steadi-10fps-873-rev1/0036.webp


二進制
public/cone-steadi-10fps-873-rev1/0037.webp


二進制
public/cone-steadi-10fps-873-rev1/0038.webp


二進制
public/cone-steadi-10fps-873-rev1/0039.webp


二進制
public/cone-steadi-10fps-873-rev1/0040.webp


二進制
public/cone-steadi-10fps-873-rev1/0041.webp


二進制
public/cone-steadi-10fps-873-rev1/0042.webp


二進制
public/cone-steadi-10fps-873-rev1/0043.webp


二進制
public/cone-steadi-10fps-873-rev1/0044.webp


二進制
public/cone-steadi-10fps-873-rev1/0045.webp


二進制
public/cone-steadi-10fps-873-rev1/0046.webp


二進制
public/cone-steadi-10fps-873-rev1/0047.webp


二進制
public/cone-steadi-10fps-873-rev1/0048.webp


二進制
public/cone-steadi-10fps-873-rev1/0049.webp


二進制
public/cone-steadi-10fps-873-rev1/0050.webp


二進制
public/cone-steadi-10fps-873-rev1/0051.webp


二進制
public/cone-steadi-10fps-873-rev1/0052.webp


二進制
public/cone-steadi-10fps-873-rev1/0053.webp


二進制
public/cone-steadi-10fps-873-rev1/0054.webp


二進制
public/cone-steadi-10fps-873-rev1/0055.webp


二進制
public/cone-steadi-10fps-873-rev1/0056.webp


二進制
public/cone-steadi-10fps-873-rev1/0057.webp


二進制
public/cone-steadi-10fps-873-rev1/0058.webp


二進制
public/cone-steadi-10fps-873-rev1/0059.webp


二進制
public/cone-steadi-10fps-873-rev1/0060.webp


二進制
public/cone-steadi-10fps-873-rev1/0061.webp


二進制
public/cone-steadi-10fps-873-rev1/0062.webp


二進制
public/cone-steadi-10fps-873-rev1/0063.webp


二進制
public/cone-steadi-10fps-873-rev1/0064.webp


二進制
public/cone-steadi-10fps-873-rev1/0065.webp


二進制
public/cone-steadi-10fps-873-rev1/0066.webp


二進制
public/cone-steadi-10fps-873-rev1/0067.webp


二進制
public/cone-steadi-10fps-873-rev1/0068.webp


二進制
public/cone-steadi-10fps-873-rev1/0069.webp


二進制
public/cone-steadi-10fps-873-rev1/0070.webp


二進制
public/cone-steadi-10fps-873-rev1/0071.webp


二進制
public/cone-steadi-10fps-873-rev1/0072.webp


二進制
public/cone-steadi-10fps-873-rev1/0073.webp


二進制
public/cone-steadi-10fps-873-rev1/0074.webp


二進制
public/cone-steadi-10fps-873-rev1/0075.webp


二進制
public/cone-steadi-10fps-873-rev1/0076.webp


二進制
public/cone-steadi-10fps-873-rev1/0077.webp


二進制
public/cone-steadi-10fps-873-rev1/0078.webp


二進制
public/cone-steadi-10fps-873-rev1/0079.webp


二進制
public/cone-steadi-10fps-873-rev1/0080.webp


二進制
public/cone-steadi-10fps-873-rev1/0081.webp


二進制
public/cone-steadi-10fps-873-rev1/0082.webp


二進制
public/cone-steadi-10fps-873-rev1/0083.webp


二進制
public/cone-steadi-10fps-873-rev1/0084.webp


二進制
public/cone-steadi-10fps-873-rev1/0085.webp


二進制
public/cone-steadi-10fps-873-rev1/0086.webp


二進制
public/cone-steadi-10fps-873-rev1/0087.webp


二進制
public/cone-steadi-10fps-873-rev1/0088.webp


二進制
public/cone-steadi-10fps-873-rev1/0089.webp


二進制
public/cone-steadi-10fps-873-rev1/0090.webp


二進制
public/cone-steadi-10fps-873-rev1/0091.webp


+ 0 - 0
public/cone-steadi-10fps-873-rev1/0092.webp


部分文件因文件數量過多而無法顯示