# Known Issues (fix after sprint wrap-up)

Running list of bugs spotted during manual verification, deferred until the
current sprint's feature work is done. Add to this list as more are found;
don't fix inline unless asked.

## Open

1. **Homepage hero-to-categories dead space gap on the storefront home
   page.** Traces to bootstrap mock config (widget/section padding values
   in the dev bootstrap fixture), not a code defect in
   `dynamic-page-layout.component.ts` or the widget components - not fixed
   this session, needs config-side investigation if it reproduces with
   real tenant data rather than mock config.

2. **~179 untranslated raw i18n keys across the entire admin backoffice CRUD
   UI (products/categories/orders/transactions/users/monitoring/analytics).**
   `translations.ts`/`en.ts`/`ru.ts`/`hy.ts` have no `adminProducts.*`,
   `adminCategories.*`, `adminOrders.*`, `adminTransactions.*`,
   `adminUsers.*`, `adminMonitoring.*`, or `adminAnalytics.*` sections at all
   (confirmed: zero matches for any of these prefixes in any of the 4 i18n
   files). `TranslateService.t()` falls through to returning the raw dotted
   key string when a key isn't found (see `translate.service.ts`), so every
   templated string in these features (buttons, table headers, filters,
   badges, empty/placeholder text) renders literally as e.g.
   `adminProducts.create` instead of real copy - same root cause as the
   already-fixed dashboard Quick Actions bug below, just at the scale of
   almost the entire admin backoffice built across Sprints 20-27.
   - Counted by grepping all `'adminXxx.yyy'` translate-pipe usages under
     `src/app/features/admin/**`: `adminProducts` 72, `adminCategories` 23,
     `adminOrders` 24, `adminUsers` 21, `adminMonitoring` 13,
     `adminAnalytics` 12, `adminTransactions` 13 (≈178 distinct keys, ×3
     locales ≈ 534 strings to author).
   - Likely why it was never caught: every affected Sprint (20-27) explicitly
     noted live-browser click-through was blocked on the guarded admin route
     and verification was tsc/build/arch:check only - none of those catch
     missing i18n keys (pipe arguments are plain strings, not type-checked).
   - Found: 2026-07-15, during Sprint 28 manual audit (reading templates +
     grepping i18n files, not live browser).
   - **Deferred to Sprint 29** ("translation validation" is explicit Sprint 29
     scope per `SPRINT-PLAN.md` (removed, see git history)) rather than fixed inline during Sprint
     28 polish - authoring ~534 correct strings across 3 languages is a large,
     separate, mechanical pass of its own and shouldn't be rushed inside a
     polish sprint. Sprint 28 only adds the handful of new keys it introduces
     itself (empty-state copy for the skeleton/empty-state consistency fix),
     it does not touch the ~178 pre-existing gap.

3. **Theme Mode selector has no runtime effect.** `theme-section`'s light/dark/
   system dropdown saves correctly and `theme-engine.service.ts` sets a
   `data-theme-mode` attribute on `<html>`, but no CSS anywhere in the app
   reads that attribute — picking Dark or System changes nothing visually
   today. Theme palette colors are unaffected (they're real CSS custom
   properties, genuinely live). Fixing this means implementing actual
   dark-mode CSS (a dark palette + `[data-theme-mode]`/`prefers-color-scheme`
   strategy + a `matchMedia` listener for "system", since that can change
   without a reload) — a real feature project, not a wiring fix.
   - Found: 2026-07-17, project-editor bug-hunt audit (`docs/EDITOR.md`).

4. **`dynamic-renderer/` pipeline exists but is never wired up.**
   `src/app/dynamic-renderer/{page-renderer,section-renderer,section-engine,
   page-resolver,widget-host}` has services and models but zero components
   or templates (every directory has only a `.gitkeep`). The storefront
   homepage renders through a separate, older path that doesn't consume it.
   Two editor fields feed this dead pipeline with no visible effect:
   `layout.type` (Theme section, "Site Layout") and the homepage section's
   own `type` field (`homepage-section.component.ts`'s
   `updateSection(id, 'type', ...)` has no UI calling it, because of this).
   Needs a decision: finish wiring it in (if it's WIP for a planned
   replacement) or delete it as abandoned scaffolding.
   - Found: 2026-07-17, project-editor bug-hunt audit.

5. **`HeaderConfig.showProfile` toggle has no corresponding UI.** The header
   editor's "Profile" toggle updates a real config field, but
   `header.component.html` never references `showProfile` — there's no
   profile/account menu in the storefront header to show or hide. Needs an
   auth-system check first (does one exist yet?) before building the menu.
   - Found: 2026-07-17, project-editor bug-hunt audit.

6. **Payment modal / bank-payment iframe on Cart still custom, not `app-dialog`.**
   Correction (2026-07-24, RC A11Y-01): the "already has focus-trap" assumption
   below was wrong — it had none. RC A11Y-01 ported `app-dialog`'s confirmed-
   correct focus-trap/Escape/return-focus pattern directly onto it
   (`ACCESSIBILITY_REPORT.md` (removed, see git history)), so the accessibility gap is closed. It's
   still a separate custom component, not the shared `app-dialog` itself —
   migrating it to the actual primitive remains a composition change,
   deliberately left out of every polish pass so far.
   - Found: 2026-07-23, RC-Premium-01 (`STORE_FRONT_UX_REVIEW.md` (removed, see git history)).

7. **Cart's `clearCart()` uses native `confirm()`, no styled confirm dialog.**
   No existing storefront pattern for a confirm-remove dialog to follow yet —
   introducing the first one is an architecture decision, not polish.
   - Found: 2026-07-23, RC-Premium-01.

8. **`stars.component` rating glyph color and a few legacy hex literals in
   `pages/category`/`pages/search` have no exact design-token match.**
   Left as literals to avoid an unintended visual shift; needs a deliberate
   token-extension decision before normalizing.
   - Found: 2026-07-23, RC-Premium-01.

9. **Genuine brand-color contrast failures (WCAG AA).** `--border-color`
   fails 3:1 UI-component contrast in every theme (1.24-1.42:1 measured);
   `--success/--warning/--error/--info-color` fail 4.5:1 when used as plain
   text-on-white in a handful of places. Real palette colors, not a token
   bug — fixing means visibly changing the brand, needs theme-owner sign-off.
   - Found: 2026-07-24, RC A11Y-01 (`ACCESSIBILITY_REPORT.md` (removed, see git history)).

10. **Footer "Contacts" link has no static-page content in mock data.**
    Unlike the "About" link (which was a route-name mismatch, fixed), no
    content exists for Contacts at all — needs a content decision, not a
    code fix.
    - Found: 2026-07-24, Release Candidate walkthrough (`RELEASE_REPORT.md` (removed, see git history)).

11. **Builder's static-page body editor is hidden and mislabeled.** The
    actual WYSIWYG content editor isn't on the "Content" tab (title/image
    only) — it's inside a collapsed `<details>` under "Advanced", labeled
    "Source HTML (advanced)" though it's the only way to edit page content.
    Works correctly once found; relocating/relabeling is a navigation
    decision, not a bug fix.
    - Found: 2026-07-24, Release Candidate walkthrough.

12. **`primeng`/`primeicons` still in `package.json` after their only
    consumer was deleted.** `npm uninstall` fails (`ETARGET`) on a
    pre-existing, unrelated broken `barry-cache` devDependency resolution —
    fix that first, then drop the now-fully-unused dependency (likely closes
    most of the remaining bundle-budget overage in one move).
    - Found: 2026-07-24, RC PERF-01 (`PERFORMANCE_REPORT.md` (removed, see git history)).

13. **CRITICAL — `pages/category/*`, `pages/search/*`, `pages/item-detail/*`,
    `pages/info/**`, `pages/legal/**` (40+ files) are entirely unrouted dead
    code, not live pages.** Verified directly against `src/app/app.routes.ts`:
    `category/:id` and `category/:id/items` `redirectTo: 'catalog/:id'`
    (served by `CatalogContainerComponent`); `search` also routes to
    `CatalogContainerComponent`; `product/:id` routes to
    `ProductDetailsContainerComponent`, not `pages/item-detail`;
    `cmsContentRoutes` (meant to route `pages/info/**`/`pages/legal/**`) is a
    literal empty array (`app.routes.ts:292`) behind a
    `// TODO(CMS): Resolve informational/legal pages from backend content
    configuration here` comment — About/Contacts/FAQ/Delivery/Guarantee/
    Company-Details/Payment-Terms/Return-Policy/Public-Offer/Privacy-Policy
    are all actually served by the catch-all `:staticPath` route resolving
    `bootstrap.staticPages` (`pages/static-page/static-page.component.ts`),
    confirmed independently by `docs/FRONTEND.md`'s own routing section
    ("Static/CMS pages resolve dynamically... no hardcoded page list").
    **This means several "fixes" earlier in this document and in
    since-deleted audit reports (see git history) were applied to dead code
    with zero production effect**
    — see the correction note on Fixed item 7 below. This was missed by
    three separate passes this cycle (RC-Premium-01, RC STORE-01, and the
    dead-code cleanup sprint, which manually re-verified against
    `app.routes.ts` and still concluded these files were live — an error in
    that verification, not a tooling blind spot this time) before being
    caught during the documentation-consolidation pass. Needs a decision:
    wire `cmsContentRoutes` back up (restoring 10 hardcoded per-locale pages
    that duplicate what the CMS static-page renderer already does), or
    delete all 40+ files as genuinely dead now that the duplication is
    confirmed intentional-by-omission rather than accidental.
    - Found: 2026-07-25, Documentation Cleanup pass.

14. **No `canDeactivate` guard on `admin/products/:id/edit`.** Categories
    protect against navigating away with unsaved changes
    (`adminCategoryDirtyGuard`, `app.routes.ts:121,131`); products do not,
    despite `AdminProductsFacade` having its own dirty-tracking draft logic.
    Inconsistent, low-effort fix (mirror the categories guard) but not
    applied here — this pass is documentation-only.
    - Found: 2026-07-19 (`PROJECT-STATE.md` (removed, see git history)), re-verified
      2026-07-25 against current `app.routes.ts` — still true.

## Fixed

1. **Full-project UX/UI + motion pass across storefront, admin dashboard,
   admin CRUD, and project-editor.**
   User asked (2026-07-16) for a full UX/UI audit across admin, dashboard,
   and storefront, sequenced: storefront -> admin dashboard -> admin CRUD ->
   project-editor. All 4 phases completed:
   - Fixed: `project-editor-save-bar` buttons were plain unstyled `<button>`s
     (`project-editor-save-bar.component.html/.scss`) - now use the shared
     `app-button` primitive.
   - Fixed: `.platform-nav-group` (`header.component.html/.scss`) applied
     `platform-nav-btn-left` to every nav button regardless of position,
     causing double borders and wrong end-radius; replaced with
     `:first-child`/`:last-child`/`:not(:first-child)` structural selectors,
     dropped the dead `-middle`/`-right` classes.
   - Polished: storefront widgets used on every page -
     `hero-widget.component.ts`, `categories-widget.component.ts`,
     `product-carousel-widget.component.ts`,
     `footer-navigation-widget.component.ts` - added design tokens, hover/
     focus states, 44px touch targets, entrance motion, all gated behind
     `prefers-reduced-motion`.
   - Polished: `admin-dashboard-card.component.scss` and
     `admin-dashboard-quick-actions.component.scss` - hover lift, entrance
     animation, reduced-motion guard.
   - Audited: admin backoffice CRUD (products/categories/orders/users/
     transactions/monitoring/analytics) - already consistently built on the
     shared `app-button`/`app-table`/`app-badge`/`app-empty-state`/
     `app-pagination` primitives from earlier sprints; grepped all 7 areas
     for raw unstyled `<button>`s (the save-bar bug pattern) and found only
     one: the gallery-image remove badge in
     `admin-product-form.component.scss` (`.gallery-item button`) had no
     hover/focus state and a 20x20px hit area below the 44px touch-target
     minimum - fixed with hover/focus-visible states and an invisible
     `::before` inset to expand the hit area without changing the visual
     badge size.
   - Fixed: `section.shared.scss` (used by all 11 project-editor sections)
     had a bare `button`/`button.secondary` style with zero hover, focus, or
     transition - added hover/active/focus-visible/disabled states plus
     `prefers-reduced-motion` guard, applied uniformly across every section.
   - Added: `project-editor-page.component.scss` `.project-editor-stack > *`
     now fades/slides in (220ms) whenever `@switch` swaps the active
     section component; `.project-editor-section-actions button` (reset
     section) got the same hover/focus treatment as the rest of the shared
     button styles.
   - Verified: `tsc --noEmit` clean after every batch of edits; live-checked
     in browser at each phase (homepage nav-group render, save-bar render,
     dashboard cards, project-editor section switch + reset button).
   - One dev-server crash occurred mid-session (unrelated pre-existing
     `ng serve` process died independently of these edits, confirmed via
     `curl` connection-refused before restart) - restarted via
     `npm run dexar`, not a regression from this work.
   - See item 1 below (homepage dead-space gap) for the one issue found
     but not fixed (config data, not code).

2. **Project Editor footer: payment icons and social links had no validation.**
   `footer-section.component.ts` parsed both fields from pipe-delimited
   `<textarea>` strings (`icon.src|icon.alt`, `link.id|link.label|link.url`)
   with zero validation - malformed rows silently produced empty `src`/`alt`/
   `url` values instead of surfacing an error.
   - Fixed: 2026-07-16, replaced both textareas with `app-key-value-editor`
     rows (icon picked via `MediaPickerComponent`, label/URL via `app-input`),
     added inline URL-format validation on social links (same `HTTP_URL`
     pattern used in `project-validator.service.ts`) and a missing footer-logo
     media picker.

3. **Project Editor navigation: nav link labels only editable for the default locale.**
   `navigation-section.component.ts`'s `labelOf` helper (and the facade's
   `updateNavLinkLabel`) always read/wrote the default locale's key on a
   `NavigationLocalizedText` label map, so switching locales elsewhere in the
   editor had no effect on nav link text - other locales' translations could
   only be edited by hand-editing the exported JSON.
   - Fixed: 2026-07-16, added `app-locale-tabs` to the section; the label
     input now reads/writes the active tab's locale via a new
     `editableLabel()` helper, and `ProjectEditorFacade.updateNavLinkLabel()`
     gained an optional `locale` parameter (defaults to the current default
     locale, so existing callers are unaffected).

4. **Quick Actions: 3 untranslated raw i18n keys.**
   `dashboard.actionUsers`, `dashboard.actionMonitoring`,
   `dashboard.actionAnalytics` rendered as literal key strings instead of
   translated labels on the admin dashboard's Quick Actions section, because
   `admin-dashboard.facade.ts` referenced them but they were never added to
   `translations.ts`/`en.ts`/`ru.ts`/`hy.ts`.
   - Found: 2026-07-15, manual browser verification of
     `/:lang/backoffice/dashboard?devBypassAdmin=true`.
   - Fixed: 2026-07-15, added the 3 keys to the interface + all 3 locales.

5. **Project Editor: 9 real correctness bugs across footer, features,
   widgets, languages, preview, static-pages, general, branding/SEO, and the
   shared media picker.** Found via a section-by-section "does this control
   actually do what it claims at runtime" audit, not a feature pass. Full
   detail (repro steps, fix, live verification) in `docs/EDITOR.md`'s
   "Bug-hunt audit pass (2026-07-17)" section — summary:
   - Footer social-link/payment-icon id generation reproducibly collided
     (array-length-derived / fixed suffix), corrupting `@for (track item.id)`
     identity on the public storefront footer.
   - Features' wishlist/compare toggle only drove one of the two flags that
     actually gate visibility at runtime.
   - Widgets' JSON-fallback textarea silently discarded invalid edits instead
     of showing an error.
   - Languages' add-locale silently no-opped on a duplicate code.
   - Preview's import bypassed undo history and draft `localStorage`
     persistence entirely.
   - Static Pages' create/duplicate-page slug generation had the same
     collision bug as the footer one.
   - General's free-text language fields bypassed `LocaleSyncService`
     (no translation-entry propagation) and had no guard against an
     unsupported default locale.
   - Branding's `socialImageUrl` field (added earlier the same session) was
     never actually read by `SeoService` — dead on arrival until wired in.
   - The shared `app-media-picker`'s backing facade is a root singleton;
     search/folder/page filters leaked between independently-opened picker
     dialogs on the same page.
   - Found & fixed: 2026-07-17. Each bug was reproduced live via
     `window.ng.getComponent()` before fixing and re-verified after.
   - 3 further gaps were found but are real feature work, not wiring bugs —
     moved to Open (items 3-5 above) rather than fixed inline: Theme Mode
     has no runtime effect, the `dynamic-renderer/` pipeline is unwired,
     and the header's Profile toggle has no corresponding menu.

6. **`admin/categories` facade: dead create-draft recovery + broken
   drag-reorder.** Found via the same bug-hunt method as project-editor's
   audit, applied to `admin/products` + `admin/categories`. Full detail
   (repro steps, fix, live verification) in `docs/ADMIN.md`'s "Bug-hunt audit
   pass (2026-07-17)" section - summary:
   - `startCreate()` generated a fresh `category-${Date.now()}` id every
     call and keyed the `localStorage` autosave draft off it, so create-mode
     draft recovery could never find a match (even within the same tab,
     seconds apart) and orphaned an entry every abandoned attempt.
   - `reorder(id, targetOrder)` wrote the dropped-on row's `order` value
     straight onto the dragged category, tying two siblings on the same
     `order` instead of repositioning - and since every seeded category
     starts at `order: 0`, every drag on fresh data was a silent no-op.
   - Found & fixed: 2026-07-17. Each reproduced live via
     `window.ng.getComponent()` before fixing, re-verified after (real
     backend unreachable in this environment, so via
     `facade.categories.set([...])` synthetic siblings feeding the same
     facade methods/gateway calls the UI drives).
   - A third bug from the same audit pass, fixed in a follow-up commit:
     `admin-product-form`/`admin-category-form` hardcoded translation-tab
     locales to `['en','ru','hy']` instead of the tenant's actual
     `supportedLocales`. Fixed by giving `AdminProductsFacade`/
     `AdminCategoriesFacade` a `supportedLocales` computed +
     `ensureLocalesLoaded()` reading/lazily-loading
     `ProjectEditorFacade.bootstrap()` (same pattern
     `AdminDashboardFacade.ensureLoaded()` already uses), threaded down to
     both form components via a new `locales` `@Input()`. Verified live:
     rendered tab order changed from the hardcoded `['en','ru','hy']` to the
     real tenant order `['ru','en','hy']` in both editors.

7. **`pages/category` and `pages/search` hand-rolled skeleton markup
   replaced with shared `app-skeleton`.** Both pages had their own
   `.skeleton-card`/`.skeleton-image`/`.skeleton-line` shimmer CSS with
   hardcoded hex colors, duplicating what `app-skeleton` already provides
   and what `catalog-container`/`product-details-container` already use.
   - Fixed: 2026-07-23, RC STORE-01 (`STORE_REVIEW.md` (removed, see git history)).
   - **Correction (2026-07-25):** these files are unrouted dead code (Open
     item 13) — the fix is real and harmless but currently has zero
     production effect. Live category/search rendering goes through
     `CatalogContainerComponent`, not these files.

8. **Cart's dead `.email-form` markup and CSS removed.** Post-payment
   email/phone-capture form was commented-out markup with a matching
   ~90-line dead CSS block still shipping in the bundle.
   - Fixed: 2026-07-23, RC STORE-01.

9. **App-wide query-param routing broken (P0).** `language.guard.ts`'s
   legacy-URL redirect built the target with `router.createUrlTree([...])`
   using a single path-segment string with the query string baked in, so it
   got percent-encoded into the path instead of parsed as query params
   (`/edit/branding?devBypassAdmin=true` → `/ru/edit/branding%3FdevBypassAdmin%3Dtrue`,
   a dead route). This guard runs on every top-level route app-wide, so any
   bookmarked/shared deep link with query params was silently broken —
   found during the Builder RC walkthrough but affects all 3 surfaces.
   - Fixed: 2026-07-24, Release Candidate walkthrough (`RELEASE_REPORT.md` (removed, see git history)),
     `router.parseUrl()` instead of a hand-built path segment.

10. **Backoffice Categories CRUD completely broken end-to-end (P0).**
    `admin-categories-gateway.token.ts` resolved via
    `RuntimeProviderStrategyService.getBackofficeProviderMode()`, which —
    unlike `getBootstrapProviderMode()` — has no `isLocalhost()` fallback,
    so it always picked the real HTTP `AdminCategoriesApiGateway` instead of
    the local mock in an environment with no real backend. Combined with
    `saveDraft()` having no error handler: every create/publish click
    silently failed, `dirty` never cleared, and the unsaved-changes guard
    then blocked navigation with zero feedback.
    - Fixed: 2026-07-24, Release Candidate walkthrough, wired to the
      already-defined `getCategoryProviderMode()` + added the same
      `isLocalhost()` fallback `getBootstrapProviderMode()` already had.
      Live-verified: create/edit/reorder all persist correctly now.

## Notes (not bugs, just flag before shipping)

- `src/environments/environment.ts`: `useMockData` was temporarily flipped to
  `true` during this session's manual verification (so Categories/Products
  dashboard cards showed mock counts instead of erroring against a
  nonexistent local `/api/backoffice/*` backend), then reverted back to
  `false` afterward - matches its pre-session value.
