feat: add news section with admin editor and public article view

- NewsSection with animated grid background, category filters, featured cards
- AdminNews list page with toggle publish/featured, pagination
- AdminNewsCreate with TipTap rich text editor, URL validation
- NewsArticle detail page with DOMPurify sanitization, Telegram back button
- Toggle component with WCAG 44px touch targets, role=switch
- Prose styles for highlight marks and responsive iframes
- i18n translations (en, ru, zh, fa)
This commit is contained in:
Fringg
2026-03-23 10:49:46 +03:00
parent 5b12784ab8
commit 99fc33625e
17 changed files with 7750 additions and 70 deletions

View File

@@ -4473,5 +4473,59 @@
"shareModalActivateViaCabinet": "Or via website:",
"copyMessage": "Copy message",
"shareToastCopied": "Message copied"
},
"news": {
"title": "News & Updates",
"filterAll": "All",
"readMore": "Read more",
"readTime": "min read",
"loadMore": "Load more",
"noNews": "No news yet",
"backToHome": "Back",
"views": "views",
"admin": {
"title": "News Management",
"create": "Create Article",
"edit": "Edit",
"delete": "Delete",
"confirmDelete": "Delete this article?",
"published": "Published",
"draft": "Draft",
"featured": "Featured",
"titleLabel": "Title",
"slugLabel": "URL Slug",
"categoryLabel": "Category",
"categoryColorLabel": "Category Color",
"tagLabel": "Tag",
"excerptLabel": "Short Description",
"contentLabel": "Content",
"imageLabel": "Featured Image",
"readTimeLabel": "Read Time (min)",
"save": "Save",
"saving": "Saving...",
"saveError": "Failed to save article. Please try again.",
"saved": "Article saved",
"deleted": "Article deleted",
"toolbar": {
"bold": "Bold",
"italic": "Italic",
"underline": "Underline",
"strikethrough": "Strikethrough",
"heading1": "Heading 1",
"heading2": "Heading 2",
"heading3": "Heading 3",
"bulletList": "Bullet List",
"orderedList": "Ordered List",
"blockquote": "Blockquote",
"codeBlock": "Code Block",
"alignLeft": "Align Left",
"alignCenter": "Align Center",
"highlight": "Highlight",
"link": "Link",
"image": "Image",
"imageUrlPrompt": "Image URL:",
"linkUrlPrompt": "URL:"
}
}
}
}

View File

@@ -3921,5 +3921,59 @@
"warning": {
"telegram_unresolvable": "نام کاربری تلگرام قابل تأیید نبود. ممکن است گیرنده اعلان هدیه را دریافت نکند."
}
},
"news": {
"title": "اخبار و به‌روزرسانی‌ها",
"filterAll": "همه",
"readMore": "ادامه مطلب",
"readTime": "دقیقه مطالعه",
"loadMore": "بارگذاری بیشتر",
"noNews": "هنوز خبری نیست",
"backToHome": "بازگشت",
"views": "بازدید",
"admin": {
"title": "مدیریت اخبار",
"create": "ایجاد مقاله",
"edit": "ویرایش",
"delete": "حذف",
"confirmDelete": "این مقاله حذف شود؟",
"published": "منتشر شده",
"draft": "پیش‌نویس",
"featured": "ویژه",
"titleLabel": "عنوان",
"slugLabel": "شناسه URL",
"categoryLabel": "دسته‌بندی",
"categoryColorLabel": "رنگ دسته‌بندی",
"tagLabel": "برچسب",
"excerptLabel": "توضیح کوتاه",
"contentLabel": "محتوا",
"imageLabel": "تصویر ویژه",
"readTimeLabel": "زمان مطالعه (دقیقه)",
"save": "ذخیره",
"saving": "در حال ذخیره...",
"saveError": "ذخیره مقاله ناموفق بود. لطفاً دوباره تلاش کنید.",
"saved": "مقاله ذخیره شد",
"deleted": "مقاله حذف شد",
"toolbar": {
"bold": "پررنگ",
"italic": "کج",
"underline": "زیرخط",
"strikethrough": "خط‌خورده",
"heading1": "عنوان ۱",
"heading2": "عنوان ۲",
"heading3": "عنوان ۳",
"bulletList": "لیست نقطه‌ای",
"orderedList": "لیست شماره‌دار",
"blockquote": "نقل قول",
"codeBlock": "بلوک کد",
"alignLeft": "چپ‌چین",
"alignCenter": "وسط‌چین",
"highlight": "برجسته",
"link": "پیوند",
"image": "تصویر",
"imageUrlPrompt": "آدرس تصویر:",
"linkUrlPrompt": "آدرس پیوند:"
}
}
}
}

View File

@@ -5040,5 +5040,59 @@
"shareModalActivateViaCabinet": "Или через сайт:",
"copyMessage": "Скопировать сообщение",
"shareToastCopied": "Сообщение скопировано"
},
"news": {
"title": "Новости и обновления",
"filterAll": "Все",
"readMore": "Читать подробнее",
"readTime": "мин чтения",
"loadMore": "Загрузить ещё",
"noNews": "Пока нет новостей",
"backToHome": "Назад",
"views": "просмотров",
"admin": {
"title": "Управление новостями",
"create": "Создать новость",
"edit": "Редактировать",
"delete": "Удалить",
"confirmDelete": "Удалить эту новость?",
"published": "Опубликовано",
"draft": "Черновик",
"featured": "Избранное",
"titleLabel": "Заголовок",
"slugLabel": "URL-адрес",
"categoryLabel": "Категория",
"categoryColorLabel": "Цвет категории",
"tagLabel": "Тег",
"excerptLabel": "Краткое описание",
"contentLabel": "Содержание",
"imageLabel": "Изображение",
"readTimeLabel": "Время чтения (мин)",
"save": "Сохранить",
"saving": "Сохранение...",
"saveError": "Не удалось сохранить статью. Попробуйте ещё раз.",
"saved": "Новость сохранена",
"deleted": "Новость удалена",
"toolbar": {
"bold": "Жирный",
"italic": "Курсив",
"underline": "Подчёркнутый",
"strikethrough": "Зачёркнутый",
"heading1": "Заголовок 1",
"heading2": "Заголовок 2",
"heading3": "Заголовок 3",
"bulletList": "Маркированный список",
"orderedList": "Нумерованный список",
"blockquote": "Цитата",
"codeBlock": "Блок кода",
"alignLeft": "По левому краю",
"alignCenter": "По центру",
"highlight": "Выделение",
"link": "Ссылка",
"image": "Изображение",
"imageUrlPrompt": "URL изображения:",
"linkUrlPrompt": "URL ссылки:"
}
}
}
}

View File

@@ -3920,5 +3920,59 @@
"warning": {
"telegram_unresolvable": "无法验证此 Telegram 用户名。收件人可能不会收到礼物通知。"
}
},
"news": {
"title": "新闻与更新",
"filterAll": "全部",
"readMore": "阅读更多",
"readTime": "分钟阅读",
"loadMore": "加载更多",
"noNews": "暂无新闻",
"backToHome": "返回",
"views": "浏览量",
"admin": {
"title": "新闻管理",
"create": "创建文章",
"edit": "编辑",
"delete": "删除",
"confirmDelete": "删除这篇文章?",
"published": "已发布",
"draft": "草稿",
"featured": "精选",
"titleLabel": "标题",
"slugLabel": "URL标识",
"categoryLabel": "分类",
"categoryColorLabel": "分类颜色",
"tagLabel": "标签",
"excerptLabel": "简短描述",
"contentLabel": "内容",
"imageLabel": "特色图片",
"readTimeLabel": "阅读时间(分钟)",
"save": "保存",
"saving": "保存中...",
"saveError": "保存文章失败,请重试。",
"saved": "文章已保存",
"deleted": "文章已删除",
"toolbar": {
"bold": "粗体",
"italic": "斜体",
"underline": "下划线",
"strikethrough": "删除线",
"heading1": "标题 1",
"heading2": "标题 2",
"heading3": "标题 3",
"bulletList": "无序列表",
"orderedList": "有序列表",
"blockquote": "引用",
"codeBlock": "代码块",
"alignLeft": "左对齐",
"alignCenter": "居中",
"highlight": "高亮",
"link": "链接",
"image": "图片",
"imageUrlPrompt": "图片URL",
"linkUrlPrompt": "URL"
}
}
}
}