fix(storefront): premium UX polish for product, compare, wishlist

- delivery-information, product-actions, product-description,
  product-gallery, product-information, related-products,
  variant-selector: normalize hardcoded hex colors to design tokens
  (--text-primary, --text-secondary, --border-color, --bg-primary/
  --bg-secondary, --primary-color/--primary-hover); stock status and
  discount badge now use semantic --success-color/--warning-color/
  --error-color instead of near-duplicate literal hex
- product-actions: add aria-pressed to wishlist/compare toggle
  buttons; add hover/active/disabled states to action buttons
- product-gallery: add aria-current + aria-label to active thumbnail
  button; add focus-visible ring and hover state on thumbnails and
  toolbar buttons
- variant-selector: add aria-pressed to colour/size option buttons;
  add a visible checkmark glyph on the selected colour swatch so
  selection isn't color-only; add hover states
- product-tabs: add role="tab"/aria-selected to tab buttons
- star-selector: add per-star aria-label (new starsLabel i18n key
  added to en/hy/ru + translations.ts interface)
- question-list: add aria-expanded to the ask-question disclosure
  toggle; swap plain empty-state <p> for app-empty-state; add
  hover/disabled states to pager buttons
- review-list: swap plain empty-state <p> for app-empty-state; add
  hover/disabled states to pager and load-more buttons
- question-card, question-form, review-form: normalize accepted/
  success/error colors to semantic tokens; add focus-visible and
  hover/disabled states to inputs and submit buttons
- compare-table: add scope="col"/scope="row" to table headers; make
  header row and attribute column sticky for easier comparison on
  long tables
- compare-page: add hover/focus states to the remove-from-compare
  chip button

Build verified green via `npm run build`.

Out of scope / skipped:
- src/app/pages/item-detail/* is dead code (not referenced by any
  route or component) - left untouched
- wishlist page and product-details-container were already fully
  composed with shared skeleton/empty-state/button components from
  the RC-Visual-02 pass - no changes needed
- stars.component display-only rating glyphs use a light gray not an
  exact token match - left as-is to avoid an unintended visual shift

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
sdarbinyan
2026-07-23 11:47:57 +04:00
parent 9ea8c98faf
commit ea1a5d9b8a
29 changed files with 271 additions and 81 deletions

View File

@@ -283,6 +283,7 @@ export const en: Translations = {
mediaAria: 'Product media',
ratingStarsAria: 'Rating stars',
selectRatingAria: 'Select rating',
starsLabel: 'stars',
reviewsEmpty: 'No reviews yet.',
questionsEmpty: 'No questions yet.',
askQuestion: 'Ask question',

View File

@@ -283,6 +283,7 @@ export const hy: Translations = {
mediaAria: 'Ապրանքի մեդիա',
ratingStarsAria: 'Աստղային վարկանիշ',
selectRatingAria: 'Ընտրեք գնահատականը',
starsLabel: 'աստղ',
reviewsEmpty: 'Կարծիքներ դեռ չկան։',
questionsEmpty: 'Հարցեր դեռ չկան։',
askQuestion: 'Տալ հարց',

View File

@@ -283,6 +283,7 @@ export const ru: Translations = {
mediaAria: 'Медиа товара',
ratingStarsAria: 'Рейтинг в звездах',
selectRatingAria: 'Выберите оценку',
starsLabel: 'звёзд',
reviewsEmpty: 'Пока нет отзывов.',
questionsEmpty: 'Пока нет вопросов.',
askQuestion: 'Задать вопрос',

View File

@@ -281,6 +281,7 @@ export interface Translations {
mediaAria: string;
ratingStarsAria: string;
selectRatingAria: string;
starsLabel: string;
reviewsEmpty: string;
questionsEmpty: string;
askQuestion: string;