Skip to content

Feat/features section#406

Merged
apsinghdev merged 7 commits into
apsinghdev:mainfrom
Aryan-205:feat/features-section
Jun 22, 2026
Merged

Feat/features section#406
apsinghdev merged 7 commits into
apsinghdev:mainfrom
Aryan-205:feat/features-section

Conversation

@Aryan-205

@Aryan-205 Aryan-205 commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

closes #403

Summary by CodeRabbit

  • New Features

    • Added "Explore Features" interactive section on the pricing page with an auto-cycling carousel showcasing product features, detailed descriptions, and visual previews in a browser mockup format.
  • Improvements

    • Updated testimonials and FAQ content for consistency.
    • Enhanced pricing page messaging and copy.
    • Improved avatar validation handling.

@vercel

vercel Bot commented Jun 18, 2026

Copy link
Copy Markdown

@Aryan-205 is attempting to deploy a commit to the AJEET PRATAP SINGH's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

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

More reviews will be available in 10 minutes and 33 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 refill rate.

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, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4f5561a3-6c93-4853-bd38-e103fe02c461

📥 Commits

Reviewing files that changed from the base of the PR and between 07774e3 and 5050695.

📒 Files selected for processing (2)
  • apps/api/src/utils/avatar-validator.ts
  • apps/web/src/app/(main)/(landing)/pitch/page.tsx
📝 Walkthrough

Walkthrough

Adds a new "Explore Features" section to the pricing landing page consisting of a typed feature data catalog, two image display components (ExploreFeaturesImagePreview, ExploreFeaturesBrowserMockup), and an auto-advancing carousel dashboard (ExploreFeaturesDashboard). The pricing page is updated to mount the section and support #explore-features hash navigation. Supporting changes include branding capitalization fixes ("Opensox"), static pro-slot copy, and avatar validator refactoring.

Changes

Explore Features Section

Layer / File(s) Summary
Feature data catalog: types, icons, and entries
apps/web/src/components/features/explore-features-data.ts
Defines HeroIcon, FeatureIconName, FeatureData types; exports FEATURE_ICON_MAP mapping icon name strings to Heroicon components; exports FEATURES_DATA with 11 ordered feature entries referencing internal FEATURE_IMAGES asset paths.
Image display components: preview and browser mockup
apps/web/src/components/features/explore-features-image-preview.tsx, apps/web/src/components/features/explore-features-browser-mockup.tsx
ExploreFeaturesImagePreview renders next/image with imageError state that resets on imageSrc change and falls back to an icon/title overlay. ExploreFeaturesBrowserMockup provides the same image/fallback pattern wrapped in a browser-chrome frame with gradient body.
Dashboard carousel: state, auto-advance, visibility, and sidebar scroll
apps/web/src/components/features/explore-features-dashboard.tsx (lines 1–162)
Manages activeIndex with timer-based auto-advance paused by visibilitychange events, IntersectionObserver, and manual navigation. Implements requestAnimationFrame-scheduled sidebar scroll to keep the active item in view.
Dashboard render: sidebar, header, navigation, and preview
apps/web/src/components/features/explore-features-dashboard.tsx (lines 164–312)
Renders animated sidebar feature buttons with active indicator, animated feature header content, prev/next controls, and an animated ExploreFeaturesImagePreview keyed to the active feature.
Features wrapper and pricing page mount
apps/web/src/components/features/features.tsx, apps/web/src/app/(main)/(landing)/pricing/page.tsx
Features wraps ExploreFeaturesDashboard with a Header and border. Inserted into the pricing page before <TestimonialsSection />; hash-scroll handler extended to handle #explore-features.

Supporting Updates: Branding, Pricing Copy, and Validation

Layer / File(s) Summary
Pricing page copy and formatting adjustments
apps/web/src/app/(main)/(landing)/pricing/page.tsx
Replaces live proMemberCountData.count display with static "first 200 users" text. Reformats Footer/PaymentFlow dynamic imports, WhySubItem type, SecondaryPricingCard query invocations, and formatApproxPlanPrice call without behavioral changes.
Branding consistency: Opensox capitalization
apps/web/src/components/faq/faqData.ts, apps/web/src/app/(main)/(landing)/pricing/page.tsx
Updates FAQ answer and pricing page testimonial strings from "OpenSox" to "Opensox" throughout.
Avatar validator refactoring
apps/api/src/utils/avatar-validator.ts
Rewrites validateAvatarUrl into explicit step-labeled stages preserving all security checks; updates User-Agent header casing from OpenSox-Avatar-Validator/1.0 to Opensox-Avatar-Validator/1.0.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant ExploreFeaturesDashboard
    participant IntersectionObserver
    participant AutoAdvanceTimer
    participant ExploreFeaturesImagePreview

    IntersectionObserver->>ExploreFeaturesDashboard: section enters viewport
    ExploreFeaturesDashboard->>AutoAdvanceTimer: start interval (AUTO_ADVANCE_MS)
    AutoAdvanceTimer->>ExploreFeaturesDashboard: tick → increment activeIndex
    ExploreFeaturesDashboard->>ExploreFeaturesImagePreview: re-render with new feature (imageSrc, FeatureIcon, featureTitle)
    User->>ExploreFeaturesDashboard: click sidebar button / prev / next
    ExploreFeaturesDashboard->>AutoAdvanceTimer: clear interval (pause)
    ExploreFeaturesDashboard->>ExploreFeaturesImagePreview: re-render with selected feature
    ExploreFeaturesDashboard->>AutoAdvanceTimer: schedule resume after RESUME_AFTER_MS
    IntersectionObserver->>ExploreFeaturesDashboard: section leaves viewport
    ExploreFeaturesDashboard->>AutoAdvanceTimer: clear interval (pause)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • apsinghdev/opensox#250: Both PRs modify the pricing page hash-based smooth-scrolling useEffect to register additional anchor IDs.
  • apsinghdev/opensox#309: Both PRs modify the same hash-scroll handler in pricing/page.tsx, overlapping at the same behavior code.
  • apsinghdev/opensox#324: Both PRs adjust the pricing page layout around <TestimonialsSection /> and add new sections near it.

Poem

🐇 Hippity hop, a showcase appears,
Eleven features lined up with cheer!
Auto-advance slides, the carousel spins,
"Opensox" spelled right — consistency wins.
The browser mockup gleams with its dots,
A rabbit built this with colorful lots! 🎨

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Minor out-of-scope changes detected: reformatted avatar validator utility, updated FAQ capitalization, and modified pricing page copy beyond feature integration requirements. Consider moving unrelated changes (avatar validator, FAQ updates, pricing copy changes) to separate PRs to keep this PR focused on the features showcase component.
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 "Feat/features section" is vague and uses a generic convention-based prefix without clearly describing the main change or functionality added. Consider a more descriptive title like "Add features showcase component to pricing page" that clearly conveys what was added and where.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed The PR successfully implements a features showcase component with all 13 required feature items from issue #403, displayed through an interactive dashboard with browser mockup previews.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@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: 4

🤖 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/web/src/components/features/explore-features-browser-mockup.tsx`:
- Around line 21-23: The imageError state remains true after an image failure,
causing subsequent valid imageSrc updates to still display the fallback. Add a
useEffect hook that monitors imageSrc as a dependency and resets imageError to
false whenever imageSrc changes, ensuring that new valid image sources are not
blocked by previous error states.
- Around line 27-77: Replace all hardcoded hex color values throughout the
ExploreFeaturesBrowserMockup component with design token Tailwind classes.
Specifically, replace instances like bg-[`#252525`], bg-[`#101010`], bg-[`#0a0a0a`],
border-[`#252525`], the hardcoded traffic light circle colors (bg-[`#ff5f57`],
bg-[`#febc2e`], bg-[`#28c840`]), and the radial gradient with rgba values with their
corresponding design token equivalents from the Tailwind system (such as
bg-surface-*, border-*, text-* classes). Ensure all color references throughout
the component consistently use design tokens instead of arbitrary hex values.

In `@apps/web/src/components/features/explore-features-dashboard.tsx`:
- Around line 161-284: Replace all hardcoded hex and rgb color values with
semantic token-based classes throughout the explore-features-dashboard
component. Specifically, convert hardcoded values like border-[`#252525`],
bg-[`#101010`], text-[`#d1d1d1`] in the container and sidebar sections to their
appropriate semantic token classes from the design system. Additionally, update
the motion animation color properties (the rgb values in the animate objects for
the icon and title spans within the map function that renders FEATURES_DATA) to
use semantic token values instead of hardcoded rgb expressions. Ensure all color
references in the header section, button hover states, and the scrollbar styling
use consistent semantic tokens rather than direct hex or rgb values.

In `@apps/web/src/components/features/features.tsx`:
- Around line 9-37: The decorative left and right rail divs are using inline
style objects with hardcoded hex values (`#252525`) for colors and patterns, which
violates the project's styling guidelines. Replace the inline style props on
both the left rail and right rail divs with Tailwind classes that use the
project's design tokens for colors. Extract the background pattern and border
styling into Tailwind utilities, ensuring the visual appearance remains the same
while adhering to the tokenized styling contract and avoiding hardcoded hex
values.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 896e41cb-d3d1-4ca5-b08d-3fd056126271

📥 Commits

Reviewing files that changed from the base of the PR and between b8456ef and 749f8da.

⛔ Files ignored due to path filters (2)
  • apps/web/public/assets/features/pro-preview.svg is excluded by !**/*.svg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (6)
  • apps/web/src/app/(main)/(landing)/page.tsx
  • apps/web/src/components/features/explore-features-browser-mockup.tsx
  • apps/web/src/components/features/explore-features-dashboard.tsx
  • apps/web/src/components/features/explore-features-data.ts
  • apps/web/src/components/features/features.tsx
  • apps/web/tsconfig.json

Comment thread apps/web/src/components/features/explore-features-dashboard.tsx Outdated
Comment thread apps/web/src/components/features/features.tsx Outdated
@apsinghdev

Copy link
Copy Markdown
Owner

@Aryan-205 nice work!

two requests:

  1. can you pls add the screen recording of your changes?
  2. pls take a look at the reviews suggested by coderabbit.

@apsinghdev

Copy link
Copy Markdown
Owner

@Aryan-205 hey any update on this?

@Aryan-205

Copy link
Copy Markdown
Contributor Author

yes, m working on this rn, will probably submit you the videos and images with the fixes in 1-2 hours, with that this would be finished as the UI is already complete

@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/web/src/components/features/explore-features-dashboard.tsx`:
- Around line 172-176: The PrimaryButton component is incorrectly nested inside
a Link component, which violates HTML semantics and breaks accessibility for
keyboard and screen-reader users. Replace the Link wrapper with Next.js routing
by importing useRouter from next/navigation at the top of the
explore-features-dashboard.tsx component, then remove the outer Link element
from the code block around the PrimaryButton with the "/pricing" href, and
instead add an onClick handler to the PrimaryButton that calls
router.push("/pricing") to navigate programmatically.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: fd04b2c8-ef4b-4bf5-bedd-665bcf4b992f

📥 Commits

Reviewing files that changed from the base of the PR and between 749f8da and d32a4e0.

⛔ Files ignored due to path filters (11)
  • apps/web/public/assets/features/10updates-n-opportunities.png is excluded by !**/*.png
  • apps/web/public/assets/features/11prorefs.png is excluded by !**/*.png
  • apps/web/public/assets/features/1onboardingcall.png is excluded by !**/*.png
  • apps/web/public/assets/features/2community.png is excluded by !**/*.png
  • apps/web/public/assets/features/3weeklysessions.png is excluded by !**/*.png
  • apps/web/public/assets/features/4unlimitedqna.png is excluded by !**/*.png
  • apps/web/public/assets/features/5promodules.png is excluded by !**/*.png
  • apps/web/public/assets/features/6weeklycontests.png is excluded by !**/*.png
  • apps/web/public/assets/features/7hand-pickedossprojects.png is excluded by !**/*.png
  • apps/web/public/assets/features/8prorecordings.png is excluded by !**/*.png
  • apps/web/public/assets/features/9pvtthreads.png is excluded by !**/*.png
📒 Files selected for processing (5)
  • apps/web/src/components/features/explore-features-browser-mockup.tsx
  • apps/web/src/components/features/explore-features-dashboard.tsx
  • apps/web/src/components/features/explore-features-data.ts
  • apps/web/src/components/features/explore-features-image-preview.tsx
  • apps/web/src/components/features/features.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/web/src/components/features/features.tsx
  • apps/web/src/components/features/explore-features-browser-mockup.tsx

Comment thread apps/web/src/components/features/explore-features-dashboard.tsx
@Aryan-205

Copy link
Copy Markdown
Contributor Author
Screen.Recording.2026-06-21.at.3.17.41.PM.mov
screen-recording-2026-06-21-at-31817-pm_3Yk4Ac0L.mp4

@apsinghdev
apsinghdev force-pushed the feat/features-section branch from 3906b16 to 07774e3 Compare June 22, 2026 09:31
@vercel

vercel Bot commented Jun 22, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
opensox-website Ready Ready Preview, Comment Jun 22, 2026 9:52am

@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

🧹 Nitpick comments (2)
apps/web/src/app/(main)/(landing)/pricing/page.tsx (1)

2-14: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

reorder imports to match project import groups.

this block mixes local imports with third-party/react imports. please group as: react → third-party → local components → utils → types.

as per coding guidelines: "organize imports in order: react → third-party → local components → utils → types."

🤖 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/web/src/app/`(main)/(landing)/pricing/page.tsx around lines 2 - 14, The
imports in this file are not organized according to the project guidelines.
Reorganize the imports at the top of the pricing page file to follow this order:
first React and React hooks (React, useEffect), then all third-party library
imports (next/image, next/link, next/navigation, lucide-react icons,
framer-motion, next/dynamic), followed by local component imports (Header,
ShineBorder, PrimaryButton, Features), and finally utility/lib imports (trpc,
formatApproxPlanPrice). Ensure each group is separated by a blank line for
clarity.

Source: Coding guidelines

apps/api/src/utils/avatar-validator.ts (1)

47-145: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

trim step comments to intent-level notes only

the new // step n comments mostly restate what the code already says. keep comments for rationale/tradeoffs (why), and drop procedural narration (what) to reduce noise.

As per coding guidelines: "Avoid unnecessary comments; code should be self-documenting when possible" and "Use comments to explain 'why', not 'what'".

🤖 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/api/src/utils/avatar-validator.ts` around lines 47 - 145, Remove the
procedural step comments (Step 1 through Step 9) throughout the avatar
validation function that merely restate what the code logic already expresses
clearly. Keep only comments that explain the rationale or design decisions
behind specific validation checks (such as why IP addresses are rejected or why
certain hosts are allowed). The variable names, control flow, and error messages
are sufficiently descriptive to make the code self-documenting without the step
narration.

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/api/src/utils/avatar-validator.ts`:
- Around line 101-114: The clearTimeout(timeoutId) call only executes when the
fetch succeeds, but if the fetch call throws an error, the timeout is never
cleared, causing timer accumulation. Wrap the fetch call in a try-finally block
where the try block contains the fetch request and the finally block contains
the clearTimeout(timeoutId) call. This ensures that regardless of whether the
fetch succeeds or throws an error, the timeout is always properly cleaned up.

---

Nitpick comments:
In `@apps/api/src/utils/avatar-validator.ts`:
- Around line 47-145: Remove the procedural step comments (Step 1 through Step
9) throughout the avatar validation function that merely restate what the code
logic already expresses clearly. Keep only comments that explain the rationale
or design decisions behind specific validation checks (such as why IP addresses
are rejected or why certain hosts are allowed). The variable names, control
flow, and error messages are sufficiently descriptive to make the code
self-documenting without the step narration.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx:
- Around line 2-14: The imports in this file are not organized according to the
project guidelines. Reorganize the imports at the top of the pricing page file
to follow this order: first React and React hooks (React, useEffect), then all
third-party library imports (next/image, next/link, next/navigation,
lucide-react icons, framer-motion, next/dynamic), followed by local component
imports (Header, ShineBorder, PrimaryButton, Features), and finally utility/lib
imports (trpc, formatApproxPlanPrice). Ensure each group is separated by a blank
line for clarity.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2b7c30ef-79ae-4514-b877-25a6a2419668

📥 Commits

Reviewing files that changed from the base of the PR and between 656b2fc and 07774e3.

⛔ Files ignored due to path filters (13)
  • apps/web/public/assets/features/10updates-n-opportunities.png is excluded by !**/*.png
  • apps/web/public/assets/features/11prorefs.png is excluded by !**/*.png
  • apps/web/public/assets/features/1onboardingcall.png is excluded by !**/*.png
  • apps/web/public/assets/features/2community.png is excluded by !**/*.png
  • apps/web/public/assets/features/3weeklysessions.png is excluded by !**/*.png
  • apps/web/public/assets/features/4unlimitedqna.png is excluded by !**/*.png
  • apps/web/public/assets/features/5promodules.png is excluded by !**/*.png
  • apps/web/public/assets/features/6weeklycontests.png is excluded by !**/*.png
  • apps/web/public/assets/features/7hand-pickedossprojects.png is excluded by !**/*.png
  • apps/web/public/assets/features/8prorecordings.png is excluded by !**/*.png
  • apps/web/public/assets/features/9pvtthreads.png is excluded by !**/*.png
  • apps/web/public/assets/features/pro-preview.svg is excluded by !**/*.svg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (8)
  • apps/api/src/utils/avatar-validator.ts
  • apps/web/src/app/(main)/(landing)/pricing/page.tsx
  • apps/web/src/components/faq/faqData.ts
  • apps/web/src/components/features/explore-features-browser-mockup.tsx
  • apps/web/src/components/features/explore-features-dashboard.tsx
  • apps/web/src/components/features/explore-features-data.ts
  • apps/web/src/components/features/explore-features-image-preview.tsx
  • apps/web/src/components/features/features.tsx
✅ Files skipped from review due to trivial changes (1)
  • apps/web/src/components/faq/faqData.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • apps/web/src/components/features/explore-features-browser-mockup.tsx
  • apps/web/src/components/features/features.tsx
  • apps/web/src/components/features/explore-features-image-preview.tsx
  • apps/web/src/components/features/explore-features-dashboard.tsx

Comment thread apps/api/src/utils/avatar-validator.ts Outdated
@apsinghdev
apsinghdev merged commit 9cd35cd into apsinghdev:main Jun 22, 2026
3 checks passed
@apsinghdev

Copy link
Copy Markdown
Owner

great work! @Aryan-205

pls share ur upi

MistakenPirate added a commit to MistakenPirate/opensox that referenced this pull request Jun 25, 2026
Conflict resolution:
- pricing/page.tsx: kept the revamp (ours). main's single-card
  "investment" design + "shareholders invested"/"slots booked"
  counter is the page this branch replaces; the two are
  incompatible redesigns, not line-mergeable.
- explore-features-* / features.tsx: took main's versions — they
  are the merged+polished superset (PR apsinghdev#406 + polish + img fix)
  of the commits cherry-picked here.
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.

[rvmp-4]: create a features showcase component for the pricing page

2 participants