diff --git a/apps/business/src/components/WebsiteMetaTagModal.tsx b/apps/business/src/components/WebsiteMetaTagModal.tsx index c5f108d..fd7b196 100644 --- a/apps/business/src/components/WebsiteMetaTagModal.tsx +++ b/apps/business/src/components/WebsiteMetaTagModal.tsx @@ -6,7 +6,7 @@ import { useT } from '../i18n/useT' import styles from './WebsiteMetaTagModal.module.css' const ANIMATION_MS = 220 -const META_NAME_RE = /^[a-zA-Z0-9_.:-]{1,80}$/ +const META_HTML_RE = /^]*>/i interface WebsiteMetaTagModalProps { open: boolean @@ -65,11 +65,11 @@ export function WebsiteMetaTagModal({ e.preventDefault() const trimmedName = name.trim() const trimmedContent = content.trim() - if (!trimmedName || !META_NAME_RE.test(trimmedName)) { + if (!trimmedName) { setFormError(t('website.badges.meta.nameInvalid')) return } - if (!trimmedContent) { + if (!trimmedContent || !META_HTML_RE.test(trimmedContent)) { setFormError(t('website.badges.meta.contentRequired')) return } diff --git a/apps/business/src/i18n/messages.ts b/apps/business/src/i18n/messages.ts index d5281e2..ff83d0a 100644 --- a/apps/business/src/i18n/messages.ts +++ b/apps/business/src/i18n/messages.ts @@ -2435,7 +2435,7 @@ const en = { 'website.badges.errorLoad': 'Unable to load tags & badges.', 'website.badges.errorSave': 'Unable to save tags & badges.', 'website.badges.meta.title': 'Custom meta tags', - 'website.badges.meta.desc': 'Each row is added to the website head as', + 'website.badges.meta.desc': 'Name is only a label. Value is the full tag, e.g.', 'website.badges.meta.sample': '', 'website.badges.meta.add': 'Add meta tag', 'website.badges.meta.modalTitle': 'Add meta tag', @@ -2445,12 +2445,13 @@ const en = { 'website.badges.meta.nameLabel': 'Name', 'website.badges.meta.valueLabel': 'Value', 'website.badges.meta.remove': 'Remove meta tag', - 'website.badges.meta.empty': 'No custom tags yet. Use + to add a name and value.', - 'website.badges.meta.namePlaceholder': 'name (e.g. google-site-verification)', - 'website.badges.meta.contentPlaceholder': 'value / content', - 'website.badges.meta.nameInvalid': - 'Meta tag names may only use letters, numbers, and _ . : -', - 'website.badges.meta.contentRequired': 'Each meta tag needs both a name and a value.', + 'website.badges.meta.empty': 'No custom tags yet. Use + to paste a full meta tag.', + 'website.badges.meta.namePlaceholder': 'Label (e.g. Google verification)', + 'website.badges.meta.contentPlaceholder': + '', + 'website.badges.meta.nameInvalid': 'Enter a short label for this meta tag.', + 'website.badges.meta.contentRequired': + 'Value must be a full meta tag starting with .', 'website.badges.enamad.title': 'eNamad', 'website.badges.enamad.desc': 'If you have received an eNamad badge for your website, enter its HTML code below to show it on the site.', @@ -5353,7 +5354,7 @@ const fa: Record = { 'website.badges.errorLoad': 'بارگذاری تگ و نشان‌ها ممکن نشد.', 'website.badges.errorSave': 'ذخیره تگ و نشان‌ها ممکن نشد.', 'website.badges.meta.title': 'تگ‌های متا سفارشی', - 'website.badges.meta.desc': 'هر ردیف در هد وب‌سایت قرار می‌گیرد به‌صورت', + 'website.badges.meta.desc': 'نام فقط برچسب است. مقدار کل تگ است، مثلاً', 'website.badges.meta.sample': '', 'website.badges.meta.add': 'افزودن تگ متا', 'website.badges.meta.modalTitle': 'افزودن تگ متا', @@ -5363,12 +5364,13 @@ const fa: Record = { 'website.badges.meta.nameLabel': 'نام', 'website.badges.meta.valueLabel': 'مقدار', 'website.badges.meta.remove': 'حذف تگ متا', - 'website.badges.meta.empty': 'هنوز تگ سفارشی ندارید. با + نام و مقدار اضافه کنید.', - 'website.badges.meta.namePlaceholder': 'نام (مثلاً google-site-verification)', - 'website.badges.meta.contentPlaceholder': 'مقدار / محتوا', - 'website.badges.meta.nameInvalid': - 'نام تگ فقط می‌تواند شامل حروف، اعداد و _ . : - باشد.', - 'website.badges.meta.contentRequired': 'هر تگ متا باید هم نام و هم مقدار داشته باشد.', + 'website.badges.meta.empty': 'هنوز تگ سفارشی ندارید. با + کل تگ متا را بچسبانید.', + 'website.badges.meta.namePlaceholder': 'برچسب (مثلاً تأیید گوگل)', + 'website.badges.meta.contentPlaceholder': + '', + 'website.badges.meta.nameInvalid': 'یک برچسب کوتاه برای این تگ متا وارد کنید.', + 'website.badges.meta.contentRequired': + 'مقدار باید یک تگ متای کامل باشد که با شروع شود.', 'website.badges.enamad.title': 'اینماد', 'website.badges.enamad.desc': 'در صورتی که نشان اینماد برای وبسایت خود دریافت کرده اید، کد HTML آن را در زیر وارد کنید تا در وبسایت نمایش داده شود.', diff --git a/apps/business/src/pages/WebsiteBadgesPage.module.css b/apps/business/src/pages/WebsiteBadgesPage.module.css index 0460757..6039d87 100644 --- a/apps/business/src/pages/WebsiteBadgesPage.module.css +++ b/apps/business/src/pages/WebsiteBadgesPage.module.css @@ -27,14 +27,20 @@ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; line-height: 1.4; - color: var(--text-primary); - background: rgba(15, 23, 42, 0.55); - border: 1px solid rgba(148, 163, 184, 0.28); + color: #0f172a; + background: #f8fafc; + border: 1px solid rgba(148, 163, 184, 0.5); border-radius: 6px; unicode-bidi: isolate; white-space: nowrap; } +:global(html[data-theme='dark']) .metaSample { + color: var(--text-primary); + background: rgba(15, 23, 42, 0.55); + border-color: rgba(148, 163, 184, 0.28); +} + .metaList { list-style: none; margin: 0; @@ -66,15 +72,21 @@ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; font-weight: 600; - color: var(--text-primary); - background: rgba(15, 23, 42, 0.45); - border: 1px solid rgba(148, 163, 184, 0.25); + color: #0f172a; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.5); border-radius: 6px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +:global(html[data-theme='dark']) .metaName { + color: var(--text-primary); + background: rgba(15, 23, 42, 0.45); + border-color: rgba(148, 163, 184, 0.25); +} + .metaValue { min-width: 0; font-size: 12px; diff --git a/apps/business/src/pages/WebsiteBadgesPage.tsx b/apps/business/src/pages/WebsiteBadgesPage.tsx index cf82e66..8e63e3c 100644 --- a/apps/business/src/pages/WebsiteBadgesPage.tsx +++ b/apps/business/src/pages/WebsiteBadgesPage.tsx @@ -23,7 +23,7 @@ import sharedStyles from './ProductSettingsPage.module.css' import settingsStyles from './WebsiteSettingsPage.module.css' import styles from './WebsiteBadgesPage.module.css' -const META_NAME_RE = /^[a-zA-Z0-9_.:-]{1,80}$/ +const META_HTML_RE = /^]*>/i const MAX_META_TAGS = 40 type TrustKind = 'enamad' | 'samandehi' @@ -152,11 +152,11 @@ export function WebsiteBadgesPage() { const name = tag.name.trim() const content = tag.content.trim() if (!name && !content) continue - if (!name || !META_NAME_RE.test(name)) { + if (!name) { setError(t('website.badges.meta.nameInvalid')) return } - if (!content) { + if (!content || !META_HTML_RE.test(content)) { setError(t('website.badges.meta.contentRequired')) return } diff --git a/apps/business/src/services/settingsService.ts b/apps/business/src/services/settingsService.ts index ca1ed57..1b05109 100644 --- a/apps/business/src/services/settingsService.ts +++ b/apps/business/src/services/settingsService.ts @@ -111,6 +111,7 @@ export interface WebsiteSchemaSettings { sameAs: string[] } +/** name = admin label; content = full `` HTML */ export interface WebsiteMetaTag { id: string name: string