Skip to content

Comments

Implement Silver, Gold and Platinum pricing plans on on-premises pages#613

Open
ViktorSoroka07 wants to merge 1 commit intodevelopfrom
feature/pricing-plans-update
Open

Implement Silver, Gold and Platinum pricing plans on on-premises pages#613
ViktorSoroka07 wants to merge 1 commit intodevelopfrom
feature/pricing-plans-update

Conversation

@ViktorSoroka07
Copy link
Collaborator

@ViktorSoroka07 ViktorSoroka07 commented Dec 22, 2025

PR Checklist

  • Have you verified that the PR is pointing to the correct target branch? (develop for features/bugfixes, master for release/hotfix)?
  • Have you followed the guidelines in our Dev Guide
  • Have you run prettier (npm run format)?
  • Have you checked that the build output looks according to design (screen, mobile, desktop) in Figma (npm run serve)?

Notes

Contentful env for deployments - dev.

Visuals

Screenshot 2025-12-22 at 17 23 09 Screenshot 2025-12-22 at 17 22 03 Screenshot 2025-12-22 at 17 22 08

Summary by CodeRabbit

  • New Features

    • Added a reusable icon-with-background and benefit item components; new benefits section on pricing pages.
  • Improvements

    • Updated navigation labels to "SaaS Plans" and "Service Packages".
    • Refined pricing layout and price period display; "Most popular" → "Top choice".
    • Added Terms & Conditions and consolidated Learn more links on pricing pages.
    • Made several headings/subtitles render conditionally for cleaner layouts.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Dec 22, 2025

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • 🔍 Trigger a full review

Walkthrough

Adds an IconWithBackground component and BenefitItem, refactors LinkedCard and LinkedCardBlock to support iconColor and generic CardComponent, updates OfferPageWrapper to show benefits on pricing pages, removes comparePlans/utilizationDescription plumbing, tweaks pricing UI/text, and applies multiple styling and content updates including renaming labels and terminology changes.

Changes

Cohort / File(s) Summary
IconWithBackground
src/components/IconWithBackground/IconWithBackground.tsx, src/components/IconWithBackground/IconWithBackground.scss, src/components/IconWithBackground/index.ts
New React component + SCSS for circular icon-with-background using CSS variables for icon URL and color; exported via index barrel.
BenefitItem
src/components/LinkedCardBlock/BenefitItem/BenefitItem.tsx, src/components/LinkedCardBlock/BenefitItem/BenefitItem.scss, src/components/LinkedCardBlock/BenefitItem/index.ts
New BenefitItem component with optional icon/iconColor, title, description, optional link; uses IconWithBackground and BEM styles; re-exported.
LinkedCard
src/components/LinkedCard/LinkedCard.tsx, src/components/LinkedCard/LinkedCard.scss
Reworked props into a discriminated union requiring icon+iconColor together or neither; uses IconWithBackground instead of img; SCSS adjusted to target .icon-with-background spacing.
LinkedCardBlock (generic)
src/components/LinkedCardBlock/LinkedCardBlock.tsx, src/components/LinkedCardBlock/LinkedCardBlock.scss, src/components/LinkedCardBlock/index.ts
Converted to generic component with CardComponent?: ComponentType (defaults to LinkedCard), replaced largePadding boolean with mode?: 'large', updated rendering to use CardComponent; SCSS simplified and BenefitItem exported.
OfferPageWrapper
src/components/OfferPageWrapper/OfferPageWrapper.tsx, src/components/OfferPageWrapper/OfferPageWrapper.scss, src/components/OfferPageWrapper/constants.ts
Removed comparePlans and utilizationDescription props/usage; adds conditional LinkedCardBlock with BENEFITS_CARDS and Terms & Conditions link on pricing pages; many SCSS layout updates; new BENEFITS_CARDS constant.
PricingCard & PricingHero
src/components/PricingCard/PricingCard.tsx, src/components/PricingCard/PricingCard.scss, src/components/PricingHero/PricingHero.tsx, src/components/PricingHero/PricingHero.scss
Removed tooltip/isTotalYearPriceShown logic and list-item icon rendering; "Most popular" → "Top choice"; added price-period markup and related styles; PricingHero.offerType made optional and title conditional.
TitleBlock & InfoCard
src/components/TitleBlock/TitleBlock.tsx, src/components/InfoCard/InfoCard.tsx
TitleBlock.subtitle made optional and rendered conditionally; InfoCard accepts optional className and memoizes BEM builder.
Accelerators (D4j, Healenium, Qasp)
src/containers/AcceleratorsPage/*/*Page.tsx, src/containers/AcceleratorsPage/*/constants.tsx
Removed comparePlans GraphQL/props and utilizationDescription usage; updated FAQ/TIME_SCALE wording to "professional service hours" and adjusted other content.
OnPremisesPage & TIME/FAQ
src/containers/OnPremisesPage/OnPremisesPage.tsx, src/containers/OnPremisesPage/constants.tsx
Removed comparePlans/utilizationDescription usage; restructured TIME_SCALE_DATA and substantially revised FAQ content and wording around support hours.
SaasPage
src/containers/SassPage/SaasPage.tsx
Removed offerType="SaaS" prop and replaced multi-line description with a concise single-line description.
Community & Sponsors constants
src/containers/CommunityPage/constants.ts, src/containers/SponsorsPage/*/constants.ts
Added iconColor to cards, swapped several icon imports, and updated LinkedCardBlock usage to mode="large" in CommunityPage.
Utilities & Hooks
src/utils/formatOfferingPlans.ts, src/utils/contactUsConfig.ts, src/hooks/usePricingHeroProps.tsx
formatOfferingPlans: optional chaining and conditional spread to omit comparePlans when absent; contactUsConfig: changed onPremises plans to Silver/Gold/Platinum; usePricingHeroProps: updated icons and button labels ("SaaS" → "SaaS Plans", "On-Premises" → "Service Packages").
Navigation Constants
src/components/Layout/Navigation/NavMenu/OfferingsMenu/constants.tsx
PRICING_CONFIG titles updated: "SaaS" → "SaaS Plans", "On-Premises" → "Service Packages".
Styling tweaks
src/components/OfferPageWrapper/TimeScale/TimeScale.scss, src/components/PricingCard/PricingCard.scss, src/components/LinkedCardBlock/LinkedCardBlock.scss, src/components/LinkedCard/LinkedCard.scss, others
Multiple SCSS adjustments: padding-block usage, list sizing, price font-scale changes, layout simplifications and selector cleanups across affected components.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Areas requiring extra attention:

  • LinkedCardBlock generic types and default CardComponent typing (type inference and JSX props compatibility).
  • OfferPageWrapper conditional rendering and removal of comparePlans/utilizationDescription (ensure no runtime undefined usage).
  • formatOfferingPlans conditional comparePlans spread and callers that may expect comparePlans.
  • IconWithBackground CSS variable usage and mask-based rendering (cross-browser checks) and iconColor propagation.
  • PricingCard changes that removed tooltip/list-item renderers (verify accessibility and visual parity).

Possibly related PRs

Suggested reviewers

  • AmsterGet
  • siarheirazuvalau

Poem

🐰 I hopped through code to add a glow,

Icons round and titles now in tow,
Cards that flex and generics that play,
"Service hours" whisper what we say—
A nibble, a patch, and off I go! 🥕

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Update on premises pricing plans' directly aligns with the core changes in the PR, which include pricing plan updates and on-premises terminology changes throughout the codebase.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/pricing-plans-update

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 and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

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

⚠️ Outside diff range comments (1)
src/containers/OnPremisesPage/constants.tsx (1)

36-113: Terminology inconsistency across pricing pages causes customer confusion.

OnPremisesPage uses "support hours" while AcceleratorsPage (D4jPage, HealeniumPage) use "professional service hours", and TestingAsServicePage uses "Professional Service Points". This creates confusion about whether these are the same or different offerings.

Standardize terminology across all pricing/service pages:

  • Decide on a single term for each distinct service type
  • Update all constant files consistently
  • Clarify in documentation if these are intentionally different products
🧹 Nitpick comments (6)
src/components/InfoCard/InfoCard.tsx (1)

1-1: Consider whether memoization is necessary here.

The useMemo hook memoizes the BEM block builder creation, but createBemBlockBuilder is a lightweight operation (array manipulation and string concatenation). The memoization overhead might outweigh the benefits in typical render scenarios.

Additionally, compact filters out falsy values before passing to createBemBlockBuilder, but the builder already handles falsy blocks internally (see the conditional logic in the reduce function). While explicit, this adds a minor redundancy.

That said, if this pattern is used consistently across the codebase for uniformity (as suggested by the AI summary), it's reasonable to maintain for consistency.

</review_comment_end>

Also applies to: 3-3, 18-21

src/containers/AcceleratorsPage/D4jPage/constants.tsx (1)

61-77: Minor: Inconsistent JSX wrapper choice.

FAQ items 3 and 4 use different wrapper patterns (<div> vs <></>). Consider using consistent wrappers across all FAQ items for maintainability.

src/containers/OnPremisesPage/OnPremisesPage.tsx (1)

27-27: Consider refining the description text for clarity.

The updated description text could be improved for readability:

  • Current: "Need expert assistance or enterprise features for your self-hosted or SaaS ReportPortal? We offer support, integrations, migrations and custom features development"
  • Consider adding punctuation and improving flow
🔎 Suggested refinement
-          'Need expert assistance or enterprise features for your self-hosted or SaaS ReportPortal? We offer support, integrations, migrations and custom features development',
+          'Need expert assistance or enterprise features for your self-hosted or SaaS ReportPortal? We offer support, integrations, migrations, and custom features development.',

Note: Added Oxford comma and period at the end.

src/components/LinkedCardBlock/BenefitItem/BenefitItem.tsx (2)

9-16: Type inconsistency: iconColor is required but icon is optional.

In CommonBenefitItemProps, iconColor is required (iconColor: string) while icon is optional (icon?: string). This is semantically inconsistent since iconColor only makes sense when icon is provided. Consider making both optional or aligning with the discriminated union pattern used in BenefitItemProps.

🔎 Suggested fix
 export interface CommonBenefitItemProps {
   itemTitle: string;
   description: string;
   link?: string;
   linkText?: string;
-  icon?: string;
-  iconColor: string;
+  icon?: string;
+  iconColor?: string;
 }

43-48: Consider using ArrowLink for consistency.

LinkedCard uses the ArrowLink component for link rendering, while BenefitItem uses a plain Link with a hardcoded " >" suffix. For visual and behavioral consistency across card components, consider using ArrowLink here as well.

src/components/OfferPageWrapper/OfferPageWrapper.tsx (1)

118-128: Consider using a <button> for scroll-to behavior.

The current implementation uses a Link with to="#" and preventDefault() for scroll behavior. While this works, a <button> styled as a link would be more semantically appropriate since this action doesn't navigate to a new URL.

🔎 Suggested refactor
-              <Link
-                to="#"
-                className="link"
-                onClick={event => {
-                  event.preventDefault();
-
-                  utilizationRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' });
-                }}
-              >
+              <button
+                type="button"
+                className="link"
+                onClick={() => {
+                  utilizationRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' });
+                }}
+              >
                 Learn more
-              </Link>
+              </button>

This would require ensuring the .link class applies appropriate button-reset styles.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0d9ff7c and 239dc7b.

⛔ Files ignored due to path filters (26)
  • src/components/OfferPageWrapper/icons/envelope.svg is excluded by !**/*.svg
  • src/components/OfferPageWrapper/icons/handshake.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/boost-agents.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/developer-guide.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/enhance-integrations.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/improve-core.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/installation-guide.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/release-notes.svg is excluded by !**/*.svg
  • src/containers/SassPage/icons/cloud-icon.inline.svg is excluded by !**/*.svg
  • src/containers/SassPage/icons/server-icon.inline.svg is excluded by !**/*.svg
  • src/containers/SassPage/icons/service-packages-icon.inline.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/BusinessPage/icons/brand-visibility.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/BusinessPage/icons/community-engagement.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/BusinessPage/icons/product-improvement.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/BusinessPage/icons/talent-attraction.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/IndividualPage/icons/gain-recognition.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/IndividualPage/icons/join-community.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/IndividualPage/icons/support-innovation.svg is excluded by !**/*.svg
  • src/svg/community.svg is excluded by !**/*.svg
  • src/svg/deal.inline.svg is excluded by !**/*.svg
  • src/svg/externalLinkArrow.inline.svg is excluded by !**/*.svg
  • src/svg/headphones.inline.svg is excluded by !**/*.svg
  • src/svg/infoIcon.inline.svg is excluded by !**/*.svg
  • src/svg/star.inline.svg is excluded by !**/*.svg
  • src/svg/star.svg is excluded by !**/*.svg
  • src/svg/tool.inline.svg is excluded by !**/*.svg
📒 Files selected for processing (37)
  • src/components/IconWithBackground/IconWithBackground.scss
  • src/components/IconWithBackground/IconWithBackground.tsx
  • src/components/IconWithBackground/index.ts
  • src/components/InfoCard/InfoCard.tsx
  • src/components/Layout/Navigation/NavMenu/OfferingsMenu/constants.tsx
  • src/components/LinkedCard/LinkedCard.scss
  • src/components/LinkedCard/LinkedCard.tsx
  • src/components/LinkedCardBlock/BenefitItem/BenefitItem.scss
  • src/components/LinkedCardBlock/BenefitItem/BenefitItem.tsx
  • src/components/LinkedCardBlock/BenefitItem/index.ts
  • src/components/LinkedCardBlock/LinkedCardBlock.scss
  • src/components/LinkedCardBlock/LinkedCardBlock.tsx
  • src/components/LinkedCardBlock/index.ts
  • src/components/OfferPageWrapper/OfferPageWrapper.scss
  • src/components/OfferPageWrapper/OfferPageWrapper.tsx
  • src/components/OfferPageWrapper/TimeScale/TimeScale.scss
  • src/components/OfferPageWrapper/constants.ts
  • src/components/PricingCard/PricingCard.scss
  • src/components/PricingCard/PricingCard.tsx
  • src/components/PricingHero/PricingHero.scss
  • src/components/PricingHero/PricingHero.tsx
  • src/components/TitleBlock/TitleBlock.tsx
  • src/containers/AcceleratorsPage/D4jPage/D4jPage.tsx
  • src/containers/AcceleratorsPage/D4jPage/constants.tsx
  • src/containers/AcceleratorsPage/HealeniumPage/HealeniumPage.tsx
  • src/containers/AcceleratorsPage/HealeniumPage/constants.tsx
  • src/containers/AcceleratorsPage/QaspPage/QaspPage.tsx
  • src/containers/CommunityPage/CommunityPage.tsx
  • src/containers/CommunityPage/constants.ts
  • src/containers/OnPremisesPage/OnPremisesPage.tsx
  • src/containers/OnPremisesPage/constants.tsx
  • src/containers/SassPage/SaasPage.tsx
  • src/containers/SponsorsPage/BusinessPage/constants.ts
  • src/containers/SponsorsPage/IndividualPage/constants.ts
  • src/hooks/usePricingHeroProps.tsx
  • src/utils/contactUsConfig.ts
  • src/utils/formatOfferingPlans.ts
🧰 Additional context used
🧬 Code graph analysis (13)
src/containers/AcceleratorsPage/QaspPage/QaspPage.tsx (1)
src/utils/formatOfferingPlans.ts (1)
  • formatOfferingPlans (6-26)
src/components/OfferPageWrapper/constants.ts (2)
src/components/LinkedCardBlock/BenefitItem/BenefitItem.tsx (1)
  • BenefitItemProps (18-26)
src/utils/constants.ts (1)
  • DOCUMENTATION_URL (5-5)
src/components/IconWithBackground/IconWithBackground.tsx (1)
src/utils/createBemBlockBuilder.ts (1)
  • createBemBlockBuilder (4-24)
src/components/TitleBlock/TitleBlock.tsx (1)
src/utils/createBemBlockBuilder.ts (1)
  • createBemBlockBuilder (4-24)
src/components/LinkedCardBlock/LinkedCardBlock.tsx (3)
src/components/LinkedCard/LinkedCard.tsx (2)
  • LinkedCardProps (17-25)
  • LinkedCard (29-45)
src/utils/createBemBlockBuilder.ts (1)
  • createBemBlockBuilder (4-24)
src/components/TitleBlock/TitleBlock.tsx (1)
  • TitleBlock (13-18)
src/containers/OnPremisesPage/OnPremisesPage.tsx (1)
src/utils/formatOfferingPlans.ts (1)
  • formatOfferingPlans (6-26)
src/containers/AcceleratorsPage/D4jPage/D4jPage.tsx (1)
src/utils/formatOfferingPlans.ts (1)
  • formatOfferingPlans (6-26)
src/components/LinkedCardBlock/BenefitItem/BenefitItem.tsx (2)
src/utils/createBemBlockBuilder.ts (1)
  • createBemBlockBuilder (4-24)
src/components/IconWithBackground/IconWithBackground.tsx (1)
  • IconWithBackground (13-27)
src/components/InfoCard/InfoCard.tsx (2)
src/utils/types.ts (1)
  • LinkDto (21-24)
src/utils/createBemBlockBuilder.ts (1)
  • createBemBlockBuilder (4-24)
src/containers/OnPremisesPage/constants.tsx (2)
src/containers/AcceleratorsPage/D4jPage/constants.tsx (1)
  • FAQ_DATA (33-129)
src/containers/AcceleratorsPage/HealeniumPage/constants.tsx (1)
  • FAQ_DATA (22-55)
src/containers/AcceleratorsPage/HealeniumPage/constants.tsx (2)
src/containers/AcceleratorsPage/D4jPage/constants.tsx (1)
  • FAQ_DATA (33-129)
src/containers/OnPremisesPage/constants.tsx (1)
  • FAQ_DATA (33-113)
src/containers/AcceleratorsPage/HealeniumPage/HealeniumPage.tsx (1)
src/utils/formatOfferingPlans.ts (1)
  • formatOfferingPlans (6-26)
src/components/LinkedCard/LinkedCard.tsx (2)
src/components/IconWithBackground/IconWithBackground.tsx (1)
  • IconWithBackground (13-27)
src/components/ArrowLink/ArrowLink.tsx (1)
  • ArrowLink (18-28)
🔇 Additional comments (55)
src/components/TitleBlock/TitleBlock.tsx (1)

8-8: LGTM! Good improvement to prevent empty DOM elements.

Making the subtitle optional and conditionally rendering it is the correct approach. This prevents rendering an empty div when no subtitle is provided, keeping the DOM clean.

Also applies to: 16-16

src/components/InfoCard/InfoCard.tsx (1)

14-14: Well-structured implementation with good flexibility.

The addition of the optional className prop enhances component flexibility, allowing consumers to apply custom styling when needed. The component structure is clean, follows BEM conventions consistently, and the Link button is properly integrated with appropriate class composition.

</review_comment_end>

Also applies to: 17-17, 23-37

src/containers/SponsorsPage/IndividualPage/constants.ts (3)

18-18: Icon swaps are semantically appropriate.

The updated icons align well with their respective card purposes:

  • communitySvg for "Join a Community"
  • starSvg for "Gain recognition"

These changes improve consistency by using centralized assets while maintaining clear visual semantics.

Also applies to: 25-25


1-2: The new SVG imports resolve correctly and files exist.

The @app/* alias maps to src/* per tsconfig.json, so:

  • @app/svg/star.svgsrc/svg/star.svg
  • @app/svg/community.svgsrc/svg/community.svg

Both files are present and the imports are valid.


12-12: No changes needed. All CSS variables (--graphics-iris, --graphics-light-blue, --graphics-jade) are properly defined in src/styles/css-variables.scss, and the iconColor property is correctly consumed by the IconWithBackground component across all card implementations.

src/containers/AcceleratorsPage/HealeniumPage/constants.tsx (2)

25-32: Terminology update improves clarity.

The change from "Professional Service Points" to "professional service hours" is clear, consistent, and more intuitive for users. The updated wording accurately describes the subscription model.


9-9: No issues found. The time allocation changes (56→50 hours, 112→120 hours) are intentional per the PR objective and the new values align with official Healenium pricing documentation. No other codebase references to the old values exist, and the terminology update to "professional service hours" is consistent with other accelerator pages (e.g., D4jPage).

src/components/LinkedCard/LinkedCard.scss (1)

16-18: LGTM! Clean integration with the new IconWithBackground component.

The styling change properly supports the new IconWithBackground component architecture by replacing the previous &__image selector with the .icon-with-background class selector.

src/hooks/usePricingHeroProps.tsx (1)

5-20: LGTM! Button text and icon updates align with the rebranding.

The changes properly update the pricing navigation buttons from "SaaS" to "SaaS Plans" and "On-Prem Services" to "Service Packages", with corresponding icon update.

src/utils/formatOfferingPlans.ts (1)

8-24: LGTM! Defensive programming with proper null handling.

The optional chaining and conditional spread ensure that comparePlans is only included in the return object when valid data exists, preventing downstream consumers from handling undefined/empty values.

src/containers/CommunityPage/constants.ts (1)

18-18: LGTM! Consistent iconColor addition across all cards.

The iconColor property additions properly support the IconWithBackground component's color customization using CSS variables.

Also applies to: 27-27, 36-36, 48-48, 57-57, 66-66

src/components/IconWithBackground/IconWithBackground.tsx (1)

1-27: LGTM! Well-structured component with proper encapsulation.

The IconWithBackground component is cleanly implemented using CSS variables for customization and follows BEM naming conventions. The icon URL is used in a CSS mask, which is safe since icons come from static imports in the codebase.

src/containers/AcceleratorsPage/D4jPage/constants.tsx (1)

36-43: LGTM! Terminology updated consistently.

The FAQ label and content properly use "professional service hours" instead of the previous "Professional Service Points" terminology.

src/components/PricingCard/PricingCard.tsx (3)

44-44: LGTM! Label text updated.

The change from "Most popular" to "Top choice" aligns with the UI refresh.


62-62: Simplified list item rendering.

The removal of custom BLOCKS.LIST_ITEM rendering simplifies the component by eliminating icon-based list customization. Ensure this aligns with the intended visual design.


78-80: LGTM! Clearer price period display.

The updated price period formatting ("for package per {period}") provides clearer context for the pricing structure.

src/containers/OnPremisesPage/constants.tsx (2)

39-42: Verify the policy change for hours validity.

The validity period content has been significantly changed from monthly accumulation with rollover to a simpler "annual term only, no rollover" policy. Ensure this reflects the actual updated business policy.


5-30: No action needed. The timeScaleData prop in OfferPageWrapper explicitly accepts both number and string types (time: number | string), so the type change from numbers to strings is not breaking.

Likely an incorrect or invalid review comment.

src/containers/SponsorsPage/BusinessPage/constants.ts (2)

2-3: LGTM: Consolidated icon imports.

The refactor to use shared icons from the common SVG directory is a good practice for consistency and maintainability.


13-14: The CSS custom properties referenced in this file are already properly defined. All variables (--graphics-iris, --graphics-orchid, --graphics-light-blue, --graphics-jade) are defined in src/styles/css-variables.scss within the :root selector and are available globally throughout the application.

src/components/PricingCard/PricingCard.scss (2)

95-105: LGTM: Updated price display styling.

The font scale change and new price-period class improve the visual hierarchy of pricing information.


127-139: Verify browser support for :has() selector.

The :has() pseudo-class at lines 127 and 220 is now supported across all major browsers. The CSS :has() pseudo class is finally supported by all major browsers. Current support includes:

  • Chrome/Edge 105+
  • Firefox 121+
  • Safari 15.4+

Ensure your target browser compatibility matrix aligns with these requirements.

Also applies to: 220-222

src/components/LinkedCardBlock/BenefitItem/index.ts (1)

1-1: LGTM: Standard barrel export pattern.

The re-export follows established conventions for exposing the BenefitItem component through its module namespace.

src/components/LinkedCardBlock/index.ts (1)

2-2: LGTM: BenefitItem added to public API.

The re-export makes BenefitItem available alongside LinkedCardBlock, enabling consumers to import both from the same module.

src/components/IconWithBackground/index.ts (1)

1-1: LGTM: Standard barrel export pattern.

The re-export establishes the public API for the IconWithBackground component.

src/components/PricingHero/PricingHero.tsx (1)

24-24: LGTM: Proper handling of optional prop.

Making offerType optional with conditional rendering at Line 88 is the correct approach. This maintains backward compatibility while preventing empty wrapper divs when the prop is not provided.

Also applies to: 88-88

src/containers/CommunityPage/CommunityPage.tsx (1)

46-46: LGTM: Improved API with mode prop.

Replacing the boolean largePadding with mode="large" is a more extensible API design that allows for additional mode variants in the future. The LinkedCardBlock component correctly accepts the mode prop as an optional string literal type 'large', and the implementation properly applies BEM modifier classes based on the mode value for styling.

src/utils/contactUsConfig.ts (1)

7-7: Verify URL redirects and integrations for renamed pricing plans.

Changing plan names from ['Lite', 'Service Pro', 'Advanced'] to ['Silver', 'Gold', 'Platinum'] requires:

  1. Implementing 301 permanent redirects for old URLs

    • /contact-us/on-premises/lite/contact-us/on-premises/silver
    • /contact-us/on-premises/service-pro/contact-us/on-premises/gold
    • /contact-us/on-premises/advanced/contact-us/on-premises/platinum
  2. Updating any external documentation, marketing materials, and customer-facing references

  3. Verifying Salesforce or other integrations recognize the new plan names

Confirm these changes are complete before deploying.

src/components/IconWithBackground/IconWithBackground.scss (1)

1-33: LGTM! Clean implementation of icon with background component.

The SCSS follows BEM conventions and uses modern CSS features appropriately:

  • CSS custom properties for dynamic theming (--icon-color, --icon-url)
  • Mask technique for SVG icon coloring
  • Logical properties (border-radius, flex)
  • Proper layering with pseudo-element for translucent background
src/components/Layout/Navigation/NavMenu/OfferingsMenu/constants.tsx (2)

13-13: LGTM! Clear terminology update.

The change from "SaaS" to "SaaS Plans" provides better clarity in the navigation menu.


19-19: LGTM! Terminology alignment.

The change from "On-Premises" to "Service Packages" aligns with the PR's objective to update pricing plan terminology.

src/components/LinkedCardBlock/LinkedCardBlock.scss (4)

5-5: Verify visual impact of reduced padding.

The vertical padding has been reduced from 120px to 80px (a 40px reduction) and updated to use the logical property padding-block. This is a noticeable visual change that should be verified across different screen sizes.

The PR description mentions visual checks were performed. Please confirm the reduced spacing looks appropriate in the context of the pricing pages.


7-10: LGTM! Improved modifier naming and logical properties.

The modifier class rename from --large-padding to --large is more concise, and the use of padding-block is a modern best practice.


13-19: LGTM! Improved BEM structure.

The refactored selectors (.title-block__title and .title-block__subtitle) follow proper BEM conventions and improve specificity.


32-35: LGTM! Support for new BenefitItem component.

The addition of .benefit-item alongside .linked-card allows the LinkedCardBlock to properly render both types of card components with consistent flex layout.

src/components/LinkedCardBlock/BenefitItem/BenefitItem.scss (1)

1-40: LGTM! Well-structured BenefitItem styles.

The SCSS follows established patterns:

  • Proper BEM naming convention
  • Flex layout with appropriate gap for icon-text pairing
  • Uses design system mixins for typography consistency
  • CSS custom properties for theming (--text-primary)
  • Clean, maintainable structure
src/containers/AcceleratorsPage/D4jPage/D4jPage.tsx (1)

9-9: LGTM! Consistent refactoring pattern.

The removal of comparePlans destructuring aligns with the systematic refactoring across all accelerator pages (D4jPage, QaspPage, HealeniumPage) and pricing pages to simplify the data structure. The formatOfferingPlans utility now returns only plans, as shown in the relevant code snippets.

src/components/OfferPageWrapper/constants.ts (1)

1-29: LGTM! Well-structured benefits data.

The BENEFITS_CARDS constant is well-organized with proper typing and clear benefit descriptions. The use of CSS custom properties for iconColor maintains consistency with the design system. The DOCUMENTATION_URL constant is properly exported from utils and correctly configured via environment variables.

src/containers/AcceleratorsPage/QaspPage/QaspPage.tsx (1)

10-10: Refactoring confirmed safe: QaSpace pricing display unaffected by comparePlans removal.

The change from const { plans, comparePlans } to const { plans } in QaspPage.tsx is verified as safe. The OfferPageWrapper component does not accept a comparePlans prop—it only requires plans and other configuration properties. No code in the QaSpace context references comparePlans, and the destructuring pattern is consistent across all accelerator pages (D4jPage, HealeniumPage, QaspPage). The formatOfferingPlans function continues to support comparePlans for pages that need it (e.g., SaasPage), confirming this is a safe elimination of unused destructuring.

src/containers/OnPremisesPage/OnPremisesPage.tsx (1)

9-9: Verify removal of comparePlans from On-Premises page.

Line 9 correctly extracts only plans from formatOfferingPlans, reflecting the refactoring where comparePlans is now returned conditionally based on query data availability. OnPremisesPage no longer references comparePlans.

src/containers/SassPage/SaasPage.tsx (1)

48-48: LGTM!

The updated description is concise and clearly communicates the SaaS value proposition. The removal of the offerType prop aligns with the updated PricingHero component that now treats it as optional.

src/components/PricingHero/PricingHero.scss (1)

56-99: LGTM!

The margin adjustment and the new :first-child centering rule for &-subtitle correctly handle the layout when offerType is omitted, ensuring proper centering when the subtitle becomes the first child element.

src/containers/AcceleratorsPage/HealeniumPage/HealeniumPage.tsx (1)

9-19: LGTM!

The simplified destructuring of { plans } aligns with the removal of compare plan functionality from this page. The formatOfferingPlans utility conditionally spreads comparePlans, so extracting only plans is type-safe.

src/components/OfferPageWrapper/TimeScale/TimeScale.scss (1)

97-133: LGTM!

The styling simplifications for &__list and its li elements improve maintainability by replacing complex nth-child offset logic with explicit width specifications. The responsive adjustments appear consistent with the broader UI simplification goals of this PR.

src/components/LinkedCard/LinkedCard.tsx (1)

37-44: LGTM!

The refactored component structure using IconWithBackground is clean. The discriminated union type correctly ensures iconColor is available when icon is provided.

src/components/OfferPageWrapper/OfferPageWrapper.scss (2)

45-61: LGTM!

The new .linked-card-block section provides appropriate container padding resets and responsive max-width constraints for the cards. The styling integrates well with the new BenefitItem component rendering.


128-145: LGTM!

The &__subscription-info block provides clean styling with appropriate link states. The &:not(.link) selector correctly differentiates styling between generic anchors and the .link class.

src/components/LinkedCardBlock/LinkedCardBlock.tsx (2)

21-28: LGTM on the generic refactor!

The generic pattern <T extends LinkedCardProps = LinkedCardProps> enables flexible card component injection while maintaining type safety. The default CardComponent assignment correctly uses a type assertion since LinkedCard is typed for the base LinkedCardProps.


37-39: Key uniqueness assumption: itemTitle may not be unique.

Using cardInfo.itemTitle as the React key assumes titles are unique across cards. If duplicate titles are possible, this could cause React reconciliation issues. Consider using an index or adding an id field if uniqueness cannot be guaranteed.

src/components/OfferPageWrapper/OfferPageWrapper.tsx (6)

19-26: LGTM!

New imports are well-organized and follow the existing project patterns.


97-97: LGTM!

The conditional spread pattern is a clean approach to conditionally pass props based on page type.


104-106: LGTM!

Good use of the semantic <mark> element for text highlighting.


132-138: LGTM!

The conditional benefits block is cleanly integrated using the LinkedCardBlock with BenefitItem as the card renderer.


150-150: LGTM!

Heading text aligns with the updated terminology for support hours.


152-158: Verify the icon choice for an internal link.

The LinkArrow icon (imported from externalLinkArrow.inline.svg) is typically used to indicate external links that navigate away from the site. However, /legal/terms appears to be an internal route.

Consider whether this icon choice is intentional or if a different visual treatment would be more appropriate for internal navigation to avoid user confusion.

Comment on lines 100 to 114
children: (
<>
<div>
<div>
If Company seeks to consume more Professional Service Points than have been contracted for
according to the Order, overage fees of 25% on a per Professional Service Point basis will
If Company seeks to consume more Professional service hours than have been contracted for
according to the Order, overage fees of 25% on a per Professional service hour basis will
apply.
</div>
<div>
Professional Service Points may be used for the duration of the payment term, and expire
at that time. For example, annual upfront payment entitles Company to use the contracted
monthly service points at any point in the year. For a quarterly upfront payment, service
points must be used within three months.
Professional service hours may be used for the duration of the payment term, and expire at
that time. For example, annual upfront payment entitles Company to use the contracted
monthly Service Points at any point in the year. For a quarterly upfront payment, Service
Points must be used within three months.
</div>
</>
</div>
),
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Terminology inconsistency: Mixed capitalization and outdated term.

  • Line 103: Uses "Professional service hours" (capital P)
  • Line 110: Still uses outdated term "Service Points" instead of "professional service hours"

These should be updated to match the lowercase "professional service hours" used elsewhere in the file (line 36, 40, etc.).

🔎 Proposed fix for consistent terminology
       <div>
-          If Company seeks to consume more Professional service hours than have been contracted for
+          If Company seeks to consume more professional service hours than have been contracted for
           according to the Order, overage fees of 25% on a per Professional service hour basis will
           apply.
         </div>
         <div>
           Professional service hours may be used for the duration of the payment term, and expire at
           that time. For example, annual upfront payment entitles Company to use the contracted
-          monthly Service Points at any point in the year. For a quarterly upfront payment, Service
-          Points must be used within three months.
+          monthly professional service hours at any point in the year. For a quarterly upfront payment,
+          professional service hours must be used within three months.
         </div>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
children: (
<>
<div>
<div>
If Company seeks to consume more Professional Service Points than have been contracted for
according to the Order, overage fees of 25% on a per Professional Service Point basis will
If Company seeks to consume more Professional service hours than have been contracted for
according to the Order, overage fees of 25% on a per Professional service hour basis will
apply.
</div>
<div>
Professional Service Points may be used for the duration of the payment term, and expire
at that time. For example, annual upfront payment entitles Company to use the contracted
monthly service points at any point in the year. For a quarterly upfront payment, service
points must be used within three months.
Professional service hours may be used for the duration of the payment term, and expire at
that time. For example, annual upfront payment entitles Company to use the contracted
monthly Service Points at any point in the year. For a quarterly upfront payment, Service
Points must be used within three months.
</div>
</>
</div>
),
children: (
<div>
<div>
If Company seeks to consume more professional service hours than have been contracted for
according to the Order, overage fees of 25% on a per professional service hour basis will
apply.
</div>
<div>
professional service hours may be used for the duration of the payment term, and expire at
that time. For example, annual upfront payment entitles Company to use the contracted
monthly professional service hours at any point in the year. For a quarterly upfront payment,
professional service hours must be used within three months.
</div>
</div>
),
🤖 Prompt for AI Agents
In src/containers/AcceleratorsPage/D4jPage/constants.tsx around lines 100 to
114, update inconsistent terminology: change "Professional service hours"
(capital P) to "professional service hours" and replace the outdated term
"Service Points" with "professional service hours" so phrasing is consistent
with the lowercase usage elsewhere in the file; make these exact string
replacements in the JSX children blocks on the specified lines.

@ViktorSoroka07 ViktorSoroka07 force-pushed the feature/pricing-plans-update branch from 239dc7b to b876886 Compare December 22, 2025 15:31
@ViktorSoroka07 ViktorSoroka07 changed the title Update on premises pricing plans Implement Silver, Gold and Platinum pricing plans on on-premises pages Dec 22, 2025
@ViktorSoroka07 ViktorSoroka07 changed the base branch from master to develop December 22, 2025 15:33
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (6)
src/components/PricingCard/PricingCard.scss (2)

127-139: Consider browser support requirements for :has() selector.

The :has() pseudo-class has broad modern browser support (Chrome 105+, Safari 15.4+, Firefox 121+), but older browsers will ignore this rule entirely. If your target audience includes users on older browsers, the feature content inside <b> tags will fall back to default styling.

Also, consider extracting the 48px line-height to a variable for consistency with other typography definitions.


220-222: Consider nesting this rule within the .pricing-card block for BEM consistency.

This rule works correctly but is placed outside the main .pricing-card block. For better organization and BEM methodology adherence, consider moving it inside the &__price-value block.

🔎 Suggested refactor
   &__price-value {
     @include m.font-scale(x3-medium);
     @include m.font-poppins(v.$fw-bold);

     display: inline-block;
     margin-right: 5px;
     margin-bottom: 10px;
+
+    &:has(+ .pricing-card__price-period) {
+      margin-bottom: 0;
+    }
   }

-// Remove lines 220-222
-.pricing-card__price-value:has(+ .pricing-card__price-period) {
-  margin-bottom: 0;
-}
src/components/InfoCard/InfoCard.tsx (1)

18-21: useMemo optimization is a minor performance gain.

Memoizing the BEM block builder prevents recreation on each render, but createBemBlockBuilder is relatively lightweight. This optimization is correct but offers minimal performance benefit.

src/utils/contactUsConfig.ts (1)

142-142: Standardize terminology: "Package" vs "Plan".

There's a terminology inconsistency in the Salesforce source values:

  • Line 142: Request Support "${plan} Package"
  • Line 154: Request Support "${plan} Plan"

Both refer to on-premises plans. Consider standardizing to either "Package" or "Plan" for consistency in analytics and tracking.

🔎 Proposed fix to standardize terminology

If "Package" is the preferred term:

         {
           name: SALESFORCE_SOURCE_NAME,
-          value: `Landing page / On-Premises / Compare Plan / Request Support "${plan} Plan"`,
+          value: `Landing page / On-Premises / Compare Plan / Request Support "${plan} Package"`,
         },

Or if "Plan" is preferred:

         {
           name: SALESFORCE_SOURCE_NAME,
-          value: `Landing page / On-Premises / Request Support "${plan} Package"`,
+          value: `Landing page / On-Premises / Request Support "${plan} Plan"`,
         },

Also applies to: 154-154

src/containers/OnPremisesPage/constants.tsx (1)

70-75: Consider improving readability.

The answer text has slightly awkward formatting with the <br /> tag placement and multiple sentence fragments in a single <div>.

🔎 Suggested formatting improvement
     children: (
-      <div>
-        Unfortunately, no. You can&apos;t downgrade your billing plan at any time. <br /> However,
-        if you need more support hours, we can discuss the plan upgrade. For that, please, press
-        &quot;Contact us&quot; in the upper right corner of our landing page. We&apos;ll be happy to
-        help you to find the most suitable plan for your team and provide a quote.
-      </div>
+      <>
+        <div>
+          Unfortunately, no. You can&apos;t downgrade your billing plan at any time.
+        </div>
+        <div>
+          However, if you need more support hours, we can discuss the plan upgrade. For that,
+          please press &quot;Contact us&quot; in the upper right corner of our landing page.
+          We&apos;ll be happy to help you find the most suitable plan for your team and provide a
+          quote.
+        </div>
+      </>
     ),
src/components/LinkedCardBlock/LinkedCardBlock.tsx (1)

37-39: Consider adding a fallback for key uniqueness.

The component uses cardInfo.itemTitle as the React key. While this works when titles are unique, it could cause issues if the component is reused with duplicate titles.

🔎 Optional improvement for key prop

Consider adding an optional id field to the card data or using a combination of title and index:

       {cardsInfo.map((cardInfo, index) => (
-        <CardComponent key={cardInfo.itemTitle} {...cardInfo} />
+        <CardComponent key={cardInfo.id || `${cardInfo.itemTitle}-${index}`} {...cardInfo} />
       ))}

This would require updating the type definition to include an optional id field.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 239dc7b and b876886.

⛔ Files ignored due to path filters (26)
  • src/components/OfferPageWrapper/icons/envelope.svg is excluded by !**/*.svg
  • src/components/OfferPageWrapper/icons/handshake.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/boost-agents.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/developer-guide.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/enhance-integrations.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/improve-core.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/installation-guide.svg is excluded by !**/*.svg
  • src/containers/CommunityPage/icons/release-notes.svg is excluded by !**/*.svg
  • src/containers/SassPage/icons/cloud-icon.inline.svg is excluded by !**/*.svg
  • src/containers/SassPage/icons/server-icon.inline.svg is excluded by !**/*.svg
  • src/containers/SassPage/icons/service-packages-icon.inline.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/BusinessPage/icons/brand-visibility.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/BusinessPage/icons/community-engagement.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/BusinessPage/icons/product-improvement.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/BusinessPage/icons/talent-attraction.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/IndividualPage/icons/gain-recognition.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/IndividualPage/icons/join-community.svg is excluded by !**/*.svg
  • src/containers/SponsorsPage/IndividualPage/icons/support-innovation.svg is excluded by !**/*.svg
  • src/svg/community.svg is excluded by !**/*.svg
  • src/svg/deal.inline.svg is excluded by !**/*.svg
  • src/svg/externalLinkArrow.inline.svg is excluded by !**/*.svg
  • src/svg/headphones.inline.svg is excluded by !**/*.svg
  • src/svg/infoIcon.inline.svg is excluded by !**/*.svg
  • src/svg/star.inline.svg is excluded by !**/*.svg
  • src/svg/star.svg is excluded by !**/*.svg
  • src/svg/tool.inline.svg is excluded by !**/*.svg
📒 Files selected for processing (37)
  • src/components/IconWithBackground/IconWithBackground.scss
  • src/components/IconWithBackground/IconWithBackground.tsx
  • src/components/IconWithBackground/index.ts
  • src/components/InfoCard/InfoCard.tsx
  • src/components/Layout/Navigation/NavMenu/OfferingsMenu/constants.tsx
  • src/components/LinkedCard/LinkedCard.scss
  • src/components/LinkedCard/LinkedCard.tsx
  • src/components/LinkedCardBlock/BenefitItem/BenefitItem.scss
  • src/components/LinkedCardBlock/BenefitItem/BenefitItem.tsx
  • src/components/LinkedCardBlock/BenefitItem/index.ts
  • src/components/LinkedCardBlock/LinkedCardBlock.scss
  • src/components/LinkedCardBlock/LinkedCardBlock.tsx
  • src/components/LinkedCardBlock/index.ts
  • src/components/OfferPageWrapper/OfferPageWrapper.scss
  • src/components/OfferPageWrapper/OfferPageWrapper.tsx
  • src/components/OfferPageWrapper/TimeScale/TimeScale.scss
  • src/components/OfferPageWrapper/constants.ts
  • src/components/PricingCard/PricingCard.scss
  • src/components/PricingCard/PricingCard.tsx
  • src/components/PricingHero/PricingHero.scss
  • src/components/PricingHero/PricingHero.tsx
  • src/components/TitleBlock/TitleBlock.tsx
  • src/containers/AcceleratorsPage/D4jPage/D4jPage.tsx
  • src/containers/AcceleratorsPage/D4jPage/constants.tsx
  • src/containers/AcceleratorsPage/HealeniumPage/HealeniumPage.tsx
  • src/containers/AcceleratorsPage/HealeniumPage/constants.tsx
  • src/containers/AcceleratorsPage/QaspPage/QaspPage.tsx
  • src/containers/CommunityPage/CommunityPage.tsx
  • src/containers/CommunityPage/constants.ts
  • src/containers/OnPremisesPage/OnPremisesPage.tsx
  • src/containers/OnPremisesPage/constants.tsx
  • src/containers/SassPage/SaasPage.tsx
  • src/containers/SponsorsPage/BusinessPage/constants.ts
  • src/containers/SponsorsPage/IndividualPage/constants.ts
  • src/hooks/usePricingHeroProps.tsx
  • src/utils/contactUsConfig.ts
  • src/utils/formatOfferingPlans.ts
🚧 Files skipped from review as they are similar to previous changes (19)
  • src/components/LinkedCardBlock/index.ts
  • src/components/IconWithBackground/index.ts
  • src/components/LinkedCard/LinkedCard.scss
  • src/components/OfferPageWrapper/constants.ts
  • src/components/IconWithBackground/IconWithBackground.scss
  • src/containers/SponsorsPage/IndividualPage/constants.ts
  • src/components/LinkedCardBlock/BenefitItem/BenefitItem.tsx
  • src/containers/AcceleratorsPage/QaspPage/QaspPage.tsx
  • src/components/Layout/Navigation/NavMenu/OfferingsMenu/constants.tsx
  • src/components/OfferPageWrapper/OfferPageWrapper.scss
  • src/components/PricingCard/PricingCard.tsx
  • src/components/LinkedCard/LinkedCard.tsx
  • src/components/LinkedCardBlock/LinkedCardBlock.scss
  • src/components/LinkedCardBlock/BenefitItem/index.ts
  • src/components/PricingHero/PricingHero.tsx
  • src/containers/AcceleratorsPage/D4jPage/constants.tsx
  • src/containers/SponsorsPage/BusinessPage/constants.ts
  • src/containers/SassPage/SaasPage.tsx
  • src/components/PricingHero/PricingHero.scss
🧰 Additional context used
🧬 Code graph analysis (9)
src/containers/OnPremisesPage/OnPremisesPage.tsx (1)
src/utils/formatOfferingPlans.ts (1)
  • formatOfferingPlans (6-26)
src/containers/AcceleratorsPage/HealeniumPage/HealeniumPage.tsx (1)
src/utils/formatOfferingPlans.ts (1)
  • formatOfferingPlans (6-26)
src/containers/AcceleratorsPage/D4jPage/D4jPage.tsx (1)
src/utils/formatOfferingPlans.ts (1)
  • formatOfferingPlans (6-26)
src/components/OfferPageWrapper/OfferPageWrapper.tsx (5)
src/custom.d.ts (1)
  • Link (18-18)
src/components/LinkedCardBlock/LinkedCardBlock.tsx (1)
  • LinkedCardBlock (21-44)
src/components/OfferPageWrapper/constants.ts (1)
  • BENEFITS_CARDS (8-29)
src/components/LinkedCardBlock/BenefitItem/BenefitItem.tsx (1)
  • BenefitItem (30-51)
src/components/OfferPageWrapper/TimeScale/TimeScale.tsx (1)
  • TimeScale (17-48)
src/containers/AcceleratorsPage/HealeniumPage/constants.tsx (2)
src/containers/AcceleratorsPage/D4jPage/constants.tsx (1)
  • FAQ_DATA (33-129)
src/containers/OnPremisesPage/constants.tsx (1)
  • FAQ_DATA (33-113)
src/containers/OnPremisesPage/constants.tsx (2)
src/containers/AcceleratorsPage/D4jPage/constants.tsx (1)
  • FAQ_DATA (33-129)
src/containers/AcceleratorsPage/HealeniumPage/constants.tsx (1)
  • FAQ_DATA (22-55)
src/components/IconWithBackground/IconWithBackground.tsx (1)
src/utils/createBemBlockBuilder.ts (1)
  • createBemBlockBuilder (4-24)
src/components/LinkedCardBlock/LinkedCardBlock.tsx (3)
src/components/LinkedCard/LinkedCard.tsx (2)
  • LinkedCardProps (17-25)
  • LinkedCard (29-45)
src/utils/createBemBlockBuilder.ts (1)
  • createBemBlockBuilder (4-24)
src/components/TitleBlock/TitleBlock.tsx (1)
  • TitleBlock (13-18)
src/components/InfoCard/InfoCard.tsx (2)
src/utils/types.ts (1)
  • LinkDto (21-24)
src/utils/createBemBlockBuilder.ts (1)
  • createBemBlockBuilder (4-24)
🔇 Additional comments (29)
src/components/LinkedCardBlock/BenefitItem/BenefitItem.scss (1)

1-40: LGTM! Clean and well-structured SCSS.

The stylesheet follows best practices:

  • Modern SCSS module syntax with @use
  • Consistent BEM naming convention
  • Appropriate use of typography mixins
  • CSS custom properties for theming
  • Clean flex-based layout structure

The component styling is maintainable and follows the project's conventions.

src/components/PricingCard/PricingCard.scss (2)

94-101: LGTM!

The updated font scale and margin adjustments align with the pricing UI refresh.


103-105: LGTM!

New period label styling is clean and uses the appropriate service color variable.

src/hooks/usePricingHeroProps.tsx (1)

5-5: The import path is valid—the ServicePackagesIcon file exists.

The icon file exists at src/containers/SassPage/icons/service-packages-icon.inline.svg, and the relative import path from the hook is correct.

src/components/TitleBlock/TitleBlock.tsx (2)

6-9: LGTM! Making subtitle optional improves component flexibility.

The change from required to optional prop is well-aligned with the conditional rendering below and allows cleaner usage when a subtitle isn't needed.


16-16: Good use of conditional rendering.

The conditional rendering pattern at line 16 prevents empty subtitle divs from cluttering the DOM when no subtitle is provided. This pairs well with the optional prop definition. All usages of TitleBlock in the codebase pass either a subtitle string or leave it undefined, so the change is fully compatible with existing code.

src/components/InfoCard/InfoCard.tsx (2)

1-3: LGTM!

The new imports are appropriate for the memoized BEM builder implementation.


23-37: LGTM!

The restructured rendering properly uses the memoized BEM builder for all elements, and the Link button is correctly composed with combined class names.

src/components/OfferPageWrapper/TimeScale/TimeScale.scss (2)

15-15: LGTM! Layout refinements for improved spacing and background rendering.

The margin simplification and background-size change from "cover" to "contain" appear to be intentional improvements. The "contain" value ensures the background image is fully visible without cropping.

Also applies to: 23-23


116-121: LGTM! Consider testing with longer content.

The explicit width values (240px mobile, 180px tablet+) provide predictable layout. Ensure longer text content wraps gracefully within these constraints.

src/utils/formatOfferingPlans.ts (1)

8-24: LGTM! Excellent defensive programming for optional comparePlans.

The use of optional chaining and conditional spread ensures:

  • No runtime errors when allContentfulComparePlan is absent
  • Clean return type - comparePlans key is only present when data exists
  • Backward compatibility with existing consumers

This aligns well with the PR's goal to deprecate comparePlans usage across pages.

src/containers/AcceleratorsPage/HealeniumPage/constants.tsx (2)

6-19: Verify the time bucket changes align with pricing updates.

The time values have changed:

  • Line 9: 56 → 50 hours (-10.7%)
  • Line 17: 112 → 120 hours (+7.1%)

Also, the non-breaking space entity was removed from line 6, which simplifies the rendering.

Please confirm these time adjustments align with the updated pricing structure mentioned in the PR objectives.


25-33: LGTM! Terminology standardization improves clarity.

The FAQ has been updated to consistently use "professional service hours" instead of the previous "Professional Service Points". This matches the pattern in D4jPage constants (as shown in relevant snippets) and improves terminology consistency across accelerator pages.

src/containers/OnPremisesPage/OnPremisesPage.tsx (2)

9-19: LGTM! Correctly updated to match formatOfferingPlans API changes.

The destructuring now only extracts plans, which aligns with the updated formatOfferingPlans function that conditionally includes comparePlans. The GraphQL query appropriately no longer fetches allContentfulComparePlan.


22-36: LGTM! Hero description updated and deprecated props removed.

The new hero description better articulates the value proposition: "expert assistance or enterprise features for your self-hosted or SaaS ReportPortal". The removal of comparePlans and utilizationDescription props aligns with the broader refactoring to simplify the pricing presentation.

src/containers/CommunityPage/CommunityPage.tsx (1)

46-46: LGTM! LinkedCardBlock API updated to use mode prop.

The prop has been changed from largePadding (boolean) to mode="large" (string), which provides more flexibility for future layout variants. This aligns with the LinkedCardBlock refactoring mentioned in the AI summary.

src/containers/AcceleratorsPage/D4jPage/D4jPage.tsx (1)

9-38: LGTM! Consistent comparePlans removal across accelerator pages.

This change mirrors the updates in OnPremisesPage and HealeniumPage:

  • Destructures only plans from formatOfferingPlans
  • Removes allContentfulComparePlan from GraphQL query
  • Removes comparePlans and utilizationDescription props from OfferPageWrapper

The consistent pattern across all offering pages indicates a well-coordinated refactoring effort.

src/containers/AcceleratorsPage/HealeniumPage/HealeniumPage.tsx (1)

9-38: LGTM! Final page completing the consistent comparePlans removal.

HealeniumPage follows the same refactoring pattern as D4jPage, QaspPage, and OnPremisesPage:

  • Extracts only plans from formatOfferingPlans
  • Omits allContentfulComparePlan from GraphQL
  • No longer passes comparePlans or utilizationDescription to OfferPageWrapper

All offering pages are now consistent with the new pricing presentation approach.

src/containers/CommunityPage/constants.ts (1)

18-18: LGTM! Consistent iconColor additions align with IconWithBackground pattern.

All six CSS variables are properly defined in the design system, and the iconColor properties follow the consistent var(--graphics-{color}) pattern across card entries in both GITHUB_CONTRIBUTION_CARDS and DOCUMENTATION_CARDS.

src/components/IconWithBackground/IconWithBackground.tsx (1)

13-27: LGTM!

The component implementation is clean and uses CSS custom properties appropriately. The icon prop appears to be sourced from internal SVG imports based on the usage context (e.g., starSvg, envelopeSvg in BENEFITS_CARDS), so direct string interpolation into the url() is acceptable.

src/containers/OnPremisesPage/constants.tsx (3)

3-31: LGTM! Clear service tier restructuring.

The TIME_SCALE_DATA has been reorganized into three distinct tiers (1+, 50+, 150+ hours) with well-defined service categories. The new structure clearly communicates the scope and complexity of services available at each tier.


82-85: Verify overage policy simplification is intentional.

The overage policy explanation has been significantly simplified, removing the detailed accumulation logic about payment terms (quarterly vs. annual). Ensure this simplification aligns with the updated business model.


36-44: The terminology update in OnPremisesPage is incomplete—old terminology persists in other files.

The change to "support hours" in OnPremisesPage/constants.tsx is correct, but the codebase still contains the old terminology:

  • "professional service hours" remains in src/containers/AcceleratorsPage/HealeniumPage/constants.tsx and src/containers/AcceleratorsPage/D4jPage/constants.tsx
  • "Professional Service Points" persists in multiple TestingAsServicePage files (Tips/constants.ts, Tips/Tips.tsx, ServiceHours/ServiceHours.tsx, BenefitsOfTaas/BenefitsOfTaas.tsx)

For true terminology consistency, update these remaining references to align with the new terminology.

Likely an incorrect or invalid review comment.

src/components/LinkedCardBlock/LinkedCardBlock.tsx (1)

10-17: LGTM! Well-designed generic component.

The conversion to a generic component is well-executed. The type constraint T extends LinkedCardProps ensures type safety while allowing flexibility for different card types (e.g., BenefitItem). The optional CardComponent prop with a sensible default maintains backward compatibility.

src/components/OfferPageWrapper/OfferPageWrapper.tsx (5)

19-19: LGTM! New imports support the enhanced pricing page features.

The added imports (LinkedCardBlock, BenefitItem, LinkArrow, BENEFITS_CARDS) support the new benefits section and Terms & Conditions link, aligning with the PR's objective to update pricing plans UI.

Also applies to: 23-23, 26-26


104-106: LGTM! Terminology and content updates are consistent.

The updates consistently use "support hours" terminology throughout, replacing previous references to "professional service hours" or "Professional Service Points". The emphasis on "full year" aligns with the annual subscription model, and the Learn more link provides intuitive navigation to the utilization details.

Also applies to: 115-128, 150-150


132-138: LGTM! Benefits section properly implemented.

The LinkedCardBlock is correctly used with BenefitItem as the CardComponent to render the benefits cards. The conditional rendering ensures this section appears only on pricing pages, providing clear value proposition to potential customers.


152-158: LGTM! Terms & Conditions link well-placed.

The Terms & Conditions link is appropriately positioned after the utilization details and conditionally rendered for pricing pages. The visual indicator (LinkArrow) helps users recognize this as an important legal document link.


90-98: No issues detected. The PricingHero component correctly defines offerType as an optional prop and safely handles cases where it's undefined through conditional rendering.

@ViktorSoroka07 ViktorSoroka07 force-pushed the feature/pricing-plans-update branch 5 times, most recently from 9260946 to 7cb9e9b Compare December 22, 2025 18:14
@AmsterGet AmsterGet force-pushed the feature/pricing-plans-update branch from 7cb9e9b to e8fd017 Compare February 6, 2026 16:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants