feat(product): add reusable Product Experience 2.0

Unify product details modules behind config-driven contracts so teams can
extend UX without changing runtime architecture or bootstrap flow.

Keep backward compatibility with existing product payloads by treating new
media/specification/variant/related structures as optional extensions.

Improve conversion and content discoverability with reusable actions,
typed media rendering, grouped specifications, dynamic variants, and
multi-collection related products.
This commit is contained in:
sdarbinyan
2026-07-10 13:10:35 +04:00
parent 86de2cc45b
commit aed0a47388
37 changed files with 1257 additions and 77 deletions

View File

@@ -267,8 +267,27 @@ export const en: Translations = {
reviewTextPlaceholder: 'Describe your experience',
reviewAnonymous: 'Submit anonymously',
reviewUploadPlaceholder: 'Photo upload is planned for a future sprint.',
reviewRatingRequired: 'Please select a rating.',
reviewTextRequired: 'Please add your review text.',
reviewSuccess: 'Review submitted successfully.',
submitReview: 'Submit review',
submitting: 'Submitting...',
loadMore: 'Load more',
showingOf: 'Showing {{shown}} of {{total}}',
questionsSubmissionFuture: 'Question submission can be enabled later without component changes.',
specificationsGeneral: 'General',
actionsAria: 'Product actions',
buyNow: 'Buy now',
wishlist: 'Wishlist',
compare: 'Compare',
share: 'Share',
notifyMe: 'Notify me',
zoom: 'Zoom',
fullscreen: 'Fullscreen',
pdfDocument: 'Product PDF document',
manualDocument: 'Product manual',
warrantyDocument: 'Warranty document',
openDocument: 'Open document',
specificationsEmpty: 'No specifications provided yet.',
warrantyTitle: 'Warranty and returns',
warrantyItem1: 'Warranty terms are provided by the seller and local law.',

View File

@@ -267,8 +267,27 @@ export const hy: Translations = {
reviewTextPlaceholder: 'Նկարագրեք ձեր փորձը',
reviewAnonymous: 'Ուղարկել անանուն',
reviewUploadPlaceholder: 'Լուսանկար վերբեռնելը նախատեսված է հաջորդ սպրինտում։',
reviewRatingRequired: 'Խնդրում ենք ընտրել գնահատական։',
reviewTextRequired: 'Խնդրում ենք գրել կարծիք։',
reviewSuccess: 'Կարծիքը հաջողությամբ ուղարկվեց։',
submitReview: 'Ուղարկել կարծիքը',
submitting: 'Ուղարկվում է...',
loadMore: 'Բեռնել ավելին',
showingOf: 'Ցուցադրվում է {{shown}} / {{total}}',
questionsSubmissionFuture: 'Հարցի ուղարկումը կարելի է միացնել ավելի ուշ՝ առանց բաղադրիչի փոփոխության։',
specificationsGeneral: 'Ընդհանուր',
actionsAria: 'Ապրանքի գործողություններ',
buyNow: 'Գնել հիմա',
wishlist: 'Նախընտրածներ',
compare: 'Համեմատել',
share: 'Կիսվել',
notifyMe: 'Ծանուցել ինձ',
zoom: 'Մեծացնել',
fullscreen: 'Ամբողջ էկրան',
pdfDocument: 'Ապրանքի PDF փաստաթուղթ',
manualDocument: 'Ապրանքի ուղեցույց',
warrantyDocument: 'Երաշխիքի փաստաթուղթ',
openDocument: 'Բացել փաստաթուղթը',
specificationsEmpty: 'Բնութագրերը դեռ հասանելի չեն։',
warrantyTitle: 'Երաշխիք և վերադարձ',
warrantyItem1: 'Երաշխիքի պայմանները սահմանվում են վաճառողի և տեղական օրենքներով։',

View File

@@ -267,8 +267,27 @@ export const ru: Translations = {
reviewTextPlaceholder: 'Опишите ваш опыт использования',
reviewAnonymous: 'Отправить анонимно',
reviewUploadPlaceholder: 'Загрузка фото запланирована в следующем спринте.',
reviewRatingRequired: 'Выберите оценку.',
reviewTextRequired: 'Добавьте текст отзыва.',
reviewSuccess: 'Отзыв успешно отправлен.',
submitReview: 'Отправить отзыв',
submitting: 'Отправка...',
loadMore: 'Показать еще',
showingOf: 'Показано {{shown}} из {{total}}',
questionsSubmissionFuture: 'Отправку вопросов можно включить позже без изменения компонента.',
specificationsGeneral: 'Общие',
actionsAria: 'Действия с товаром',
buyNow: 'Купить сейчас',
wishlist: 'В избранное',
compare: 'Сравнить',
share: 'Поделиться',
notifyMe: 'Сообщить о наличии',
zoom: 'Увеличить',
fullscreen: 'Полный экран',
pdfDocument: 'PDF документ товара',
manualDocument: 'Инструкция товара',
warrantyDocument: 'Гарантийный документ',
openDocument: 'Открыть документ',
specificationsEmpty: 'Характеристики пока не указаны.',
warrantyTitle: 'Гарантия и возврат',
warrantyItem1: 'Условия гарантии определяются продавцом и местным законодательством.',

View File

@@ -265,8 +265,27 @@ export interface Translations {
reviewTextPlaceholder: string;
reviewAnonymous: string;
reviewUploadPlaceholder: string;
reviewRatingRequired: string;
reviewTextRequired: string;
reviewSuccess: string;
submitReview: string;
submitting: string;
loadMore: string;
showingOf: string;
questionsSubmissionFuture: string;
specificationsGeneral: string;
actionsAria: string;
buyNow: string;
wishlist: string;
compare: string;
share: string;
notifyMe: string;
zoom: string;
fullscreen: string;
pdfDocument: string;
manualDocument: string;
warrantyDocument: string;
openDocument: string;
specificationsEmpty: string;
warrantyTitle: string;
warrantyItem1: string;