chenlei 8 bulan lalu
induk
melakukan
f172cf4184

+ 3 - 0
package.json

@@ -10,6 +10,7 @@
   },
   },
   "dependencies": {
   "dependencies": {
     "amfe-flexible": "^2.2.1",
     "amfe-flexible": "^2.2.1",
+    "element-plus": "^2.9.0",
     "pinia": "^2.2.6",
     "pinia": "^2.2.6",
     "vue": "^3.5.13",
     "vue": "^3.5.13",
     "vue-router": "^4.4.5"
     "vue-router": "^4.4.5"
@@ -18,6 +19,8 @@
     "@vitejs/plugin-vue": "^5.2.1",
     "@vitejs/plugin-vue": "^5.2.1",
     "postcss-pxtorem": "^6.1.0",
     "postcss-pxtorem": "^6.1.0",
     "sass": "^1.82.0",
     "sass": "^1.82.0",
+    "unplugin-auto-import": "^0.18.6",
+    "unplugin-vue-components": "^0.27.5",
     "vite": "^6.0.1",
     "vite": "^6.0.1",
     "vite-plugin-vue-devtools": "^7.6.5"
     "vite-plugin-vue-devtools": "^7.6.5"
   }
   }

+ 489 - 11
pnpm-lock.yaml

@@ -11,6 +11,9 @@ importers:
       amfe-flexible:
       amfe-flexible:
         specifier: ^2.2.1
         specifier: ^2.2.1
         version: 2.2.1
         version: 2.2.1
+      element-plus:
+        specifier: ^2.9.0
+        version: 2.9.0(vue@3.5.13)
       pinia:
       pinia:
         specifier: ^2.2.6
         specifier: ^2.2.6
         version: 2.3.0(vue@3.5.13)
         version: 2.3.0(vue@3.5.13)
@@ -30,6 +33,12 @@ importers:
       sass:
       sass:
         specifier: ^1.82.0
         specifier: ^1.82.0
         version: 1.82.0
         version: 1.82.0
+      unplugin-auto-import:
+        specifier: ^0.18.6
+        version: 0.18.6(@vueuse/core@9.13.0(vue@3.5.13))(rollup@4.28.0)
+      unplugin-vue-components:
+        specifier: ^0.27.5
+        version: 0.27.5(@babel/parser@7.26.3)(rollup@4.28.0)(vue@3.5.13)
       vite:
       vite:
         specifier: ^6.0.1
         specifier: ^6.0.1
         version: 6.0.2(sass@1.82.0)
         version: 6.0.2(sass@1.82.0)
@@ -182,6 +191,15 @@ packages:
     resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
     resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
     engines: {node: '>=6.9.0'}
     engines: {node: '>=6.9.0'}
 
 
+  '@ctrl/tinycolor@3.6.1':
+    resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+    engines: {node: '>=10'}
+
+  '@element-plus/icons-vue@2.3.1':
+    resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
+    peerDependencies:
+      vue: ^3.2.0
+
   '@esbuild/aix-ppc64@0.24.0':
   '@esbuild/aix-ppc64@0.24.0':
     resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==}
     resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
@@ -326,6 +344,15 @@ packages:
     cpu: [x64]
     cpu: [x64]
     os: [win32]
     os: [win32]
 
 
+  '@floating-ui/core@1.6.8':
+    resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+
+  '@floating-ui/dom@1.6.12':
+    resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==}
+
+  '@floating-ui/utils@0.2.8':
+    resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+
   '@jridgewell/gen-mapping@0.3.5':
   '@jridgewell/gen-mapping@0.3.5':
     resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
     resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
     engines: {node: '>=6.0.0'}
     engines: {node: '>=6.0.0'}
@@ -344,6 +371,18 @@ packages:
   '@jridgewell/trace-mapping@0.3.25':
   '@jridgewell/trace-mapping@0.3.25':
     resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
     resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
 
 
+  '@nodelib/fs.scandir@2.1.5':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.stat@2.0.5':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.walk@1.2.8':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
   '@parcel/watcher-android-arm64@2.5.0':
   '@parcel/watcher-android-arm64@2.5.0':
     resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==}
     resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==}
     engines: {node: '>= 10.0.0'}
     engines: {node: '>= 10.0.0'}
@@ -550,9 +589,21 @@ packages:
     resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
     resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
 
 
+  '@sxzz/popperjs-es@2.11.7':
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+
   '@types/estree@1.0.6':
   '@types/estree@1.0.6':
     resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
     resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
 
 
+  '@types/lodash-es@4.17.12':
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+  '@types/lodash@4.17.13':
+    resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
+
+  '@types/web-bluetooth@0.0.16':
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+
   '@vitejs/plugin-vue@5.2.1':
   '@vitejs/plugin-vue@5.2.1':
     resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==}
     resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==}
     engines: {node: ^18.0.0 || >=20.0.0}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -619,12 +670,43 @@ packages:
   '@vue/shared@3.5.13':
   '@vue/shared@3.5.13':
     resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
     resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
 
 
+  '@vueuse/core@9.13.0':
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+
+  '@vueuse/metadata@9.13.0':
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+
+  '@vueuse/shared@9.13.0':
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
+
+  acorn@8.14.0:
+    resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
   amfe-flexible@2.2.1:
   amfe-flexible@2.2.1:
     resolution: {integrity: sha512-L2VfvDzoETBjhRptg5u/IUuzHSuxm22JpSRb404p/TBGeRfwWmmNEbB+TFPIP/sS/+pbM18bCFH9QnMojLuPNw==}
     resolution: {integrity: sha512-L2VfvDzoETBjhRptg5u/IUuzHSuxm22JpSRb404p/TBGeRfwWmmNEbB+TFPIP/sS/+pbM18bCFH9QnMojLuPNw==}
 
 
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  async-validator@4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
   birpc@0.2.19:
   birpc@0.2.19:
     resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==}
     resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==}
 
 
+  brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
   braces@3.0.3:
   braces@3.0.3:
     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     engines: {node: '>=8'}
     engines: {node: '>=8'}
@@ -641,10 +723,17 @@ packages:
   caniuse-lite@1.0.30001686:
   caniuse-lite@1.0.30001686:
     resolution: {integrity: sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==}
     resolution: {integrity: sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==}
 
 
+  chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
   chokidar@4.0.1:
   chokidar@4.0.1:
     resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==}
     resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==}
     engines: {node: '>= 14.16.0'}
     engines: {node: '>= 14.16.0'}
 
 
+  confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
   convert-source-map@2.0.0:
   convert-source-map@2.0.0:
     resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
     resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
 
 
@@ -659,6 +748,9 @@ packages:
   csstype@3.1.3:
   csstype@3.1.3:
     resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
     resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
 
 
+  dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
   debug@4.3.7:
   debug@4.3.7:
     resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
     resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
     engines: {node: '>=6.0'}
     engines: {node: '>=6.0'}
@@ -688,6 +780,11 @@ packages:
   electron-to-chromium@1.5.70:
   electron-to-chromium@1.5.70:
     resolution: {integrity: sha512-P6FPqAWIZrC3sHDAwBitJBs7N7IF58m39XVny7DFseQXK2eiMn7nNQizFf63mWDDUnFvaqsM8FI0+ZZfLkdUGA==}
     resolution: {integrity: sha512-P6FPqAWIZrC3sHDAwBitJBs7N7IF58m39XVny7DFseQXK2eiMn7nNQizFf63mWDDUnFvaqsM8FI0+ZZfLkdUGA==}
 
 
+  element-plus@2.9.0:
+    resolution: {integrity: sha512-ccOFXKsauo2dtokAr4OX7gZsb7TuAoVxA2zGRZo5o2yyDDBLBaZxOoFQPoxITSLcHbBfQuNDGK5Iag5hnyKkZA==}
+    peerDependencies:
+      vue: ^3.2.0
+
   entities@4.5.0:
   entities@4.5.0:
     resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
     resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
     engines: {node: '>=0.12'}
     engines: {node: '>=0.12'}
@@ -704,13 +801,30 @@ packages:
     resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
     resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
 
 
+  escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+  escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
   estree-walker@2.0.2:
   estree-walker@2.0.2:
     resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
     resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
 
 
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
   execa@9.5.1:
   execa@9.5.1:
     resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==}
     resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==}
     engines: {node: ^18.19.0 || >=20.5.0}
     engines: {node: ^18.19.0 || >=20.5.0}
 
 
+  fast-glob@3.3.2:
+    resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+    engines: {node: '>=8.6.0'}
+
+  fastq@1.17.1:
+    resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+
   figures@6.1.0:
   figures@6.1.0:
     resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
     resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
@@ -736,6 +850,10 @@ packages:
     resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
     resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
 
 
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
   globals@11.12.0:
   globals@11.12.0:
     resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
     resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
     engines: {node: '>=4'}
     engines: {node: '>=4'}
@@ -757,6 +875,10 @@ packages:
   immutable@5.0.3:
   immutable@5.0.3:
     resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==}
     resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==}
 
 
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
   is-docker@3.0.0:
   is-docker@3.0.0:
     resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
     resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -805,6 +927,9 @@ packages:
   js-tokens@4.0.0:
   js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
 
 
+  js-tokens@9.0.1:
+    resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
   jsesc@3.0.2:
   jsesc@3.0.2:
     resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
     resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
@@ -821,19 +946,50 @@ packages:
   kolorist@1.8.0:
   kolorist@1.8.0:
     resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
     resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
 
 
+  local-pkg@0.5.1:
+    resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
+    engines: {node: '>=14'}
+
+  lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+  lodash-unified@1.0.3:
+    resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+    peerDependencies:
+      '@types/lodash-es': '*'
+      lodash: '*'
+      lodash-es: '*'
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
   lru-cache@5.1.1:
   lru-cache@5.1.1:
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
 
 
   magic-string@0.30.14:
   magic-string@0.30.14:
     resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==}
     resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==}
 
 
+  memoize-one@6.0.0:
+    resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
   micromatch@4.0.8:
   micromatch@4.0.8:
     resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
     resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
     engines: {node: '>=8.6'}
     engines: {node: '>=8.6'}
 
 
+  minimatch@9.0.5:
+    resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
   mitt@3.0.1:
   mitt@3.0.1:
     resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
     resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
 
 
+  mlly@1.7.3:
+    resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==}
+
   mrmime@2.0.0:
   mrmime@2.0.0:
     resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
     resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
     engines: {node: '>=10'}
     engines: {node: '>=10'}
@@ -857,6 +1013,13 @@ packages:
   node-releases@2.0.18:
   node-releases@2.0.18:
     resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
     resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
 
 
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  normalize-wheel-es@1.2.0:
+    resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+
   npm-run-path@6.0.0:
   npm-run-path@6.0.0:
     resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
     resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
@@ -903,6 +1066,9 @@ packages:
       typescript:
       typescript:
         optional: true
         optional: true
 
 
+  pkg-types@1.2.1:
+    resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
+
   postcss-pxtorem@6.1.0:
   postcss-pxtorem@6.1.0:
     resolution: {integrity: sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==}
     resolution: {integrity: sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==}
     peerDependencies:
     peerDependencies:
@@ -916,10 +1082,21 @@ packages:
     resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
     resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
 
 
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
   readdirp@4.0.2:
   readdirp@4.0.2:
     resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==}
     resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==}
     engines: {node: '>= 14.16.0'}
     engines: {node: '>= 14.16.0'}
 
 
+  reusify@1.0.4:
+    resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
   rfdc@1.4.1:
   rfdc@1.4.1:
     resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
     resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
 
 
@@ -932,11 +1109,17 @@ packages:
     resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
     resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
 
 
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
   sass@1.82.0:
   sass@1.82.0:
     resolution: {integrity: sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q==}
     resolution: {integrity: sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q==}
     engines: {node: '>=14.0.0'}
     engines: {node: '>=14.0.0'}
     hasBin: true
     hasBin: true
 
 
+  scule@1.3.0:
+    resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
   semver@6.3.1:
   semver@6.3.1:
     resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
     resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
     hasBin: true
     hasBin: true
@@ -969,6 +1152,9 @@ packages:
     resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
     resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
 
 
+  strip-literal@2.1.1:
+    resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==}
+
   superjson@2.2.1:
   superjson@2.2.1:
     resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==}
     resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==}
     engines: {node: '>=16'}
     engines: {node: '>=16'}
@@ -984,14 +1170,49 @@ packages:
     resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
     resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
 
 
+  ufo@1.5.4:
+    resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
   unicorn-magic@0.3.0:
   unicorn-magic@0.3.0:
     resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
     resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
 
 
+  unimport@3.14.5:
+    resolution: {integrity: sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==}
+
   universalify@2.0.1:
   universalify@2.0.1:
     resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
     resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
     engines: {node: '>= 10.0.0'}
     engines: {node: '>= 10.0.0'}
 
 
+  unplugin-auto-import@0.18.6:
+    resolution: {integrity: sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@nuxt/kit': ^3.2.2
+      '@vueuse/core': '*'
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+      '@vueuse/core':
+        optional: true
+
+  unplugin-vue-components@0.27.5:
+    resolution: {integrity: sha512-m9j4goBeNwXyNN8oZHHxvIIYiG8FQ9UfmKWeNllpDvhU7btKNNELGPt+o3mckQKuPwrE7e0PvCsx+IWuDSD9Vg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/parser': ^7.15.8
+      '@nuxt/kit': ^3.2.2
+      vue: 2 || 3
+    peerDependenciesMeta:
+      '@babel/parser':
+        optional: true
+      '@nuxt/kit':
+        optional: true
+
+  unplugin@1.16.0:
+    resolution: {integrity: sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==}
+    engines: {node: '>=14.0.0'}
+
   update-browserslist-db@1.1.1:
   update-browserslist-db@1.1.1:
     resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
     resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
     hasBin: true
     hasBin: true
@@ -1088,6 +1309,9 @@ packages:
       typescript:
       typescript:
         optional: true
         optional: true
 
 
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
   which@2.0.2:
   which@2.0.2:
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
     engines: {node: '>= 8'}
     engines: {node: '>= 8'}
@@ -1298,6 +1522,12 @@ snapshots:
       '@babel/helper-string-parser': 7.25.9
       '@babel/helper-string-parser': 7.25.9
       '@babel/helper-validator-identifier': 7.25.9
       '@babel/helper-validator-identifier': 7.25.9
 
 
+  '@ctrl/tinycolor@3.6.1': {}
+
+  '@element-plus/icons-vue@2.3.1(vue@3.5.13)':
+    dependencies:
+      vue: 3.5.13
+
   '@esbuild/aix-ppc64@0.24.0':
   '@esbuild/aix-ppc64@0.24.0':
     optional: true
     optional: true
 
 
@@ -1370,6 +1600,17 @@ snapshots:
   '@esbuild/win32-x64@0.24.0':
   '@esbuild/win32-x64@0.24.0':
     optional: true
     optional: true
 
 
+  '@floating-ui/core@1.6.8':
+    dependencies:
+      '@floating-ui/utils': 0.2.8
+
+  '@floating-ui/dom@1.6.12':
+    dependencies:
+      '@floating-ui/core': 1.6.8
+      '@floating-ui/utils': 0.2.8
+
+  '@floating-ui/utils@0.2.8': {}
+
   '@jridgewell/gen-mapping@0.3.5':
   '@jridgewell/gen-mapping@0.3.5':
     dependencies:
     dependencies:
       '@jridgewell/set-array': 1.2.1
       '@jridgewell/set-array': 1.2.1
@@ -1387,6 +1628,18 @@ snapshots:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.5.0
       '@jridgewell/sourcemap-codec': 1.5.0
 
 
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/fs.stat@2.0.5': {}
+
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.17.1
+
   '@parcel/watcher-android-arm64@2.5.0':
   '@parcel/watcher-android-arm64@2.5.0':
     optional: true
     optional: true
 
 
@@ -1516,8 +1769,18 @@ snapshots:
 
 
   '@sindresorhus/merge-streams@4.0.0': {}
   '@sindresorhus/merge-streams@4.0.0': {}
 
 
+  '@sxzz/popperjs-es@2.11.7': {}
+
   '@types/estree@1.0.6': {}
   '@types/estree@1.0.6': {}
 
 
+  '@types/lodash-es@4.17.12':
+    dependencies:
+      '@types/lodash': 4.17.13
+
+  '@types/lodash@4.17.13': {}
+
+  '@types/web-bluetooth@0.0.16': {}
+
   '@vitejs/plugin-vue@5.2.1(vite@6.0.2(sass@1.82.0))(vue@3.5.13)':
   '@vitejs/plugin-vue@5.2.1(vite@6.0.2(sass@1.82.0))(vue@3.5.13)':
     dependencies:
     dependencies:
       vite: 6.0.2(sass@1.82.0)
       vite: 6.0.2(sass@1.82.0)
@@ -1635,14 +1898,49 @@ snapshots:
 
 
   '@vue/shared@3.5.13': {}
   '@vue/shared@3.5.13': {}
 
 
+  '@vueuse/core@9.13.0(vue@3.5.13)':
+    dependencies:
+      '@types/web-bluetooth': 0.0.16
+      '@vueuse/metadata': 9.13.0
+      '@vueuse/shared': 9.13.0(vue@3.5.13)
+      vue-demi: 0.14.10(vue@3.5.13)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  '@vueuse/metadata@9.13.0': {}
+
+  '@vueuse/shared@9.13.0(vue@3.5.13)':
+    dependencies:
+      vue-demi: 0.14.10(vue@3.5.13)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  acorn@8.14.0: {}
+
   amfe-flexible@2.2.1: {}
   amfe-flexible@2.2.1: {}
 
 
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  async-validator@4.2.5: {}
+
+  balanced-match@1.0.2: {}
+
+  binary-extensions@2.3.0: {}
+
   birpc@0.2.19: {}
   birpc@0.2.19: {}
 
 
+  brace-expansion@2.0.1:
+    dependencies:
+      balanced-match: 1.0.2
+
   braces@3.0.3:
   braces@3.0.3:
     dependencies:
     dependencies:
       fill-range: 7.1.1
       fill-range: 7.1.1
-    optional: true
 
 
   browserslist@4.24.2:
   browserslist@4.24.2:
     dependencies:
     dependencies:
@@ -1657,10 +1955,24 @@ snapshots:
 
 
   caniuse-lite@1.0.30001686: {}
   caniuse-lite@1.0.30001686: {}
 
 
+  chokidar@3.6.0:
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+
   chokidar@4.0.1:
   chokidar@4.0.1:
     dependencies:
     dependencies:
       readdirp: 4.0.2
       readdirp: 4.0.2
 
 
+  confbox@0.1.8: {}
+
   convert-source-map@2.0.0: {}
   convert-source-map@2.0.0: {}
 
 
   copy-anything@3.0.5:
   copy-anything@3.0.5:
@@ -1675,6 +1987,8 @@ snapshots:
 
 
   csstype@3.1.3: {}
   csstype@3.1.3: {}
 
 
+  dayjs@1.11.13: {}
+
   debug@4.3.7:
   debug@4.3.7:
     dependencies:
     dependencies:
       ms: 2.1.3
       ms: 2.1.3
@@ -1693,6 +2007,27 @@ snapshots:
 
 
   electron-to-chromium@1.5.70: {}
   electron-to-chromium@1.5.70: {}
 
 
+  element-plus@2.9.0(vue@3.5.13):
+    dependencies:
+      '@ctrl/tinycolor': 3.6.1
+      '@element-plus/icons-vue': 2.3.1(vue@3.5.13)
+      '@floating-ui/dom': 1.6.12
+      '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
+      '@types/lodash': 4.17.13
+      '@types/lodash-es': 4.17.12
+      '@vueuse/core': 9.13.0(vue@3.5.13)
+      async-validator: 4.2.5
+      dayjs: 1.11.13
+      escape-html: 1.0.3
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+      lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
+      memoize-one: 6.0.0
+      normalize-wheel-es: 1.2.0
+      vue: 3.5.13
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+
   entities@4.5.0: {}
   entities@4.5.0: {}
 
 
   error-stack-parser-es@0.1.5: {}
   error-stack-parser-es@0.1.5: {}
@@ -1726,8 +2061,16 @@ snapshots:
 
 
   escalade@3.2.0: {}
   escalade@3.2.0: {}
 
 
+  escape-html@1.0.3: {}
+
+  escape-string-regexp@5.0.0: {}
+
   estree-walker@2.0.2: {}
   estree-walker@2.0.2: {}
 
 
+  estree-walker@3.0.3:
+    dependencies:
+      '@types/estree': 1.0.6
+
   execa@9.5.1:
   execa@9.5.1:
     dependencies:
     dependencies:
       '@sindresorhus/merge-streams': 4.0.0
       '@sindresorhus/merge-streams': 4.0.0
@@ -1743,6 +2086,18 @@ snapshots:
       strip-final-newline: 4.0.0
       strip-final-newline: 4.0.0
       yoctocolors: 2.1.1
       yoctocolors: 2.1.1
 
 
+  fast-glob@3.3.2:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fastq@1.17.1:
+    dependencies:
+      reusify: 1.0.4
+
   figures@6.1.0:
   figures@6.1.0:
     dependencies:
     dependencies:
       is-unicode-supported: 2.1.0
       is-unicode-supported: 2.1.0
@@ -1750,7 +2105,6 @@ snapshots:
   fill-range@7.1.1:
   fill-range@7.1.1:
     dependencies:
     dependencies:
       to-regex-range: 5.0.1
       to-regex-range: 5.0.1
-    optional: true
 
 
   fs-extra@11.2.0:
   fs-extra@11.2.0:
     dependencies:
     dependencies:
@@ -1768,6 +2122,10 @@ snapshots:
       '@sec-ant/readable-stream': 0.4.1
       '@sec-ant/readable-stream': 0.4.1
       is-stream: 4.0.1
       is-stream: 4.0.1
 
 
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
   globals@11.12.0: {}
   globals@11.12.0: {}
 
 
   graceful-fs@4.2.11: {}
   graceful-fs@4.2.11: {}
@@ -1780,22 +2138,23 @@ snapshots:
 
 
   immutable@5.0.3: {}
   immutable@5.0.3: {}
 
 
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
   is-docker@3.0.0: {}
   is-docker@3.0.0: {}
 
 
-  is-extglob@2.1.1:
-    optional: true
+  is-extglob@2.1.1: {}
 
 
   is-glob@4.0.3:
   is-glob@4.0.3:
     dependencies:
     dependencies:
       is-extglob: 2.1.1
       is-extglob: 2.1.1
-    optional: true
 
 
   is-inside-container@1.0.0:
   is-inside-container@1.0.0:
     dependencies:
     dependencies:
       is-docker: 3.0.0
       is-docker: 3.0.0
 
 
-  is-number@7.0.0:
-    optional: true
+  is-number@7.0.0: {}
 
 
   is-plain-obj@4.1.0: {}
   is-plain-obj@4.1.0: {}
 
 
@@ -1813,6 +2172,8 @@ snapshots:
 
 
   js-tokens@4.0.0: {}
   js-tokens@4.0.0: {}
 
 
+  js-tokens@9.0.1: {}
+
   jsesc@3.0.2: {}
   jsesc@3.0.2: {}
 
 
   json5@2.2.3: {}
   json5@2.2.3: {}
@@ -1825,6 +2186,21 @@ snapshots:
 
 
   kolorist@1.8.0: {}
   kolorist@1.8.0: {}
 
 
+  local-pkg@0.5.1:
+    dependencies:
+      mlly: 1.7.3
+      pkg-types: 1.2.1
+
+  lodash-es@4.17.21: {}
+
+  lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+    dependencies:
+      '@types/lodash-es': 4.17.12
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+
+  lodash@4.17.21: {}
+
   lru-cache@5.1.1:
   lru-cache@5.1.1:
     dependencies:
     dependencies:
       yallist: 3.1.1
       yallist: 3.1.1
@@ -1833,14 +2209,28 @@ snapshots:
     dependencies:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.0
       '@jridgewell/sourcemap-codec': 1.5.0
 
 
+  memoize-one@6.0.0: {}
+
+  merge2@1.4.1: {}
+
   micromatch@4.0.8:
   micromatch@4.0.8:
     dependencies:
     dependencies:
       braces: 3.0.3
       braces: 3.0.3
       picomatch: 2.3.1
       picomatch: 2.3.1
-    optional: true
+
+  minimatch@9.0.5:
+    dependencies:
+      brace-expansion: 2.0.1
 
 
   mitt@3.0.1: {}
   mitt@3.0.1: {}
 
 
+  mlly@1.7.3:
+    dependencies:
+      acorn: 8.14.0
+      pathe: 1.1.2
+      pkg-types: 1.2.1
+      ufo: 1.5.4
+
   mrmime@2.0.0: {}
   mrmime@2.0.0: {}
 
 
   ms@2.1.3: {}
   ms@2.1.3: {}
@@ -1854,6 +2244,10 @@ snapshots:
 
 
   node-releases@2.0.18: {}
   node-releases@2.0.18: {}
 
 
+  normalize-path@3.0.0: {}
+
+  normalize-wheel-es@1.2.0: {}
+
   npm-run-path@6.0.0:
   npm-run-path@6.0.0:
     dependencies:
     dependencies:
       path-key: 4.0.0
       path-key: 4.0.0
@@ -1878,8 +2272,7 @@ snapshots:
 
 
   picocolors@1.1.1: {}
   picocolors@1.1.1: {}
 
 
-  picomatch@2.3.1:
-    optional: true
+  picomatch@2.3.1: {}
 
 
   picomatch@4.0.2: {}
   picomatch@4.0.2: {}
 
 
@@ -1891,6 +2284,12 @@ snapshots:
     transitivePeerDependencies:
     transitivePeerDependencies:
       - '@vue/composition-api'
       - '@vue/composition-api'
 
 
+  pkg-types@1.2.1:
+    dependencies:
+      confbox: 0.1.8
+      mlly: 1.7.3
+      pathe: 1.1.2
+
   postcss-pxtorem@6.1.0(postcss@8.4.49):
   postcss-pxtorem@6.1.0(postcss@8.4.49):
     dependencies:
     dependencies:
       postcss: 8.4.49
       postcss: 8.4.49
@@ -1905,8 +2304,16 @@ snapshots:
     dependencies:
     dependencies:
       parse-ms: 4.0.0
       parse-ms: 4.0.0
 
 
+  queue-microtask@1.2.3: {}
+
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.1
+
   readdirp@4.0.2: {}
   readdirp@4.0.2: {}
 
 
+  reusify@1.0.4: {}
+
   rfdc@1.4.1: {}
   rfdc@1.4.1: {}
 
 
   rollup@4.28.0:
   rollup@4.28.0:
@@ -1935,6 +2342,10 @@ snapshots:
 
 
   run-applescript@7.0.0: {}
   run-applescript@7.0.0: {}
 
 
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
   sass@1.82.0:
   sass@1.82.0:
     dependencies:
     dependencies:
       chokidar: 4.0.1
       chokidar: 4.0.1
@@ -1943,6 +2354,8 @@ snapshots:
     optionalDependencies:
     optionalDependencies:
       '@parcel/watcher': 2.5.0
       '@parcel/watcher': 2.5.0
 
 
+  scule@1.3.0: {}
+
   semver@6.3.1: {}
   semver@6.3.1: {}
 
 
   shebang-command@2.0.0:
   shebang-command@2.0.0:
@@ -1965,6 +2378,10 @@ snapshots:
 
 
   strip-final-newline@4.0.0: {}
   strip-final-newline@4.0.0: {}
 
 
+  strip-literal@2.1.1:
+    dependencies:
+      js-tokens: 9.0.1
+
   superjson@2.2.1:
   superjson@2.2.1:
     dependencies:
     dependencies:
       copy-anything: 3.0.5
       copy-anything: 3.0.5
@@ -1974,14 +2391,73 @@ snapshots:
   to-regex-range@5.0.1:
   to-regex-range@5.0.1:
     dependencies:
     dependencies:
       is-number: 7.0.0
       is-number: 7.0.0
-    optional: true
 
 
   totalist@3.0.1: {}
   totalist@3.0.1: {}
 
 
+  ufo@1.5.4: {}
+
   unicorn-magic@0.3.0: {}
   unicorn-magic@0.3.0: {}
 
 
+  unimport@3.14.5(rollup@4.28.0):
+    dependencies:
+      '@rollup/pluginutils': 5.1.3(rollup@4.28.0)
+      acorn: 8.14.0
+      escape-string-regexp: 5.0.0
+      estree-walker: 3.0.3
+      fast-glob: 3.3.2
+      local-pkg: 0.5.1
+      magic-string: 0.30.14
+      mlly: 1.7.3
+      pathe: 1.1.2
+      picomatch: 4.0.2
+      pkg-types: 1.2.1
+      scule: 1.3.0
+      strip-literal: 2.1.1
+      unplugin: 1.16.0
+    transitivePeerDependencies:
+      - rollup
+
   universalify@2.0.1: {}
   universalify@2.0.1: {}
 
 
+  unplugin-auto-import@0.18.6(@vueuse/core@9.13.0(vue@3.5.13))(rollup@4.28.0):
+    dependencies:
+      '@antfu/utils': 0.7.10
+      '@rollup/pluginutils': 5.1.3(rollup@4.28.0)
+      fast-glob: 3.3.2
+      local-pkg: 0.5.1
+      magic-string: 0.30.14
+      minimatch: 9.0.5
+      unimport: 3.14.5(rollup@4.28.0)
+      unplugin: 1.16.0
+    optionalDependencies:
+      '@vueuse/core': 9.13.0(vue@3.5.13)
+    transitivePeerDependencies:
+      - rollup
+
+  unplugin-vue-components@0.27.5(@babel/parser@7.26.3)(rollup@4.28.0)(vue@3.5.13):
+    dependencies:
+      '@antfu/utils': 0.7.10
+      '@rollup/pluginutils': 5.1.3(rollup@4.28.0)
+      chokidar: 3.6.0
+      debug: 4.3.7
+      fast-glob: 3.3.2
+      local-pkg: 0.5.1
+      magic-string: 0.30.14
+      minimatch: 9.0.5
+      mlly: 1.7.3
+      unplugin: 1.16.0
+      vue: 3.5.13
+    optionalDependencies:
+      '@babel/parser': 7.26.3
+    transitivePeerDependencies:
+      - rollup
+      - supports-color
+
+  unplugin@1.16.0:
+    dependencies:
+      acorn: 8.14.0
+      webpack-virtual-modules: 0.6.2
+
   update-browserslist-db@1.1.1(browserslist@4.24.2):
   update-browserslist-db@1.1.1(browserslist@4.24.2):
     dependencies:
     dependencies:
       browserslist: 4.24.2
       browserslist: 4.24.2
@@ -2065,6 +2541,8 @@ snapshots:
       '@vue/server-renderer': 3.5.13(vue@3.5.13)
       '@vue/server-renderer': 3.5.13(vue@3.5.13)
       '@vue/shared': 3.5.13
       '@vue/shared': 3.5.13
 
 
+  webpack-virtual-modules@0.6.2: {}
+
   which@2.0.2:
   which@2.0.2:
     dependencies:
     dependencies:
       isexe: 2.0.0
       isexe: 2.0.0

File diff ditekan karena terlalu besar
+ 28 - 23
src/assets/data.js


TEMPAT SAMPAH
src/assets/fonts/timesi.ttf


TEMPAT SAMPAH
src/assets/images/button-min.png


+ 9 - 0
src/assets/main.css

@@ -34,6 +34,7 @@ select {
 }
 }
 body {
 body {
   color: #333333;
   color: #333333;
+  text-align: justify;
   font-family: "SourceHanSerifSC-Regular";
   font-family: "SourceHanSerifSC-Regular";
   -webkit-tap-highlight-color: transparent;
   -webkit-tap-highlight-color: transparent;
 }
 }
@@ -71,6 +72,14 @@ iframe {
   font-family: "SourceHanSerifSC-Regular";
   font-family: "SourceHanSerifSC-Regular";
   src: url("./fonts/SOURCEHANSERIFCN-REGULAR.otf");
   src: url("./fonts/SOURCEHANSERIFCN-REGULAR.otf");
 }
 }
+@font-face {
+  font-family: "timesi";
+  src: url("./fonts/timesi.ttf");
+}
+
+.timesi {
+  font-family: "timesi";
+}
 
 
 .limit-line {
 .limit-line {
   display: -webkit-box;
   display: -webkit-box;

+ 6 - 6
src/views/Chapter1/index.scss

@@ -81,13 +81,13 @@
     &-inner {
     &-inner {
       flex: 1;
       flex: 1;
       height: 0;
       height: 0;
-      margin-top: utils.vw-calc(10);
+      margin-top: utils.vw-calc(30);
       padding: 0 utils.vw-calc(60);
       padding: 0 utils.vw-calc(60);
-      width: utils.vw-calc(847);
+      width: utils.vw-calc(1000);
       box-sizing: content-box;
       box-sizing: content-box;
       overflow: auto;
       overflow: auto;
-      font-size: utils.vw-calc(24);
-      line-height: utils.vw-calc(36);
+      font-size: utils.vw-calc(30);
+      line-height: utils.vw-calc(42);
       text-indent: 2em;
       text-indent: 2em;
 
 
       &::-webkit-scrollbar {
       &::-webkit-scrollbar {
@@ -108,7 +108,7 @@
       text-align: center;
       text-align: center;
       text-indent: 0;
       text-indent: 0;
 
 
-      img {
+      .el-image {
         max-width: utils.vw-calc(660);
         max-width: utils.vw-calc(660);
       }
       }
       p {
       p {
@@ -213,7 +213,7 @@
         align-items: center;
         align-items: center;
         margin-bottom: utils.vw-calc(40);
         margin-bottom: utils.vw-calc(40);
 
 
-        img {
+        .el-image {
           max-width: 100%;
           max-width: 100%;
         }
         }
         p {
         p {

+ 5 - 1
src/views/Chapter1/index.vue

@@ -15,7 +15,11 @@
             <p>
             <p>
               {{ detail?.imgs[0].description }}
               {{ detail?.imgs[0].description }}
             </p>
             </p>
-            <img :src="detail?.imgs[0].url" />
+            <ElImage
+              :src="detail?.imgs[0].url"
+              preview-teleported
+              :preview-src-list="[detail?.imgs[0].url]"
+            />
           </div>
           </div>
 
 
           <div v-html="detail?.content" class="chapter1-card__content" />
           <div v-html="detail?.content" class="chapter1-card__content" />

TEMPAT SAMPAH
src/views/Chapter2/images/img2-min.png


+ 2 - 2
src/views/Chapter2/index.scss

@@ -85,7 +85,7 @@
       gap: utils.vw-calc(36);
       gap: utils.vw-calc(36);
       height: 100%;
       height: 100%;
 
 
-      img {
+      .el-image {
         flex-shrink: 0;
         flex-shrink: 0;
         max-width: utils.vw-calc(465);
         max-width: utils.vw-calc(465);
       }
       }
@@ -170,7 +170,7 @@
         justify-content: center;
         justify-content: center;
         gap: utils.vw-calc(23);
         gap: utils.vw-calc(23);
 
 
-        img {
+        .el-image {
           flex-shrink: 0;
           flex-shrink: 0;
           max-width: 100%;
           max-width: 100%;
         }
         }

+ 27 - 4
src/views/Chapter2/index.vue

@@ -11,12 +11,18 @@
         <h2>{{ detail?.name.split(" ")[0] }}</h2>
         <h2>{{ detail?.name.split(" ")[0] }}</h2>
 
 
         <div class="chapter2-card-wrap">
         <div class="chapter2-card-wrap">
-          <img :src="detail?.imgs[0]" />
+          <ElImage
+            :src="detail?.imgs[0]"
+            preview-teleported
+            :preview-src-list="detail?.imgs"
+          />
 
 
           <div class="chapter2-card-inner">
           <div class="chapter2-card-inner">
-            <p>{{ detail?.name }}</p>
+            <p v-if="title">
+              {{ title[0] }} <i>{{ title[1] }}</i>
+            </p>
             <p>{{ detail?.tips }}</p>
             <p>{{ detail?.tips }}</p>
-            <p>{{ detail?.type }}</p>
+            <p v-html="typeStr" />
             <div v-html="detail?.content" />
             <div v-html="detail?.content" />
           </div>
           </div>
         </div>
         </div>
@@ -41,7 +47,7 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref, onMounted } from "vue";
+import { computed, ref, onMounted } from "vue";
 import { useRoute, useRouter } from "vue-router";
 import { useRoute, useRouter } from "vue-router";
 import data from "@/assets/data";
 import data from "@/assets/data";
 import { useMobile } from "@/utils";
 import { useMobile } from "@/utils";
@@ -66,6 +72,23 @@ const toggleDetail = (step) => {
   detail.value = data.chapter2.type[route.params.type].list[idx.value];
   detail.value = data.chapter2.type[route.params.type].list[idx.value];
   router.replace({ name: "chapter2", params: { index: idx.value } });
   router.replace({ name: "chapter2", params: { index: idx.value } });
 };
 };
+
+const title = computed(() => {
+  const name = detail.value?.name || "";
+  const chinese = name.match(/[\u4e00-\u9fa5]+/g)?.join("") || "";
+  const english =
+    name
+      .match(/[a-zA-Z\s]+/g)
+      ?.join("")
+      .trim() || "";
+
+  return [chinese, english];
+});
+
+const typeStr = computed(() => {
+  const name = detail.value?.type || "";
+  return name.replace(/[a-zA-Z]+/g, (match) => `<i>${match}</i>`);
+});
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>

+ 4 - 1
src/views/Chapter3/index.scss

@@ -71,7 +71,10 @@
       border-radius: 50%;
       border-radius: 50%;
       overflow: hidden;
       overflow: hidden;
 
 
-      img {
+      ::v-deep(.el-carousel__container) {
+        height: 100%;
+      }
+      .el-image {
         width: 100%;
         width: 100%;
         height: 100%;
         height: 100%;
         object-fit: cover;
         object-fit: cover;

+ 33 - 6
src/views/Chapter3/index.vue

@@ -10,14 +10,24 @@
       <div class="chapter3-card">
       <div class="chapter3-card">
         <h2>{{ detail?.name.split(" ")[0] }}</h2>
         <h2>{{ detail?.name.split(" ")[0] }}</h2>
 
 
-        <div class="chapter3-card-wrap">
-          <img :src="detail?.imgs[0]" />
-        </div>
+        <ElCarousel class="chapter3-card-wrap">
+          <ElCarouselItem v-for="(img, index) in detail?.imgs" :key="img">
+            <ElImage
+              :src="img"
+              :autoplay="false"
+              :initial-index="index"
+              preview-teleported
+              :preview-src-list="detail?.imgs"
+            />
+          </ElCarouselItem>
+        </ElCarousel>
 
 
         <div class="chapter3-card-inner">
         <div class="chapter3-card-inner">
-          <p>{{ detail?.name }}</p>
+          <p v-if="title">
+            {{ title[0] }} <i>{{ title[1] }}</i>
+          </p>
           <p>{{ detail?.tips }}</p>
           <p>{{ detail?.tips }}</p>
-          <p>{{ detail?.type }}</p>
+          <p v-html="typeStr" />
           <div v-html="detail?.content" />
           <div v-html="detail?.content" />
         </div>
         </div>
       </div>
       </div>
@@ -40,7 +50,7 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref, onMounted } from "vue";
+import { ref, computed, onMounted } from "vue";
 import { useRoute, useRouter } from "vue-router";
 import { useRoute, useRouter } from "vue-router";
 import data from "@/assets/data";
 import data from "@/assets/data";
 import { useMobile } from "@/utils";
 import { useMobile } from "@/utils";
@@ -53,6 +63,23 @@ const router = useRouter();
 const idx = ref(0);
 const idx = ref(0);
 const detail = ref(null);
 const detail = ref(null);
 
 
+const title = computed(() => {
+  const name = detail.value?.name || "";
+  const chinese = name.match(/[\u4e00-\u9fa5]+/g)?.join("") || "";
+  const english =
+    name
+      .match(/[a-zA-Z\s]+/g)
+      ?.join("")
+      .trim() || "";
+
+  return [chinese, english];
+});
+
+const typeStr = computed(() => {
+  const name = detail.value?.type || "";
+  return name.replace(/[a-zA-Z]+/g, (match) => `<i>${match}</i>`);
+});
+
 onMounted(() => {
 onMounted(() => {
   idx.value = Number(route.params.index);
   idx.value = Number(route.params.index);
   detail.value = data.chapter3.list[route.params.type].list[idx.value];
   detail.value = data.chapter3.list[route.params.type].list[idx.value];

+ 28 - 4
src/views/Chapter4/index.vue

@@ -10,11 +10,18 @@
       <div class="chapter4-card">
       <div class="chapter4-card">
         <h2>{{ detail?.name.split(" ")[0] }}</h2>
         <h2>{{ detail?.name.split(" ")[0] }}</h2>
 
 
-        <img class="chapter4-card__img" :src="detail?.imgs[0]" />
+        <ElImage
+          class="chapter4-card__img"
+          :src="detail?.imgs[0]"
+          preview-teleported
+          :preview-src-list="detail?.imgs"
+        />
 
 
         <div class="chapter4-card-inner">
         <div class="chapter4-card-inner">
-          <p>{{ detail?.name }}</p>
-          <p>{{ detail?.type }}</p>
+          <p v-if="title">
+            {{ title[0] }} <i>{{ title[1] }}</i>
+          </p>
+          <p v-html="typeStr" />
           <div v-html="detail?.content" />
           <div v-html="detail?.content" />
         </div>
         </div>
 
 
@@ -36,7 +43,7 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref, onMounted } from "vue";
+import { computed, ref, onMounted } from "vue";
 import { useRoute, useRouter } from "vue-router";
 import { useRoute, useRouter } from "vue-router";
 import data from "@/assets/data";
 import data from "@/assets/data";
 import { useMobile } from "@/utils";
 import { useMobile } from "@/utils";
@@ -49,6 +56,23 @@ const router = useRouter();
 const idx = ref(0);
 const idx = ref(0);
 const detail = ref(null);
 const detail = ref(null);
 
 
+const title = computed(() => {
+  const name = detail.value?.name || "";
+  const chinese = name.match(/[\u4e00-\u9fa5]+/g)?.join("") || "";
+  const english =
+    name
+      .match(/[a-zA-Z\s]+/g)
+      ?.join("")
+      .trim() || "";
+
+  return [chinese, english];
+});
+
+const typeStr = computed(() => {
+  const name = detail.value?.type || "";
+  return name.replace(/[a-zA-Z]+/g, (match) => `<i>${match}</i>`);
+});
+
 onMounted(() => {
 onMounted(() => {
   idx.value = Number(route.params.index);
   idx.value = Number(route.params.index);
   detail.value = data.chapter4.list[route.params.type].list[idx.value];
   detail.value = data.chapter4.list[route.params.type].list[idx.value];

+ 15 - 0
src/views/Home/index.scss

@@ -63,6 +63,16 @@
       margin-top: utils.vh-calc(50);
       margin-top: utils.vh-calc(50);
     }
     }
   }
   }
+  &__btn {
+    position: absolute;
+    left: 50%;
+    bottom: utils.vh-calc(93);
+    width: utils.vh-calc(219);
+    height: utils.vh-calc(91);
+    transform: translateX(-50%);
+    cursor: pointer;
+    background: url("@/assets/images/button-min.png") no-repeat center / contain;
+  }
   &-nav {
   &-nav {
     position: absolute;
     position: absolute;
     left: utils.vw-calc(360);
     left: utils.vw-calc(360);
@@ -173,6 +183,11 @@
         margin-top: utils.vh-calc(38);
         margin-top: utils.vh-calc(38);
       }
       }
     }
     }
+    &__btn {
+      bottom: utils.vh-calc(152);
+      width: utils.vh-calc(219);
+      height: utils.vh-calc(91);
+    }
     &-nav {
     &-nav {
       left: utils.vw-calc(70);
       left: utils.vw-calc(70);
       right: utils.vw-calc(70);
       right: utils.vw-calc(70);

+ 3 - 2
src/views/Home/index.vue

@@ -20,7 +20,8 @@
         </p>
         </p>
       </div>
       </div>
 
 
-      <ul class="home-nav">
+      <div class="home__btn" @click="$router.push({ name: 'index' })" />
+      <!-- <ul class="home-nav">
         <li
         <li
           class="home-nav__item"
           class="home-nav__item"
           @click="$router.push({ name: 'index', query: { index: '1' } })"
           @click="$router.push({ name: 'index', query: { index: '1' } })"
@@ -49,7 +50,7 @@
           <img draggable="false" src="@/assets/images/h4-min.png" />
           <img draggable="false" src="@/assets/images/h4-min.png" />
           <span>涟漪之下</span>
           <span>涟漪之下</span>
         </li>
         </li>
-      </ul>
+      </ul> -->
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>

+ 11 - 11
src/views/Index/components/Chapter1/index.scss

@@ -42,15 +42,15 @@
     &-info {
     &-info {
       display: flex;
       display: flex;
       align-items: center;
       align-items: center;
-      padding: utils.vw-calc(206) utils.vw-calc(185) utils.vw-calc(259);
+      padding: utils.vw-calc(134) utils.vw-calc(185) utils.vw-calc(107);
       gap: utils.vw-calc(82);
       gap: utils.vw-calc(82);
-      font-size: utils.vw-calc(24);
+      font-size: utils.vw-calc(36);
       text-indent: 2em;
       text-indent: 2em;
-      line-height: utils.vw-calc(36);
+      line-height: utils.vw-calc(46);
 
 
       img {
       img {
-        width: utils.vw-calc(487);
-        height: utils.vw-calc(487);
+        width: utils.vw-calc(701);
+        height: utils.vw-calc(701);
       }
       }
     }
     }
     &-nav {
     &-nav {
@@ -94,14 +94,14 @@
       height: utils.vw-calc(836);
       height: utils.vw-calc(836);
 
 
       &-info {
       &-info {
-        padding: utils.vw-calc(129) utils.vw-calc(38) utils.vw-calc(115);
-        gap: utils.vw-calc(4);
-        font-size: utils.vw-calc(18);
-        line-height: utils.vw-calc(28);
+        padding: utils.vw-calc(54) utils.vw-calc(50) utils.vw-calc(40);
+        gap: utils.vw-calc(10);
+        font-size: utils.vw-calc(22);
+        line-height: utils.vw-calc(30);
 
 
         img {
         img {
-          width: utils.vw-calc(194);
-          height: utils.vw-calc(194);
+          width: utils.vw-calc(344);
+          height: utils.vw-calc(344);
         }
         }
       }
       }
       &-nav {
       &-nav {

+ 1 - 1
src/views/Index/components/Chapter1/index.vue

@@ -10,7 +10,7 @@
       <div class="chapter1-card">
       <div class="chapter1-card">
         <div class="chapter1-card-info">
         <div class="chapter1-card-info">
           <img draggable="false" src="@/assets/images/chapter-img-min.png" />
           <img draggable="false" src="@/assets/images/chapter-img-min.png" />
-          <p>{{ data.chapter1.description }}</p>
+          <p v-html="data.chapter1.description" />
         </div>
         </div>
 
 
         <div class="chapter1-card-nav">
         <div class="chapter1-card-nav">

+ 1 - 1
src/views/Index/components/Chapter3/index.vue

@@ -32,7 +32,7 @@
             class="chapter3-item__cover"
             class="chapter3-item__cover"
             @click="goToDetail(index)"
             @click="goToDetail(index)"
           >
           >
-            <p>{{ item.description }}</p>
+            <p v-html="item.description" />
           </div>
           </div>
         </li>
         </li>
       </ul>
       </ul>

+ 1 - 0
src/views/Index/components/Chapter4/index.scss

@@ -94,6 +94,7 @@
     &-content {
     &-content {
       margin: utils.vw-calc(83) 0 utils.vw-calc(117);
       margin: utils.vw-calc(83) 0 utils.vw-calc(117);
       line-height: utils.vw-calc(36);
       line-height: utils.vw-calc(36);
+      text-indent: 2em;
     }
     }
     &__img {
     &__img {
       width: 100%;
       width: 100%;

+ 1 - 3
src/views/Index/components/Chapter4/index.vue

@@ -26,9 +26,7 @@
           </div>
           </div>
           <div :class="`i${currentTab} chapter4-card-nav__item-bg`" />
           <div :class="`i${currentTab} chapter4-card-nav__item-bg`" />
         </div>
         </div>
-        <div class="chapter4-card-content">
-          {{ LIST[currentTab].content }}
-        </div>
+        <div class="chapter4-card-content" v-html="LIST[currentTab].content" />
         <img class="chapter4-card__img" :src="LIST[currentTab].img" />
         <img class="chapter4-card__img" :src="LIST[currentTab].img" />
         <img class="chapter4-card__btn" src="./images/btn.png" />
         <img class="chapter4-card__btn" src="./images/btn.png" />
       </div>
       </div>

+ 1 - 0
src/views/Index/components/Epilogue/index.scss

@@ -32,6 +32,7 @@
       margin-top: utils.vw-calc(20);
       margin-top: utils.vw-calc(20);
       line-height: utils.vw-calc(36);
       line-height: utils.vw-calc(36);
       font-size: utils.vw-calc(24);
       font-size: utils.vw-calc(24);
+      text-indent: 2em;
 
 
       ::v-deep(p) {
       ::v-deep(p) {
         &:not(:first-child) {
         &:not(:first-child) {

+ 2 - 2
src/views/Index/components/Preface/index.scss

@@ -65,7 +65,7 @@
       margin-top: utils.vw-calc(16);
       margin-top: utils.vw-calc(16);
     }
     }
     > div:not(:first-child) {
     > div:not(:first-child) {
-      margin-top: utils.vw-calc(50);
+      margin-top: utils.vw-calc(16);
     }
     }
   }
   }
 }
 }
@@ -116,7 +116,7 @@
         margin-top: utils.vw-calc(10);
         margin-top: utils.vw-calc(10);
       }
       }
       > div:not(:first-child) {
       > div:not(:first-child) {
-        margin-top: utils.vw-calc(40);
+        margin-top: utils.vw-calc(10);
       }
       }
     }
     }
   }
   }

+ 90 - 39
src/views/Index/index.vue

@@ -1,18 +1,25 @@
 <template>
 <template>
   <div class="index">
   <div class="index">
-    <Preface :style="{ height: heightList[0] + 'px' }" />
-    <Chapter1 :style="{ height: heightList[1] + 'px' }" />
-    <Chapter2 :style="{ height: heightList[2] + 'px' }" />
-    <Chapter3 :style="{ height: heightList[3] + 'px' }" />
-    <Chapter4 :style="{ height: heightList[4] + 'px' }" />
-    <Epilogue :style="{ height: heightList[5] + 'px' }" />
+    <Preface />
+    <Chapter1 />
+    <Chapter2 />
+    <Chapter3 />
+    <Chapter4 />
+    <Epilogue />
+
+    <div class="index-footer">
+      <span class="index__tips"
+        >植物图片来自江苏省泗洪洪泽湖湿地国家级自然保护区管理处</span
+      >
+      <img class="index__logo" src="@/assets/images/logo2-min.png" />
+    </div>
   </div>
   </div>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref, onMounted, nextTick } from "vue";
-import { useRoute } from "vue-router";
-import { useMobile } from "@/utils";
+// import { ref, onMounted, nextTick } from "vue";
+// import { useRoute } from "vue-router";
+// import { useMobile } from "@/utils";
 import Preface from "./components/Preface/index.vue";
 import Preface from "./components/Preface/index.vue";
 import Chapter1 from "./components/Chapter1/index.vue";
 import Chapter1 from "./components/Chapter1/index.vue";
 import Chapter2 from "./components/Chapter2/index.vue";
 import Chapter2 from "./components/Chapter2/index.vue";
@@ -20,42 +27,86 @@ import Chapter3 from "./components/Chapter3/index.vue";
 import Chapter4 from "./components/Chapter4/index.vue";
 import Chapter4 from "./components/Chapter4/index.vue";
 import Epilogue from "./components/Epilogue/index.vue";
 import Epilogue from "./components/Epilogue/index.vue";
 
 
-const route = useRoute();
-const { isMobile } = useMobile();
+// const route = useRoute();
+// const { isMobile } = useMobile();
 
 
-const BG_HEIGHT = [2743, 3082, 4937, 3417, 2218, 1409];
-const MOBILE_BG_HEIGHT = [2118, 1467, 2550, 1868, 1303, 663];
-const heightList = ref([]);
+// const BG_HEIGHT = [2743, 3082, 4937, 3417, 2218, 1409];
+// const MOBILE_BG_HEIGHT = [2118, 1467, 2550, 1868, 1303, 663];
+// const heightList = ref([]);
 
 
-onMounted(() => {
-  const height = [];
+// onMounted(() => {
+//   const height = [];
 
 
-  (isMobile.value ? MOBILE_BG_HEIGHT : BG_HEIGHT).forEach((h) =>
-    height.push(
-      (Math.round((h / (isMobile.value ? 750 : 1920)) * 1000) / 1000) *
-        document.documentElement.clientWidth
-    )
-  );
+//   (isMobile.value ? MOBILE_BG_HEIGHT : BG_HEIGHT).forEach((h) =>
+//     height.push(
+//       (Math.round((h / (isMobile.value ? 750 : 1920)) * 1000) / 1000) *
+//         document.documentElement.clientWidth
+//     )
+//   );
 
 
-  heightList.value = height;
+//   heightList.value = height;
 
 
-  if (route.query.index) {
-    let top = 0;
-    let i = Number(route.query.index);
+//   if (route.query.index) {
+//     let top = 0;
+//     let i = Number(route.query.index);
 
 
-    while (i > 0) {
-      i--;
-      top += height[i];
-    }
+//     while (i > 0) {
+//       i--;
+//       top += height[i];
+//     }
 
 
-    nextTick(() => {
-      window.scrollTo({
-        top,
-        behavior: "smooth",
-      });
-    });
-  }
-});
+//     nextTick(() => {
+//       window.scrollTo({
+//         top,
+//         behavior: "smooth",
+//       });
+//     });
+//   }
+// });
 </script>
 </script>
 
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+@use "@/assets/utils.scss";
+
+.index {
+  position: relative;
+
+  &-footer {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    gap: utils.vw-calc(15);
+    position: absolute;
+    left: 50%;
+    bottom: utils.vw-calc(69);
+    transform: translateX(-50%);
+  }
+  &__logo {
+    width: utils.vw-calc(193);
+    height: utils.vw-calc(42);
+  }
+  &__tips {
+    white-space: nowrap;
+    letter-spacing: utils.vw-calc(2);
+    font-size: utils.vw-calc(24);
+    font-family: "SourceHanSerifSC-Bold";
+  }
+}
+
+@media screen and (max-width: 768px) {
+  .index {
+    &-footer {
+      gap: utils.vw-calc(15);
+      bottom: utils.vw-calc(26);
+    }
+    &__logo {
+      width: utils.vw-calc(113);
+      height: utils.vw-calc(21);
+    }
+    &__tips {
+      font-size: utils.vw-calc(14);
+    }
+  }
+}
+</style>

+ 12 - 1
vite.config.js

@@ -3,11 +3,22 @@ import { fileURLToPath, URL } from "node:url";
 import { defineConfig } from "vite";
 import { defineConfig } from "vite";
 import vue from "@vitejs/plugin-vue";
 import vue from "@vitejs/plugin-vue";
 // import postCssPxToRem from "postcss-pxtorem";
 // import postCssPxToRem from "postcss-pxtorem";
+import AutoImport from "unplugin-auto-import/vite";
+import Components from "unplugin-vue-components/vite";
+import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
 
 
 // https://vite.dev/config/
 // https://vite.dev/config/
 export default defineConfig({
 export default defineConfig({
   base: "./",
   base: "./",
-  plugins: [vue()],
+  plugins: [
+    vue(),
+    AutoImport({
+      resolvers: [ElementPlusResolver()],
+    }),
+    Components({
+      resolvers: [ElementPlusResolver()],
+    }),
+  ],
   server: {
   server: {
     host: "0.0.0.0",
     host: "0.0.0.0",
   },
   },