diff --git a/dictionary/en.json b/dictionary/en.json index b8f1d96..0e72cd7 100644 --- a/dictionary/en.json +++ b/dictionary/en.json @@ -3,6 +3,12 @@ "appName": "Fast3DText", "editorName": "Editor" }, + "ErrorPage": { + "title": "Some thing went wrong", + "sorry": "Sorry!", + "tryAgain": "Try again", + "backToHome": "Back to Home" + }, "HomePage": { "heroTitle": "Create Stunning 3D Text Designs", "heroSubtitle": "Generate and customize beautiful 3D text effects for your projects", @@ -46,7 +52,12 @@ "mouseRight": "mouse right for move", "previewFullscreen": "Fullscreen Preview", "downloadSize": "Size", - "downloadBackground": "Download" + "downloadBackground": "Download", + "share": "Share Link", + "shareErrorNotSupportDesc": "Not Support Share Backgound Image At Now", + "shareSuccessDesc": "The link has been generated and is permanently valid", + "shareDialogClose": "Close", + "shareDialogCopyLink": "Copy Link" }, "TextEditor": { "seoTitle": "3D Text Generator - More Options", diff --git a/dictionary/zh.json b/dictionary/zh.json index 4c16a37..3eedfd8 100644 --- a/dictionary/zh.json +++ b/dictionary/zh.json @@ -3,6 +3,12 @@ "appName": "Fast3DText", "editorName": "编辑器" }, + "ErrorPage": { + "title": " 错误页面", + "sorry": "对不起!", + "tryAgain": "再试一下", + "backToHome": "回到主页" + }, "HomePage": { "heroTitle": "创建惊艳的3D文字设计", "heroSubtitle": "为您的项目生成并定制精美的3D文字效果", @@ -46,7 +52,12 @@ "mouseRight": "鼠标右键拖动移动", "previewFullscreen": "全屏预览", "downloadSize": "尺寸", - "downloadBackground": "下载图片" + "downloadBackground": "下载图片", + "share": "分享链接", + "shareErrorNotSupportDesc": "分享时暂不支持图片背景", + "shareSuccessDesc": "链接已生成,永久有效", + "shareDialogClose": "关闭", + "shareDialogCopyLink": "复制链接" }, "TextEditor": { "seoTitle": "3D 文字生成器 - 更多的选项", diff --git a/package.json b/package.json index 5fad434..426b54e 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "@vercel/speed-insights": "^1.2.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "crypto-js": "^4.2.0", "lucide-react": "^0.479.0", + "lz-string": "^1.5.0", "motion": "^12.23.11", "next": "15.2.4", "next-intl": "^4.3.4", @@ -30,6 +32,7 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@tailwindcss/postcss": "^4.1.11", + "@types/crypto-js": "^4.2.2", "@types/node": "^20.19.9", "@types/react": "19.0.12", "@types/react-dom": "19.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53ab326..0e84e62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,9 +23,15 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + crypto-js: + specifier: ^4.2.0 + version: 4.2.0 lucide-react: specifier: ^0.479.0 version: 0.479.0(react@19.0.0) + lz-string: + specifier: ^1.5.0 + version: 1.5.0 motion: specifier: ^12.23.11 version: 12.23.11(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -66,6 +72,9 @@ importers: '@tailwindcss/postcss': specifier: ^4.1.11 version: 4.1.11 + '@types/crypto-js': + specifier: ^4.2.2 + version: 4.2.2 '@types/node': specifier: ^20.19.9 version: 20.19.9 @@ -1214,6 +1223,9 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@types/crypto-js@4.2.2': + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1606,6 +1618,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -2240,6 +2255,10 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -3959,6 +3978,8 @@ snapshots: tslib: 2.8.1 optional: true + '@types/crypto-js@4.2.2': {} + '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} @@ -4342,6 +4363,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-js@4.2.0: {} + csstype@3.1.3: {} damerau-levenshtein@1.0.8: {} @@ -5110,6 +5133,8 @@ snapshots: dependencies: react: 19.0.0 + lz-string@1.5.0: {} + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 diff --git a/src/app/[locale]/editor/[data]/page.tsx b/src/app/[locale]/editor/[data]/page.tsx new file mode 100644 index 0000000..20f0a93 --- /dev/null +++ b/src/app/[locale]/editor/[data]/page.tsx @@ -0,0 +1,23 @@ +import { decodeText } from "@/lib/utils"; +import { OnlyPage } from "../page"; + +export default function Page({ params }: { params: { data: string } }) { + + const data = params['data'] + + let backgroundProp, textProp + + if (data) { + try { + const { bg, text } = JSON.parse(decodeText(data)); + + backgroundProp = bg; + textProp = text; + } catch (error) { + console.error("parse data from url error", error) + } + } + + return () + +} \ No newline at end of file diff --git a/src/app/[locale]/editor/page.tsx b/src/app/[locale]/editor/page.tsx index 20ebddd..6b5ed62 100644 --- a/src/app/[locale]/editor/page.tsx +++ b/src/app/[locale]/editor/page.tsx @@ -1,28 +1,31 @@ +import { BackgroundProp } from "@/components/common/BackgroundSelector"; +import { TextProp } from "@/components/common/TextSetting"; import Footer from "@/components/Footer"; import FullEditor from "@/components/FullEditor"; import Header from "@/components/Header"; import { Locales } from "@/i18n/config"; -import { Flex } from "@radix-ui/themes"; +import { Box, Flex } from "@radix-ui/themes"; import { Metadata } from "next"; -import { getTranslations, setRequestLocale } from "next-intl/server"; -import { use } from "react"; +import { getTranslations } from "next-intl/server"; const host = process.env.NEXT_PUBLIC_HOST; export default function Page() { - return ( - -
- -