Skip to content

Development#149

Merged
CodeMeAPixel merged 2 commits into
productionfrom
development
Jul 14, 2026
Merged

Development#149
CodeMeAPixel merged 2 commits into
productionfrom
development

Conversation

@CodeMeAPixel

@CodeMeAPixel CodeMeAPixel commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features

    • Added a unified games plan grid and a new partners page.
    • Added expandable Server Info panels to plan cards.
    • Added collapsible filters with active-filter counts for VPS and dedicated plans.
    • Improved sorting and filtering across VPS, dedicated, and game plan hubs.
    • Updated node listings to reflect status monitor data.
  • Bug Fixes

    • Improved plan card sizing and grid alignment.
    • Strengthened plan detail parsing for specifications, locations, CPUs, and storage.
    • Fixed HTML entity handling to prevent incorrect plan details.
  • Documentation

    • Updated security support information and added v3.7.0 release notes.

@dokploy-nodebyte

dokploy-nodebyte Bot commented Jul 14, 2026

Copy link
Copy Markdown

Dokploy Preview Deployment

Name Status Preview Updated (UTC)
ProductionSite ✅ Done Preview URL 2026-07-14T07:12:59.738Z

@CodeMeAPixel CodeMeAPixel self-assigned this Jul 14, 2026
@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The release updates version support documentation, changelog and package metadata, fixes HTML entity decoding order, and adds collapsible chip-based filtering with price-first defaults to VPS and Dedicated hubs. Game hub sorting now defaults to ascending price.

Changes

Release and plan discovery

Layer / File(s) Summary
Release metadata and parser handling
.github/SECURITY.md, CHANGELOG.md, package.json, packages/core/lib/spec-parser.ts
Updates v3.7.0 metadata, supported-version rows, release notes, and HTML entity unescaping order.
Collapsible VPS and Dedicated filters
packages/ui/components/ui/filter-chip.tsx, packages/ui/components/Layouts/VPS/vps-hub.tsx, packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx
Adds reusable filter chips and collapsible VPS/Dedicated filter panels with active counts, clear behavior, and price-first sorting.
Game hub price ordering
packages/ui/components/Layouts/Games/game-hub.tsx
Sets initial and cleared GameHub sorting to ascending price.

Estimated code review effort: 3 (Moderate) | ~20 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 33.33% 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 generic and does not describe the actual changes in the pull request. Use a concise title that names the main change, such as the new filter UI and release updates.
✅ 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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch development

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.

@CodeMeAPixel CodeMeAPixel added enhancement New feature or request dependencies Pull requests that update a dependency file labels Jul 14, 2026
@CodeMeAPixel CodeMeAPixel merged commit 9c0a5a6 into production Jul 14, 2026
8 of 9 checks passed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

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 (1)
packages/core/lib/spec-parser.ts (1)

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

Unescape-ordering fix is correct — consider a regression test.

Traced through the > example: the new order (leaf entities first, & last) correctly yields > where the old order collapsed it to >. Since this was a CodeQL-flagged bug and feeds parseDescriptionSpecs (whose missing fields cause plans to be silently dropped downstream in getVpsPlans/getDedicatedPlans), a small unit test asserting bulletLines/parseDescriptionSpecs handles >, <, " correctly would guard against a regression.

🤖 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 `@packages/core/lib/spec-parser.ts` around lines 54 - 64, Add a regression test
for the spec parsing flow, targeting the function that produces bullet lines or
parseDescriptionSpecs, with encoded inputs >, <, and ".
Assert these remain >, <, and " after parsing, while preserving the
existing unescape ordering in the implementation.
🤖 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 @.github/SECURITY.md:
- Around line 110-114: Update the version-support table in SECURITY.md to
explicitly classify 3.5.x, including the current baseline version 3.5.4, and
ensure the version ranges do not leave any release uncovered. Normalize the
“Support Until” wording across all rows, preserving the intended support dates
and unsupported status.

In `@packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx`:
- Around line 349-414: Update the Filters toggle and filter panel in
packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx#L349-L414 and
packages/ui/components/Layouts/VPS/vps-hub.tsx#L377-L397: associate each Button
with its Collapsible using CollapsibleTrigger asChild or matching aria-expanded
and aria-controls attributes, and assign a corresponding id to each panel. Keep
the existing filtersOpen toggle behavior intact.

In `@packages/ui/components/ui/filter-chip.tsx`:
- Around line 1-2: Update the FilterChip toggle button to include
aria-pressed={active}, exposing its current active state to assistive
technologies while preserving the existing styling and behavior.
- Around line 15-38: Update the toggleable button in FilterChip to include
aria-pressed={active}, exposing the existing active state to assistive
technologies while preserving the current click behavior and styling.

---

Nitpick comments:
In `@packages/core/lib/spec-parser.ts`:
- Around line 54-64: Add a regression test for the spec parsing flow, targeting
the function that produces bullet lines or parseDescriptionSpecs, with encoded
inputs >, <, and ". Assert these remain >, <, and
" after parsing, while preserving the existing unescape ordering in the
implementation.
🪄 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 Plus

Run ID: dbef729f-3125-4cad-999f-dda7aea7e87d

📥 Commits

Reviewing files that changed from the base of the PR and between d01aaaa and 9cda3f5.

📒 Files selected for processing (8)
  • .github/SECURITY.md
  • CHANGELOG.md
  • package.json
  • packages/core/lib/spec-parser.ts
  • packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx
  • packages/ui/components/Layouts/Games/game-hub.tsx
  • packages/ui/components/Layouts/VPS/vps-hub.tsx
  • packages/ui/components/ui/filter-chip.tsx

Comment thread .github/SECURITY.md
Comment on lines +110 to +114
| Version | Status | Support Until |
|---------|---------------|---------------|
| 3.7.x | Current | 3.8.x Release |
| 3.6.x | Security Only | ~ Aug 2026 |
| < 3.5 | Unsupported | End of life |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Version table leaves 3.5.x support status undefined.

< 3.5 excludes 3.5.x itself, and 3.6.x doesn't cover it either — so the version this PR is bumping from (3.5.4, per package.json) has no documented support status. Also worth tightening the inconsistent "Support Until" phrasing (3.8.x Release vs ~ Aug 2026 vs End of life).

📝 Proposed fix
 | Version | Status        | Support Until |
 |---------|---------------|---------------|
 | 3.7.x   | Current       | 3.8.x Release |
 | 3.6.x   | Security Only | Aug 2026      |
-| < 3.5   | Unsupported   | End of life   |
+| 3.5.x   | Unsupported   | End of life   |
+| < 3.5   | Unsupported   | End of life   |
📝 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
| Version | Status | Support Until |
|---------|---------------|---------------|
| 3.7.x | Current | 3.8.x Release |
| 3.6.x | Security Only | ~ Aug 2026 |
| < 3.5 | Unsupported | End of life |
| Version | Status | Support Until |
|---------|---------------|---------------|
| 3.7.x | Current | 3.8.x Release |
| 3.6.x | Security Only | Aug 2026 |
| 3.5.x | Unsupported | End of life |
| < 3.5 | Unsupported | End of life |
🤖 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 @.github/SECURITY.md around lines 110 - 114, Update the version-support table
in SECURITY.md to explicitly classify 3.5.x, including the current baseline
version 3.5.4, and ensure the version ranges do not leave any release uncovered.
Normalize the “Support Until” wording across all rows, preserving the intended
support dates and unsupported status.

Comment on lines +349 to +414
<Button
variant="outline"
size="sm"
onClick={() => setFiltersOpen((v) => !v)}
className="gap-1.5 bg-card/30 border-border/50"
>
<SlidersHorizontal className="w-3.5 h-3.5" />
Filters
{activeFilterCount > 0 && (
<Badge variant="secondary" className="ml-0.5 h-4 min-w-4 px-1 text-[10px]">
{activeFilterCount}
</Badge>
)}
<ChevronDown className={cn("w-3.5 h-3.5 transition-transform", filtersOpen && "rotate-180")} />
</Button>
{hasActiveFilters && (
<Button variant="ghost" size="sm" onClick={clearFilters} className="gap-1.5 text-muted-foreground">
<X className="w-3.5 h-3.5" /> Clear
</Button>
)}
</div>

{/* RAM tier row */}
<div className="flex flex-wrap gap-1.5 items-center">
<button
type="button"
onClick={() => setRam("ALL")}
className={cn(
"px-3 py-1 rounded-full text-xs font-medium border transition-all",
ram === "ALL"
? "border-primary/50 bg-primary/10 text-primary"
: "border-border/50 text-muted-foreground hover:border-border hover:text-foreground",
)}
>
All RAM
</button>
{availableRam.map((r) => (
<button
key={r}
type="button"
onClick={() => setRam(ram === r ? "ALL" : r)}
className={cn(
"px-3 py-1 rounded-full text-xs font-medium border transition-all",
ram === r
? "border-primary/50 bg-primary/10 text-primary"
: "border-border/50 text-muted-foreground hover:border-border hover:text-foreground",
)}
>
{r} GB
</button>
))}
</div>
<Collapsible open={filtersOpen} onOpenChange={setFiltersOpen}>
<CollapsibleContent>
<div className="rounded-xl border border-border/50 bg-card/20 p-4 space-y-3">
<FilterChipRow label="Price">
<div className="flex items-center gap-1.5">
<Input
type="number"
inputMode="decimal"
placeholder="Min £"
value={priceMin}
onChange={(e) => setPriceMin(e.target.value)}
className="w-24 h-7 bg-card/30 border-border/50 text-xs"
/>
<span className="text-muted-foreground text-sm">–</span>
<Input
type="number"
inputMode="decimal"
placeholder="Max £"
value={priceMax}
onChange={(e) => setPriceMax(e.target.value)}
className="w-24 h-7 bg-card/30 border-border/50 text-xs"
/>
</div>
</FilterChipRow>

<FilterChipRow label="RAM">
<FilterChip active={ram === "ALL"} onClick={() => setRam("ALL")}>All RAM</FilterChip>
{availableRam.map((r) => (
<FilterChip key={r} active={ram === r} onClick={() => setRam(ram === r ? "ALL" : r)}>
{r} GB
</FilterChip>
))}
</FilterChipRow>

<FilterChipRow label="Hardware">
{(["ALL", "amd", "intel"] as const).map((h) => (
<FilterChip key={h} active={hardware === h} onClick={() => setHardware(h)}>
{h === "ALL" ? "All Hardware" : h.toUpperCase()}
</FilterChip>
))}
</FilterChipRow>
</div>
</CollapsibleContent>
</Collapsible>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== dedicated-hub.tsx relevant lines ==\n'
sed -n '320,440p' packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx

printf '\n== vps-hub.tsx relevant lines ==\n'
sed -n '340,430p' packages/ui/components/Layouts/VPS/vps-hub.tsx

printf '\n== search for CollapsibleTrigger / aria-expanded / aria-controls in related UI ==\n'
rg -n "CollapsibleTrigger|aria-expanded|aria-controls|CollapsibleContent" packages/ui/components/Layouts packages/ui/components -g '*.tsx' | sed -n '1,200p'

Repository: NodeByteHosting/website

Length of output: 15968


Add disclosure ARIA to the Filters toggle in both hubs.

The current plain Button only toggles filtersOpen; it doesn’t expose aria-expanded/aria-controls for the filter panel. Use CollapsibleTrigger asChild or add those attributes plus a matching panel id in:

  • packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx#L349-L414
  • packages/ui/components/Layouts/VPS/vps-hub.tsx#L377-L397
📍 Affects 2 files
  • packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx#L349-L414 (this comment)
  • packages/ui/components/Layouts/VPS/vps-hub.tsx#L377-L397
🤖 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 `@packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx` around lines 349
- 414, Update the Filters toggle and filter panel in
packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx#L349-L414 and
packages/ui/components/Layouts/VPS/vps-hub.tsx#L377-L397: associate each Button
with its Collapsible using CollapsibleTrigger asChild or matching aria-expanded
and aria-controls attributes, and assign a corresponding id to each panel. Keep
the existing filtersOpen toggle behavior intact.

Comment on lines +1 to +2
import type { ReactNode } from "react"
import { cn } from "@/lib/utils"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check tsconfig path aliases and how sibling ui/ files import `cn`
fd tsconfig.json --max-depth 2 -x cat {}
echo "---"
rg -n "from ['\"]`@/lib/utils`['\"]|from ['\"]`@/packages/core/lib/utils`['\"]" packages/ui/components/ui

Repository: NodeByteHosting/website

Length of output: 5130


🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="packages/ui/components/ui/filter-chip.tsx"
wc -l "$file"
echo "---"
cat -n "$file"

Repository: NodeByteHosting/website

Length of output: 1612


Add aria-pressed to the filter toggle

FilterChip is a toggle button, so set aria-pressed={active} to expose its on/off state to assistive tech.

🤖 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 `@packages/ui/components/ui/filter-chip.tsx` around lines 1 - 2, Update the
FilterChip toggle button to include aria-pressed={active}, exposing its current
active state to assistive technologies while preserving the existing styling and
behavior.

Comment on lines +15 to +38
export function FilterChip({
active,
onClick,
children,
}: {
active: boolean
onClick: () => void
children: ReactNode
}) {
return (
<button
type="button"
onClick={onClick}
className={cn(
"px-3 py-1 rounded-full text-xs font-medium border transition-all",
active
? "border-primary/50 bg-primary/10 text-primary"
: "border-border/50 text-muted-foreground hover:border-border hover:text-foreground",
)}
>
{children}
</button>
)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

set -euo pipefail

echo '--- filter-chip.tsx ---'
sed -n '1,220p' packages/ui/components/ui/filter-chip.tsx

echo
echo '--- usages of FilterChip ---'
rg -n "FilterChip" packages -g '!**/dist/**' -g '!**/build/**'

echo
echo '--- nearby aria patterns in ui components ---'
rg -n "aria-pressed|role=\"switch\"|aria-selected|role=\"tab\"" packages/ui -g '!**/dist/**' -g '!**/build/**'

Repository: NodeByteHosting/website

Length of output: 5491


🏁 Script executed:

set -euo pipefail
pwd
git ls-files packages/ui/components/ui/filter-chip.tsx
sed -n '1,120p' packages/ui/components/ui/filter-chip.tsx
rg -n "FilterChip" packages -g '!**/dist/**' -g '!**/build/**'

Repository: NodeByteHosting/website

Length of output: 5337


Add aria-pressed to expose the active state.

FilterChip is a toggleable button, but active is only reflected visually. Add aria-pressed={active} so screen readers can announce which filters are selected.

🤖 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 `@packages/ui/components/ui/filter-chip.tsx` around lines 15 - 38, Update the
toggleable button in FilterChip to include aria-pressed={active}, exposing the
existing active state to assistive technologies while preserving the current
click behavior and styling.

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

Labels

dependencies Pull requests that update a dependency file enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant