Skip to content

feat(classic-chroma): add a Classic chroma picker to the native carousel - #347

Draft
ccccxp wants to merge 7 commits into
Alban1911:mainfrom
ccccxp:pr/classic-chroma
Draft

ccccxp wants to merge 7 commits into
Alban1911:mainfrom
ccccxp:pr/classic-chroma

Conversation

@ccccxp

@ccccxp ccccxp commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Merge order

This PR requires ClassicWheel #344. Please merge #344 first. This branch contains only its seven chroma commits and does not include any ClassicWheel commit.

What this adds

This adds a Rift Classic chroma button and picker using variants exposed by the current Classic catalog.

Selecting a chroma keeps its parent card centered, updates the control color and full-screen artwork, and sends the resource chroma ID through Rose's existing selection path. The control uses ClassicWheel's stable center-card host, preventing it from flashing on a side card, closing during unrelated refreshes, or appearing half-clipped.

Why a separate plugin

The regular ChromaWheel expects ordinary champion IDs and the regular card lifecycle. Classic variants come from the JADE catalog and must keep a separate carrier while their parent card moves through the fixed carousel.

ROSE-ClassicChroma owns only the Classic picker. It reuses ClassicWheel's catalog and navigation API instead of maintaining another list or navigator. The regular ChromaWheel remains unchanged outside Rift Classic and stays available as a fallback if the Classic plugin is unavailable. FormsWheel is untouched.

Carrier and resource compatibility

The picker stores resource chroma IDs and does not assume a carrier slot. With #344 alone it uses upstream's Skin0 + classic/ path. If #318 is present, the same selection follows Rose's automatic choice between native default + classic-native/ and Skin0 + classic/. This PR does not choose or mix carrier package families.

Validation

  • JavaScript syntax and changed Python module checks passed.
  • The carrier, wheel, history, random, and chroma branches merge together without conflicts.
  • Integrated live testing covered panel interaction, variant switching, parent-card stability, artwork synchronization, and injection.

Changed files

  • Pengu Loader/plugins/ROSE-ClassicChroma/index.js
  • Pengu Loader/plugins/ROSE-ChromaWheel/index.js
  • ui/chroma/classic_integration.py

Add the Classic chroma control as a separate plugin that consumes the ClassicWheel carousel movement API. Keep parent-card control stable while opening, previewing, selecting, or dismissing a chroma so the native carousel cannot fall back to a stale card.

The picker uses only chromas exposed by the current Classic catalog and publishes the selected resource ID through the existing backend selection path. Regular-mode ChromaWheel behavior is unchanged.

Source commit consolidated: f7f87916. Verification: the plugin passed node --check; parent-card fallback was previously exercised during live Classic selection.
Translate Classic chroma messages into the validated wheel selection pipeline, preserve owned chroma selection in LCU, and resolve chroma names correctly for history, random, and protected-target injection.

Validation: covered by final branch syntax and git diff checks. No separate live-client run is claimed for this commit.
Read variants and project selection through the shared Classic wheel API so the picker works with both native-carrier and Skin0 resource policies without maintaining a second catalog.

Validation: covered by final branch syntax and git diff checks. No separate live-client run is claimed for this commit.
Anchor the color button and picker to the selected native card and keep the panel open through wheel refreshes, preventing cropped buttons and immediate close/reopen flicker.

Validation: covered by final branch syntax and git diff checks. No separate live-client run is claimed for this commit.
Ignore Classic chroma messages until the shared wheel selection pipeline and catalog are available. This keeps the chroma PR independently mergeable without affecting regular ChromaWheel behavior.

Validation: covered by final branch syntax and git diff checks. No separate live-client run is claimed for this commit.
Mount the Classic chroma control in the wheel-owned stable host instead of a reused native card. Preserve explicit positioning inside that host so the button does not flash, move to a side card, or appear half-clipped during carousel transitions.

The plugin consumes only the carrier-independent ClassicWheel API and therefore supports both the upstream Skin0 policy and the optional native-carrier policy.

Validation:

- JavaScript syntax and git diff checks passed.

- Integrated live testing confirmed the surrounding chroma flow; the final host-follow correction addresses the observed transition artifact.
Publish the Classic chroma owner after the dedicated selector has initialized its bridge subscriptions and Classic wheel integration.

The regular ChromaWheel now stops its JADE scanner and removes its controls only when both a Classic session and the matching chroma owner are present. It remains unchanged in ordinary modes and remains the JADE fallback if the dedicated selector is unavailable.

FormsWheel is intentionally untouched because this PR does not provide a Classic replacement for form selection.

Validation: covered by final branch syntax and git diff checks. No separate live-client run is claimed for this commit.
@ccccxp
ccccxp force-pushed the pr/classic-chroma branch from 73017c9 to a8e1bea Compare October 18, 2026 14:43
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.

1 participant