Skip to content

Refactor/herbatica UI ux report - #478

Merged
KaiUweCZE merged 9 commits into
masterfrom
refactor/herbatica-ui-ux-report
Jun 27, 2026
Merged

Refactor/herbatica UI ux report#478
KaiUweCZE merged 9 commits into
masterfrom
refactor/herbatica-ui-ux-report

Conversation

@KaiUweCZE

@KaiUweCZE KaiUweCZE commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

  • New Features

    • Updated homepage benefit messages with refreshed marketing copy.
  • Bug Fixes

    • Fixed carousel interactions so drag no longer triggers accidental navigation.
    • Improved product detail tabs behaviour when no section is selected.
    • Standardised phone number links in the header and product pages for more reliable tapping/calling.
  • Chores

    • Improved footer navigation typing and rendering for internal vs external links, and made the phone contact clickable.

@vercel

vercel Bot commented Jun 26, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
new-engine-ui-storybook Ready Ready Preview, Comment Jun 27, 2026 2:36pm

@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@KaiUweCZE, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 40 minutes and 51 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3ff62a72-8983-4ccc-9434-73a7bfb89122

📥 Commits

Reviewing files that changed from the base of the PR and between f72efb6 and 08300f0.

📒 Files selected for processing (1)
  • apps/herbatika/src/components/herbatika-footer.tsx

Walkthrough

The PR updates marketing copy, link rendering, hero carousel interaction, product-detail tab state, and catalog status filter normalisation.

Changes

Herbatika UI updates

Layer / File(s) Summary
Marketing copy refresh
apps/herbatika/src/assets/benefits/index.ts
The exported BENEFITS array replaces the text and description for ids 1 to 4.
Link rendering and contact links
apps/herbatika/src/components/herbatika-footer.tsx, apps/herbatika/src/components/herbatika-header.tsx, apps/herbatika/src/components/checkout/checkout-header.tsx, apps/herbatika/src/components/product-detail/sections/product-detail-media-column.tsx
Footer navigation now distinguishes internal and external URLs, and the footer, header, checkout header, and product-detail media phone links render as direct tel: links without the NextLink wrapper.
Homepage hero carousel
apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
HeroBannerCard forwards capture handlers, the carousel rebuilds slides from banners, restores on persisted page visits, and suppresses navigation after dragging.
Product detail tabs
apps/herbatika/src/components/product-detail.tsx, apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx
ProductDetail and ProductDetailTabsProps use `string

Catalog status filters

Layer / File(s) Summary
Status filter helpers
apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
A fixed supported-status set is introduced together with helpers for membership checks and normalising multi-value input.
Status query parsing
apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
The catalog status query parser switches to a status-specific CSV parser that normalises values on parse and serialise.
Status filter usage
apps/herbatika/src/lib/storefront/catalog-query-state/params.ts, apps/herbatika/src/components/category/use-category-facet-items.ts
Catalog request parameters, active-filter counts, and facet chips now use the normalised or supported status filter values.

Sequence Diagram(s)

sequenceDiagram
  participant usePageRestoreKey
  participant HomepageHeroCarouselSection
  participant HeroCarousel
  participant CarouselRoot
  participant HeroBannerCard
  participant NextLink
  usePageRestoreKey->>HomepageHeroCarouselSection: increment restoreKey on persisted pageshow
  HomepageHeroCarouselSection->>HeroCarousel: pass banners and restoreKey
  HeroCarousel->>CarouselRoot: set key={restoreKey} and render slides
  HeroCarousel->>HeroBannerCard: attach onClickCapture and onPointerDownCapture
  HeroBannerCard->>NextLink: forward capture handlers
  CarouselRoot->>HeroCarousel: report drag status changes
  HeroCarousel->>HeroBannerCard: prevent navigation after drag
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title is too vague and generic to clearly describe the main change in this pull request. Rename it to summarise the actual refactor, such as the affected Herbatika UI components or catalog query-state changes.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/herbatica-ui-ux-report
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch refactor/herbatica-ui-ux-report

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jun 26, 2026

Copy link
Copy Markdown

Greptile Summary

This PR delivers a set of UI/UX improvements across the Herbatika storefront: fixing carousel drag-to-navigate, making phone numbers tappable links, collapsing the mobile product-detail accordion, and introducing a supported-status-filter allowlist that keeps unknown URL query values from leaking into the catalog API.

  • Carousel drag fix: Each HeroCarousel instance now tracks drag state via a didDragRef and intercepts clicks in the capture phase; a usePageRestoreKey hook forces carousel remount on bfcache restoration by keying Carousel.Root off an incrementing counter.
  • Status filter allowlist: A new status-filters.ts module defines SUPPORTED_STATUS_FILTER_IDS and normalizeStatusFilterInput, applied consistently in the URL parser, API param builder, and facet item hook to strip unsupported values at every boundary.
  • Accessibility/tap improvements: tel: links in the header, checkout header, footer, and product detail now use the correct link primitives (removing spurious as={NextLink}) and the footer phone number is promoted from Footer.Text to a clickable Footer.Link.

Confidence Score: 5/5

Safe to merge — changes are well-scoped UI/UX fixes with no risk to data integrity or auth flows.

All changes are isolated UI and filter-layer fixes. The drag-suppression logic correctly uses capture-phase events and a ref to avoid stale closures; the status-filter allowlist is applied at every relevant boundary (parser, API params, facet items); the accordion collapsibility and optional section state are handled consistently between the mobile and desktop rendering paths.

No files require special attention.

Important Files Changed

Filename Overview
apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx Adds per-carousel drag suppression (didDragRef + capture-phase handlers) and a bfcache restore key that forces Carousel.Root to remount on page restoration; also swaps the CTA Button for a styled span via buttonVariants to avoid nested interactive elements.
apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx Makes activeSectionValue optional (string
apps/herbatika/src/components/herbatika-footer.tsx Introduces a FooterNavigationLink discriminated union (Route vs https: template literal), renders external links with the external prop and internal links with as={NextLink}, and upgrades the phone number from Footer.Text to a clickable Footer.Link.
apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts New module that defines SUPPORTED_STATUS_FILTER_IDS and two helpers — isCatalogStatusFilterSupported and normalizeStatusFilterInput — used to strip unknown filter values from URL params and API calls.
apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts Adds parseAsStatusStringArray parser that filters unsupported status values at URL parse and serialize time, so unknown query params are silently stripped.
apps/herbatika/src/lib/storefront/catalog-query-state/params.ts Applies normalizeStatusFilterInput to the status field before building API params and counting active filters, consistent with the new parser-level filtering.
apps/herbatika/src/components/category/use-category-facet-items.ts Filters catalogFacets.status, seedFacets.status, and queryState.status through isCatalogStatusFilterSupported before passing to buildFacetChipItems, preventing unsupported filter options from appearing in the UI.
apps/herbatika/src/components/product-detail.tsx Adds explicit string
apps/herbatika/src/components/herbatika-header.tsx Swaps NextLink for the ui-kit Link component on the tel: phone link, consistent with checkout and product-detail changes.
apps/herbatika/src/components/checkout/checkout-header.tsx Removes the as={NextLink} prop from the tel: phone link — tel: URIs don't need Next.js client routing.
apps/herbatika/src/components/product-detail/sections/product-detail-media-column.tsx Same as checkout-header: removes as={NextLink} from the tel: phone link in the product detail media column.
apps/herbatika/src/assets/benefits/index.ts Marketing copy refresh — updated text for all four BENEFITS entries with clearer wording.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[User pointer down on slide] --> B[onPointerDownCapture\ndidDragRef = false]
    B --> C{User drags?}
    C -- Yes --> D[onDragStatusChange dragging\ndidDragRef = true]
    D --> E[Click fires after drag]
    E --> F{event.detail === 0?\nkeyboard click?}
    F -- Yes --> G[Reset ref, allow navigation]
    F -- No --> H{didDragRef === true?}
    H -- Yes --> I[preventDefault + stopPropagation\nReset ref — navigation blocked]
    H -- No --> J[Allow navigation]
    C -- No --> K[Click fires normally]
    K --> L[didDragRef === false → allow navigation]

    M[User navigates away\nbfcache stores page state] --> N[pageshow event\nevent.persisted = true]
    N --> O[setRestoreKey prev + 1]
    O --> P[key prop changes on Carousel.Root\nForces full remount]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[User pointer down on slide] --> B[onPointerDownCapture\ndidDragRef = false]
    B --> C{User drags?}
    C -- Yes --> D[onDragStatusChange dragging\ndidDragRef = true]
    D --> E[Click fires after drag]
    E --> F{event.detail === 0?\nkeyboard click?}
    F -- Yes --> G[Reset ref, allow navigation]
    F -- No --> H{didDragRef === true?}
    H -- Yes --> I[preventDefault + stopPropagation\nReset ref — navigation blocked]
    H -- No --> J[Allow navigation]
    C -- No --> K[Click fires normally]
    K --> L[didDragRef === false → allow navigation]

    M[User navigates away\nbfcache stores page state] --> N[pageshow event\nevent.persisted = true]
    N --> O[setRestoreKey prev + 1]
    O --> P[key prop changes on Carousel.Root\nForces full remount]
Loading

Reviews (4): Last reviewed commit: "fix(herbatika): use stable footer link k..." | Re-trigger Greptile

Comment thread apps/herbatika/src/components/herbatika-footer.tsx Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx`:
- Around line 119-164: The HeroCarousel click suppression logic is incorrectly
blocking keyboard-initiated activation because didDragRef can remain true after
a drag ends; update handleSlideClickCapture in HeroCarousel to distinguish
keyboard synthetic clicks from pointer clicks, and allow clicks with no pointer
activity (for example by checking the click event’s detail) to proceed while
keeping the drag-prevention behavior for dragged slides.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0f5d3114-900a-40e1-916b-3428d8cb6f12

📥 Commits

Reviewing files that changed from the base of the PR and between c14ac4d and 2c56b19.

📒 Files selected for processing (8)
  • apps/herbatika/src/assets/benefits/index.ts
  • apps/herbatika/src/components/checkout/checkout-header.tsx
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/herbatika-header.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
  • apps/herbatika/src/components/product-detail.tsx
  • apps/herbatika/src/components/product-detail/sections/product-detail-media-column.tsx
  • apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx
💤 Files with no reviewable changes (2)
  • apps/herbatika/src/components/product-detail/sections/product-detail-media-column.tsx
  • apps/herbatika/src/components/checkout/checkout-header.tsx
📜 Review details
⏰ Context from checks skipped due to timeout. (3)
  • GitHub Check: Greptile Review
  • GitHub Check: main
  • GitHub Check: Analyze (javascript-typescript)
⚠️ CI failures not shown inline (1)

GitHub Check: Kilo Code Review: Kilo Code Review failed

Conclusion: failure

View job details

Review failed: The message could not be delivered
🧰 Additional context used
📓 Path-based instructions (9)
apps/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Import UI components using the @techsio/ui-kit namespace, not @libs/ui, for runtime apps

Files:

  • apps/herbatika/src/components/product-detail.tsx
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx
  • apps/herbatika/src/components/herbatika-header.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
  • apps/herbatika/src/assets/benefits/index.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

Run Biome linting and formatting only on changed files using 'bunx biome check --write path/to/file'

Files:

  • apps/herbatika/src/components/product-detail.tsx
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx
  • apps/herbatika/src/components/herbatika-header.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
  • apps/herbatika/src/assets/benefits/index.ts
apps/herbatika/**

📄 CodeRabbit inference engine (AGENTS.md)

apps/herbatika/**: Read apps/herbatika/AGENTS.md before editing Herbatika app and follow its specific configuration which overrides root assumptions
Herbatika app runs on http://localhost:3001 and routes work through libs/ui/skills and libs/storefront-data/skills workflows

Files:

  • apps/herbatika/src/components/product-detail.tsx
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx
  • apps/herbatika/src/components/herbatika-header.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
  • apps/herbatika/src/assets/benefits/index.ts
apps/**/!(medusa-be)/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use modern React patterns and React 19 for frontend applications in the monorepo

Files:

  • apps/herbatika/src/components/product-detail.tsx
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx
  • apps/herbatika/src/components/herbatika-header.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
  • apps/herbatika/src/assets/benefits/index.ts
apps/herbatika/src/**/*.{jsx,tsx}

📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md)

apps/herbatika/src/**/*.{jsx,tsx}: Use internal UI primitives/components from @techsio/ui-kit instead of native controls in app code. Avoid raw , , , <textarea>, , inline SVG icons. For Next.js links/images, prefer the UI-kit component with next/link or next/image adapter support when that component exposes it. Files: apps/herbatika/src/components/product-detail.tsx apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx apps/herbatika/src/components/herbatika-header.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx apps/herbatika/src/**/*.{jsx,tsx,css} 📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md) Use token-based utility classes instead of raw Tailwind palette/spacing values. Prefer tokenized classes like p-200, mt-300, gap-150, text-success, bg-danger over raw Tailwind values like p-4, mt-8, bg-red-600. Files: apps/herbatika/src/components/product-detail.tsx apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx apps/herbatika/src/components/herbatika-header.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx apps/herbatika/src/** 📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md) apps/herbatika/src/**: Put Herbatika visual differences in src/styles/tokens/**; avoid JSX className overrides that duplicate UI-kit component props/tokens. Use kebab-case for file names and PascalCase for React component names in Herbatika. Files: apps/herbatika/src/components/product-detail.tsx apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx apps/herbatika/src/components/herbatika-header.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx apps/herbatika/src/assets/benefits/index.ts apps/herbatika/src/**/*.{ts,tsx} 📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md) apps/herbatika/src/**/*.{ts,tsx}: Use explicit package subpath imports from @techsio/storefront-data. Do not import from package roots or dist/. Keep server-only and client-only boundaries explicit in Herbatika app code; use 'server-only' and 'getServerQueryClient' for Server Component/SSR data paths. Files: apps/herbatika/src/components/product-detail.tsx apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx apps/herbatika/src/components/herbatika-header.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx apps/herbatika/src/assets/benefits/index.ts apps/herbatika/src/**/*.{ts,tsx,js,jsx} 📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md) Keep source files at a soft limit of ~200 lines; exceeding this should trigger refactor consideration. Files: apps/herbatika/src/components/product-detail.tsx apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx apps/herbatika/src/components/herbatika-header.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx apps/herbatika/src/assets/benefits/index.ts 🧠 Learnings (2) 📚 Learning: 2025-12-16T19:45:17.746Z Learnt from: BleedingDev Repo: NMIT-WR/new-engine PR: 207 File: libs/ui/src/molecules/select.tsx:50-50 Timestamp: 2025-12-16T19:45:17.746Z Learning: When reviewing Tailwind classes in TSX/TS files, prefer using square brackets for arbitrary CSS values and complex expressions. Specifically: - Do not use the parentheses syntax (z-(--z-index)) for anything beyond simple CSS variable references; this syntax auto-wraps in var() and cannot handle calc or complex functions. - Use the square brackets syntax (e.g., h-[calc(var(--available-height)-var(--spacing-content))]) for calc expressions, var with calc, and any complex CSS expressions. This rule applies broadly to Tailwind v4 usage in TSX code across the project. Applied to files: apps/herbatika/src/components/product-detail.tsx apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx apps/herbatika/src/components/herbatika-header.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx 📚 Learning: 2026-06-14T17:05:00.817Z Learnt from: KaiUweCZE Repo: TechsioCZ/new-engine PR: 442 File: apps/herbatika/src/components/reviews/product-review-token-page.tsx:36-42 Timestamp: 2026-06-14T17:05:00.817Z Learning: When reviewing code in apps/herbatika that calls `useProducts(input: ProductListInput, options?)`, treat `enabled` provided inside the first argument (`input`) as intentional and valid. The `ProductListInput` type includes an optional `enabled?: boolean` (via `BaseStorefrontProductListInput & { enabled?: boolean }`), and the hook infrastructure strips `enabled` before constructing the HTTP request and query key (following the same `stripListInput` behavior used elsewhere). Therefore, do NOT flag `useProducts({ enabled: ... , ... }, options)` as a contract violation; `enabled` belongs in the input object, not in the `options` argument. Applied to files: apps/herbatika/src/components/product-detail.tsx apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx apps/herbatika/src/components/herbatika-header.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx apps/herbatika/src/assets/benefits/index.ts 🔇 Additional comments (8) apps/herbatika/src/assets/benefits/index.ts (1) 10-28: LGTM! apps/herbatika/src/components/herbatika-footer.tsx (1) 6-74: LGTM! Also applies to: 121-124, 136-136, 159-167 apps/herbatika/src/components/herbatika-header.tsx (1) 6-6: LGTM! Also applies to: 117-130 apps/herbatika/src/components/product-detail.tsx (1) 26-28: LGTM! apps/herbatika/src/components/product-detail/sections/product-detail-tabs.tsx (1) 15-17: LGTM! Also applies to: 41-41, 66-66, 103-108 apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx (3) 21-69: LGTM! 71-117: LGTM! 177-214: LGTM!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/herbatika/src/components/herbatika-footer.tsx (1)

111-111: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

refactor: split HerbatikaFooter into smaller sections

This file is now 234 lines, so it has drifted past the Herbatika soft limit. Please extract the contact block and/or the navigation/bottom sections into small local components before this grows further. As per coding guidelines, "apps/herbatika/src/**/*.{ts,tsx,js,jsx}: Keep source files at a soft limit of ~200 lines; exceeding this should trigger refactor consideration."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/herbatika/src/components/herbatika-footer.tsx` at line 111,
HerbatikaFooter has grown past the soft file-size limit, so split the component
into smaller local pieces. Refactor HerbatikaFooter by extracting the contact
block and/or the navigation/bottom section into separate helper components
within the same file or nearby local components, while keeping the existing
HerbatikaFooter composition and behavior unchanged.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/herbatika/src/components/herbatika-footer.tsx`:
- Line 159: The footer link list is using a presentation value as the React key,
which can remount items on copy edits and collide on duplicate labels. Update
the key in the footer links render inside the herbatika-footer component to use
the stable identifier from the link object, specifically the href property, so
each item keeps a consistent key even if the label changes.

---

Outside diff comments:
In `@apps/herbatika/src/components/herbatika-footer.tsx`:
- Line 111: HerbatikaFooter has grown past the soft file-size limit, so split
the component into smaller local pieces. Refactor HerbatikaFooter by extracting
the contact block and/or the navigation/bottom section into separate helper
components within the same file or nearby local components, while keeping the
existing HerbatikaFooter composition and behavior unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: f9424775-46ae-4221-abd8-ad5ee2d0c1d7

📥 Commits

Reviewing files that changed from the base of the PR and between 2c56b19 and f72efb6.

📒 Files selected for processing (6)
  • apps/herbatika/src/components/category/use-category-facet-items.ts
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
  • GitHub Check: Greptile Review
⚠️ CI failures not shown inline (2)

GitHub Actions: CI / main: Refactor/herbatica UI ux report

Conclusion: failure

View job details

##[group]❌ > nx run herbatika:lint
 �[2m$ biome check�[22m
 src/components/homepage/sections/homepage-hero-carousel-section.tsx:155:5 assist/source/useSortedAttributes  FIXABLE  ━━━━━━━━━━
   × The attributes are not sorted.
     154 │   return (
   > 155 │     <Carousel.Root
         │     ^^^^^^^^^^^^^^
   > 156 │       aspectRatio="none"
          ...
   > 169 │       }}
   > 170 │     >
         │     ^
     171 │       <Carousel.Slides className={slidesClassName} slides={slides} />
     172 │       {hasOverflow ? (
   i Safe fix: Sort the JSX props.
     158 158 │         key={restoreKey}
     159 159 │         loop={hasOverflow}
     160     │ - ······size="full"
     161     │ - ······slideCount={slides.length}
     162     │ - ······slidesPerMove={1}
     163     │ - ······slidesPerPage={slidesPerPage}
     164     │ - ······spacing={spacing}
     165     │ - ······onDragStatusChange={(details)·=>·{
     166     │ - ········if·(details.type·===·"dragging")·{
     167     │ - ··········didDragRef.current·=·true
     168     │ - ········}
     169     │ - ······}}
         160 │ + ······onDragStatusChange={(details)·=>·{
         161 │ + ········if·(details.type·===·"dragging")·{
         162 │ + ··········didDragRef.current·=·true
         163 │ + ········}
         164 │ + ······}}
         165 │ + ······size="full"
         166 │ + ······slideCount={slides.length}
         167 │ + ······slidesPerMove={1}
         168 │ + ······slidesPerPage={slidesPerPage}
         169 │ + ······spacing={spacing}
     170 170 │       >
     171 171 │         <Carousel.Slides className={slidesClassName} slides={slides} />
 src/components/homepage/sections/homepage-hero-carousel-section.tsx format ━━━━━━━━━━━━━━━━━━━━━━━━━
   × Formatter would have printed the following content:
     125 125 │   }: HeroCarouselProps) {
     126 126 │     const didDragRef = useRef(false)
     127     │ - ··const·handleSlidePointerDownCapture:·PointerEventHandler<HTMLAnchorElement>·=
     12...

GitHub Actions: CI / 0_main.txt: Refactor/herbatica UI ux report

Conclusion: failure

View job details

##[group]❌ > nx run herbatika:lint
 �[2m$ biome check�[22m
 src/components/homepage/sections/homepage-hero-carousel-section.tsx:155:5 assist/source/useSortedAttributes  FIXABLE  ━━━━━━━━━━
   × The attributes are not sorted.
     154 │   return (
   > 155 │     <Carousel.Root
         │     ^^^^^^^^^^^^^^
   > 156 │       aspectRatio="none"
          ...
   > 169 │       }}
   > 170 │     >
         │     ^
     171 │       <Carousel.Slides className={slidesClassName} slides={slides} />
     172 │       {hasOverflow ? (
   i Safe fix: Sort the JSX props.
     158 158 │         key={restoreKey}
     159 159 │         loop={hasOverflow}
     160     │ - ······size="full"
     161     │ - ······slideCount={slides.length}
     162     │ - ······slidesPerMove={1}
     163     │ - ······slidesPerPage={slidesPerPage}
     164     │ - ······spacing={spacing}
     165     │ - ······onDragStatusChange={(details)·=>·{
     166     │ - ········if·(details.type·===·"dragging")·{
     167     │ - ··········didDragRef.current·=·true
     168     │ - ········}
     169     │ - ······}}
         160 │ + ······onDragStatusChange={(details)·=>·{
         161 │ + ········if·(details.type·===·"dragging")·{
         162 │ + ··········didDragRef.current·=·true
         163 │ + ········}
         164 │ + ······}}
         165 │ + ······size="full"
         166 │ + ······slideCount={slides.length}
         167 │ + ······slidesPerMove={1}
         168 │ + ······slidesPerPage={slidesPerPage}
         169 │ + ······spacing={spacing}
     170 170 │       >
     171 171 │         <Carousel.Slides className={slidesClassName} slides={slides} />
 src/components/homepage/sections/homepage-hero-carousel-section.tsx format ━━━━━━━━━━━━━━━━━━━━━━━━━
   × Formatter would have printed the following content:
     125 125 │   }: HeroCarouselProps) {
     126 126 │     const didDragRef = useRef(false)
     127     │ - ··const·handleSlidePointerDownCapture:·PointerEventHandler<HTMLAnchorElement>·=
     12...
🧰 Additional context used
📓 Path-based instructions (11)
apps/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Import UI components using the @techsio/ui-kit namespace, not @libs/ui, for runtime apps

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/components/category/use-category-facet-items.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

Run Biome linting and formatting only on changed files using 'bunx biome check --write path/to/file'

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/components/category/use-category-facet-items.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
apps/herbatika/**

📄 CodeRabbit inference engine (AGENTS.md)

apps/herbatika/**: Read apps/herbatika/AGENTS.md before editing Herbatika app and follow its specific configuration which overrides root assumptions
Herbatika app runs on http://localhost:3001 and routes work through libs/ui/skills and libs/storefront-data/skills workflows

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/components/category/use-category-facet-items.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
apps/**/!(medusa-be)/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use modern React patterns and React 19 for frontend applications in the monorepo

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/components/category/use-category-facet-items.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
apps/herbatika/src/**

📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md)

apps/herbatika/src/**: Put Herbatika visual differences in src/styles/tokens/**; avoid JSX className overrides that duplicate UI-kit component props/tokens.
Use kebab-case for file names and PascalCase for React component names in Herbatika.

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/components/category/use-category-facet-items.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
apps/herbatika/src/lib/storefront/**/*.{ts,tsx}

📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md)

In Herbatika storefront composition, prefer the preset surface from @techsio/storefront-data: shared hooks, flows, query keys, query options, cache policy, and SSR helpers.

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
apps/herbatika/src/lib/**/*.{ts,tsx}

📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md)

Keep app-local storefront code thin: SDK instance, field defaults, localized text, toasts, analytics, form DTOs, address adapters, and Herbatika-specific read models can stay in app code. Move repeated backend communication, query key construction, cache sync, and mutation invalidation into libs/storefront-data.

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
apps/herbatika/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md)

apps/herbatika/src/**/*.{ts,tsx}: Use explicit package subpath imports from @techsio/storefront-data. Do not import from package roots or dist/.
Keep server-only and client-only boundaries explicit in Herbatika app code; use 'server-only' and 'getServerQueryClient' for Server Component/SSR data paths.

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/components/category/use-category-facet-items.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
apps/herbatika/src/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md)

Keep source files at a soft limit of ~200 lines; exceeding this should trigger refactor consideration.

Files:

  • apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts
  • apps/herbatika/src/components/category/use-category-facet-items.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/params.ts
  • apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts
  • apps/herbatika/src/components/herbatika-footer.tsx
  • apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx
apps/herbatika/src/**/*.{jsx,tsx}

📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md)

apps/herbatika/src/**/*.{jsx,tsx}: Use internal UI primitives/components from @techsio/ui-kit instead of native controls in app code. Avoid raw , , , <textarea>, , inline SVG icons. For Next.js links/images, prefer the UI-kit component with next/link or next/image adapter support when that component exposes it. Files: apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx apps/herbatika/src/**/*.{jsx,tsx,css} 📄 CodeRabbit inference engine (apps/herbatika/AGENTS.md) Use token-based utility classes instead of raw Tailwind palette/spacing values. Prefer tokenized classes like p-200, mt-300, gap-150, text-success, bg-danger over raw Tailwind values like p-4, mt-8, bg-red-600. Files: apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx 🧠 Learnings (2) 📚 Learning: 2026-06-14T17:05:00.817Z Learnt from: KaiUweCZE Repo: TechsioCZ/new-engine PR: 442 File: apps/herbatika/src/components/reviews/product-review-token-page.tsx:36-42 Timestamp: 2026-06-14T17:05:00.817Z Learning: When reviewing code in apps/herbatika that calls `useProducts(input: ProductListInput, options?)`, treat `enabled` provided inside the first argument (`input`) as intentional and valid. The `ProductListInput` type includes an optional `enabled?: boolean` (via `BaseStorefrontProductListInput & { enabled?: boolean }`), and the hook infrastructure strips `enabled` before constructing the HTTP request and query key (following the same `stripListInput` behavior used elsewhere). Therefore, do NOT flag `useProducts({ enabled: ... , ... }, options)` as a contract violation; `enabled` belongs in the input object, not in the `options` argument. Applied to files: apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts apps/herbatika/src/components/category/use-category-facet-items.ts apps/herbatika/src/lib/storefront/catalog-query-state/params.ts apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx 📚 Learning: 2025-12-16T19:45:17.746Z Learnt from: BleedingDev Repo: NMIT-WR/new-engine PR: 207 File: libs/ui/src/molecules/select.tsx:50-50 Timestamp: 2025-12-16T19:45:17.746Z Learning: When reviewing Tailwind classes in TSX/TS files, prefer using square brackets for arbitrary CSS values and complex expressions. Specifically: - Do not use the parentheses syntax (z-(--z-index)) for anything beyond simple CSS variable references; this syntax auto-wraps in var() and cannot handle calc or complex functions. - Use the square brackets syntax (e.g., h-[calc(var(--available-height)-var(--spacing-content))]) for calc expressions, var with calc, and any complex CSS expressions. This rule applies broadly to Tailwind v4 usage in TSX code across the project. Applied to files: apps/herbatika/src/components/herbatika-footer.tsx apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx 🪛 GitHub Actions: CI / 0_main.txt apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx [error] 155-170: Biome check failed (useSortedAttributes). The JSX attributes are not sorted for <Carousel.Root>. Safe fix: Sort the JSX props. [error] 127-131: Biome check failed (format). Formatter would have printed different line-wrapping for 'handleSlidePointerDownCapture: PointerEventHandler'. 🪛 GitHub Actions: CI / main apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx [error] 155-170: Biome check (assist/source/useSortedAttributes) failed: The JSX attributes are not sorted. Safe fix: Sort the JSX props for <Carousel.Root>. [error] 127-130: Biome check (format) failed: Formatter would have reformatted handleSlidePointerDownCapture type annotation/line breaks. 🔇 Additional comments (6) apps/herbatika/src/components/homepage/sections/homepage-hero-carousel-section.tsx (1) 134-138: LGTM! apps/herbatika/src/lib/storefront/catalog-query-state/status-filters.ts (1) 1-15: LGTM! apps/herbatika/src/lib/storefront/catalog-query-state/parsers.ts (1) 10-28: LGTM! apps/herbatika/src/lib/storefront/catalog-query-state/params.ts (1) 3-3: LGTM! Also applies to: 66-66, 102-102 apps/herbatika/src/components/category/use-category-facet-items.ts (1) 5-5: LGTM! Also applies to: 23-29 apps/herbatika/src/components/herbatika-footer.tsx (1) 28-72: LGTM! Also applies to: 122-137

Comment thread apps/herbatika/src/components/herbatika-footer.tsx Outdated
@KaiUweCZE
KaiUweCZE merged commit 2e5829d into master Jun 27, 2026
5 of 7 checks passed
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 0.19.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant