diff --git a/.trae/documents/Implement Qixi Greeting Card Feature.md b/.trae/documents/Implement Qixi Greeting Card Feature.md new file mode 100644 index 0000000..0cf80c6 --- /dev/null +++ b/.trae/documents/Implement Qixi Greeting Card Feature.md @@ -0,0 +1,53 @@ +我将在 `apps/frontend/src/views/GreetingCard/GreetingCard.vue` 中实现七夕情人节贺卡功能。 + +根据您的要求: + +1. **不使用 Tailwind CSS**。 +2. **图片功能为文件上传**(非填写地址)。我将实现本地文件读取(转换为 Base64)来模拟上传效果,确保用户可以直接选择本地图片进行预览和保存。 + +实施计划如下: + +1. **功能概览与用户提示**: + + * 在页面顶部添加美观的提示区域,说明:“下单时可选择绑定贺卡,收到货时将额外赠送一张带有二维码的贺卡,扫码即可查看您的祝福。” + + * 使用自定义 CSS (` diff --git a/apps/frontend/src/views/GreetingCard/components/CardPreview.vue b/apps/frontend/src/views/GreetingCard/components/CardPreview.vue new file mode 100644 index 0000000..6c872f6 --- /dev/null +++ b/apps/frontend/src/views/GreetingCard/components/CardPreview.vue @@ -0,0 +1,288 @@ + + + + + + + + + + {{ $t('greetingCard.cardMessage') }} + + + + + + + + + + {{ $t('greetingCard.cancelButton') }} + + {{ $t('greetingCard.exportButton') }} + + + + + + + + + \ No newline at end of file diff --git a/apps/frontend/src/views/ModernHome/ModernHome.vue b/apps/frontend/src/views/ModernHome/ModernHome.vue index 2a7f939..fe73324 100644 --- a/apps/frontend/src/views/ModernHome/ModernHome.vue +++ b/apps/frontend/src/views/ModernHome/ModernHome.vue @@ -688,6 +688,25 @@ onMounted(() => { .welcome-visual { height: 300px; } + + .stat-icon { + width: 48px; + height: 48px; + font-size: 20px; + } + + .stat-icon :deep(.el-icon) { + width: 24px; + height: 24px; + } + + .stat-value { + font-size: 1.5rem; + } + + .stat-label { + font-size: 0.8rem; + } } /* 统计卡片区 */ @@ -745,6 +764,19 @@ onMounted(() => { font-size: 24px; } +.stat-icon :deep(.el-icon) { + width: 28px; + height: 28px; + display: flex; + align-items: center; + justify-content: center; +} + +.stat-icon :deep(svg) { + width: 100%; + height: 100%; +} + .stat-content { flex: 1; } diff --git a/apps/frontend/src/views/Project/CreateProject.vue b/apps/frontend/src/views/Project/CreateProject.vue index 954299f..2279a5c 100644 --- a/apps/frontend/src/views/Project/CreateProject.vue +++ b/apps/frontend/src/views/Project/CreateProject.vue @@ -387,7 +387,6 @@ const handleSaveProject = (index,item,type='image')=>{ const createProject = async ()=>{ const {id} = await PluginProject.createProject(); // 创建新项目后,将当前路由跳转到 project/项目id/系列 - await router.replace(`/project/${id}/${series.value}`); projectId.value = id; getProjectInfo(id); @@ -406,6 +405,7 @@ const getProjectInfo = async (id)=>{ id: card.id || Date.now() + Math.random().toString(36).substr(2, 9) })); projectInfo.value.tags = [series.value]; + updateProjectInfo(projectInfo.value); } //更新项目信息 const updateProjectInfo = async (newProjectInfo)=>{ @@ -1136,6 +1136,11 @@ const init = ()=>{ const route = useRoute(); projectId.value = route.params.id; series.value = route.params.series; + if(series.value!='D1'&&series.value!='E1'){ + series.value = 'D1'; + router.replace(`/project/${projectId.value}/${series.value}`); + return + } if(projectId.value === 'new'){ createProject(); return @@ -1190,7 +1195,7 @@ onUnmounted(() => {// 禁用轮询 top:8px; left: 50%; transform: translateX(-50%); - z-index: 1000; + z-index: 100; width: 98.6%; background-color: rgba(255, 255, 255, 0.95); backdrop-filter: blur(10px); diff --git a/apps/frontend/src/views/Project/CreateProjectShu/CreateProjectShu.vue b/apps/frontend/src/views/Project/CreateProjectShu/CreateProjectShu.vue index 77ea76c..b201339 100644 --- a/apps/frontend/src/views/Project/CreateProjectShu/CreateProjectShu.vue +++ b/apps/frontend/src/views/Project/CreateProjectShu/CreateProjectShu.vue @@ -1287,7 +1287,7 @@ onUnmounted(() => {// 禁用轮询 justify-content: space-between; padding: 0 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); - z-index: 1000; + z-index: 100; } html.dark .header-nav { diff --git a/apps/frontend/src/views/cardPreview/ConfessionElectronicCard copy.vue b/apps/frontend/src/views/cardPreview/ConfessionElectronicCard copy.vue new file mode 100644 index 0000000..51f4724 --- /dev/null +++ b/apps/frontend/src/views/cardPreview/ConfessionElectronicCard copy.vue @@ -0,0 +1,589 @@ + + + + + + + 💕 + {{ $t('confessionCard.gestureHint') }} + {{ $t('confessionCard.gestureSubtext') }} + + + + + + + + + + + {{ $t('confessionCard.enableCamera') }} + {{ $t('confessionCard.disableCamera') }} + + + + + + + + + + \ No newline at end of file diff --git a/apps/frontend/src/views/cardPreview/ConfessionElectronicCard.vue b/apps/frontend/src/views/cardPreview/ConfessionElectronicCard.vue new file mode 100644 index 0000000..c21bd47 --- /dev/null +++ b/apps/frontend/src/views/cardPreview/ConfessionElectronicCard.vue @@ -0,0 +1,754 @@ + + + + + + + 💕 + {{ $t('confessionCard.gestureHint') }} + {{ $t('confessionCard.gestureSubtext') }} + + + {{ $t('confessionCard.manualTrigger')}} + + + + + + + + + + + {{ $t('confessionCard.enableCamera') }} + + + + + + + + + + \ No newline at end of file diff --git a/apps/frontend/src/views/cardPreview/index.vue b/apps/frontend/src/views/cardPreview/index.vue new file mode 100644 index 0000000..dabc6bb --- /dev/null +++ b/apps/frontend/src/views/cardPreview/index.vue @@ -0,0 +1,986 @@ + + + + + + + + + + + + + + + + + {{ isCameraActive ? 'Disable Camera' : 'Enable Camera Control' }} + + + 👋 Open Palm to scroll + ☝️ Point to aim + 🤏 Pinch to extract + 🖐️ Release to shatter + + + + + + + Loading Neural Interface... + + + + + + + diff --git a/apps/frontend/vite.config.js b/apps/frontend/vite.config.js index 915cfba..809d0cd 100644 --- a/apps/frontend/vite.config.js +++ b/apps/frontend/vite.config.js @@ -66,8 +66,8 @@ export default defineConfig({ // 配置代理解决CORS问题 proxy: { '/api': { - // target: 'https://api.deotaland.ai', - target: 'http://api.deotaland.local', + target: 'https://api.deotaland.ai', + // target: 'http://api.deotaland.local', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } diff --git a/packages/ui/src/components/LoadingCom/index.vue b/packages/ui/src/components/LoadingCom/index.vue index d55eb57..63492b8 100644 --- a/packages/ui/src/components/LoadingCom/index.vue +++ b/packages/ui/src/components/LoadingCom/index.vue @@ -38,7 +38,7 @@ /* background: red; */ backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px); - z-index: 100; + z-index: 300; opacity: 0; visibility: hidden; transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1); diff --git a/packages/utils/src/api/frontend/pay.js b/packages/utils/src/api/frontend/pay.js index d0dce45..02d7a3c 100644 --- a/packages/utils/src/api/frontend/pay.js +++ b/packages/utils/src/api/frontend/pay.js @@ -2,7 +2,7 @@ const pay = { createPaymentintention:{url:'/createPaymentintention',method:'POST'},// 创建支付意图 createCheckoutSession:{url:'/createCheckoutSession',method:'POST'},// 创建会话支付(购物车) createPayorOrder:{url:'/api-core/front/stripe/create-and-checkout',method:'POST'},//根据产品ID创建订单并跳转支付 - getProductList:{url:'/api-core/front/stripe/product/list',method:'POST'},//获取产品列表 + getProductList:{url:'/api-core/front/stripe/product/list',method:'POST',isLoading:true},//获取产品列表 calculateUnitAmount:{url:'/api-core/front/stripe/calculate-unit-amount',method:'POST'},//刷新支付金额 createWechatPay:{url:'/api-core/front/wechat/create',method:'POST'}//微信小程序支付 } diff --git a/packages/utils/src/utils/request.js b/packages/utils/src/utils/request.js index 59973ed..d8d95ce 100644 --- a/packages/utils/src/utils/request.js +++ b/packages/utils/src/utils/request.js @@ -17,7 +17,7 @@ const getEnvBaseURL = () => { // } var baseURL = ''; const hostname = window.location.hostname; - if(hostname=='localhost'||hostname=='192.168.0.146'){ + if(hostname=='localhost'||hostname=='192.168.101.2'){ baseURL = '/api' }else if(hostname.indexOf('deotaland.ai')>-1||hostname.indexOf('deota.cn')>-1){ baseURL = 'https://api.deotaland.ai' @@ -210,7 +210,6 @@ export const request = { requestConfig.data = data; } if(config.isLoading&&window.setElLoading){ - closeMethods = window.setElLoading(config.isqp) } return service(requestConfig); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b54bf0..b74583a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,9 +135,18 @@ importers: '@google/genai': specifier: ^1.27.0 version: 1.27.0 + '@mediapipe/camera_utils': + specifier: ^0.3.1675466862 + version: 0.3.1675466862 + '@mediapipe/hands': + specifier: ^0.4.1675469240 + version: 0.4.1675469240 '@splinetool/runtime': specifier: ^1.12.29 version: 1.12.29 + '@tweenjs/tween.js': + specifier: ^25.0.0 + version: 25.0.0 '@twind/core': specifier: ^1.1.3 version: 1.1.3 @@ -168,6 +177,9 @@ importers: element-plus: specifier: ^2.11.7 version: 2.11.7(vue@3.5.24) + html2canvas: + specifier: ^1.4.1 + version: 1.4.1 install: specifier: ^0.13.0 version: 0.13.0 @@ -189,6 +201,9 @@ importers: pinia-plugin-persistedstate: specifier: ^4.7.1 version: 4.7.1(pinia@3.0.4) + qrcode: + specifier: ^1.5.4 + version: 1.5.4 three: specifier: ^0.180.0 version: 0.180.0 @@ -887,6 +902,14 @@ packages: '@jridgewell/sourcemap-codec': 1.5.5 dev: true + /@mediapipe/camera_utils@0.3.1675466862: + resolution: {integrity: sha512-siuXBoUxWo9WL0MeAxIxvxY04bvbtdNl7uCxoJxiAiRtNnCYrurr7Vl5VYQ94P7Sq0gVq6PxIDhWWeZ/pLnSzw==} + dev: false + + /@mediapipe/hands@0.4.1675469240: + resolution: {integrity: sha512-GxoZvL1mmhJxFxjuyj7vnC++JIuInGznHBin5c7ZSq/RbcnGyfEcJrkM/bMu5K1Mz/2Ko+vEX6/+wewmEHPrHg==} + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1281,6 +1304,10 @@ packages: resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} dev: false + /@tweenjs/tween.js@25.0.0: + resolution: {integrity: sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==} + dev: false + /@twind/core@1.1.3: resolution: {integrity: sha512-/B/aNFerMb2IeyjSJy3SJxqVxhrT77gBDknLMiZqXIRr4vNJqiuhx7KqUSRzDCwUmyGuogkamz+aOLzN6MeSLw==} engines: {node: '>=14.15.0'} @@ -1880,6 +1907,11 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1967,6 +1999,11 @@ packages: engines: {node: '>=6'} dev: true + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: false + /caniuse-lite@1.0.30001759: resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} dev: true @@ -1996,6 +2033,14 @@ packages: clsx: 2.1.1 dev: true + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2103,6 +2148,12 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + dependencies: + utrie: 1.0.2 + dev: false + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2149,6 +2200,11 @@ packages: dependencies: ms: 2.1.3 + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -2167,6 +2223,10 @@ packages: engines: {node: '>=8'} dev: true + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dev: false + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -2707,6 +2767,14 @@ packages: flat-cache: 4.0.1 dev: true + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2833,7 +2901,6 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true /get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} @@ -2986,6 +3053,14 @@ packages: resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} dev: false + /html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} dependencies: @@ -3336,6 +3411,13 @@ packages: quansync: 0.2.11 dev: true + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3628,6 +3710,13 @@ packages: word-wrap: 1.2.5 dev: true + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3635,6 +3724,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -3642,6 +3738,11 @@ packages: p-limit: 3.1.0 dev: true + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + /package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3663,7 +3764,6 @@ packages: /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: true /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} @@ -3761,6 +3861,11 @@ packages: pathe: 2.0.3 dev: true + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + dev: false + /postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -3825,6 +3930,16 @@ packages: engines: {node: '>=6'} dev: true + /qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + /quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} dev: true @@ -3873,7 +3988,10 @@ packages: /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -3982,6 +4100,10 @@ packages: hasBin: true dev: true + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: false @@ -4190,6 +4312,12 @@ packages: source-map-support: 0.5.21 dev: true + /text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + dependencies: + utrie: 1.0.2 + dev: false + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -4473,6 +4601,12 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + /utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + /vite@7.2.2(terser@5.44.1): resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4710,6 +4844,10 @@ packages: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} dev: true + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -4761,6 +4899,15 @@ packages: worker-timers-worker: 9.0.12 dev: false + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -4798,16 +4945,45 @@ packages: engines: {node: '>=12'} dev: true + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: true + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} dev: true + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'}
{{ $t('greetingCard.cardMessage') }}
👋 Open Palm to scroll
☝️ Point to aim
🤏 Pinch to extract
🖐️ Release to shatter