Skip to content

feat(rebemer): add All-in-one (mixed) mode with per-row op toggle and family picker - #226

Merged
jackgranatowski merged 4 commits into
mainfrom
claude/rebemer-all-in-one-mode-lUZ5y
Jun 4, 2026
Merged

feat(rebemer): add All-in-one (mixed) mode with per-row op toggle and family picker#226
jackgranatowski merged 4 commits into
mainfrom
claude/rebemer-all-in-one-mode-lUZ5y

Conversation

@jackgranatowski

@jackgranatowski jackgranatowski commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

New 'mixed' mode in the reBEMer panel lets users assign BEM classes to a
subtree where some elements already have classes — without forcing a single
operation across every row.

  • All rows default to Add. The user opts in to Rename or Replace per row
    via a compact three-button toggle rendered inline on each row.
  • Rename targets a specific "class family" (base class + its --modifier
    siblings). When an element has multiple unrelated families a lets the user pick which one; unrelated classes are kept untouched. Replace strips ALL existing classes and attaches only the new BEM class — serving as both a fresh-start Add and a full-element clean slate. apply.js: 'mixed' added to VALID_MODES; per-op effectiveMode dispatch in applyToSubtree; rename branch uses renameFamilyId for the source class and iterates all currentIds rather than assuming index-0 is the base. BemPanel: readCurrentClassIds/findFirstFamilyId helpers; new currentClassIds, op, renameFamilyId fields seeded on mount; All-in-one option in mode select. Row: currentFamilies derived value; $effect to keep renameFamilyId valid; per-row op toggle + family picker + contextual notes, all gated on isMixed. panel.css: rebemer-row__op-toggle/btn and rebemer-row__family styles. docs/rebemer.md: implementation status and §6.3 table updated. https://claude.ai/code/session_013GzAkod2MTBtqia44QhStB Summary by CodeRabbit New Features All-in-one (Mixed) mode now shipped, enabling per-row operation selection (Add, Rename, Replace) with targeted class handling for each row. Style Improved editor UI layout with responsive grid wrapping and enhanced styling for operation mode controls and family selection.

claude added 2 commits June 4, 2026 14:51
… family picker

New 'mixed' mode in the reBEMer panel lets users assign BEM classes to a
subtree where some elements already have classes — without forcing a single
operation across every row.

- All rows default to Add. The user opts in to Rename or Replace per row
  via a compact three-button toggle rendered inline on each row.
- Rename targets a specific "class family" (base class + its --modifier
  siblings). When an element has multiple unrelated families a <select>
  lets the user pick which one; unrelated classes are kept untouched.
- Replace strips ALL existing classes and attaches only the new BEM class —
  serving as both a fresh-start Add and a full-element clean slate.
- apply.js: 'mixed' added to VALID_MODES; per-op effectiveMode dispatch in
  applyToSubtree; rename branch uses renameFamilyId for the source class and
  iterates all currentIds rather than assuming index-0 is the base.
- BemPanel: readCurrentClassIds/findFirstFamilyId helpers; new currentClassIds,
  op, renameFamilyId fields seeded on mount; All-in-one option in mode select.
- Row: currentFamilies derived value; $effect to keep renameFamilyId valid;
  per-row op toggle + family picker + contextual notes, all gated on isMixed.
- panel.css: rebemer-row__op-toggle/btn and rebemer-row__family styles.
- docs/rebemer.md: implementation status and §6.3 table updated.

https://claude.ai/code/session_013GzAkod2MTBtqia44QhStB
…mode

When an element has multiple unrelated class families, Replace now shows
the same family picker as Rename (with an "All classes" default).
Choosing a specific family strips only that family's base + modifiers
and keeps unrelated classes — mirroring how Rename preserves them but
without seeding the new class from old settings.

https://claude.ai/code/session_013GzAkod2MTBtqia44QhStB
@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

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

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

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ 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.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 72b81d86-cb64-45eb-8571-51f3e464782e

📥 Commits

Reviewing files that changed from the base of the PR and between 63827f5 and f3dc7ea.

📒 Files selected for processing (5)
  • docs/rebemer.md
  • plugins/SLASHED-for-WP/integrations/bricks/assets/editor-app/app.js
  • plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/BemPanel.svelte
  • plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/Row.svelte
  • plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js
📝 Walkthrough

Walkthrough

This PR introduces a new "All-in-one (Mixed)" operation mode for the reBEMer editor, enabling per-row selection of add, rename, or replace operations. Each row can target a specific class family for rename/replace behavior, with mode-aware class manipulation and selective family-based stripping.

Changes

All-in-one (Mixed) Operation Mode

Layer / File(s) Summary
Mode support and Row data contracts
plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js
VALID_MODES now includes 'mixed', and the Row JSDoc contract is extended with op (per-row operation), currentClassIds (for family detection), and renameFamilyId (family-specific rename target).
Mixed mode apply logic and class manipulation
plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js
In applyToSubtree, per-row effectiveMode is computed when top-level mode is 'mixed'. Seed selection and migrate merge now use effectiveMode. Rename operation retargets compatible modifier classes within the selected family while preserving unrelated classes. Replace operation selectively strips only the targeted family's base+modifier classes. Migrate key removal aligns with per-row operation.
BemPanel seeding with family detection
plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/BemPanel.svelte
MODE_HINTS is extended with mixed mode. Helper functions extract current global class IDs and detect the first non-modifier class family. Rows are seeded with currentClassIds and renameFamilyId derived from element settings at open. Mixed mode option is added to the operation-mode selector.
Row UI controls for mixed mode
plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/Row.svelte
Derived state tracks isMixed flag and computes currentFamilies from row.currentClassIds. An effect keeps row.renameFamilyId valid. Conditional UI renders operation toggle buttons (add/rename/replace), a family selector when multiple families exist, and role-based info/warning messages.
Styling for operation controls
plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/styles/panel.css
Added CSS for operation toggle button group (segmented, selected state, hover), family picker layout (label, full-width select with focus), and inline code styling in row-level notes.
Grid layout update and documentation
plugins/SLASHED-for-WP/integrations/bricks/assets/editor-app/app.css, docs/rebemer.md
Class picker grid changed from fixed 2-column to responsive auto-fill layout. Documentation marks mixed mode as shipped in v1 and extends the operation modes table with per-row behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • codeslash-dev/SLASHED#125: Directly extends the reBEMer MVP codebase by adding the new mixed per-row operation mode to the same core apply.js, BemPanel, and Row components.
  • codeslash-dev/SLASHED#209: Both PRs modify the same editor-app apply pipeline and component mode handling by extending apply.js and Row.svelte/BemPanel.svelte with mode-driven behavior changes.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title clearly summarizes the main change: introducing an All-in-one (mixed) mode feature with per-row operation toggle and family picker functionality.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/rebemer-all-in-one-mode-lUZ5y

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.

- Replace null sentinel with empty string in Replace family picker
  (<option value={null}> risks DOM serialisation to "null" string;
  empty string is always falsy and safe across all environments)
- Replace on 0-class element now shows "No existing classes — a new
  class will be created" instead of the misleading removal warning
- Single-family Rename note only appends "Other classes kept" when
  there actually are more class IDs than the family covers

https://claude.ai/code/session_013GzAkod2MTBtqia44QhStB

@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 (3)
plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js (2)

166-167: 💤 Low value

JSDoc type annotation doesn't include 'mixed'.

The @param type for opts.mode is 'add'|'rename'|'replace'|'migrate' but 'mixed' is now valid per VALID_MODES. Same issue exists at line 252 for applyToSubtree.

📝 Suggested fix
- * `@param` {'add'|'rename'|'replace'|'migrate'} opts.mode
+ * `@param` {'add'|'rename'|'replace'|'migrate'|'mixed'} opts.mode
🤖 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 `@plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js`
around lines 166 - 167, Update the JSDoc for opts.mode to include the 'mixed'
value (so it matches VALID_MODES) in both the apply function and applyToSubtree
function declarations; locate the JSDoc blocks above the apply and
applyToSubtree functions in apply.js and change the `@param` type union from
'add'|'rename'|'replace'|'migrate' to include 'mixed' as well.

2-10: 💤 Low value

Update the module docstring to reflect five modes.

The header says "Four modes" but 'mixed' is now a valid fifth mode. Consider updating the intro and adding a brief description of mixed mode semantics.

🤖 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 `@plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js`
around lines 2 - 10, Update the module docstring at the top of apply.js to say
"Five modes" instead of "Four modes" and add a one-line description of the new
mixed mode; specifically, extend the modes list (add, rename, replace, migrate)
with "mixed — <brief semantics>" where "mixed" explains its behavior (e.g.,
combine add and migrate semantics: attach new BEM classes while preserving
existing classes and selectively lifting allowlisted element-settings into a
global class, or whatever the exact project semantics are), and ensure the intro
and modes enumeration reflect the addition of mixed so readers know there are
now five modes.
plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/Row.svelte (1)

207-230: ⚡ Quick win

Expose mixed op-toggle state to assistive tech.

The selected Add/Rename/Replace state is visual-only. Add aria-pressed per button (and ideally a group label) so screen readers can perceive which operation is active.

Suggested markup adjustment
-    <div class="rebemer-row__op-toggle">
+    <div class="rebemer-row__op-toggle" role="group" aria-label="Operation">
       <button
         type="button"
         class="rebemer-row__op-btn"
         class:rebemer-row__op-btn--on={row.op === 'add'}
+        aria-pressed={row.op === 'add'}
         onclick={() => { row.op = 'add'; }}
       >+ Add</button>
       <button
         type="button"
         class="rebemer-row__op-btn"
         class:rebemer-row__op-btn--on={row.op === 'rename'}
+        aria-pressed={row.op === 'rename'}
         onclick={() => {
           row.op = 'rename';
           if (!row.renameFamilyId && currentFamilies.length) {
             row.renameFamilyId = currentFamilies[0].id;
           }
         }}
       >→ Rename</button>
       <button
         type="button"
         class="rebemer-row__op-btn"
         class:rebemer-row__op-btn--on={row.op === 'replace'}
+        aria-pressed={row.op === 'replace'}
         onclick={() => { row.op = 'replace'; row.renameFamilyId = null; }}
       >× Replace</button>
     </div>
🤖 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
`@plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/Row.svelte`
around lines 207 - 230, The op-toggle buttons in Row.svelte are only visually
indicated and need ARIA so assistive tech can perceive the selected state;
update each button (the elements with class "rebemer-row__op-btn" that set
row.op in their onclick handlers) to include aria-pressed={row.op ===
'add'|'rename'|'replace'} as appropriate and wrap/mark the group with an
accessible label (e.g., add role="radiogroup" and aria-label or aria-labelledby)
so screen readers know this is an exclusive choice; also ensure when you set
row.op in the onclick for the Rename and Replace handlers you keep aria state in
sync (renameFamilyId handling remains unchanged).
🤖 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 `@docs/rebemer.md`:
- Line 200: The docs sentence "Replace strips *all* old classes" is inaccurate
for mixed mode; update the docs text to explain that Replace can operate two
ways: when renameFamilyId is null it strips all old classes, but when
renameFamilyId is set (per the Row.svelte picker logic and commit 2) it only
strips the selected family's base + modifiers and preserves unrelated classes;
reference the Replace operation and the renameFamilyId flag (and Row.svelte
behavior) and change the phrasing to clearly state both behaviors.

In `@plugins/SLASHED-for-WP/integrations/bricks/assets/editor-app/app.css`:
- Line 1: The PR layer description incorrectly references the "class picker"
while the diff modifies the color picker quick-use grid (.slashed-cp__qu-grid)
used by ColorPanel.svelte; either correct the description to state that the
change updates the color picker's quick-use swatch grid from a fixed 2-column
layout to a responsive auto-fill layout, or remove/relocate this CSS change from
this PR if it was meant for a different cohort. Locate the rule for
.slashed-cp__qu-grid and the ColorPanel.svelte usage to decide whether to update
the commit message/PR description or move the change to the proper branch/PR.
Ensure the updated layer description clearly names ".slashed-cp__qu-grid" and
"ColorPanel.svelte" if you keep the change here.

In
`@plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/BemPanel.svelte`:
- Line 41: The hint string labeled 'mixed' in BemPanel.svelte is outdated and
incorrectly states Replace always strips all classes; update the 'mixed' copy to
reflect the current mixed replace behavior (Replace can target the selected
class family and will keep unrelated classes). Locate the 'mixed' entry (the
key/value with the long hint text) and change its message to clarify that
per-row controls default to Add, rows can be switched to Rename (targets one
class family, keeps others) or Replace (targets the selected class family while
preserving unrelated classes).

---

Nitpick comments:
In
`@plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/Row.svelte`:
- Around line 207-230: The op-toggle buttons in Row.svelte are only visually
indicated and need ARIA so assistive tech can perceive the selected state;
update each button (the elements with class "rebemer-row__op-btn" that set
row.op in their onclick handlers) to include aria-pressed={row.op ===
'add'|'rename'|'replace'} as appropriate and wrap/mark the group with an
accessible label (e.g., add role="radiogroup" and aria-label or aria-labelledby)
so screen readers know this is an exclusive choice; also ensure when you set
row.op in the onclick for the Rename and Replace handlers you keep aria state in
sync (renameFamilyId handling remains unchanged).

In `@plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js`:
- Around line 166-167: Update the JSDoc for opts.mode to include the 'mixed'
value (so it matches VALID_MODES) in both the apply function and applyToSubtree
function declarations; locate the JSDoc blocks above the apply and
applyToSubtree functions in apply.js and change the `@param` type union from
'add'|'rename'|'replace'|'migrate' to include 'mixed' as well.
- Around line 2-10: Update the module docstring at the top of apply.js to say
"Five modes" instead of "Four modes" and add a one-line description of the new
mixed mode; specifically, extend the modes list (add, rename, replace, migrate)
with "mixed — <brief semantics>" where "mixed" explains its behavior (e.g.,
combine add and migrate semantics: attach new BEM classes while preserving
existing classes and selectively lifting allowlisted element-settings into a
global class, or whatever the exact project semantics are), and ensure the intro
and modes enumeration reflect the addition of mixed so readers know there are
now five modes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2226b40a-fd5b-41fd-ae43-06436988655a

📥 Commits

Reviewing files that changed from the base of the PR and between bc10ccb and 63827f5.

📒 Files selected for processing (7)
  • docs/rebemer.md
  • plugins/SLASHED-for-WP/integrations/bricks/assets/editor-app/app.css
  • plugins/SLASHED-for-WP/integrations/bricks/assets/editor-app/app.js
  • plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/BemPanel.svelte
  • plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/Row.svelte
  • plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js
  • plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/styles/panel.css

Comment thread docs/rebemer.md Outdated
@@ -1 +1 @@
#slashed-rebemer-host{--rebemer-bg: #161a1d;--rebemer-fg: #e1e1e1;--rebemer-fg-muted: #8a8d95;--rebemer-border: #3d4752;--rebemer-accent: #e2b93b;--rebemer-accent-hover: #ffd042;--rebemer-input-bg: #293038;--rebemer-input-border: #3d4752;--rebemer-error: #ff4c4c;--rebemer-success: #4ade80;--rebemer-radius: 4px;--rebemer-font: "Inter", -apple-system, BlinkMacSystemFont, sans-serif}.rebemer-badge-host{display:inline-flex;align-items:center;align-self:center;flex:0 0 auto;margin:0 4px;opacity:0;pointer-events:none;transition:opacity 80ms linear}.structure-item:hover .rebemer-badge-host,.structure-item:focus-within .rebemer-badge-host,li[data-id]:hover>.rebemer-badge-host,li[data-id]:focus-within>.rebemer-badge-host{opacity:1;pointer-events:auto}.rebemer-badge{font:600 9px/1 var(--rebemer-font, "Inter", -apple-system, BlinkMacSystemFont, sans-serif);letter-spacing:0;text-transform:none;color:var(--rebemer-fg-muted, #8a8d95);display:inline;background:transparent;padding:1px 3px;margin:0;cursor:pointer;border-radius:2px;pointer-events:auto}.rebemer-badge:hover{color:var(--rebemer-accent, #e2b93b);background:#e2b93b14}.rebemer-badge:focus-visible{outline:1px dotted var(--rebemer-accent, #e2b93b);outline-offset:1px;color:var(--rebemer-accent, #e2b93b)}.rebemer-panel{position:fixed;top:80px;left:50%;transform:translate(-50%);width:440px;max-width:calc(100vw - 40px);max-height:80vh;z-index:100000;background:var(--rebemer-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);box-shadow:0 10px 40px #0009;display:flex;flex-direction:column;font:12px/1.45 var(--rebemer-font);overflow:hidden;outline:none}.rebemer-panel__header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--rebemer-border)}.rebemer-panel__title{margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:#fff}.rebemer-panel__subject{color:var(--rebemer-accent);text-transform:none;font-weight:500}.rebemer-panel__close{background:transparent;border:0;font-size:18px;color:var(--rebemer-fg-muted);cursor:pointer;padding:2px 6px}.rebemer-panel__close:hover{color:#fff}.rebemer-panel__toolbar{padding:10px 14px;display:flex;gap:12px;align-items:center;flex-wrap:wrap;border-bottom:1px solid var(--rebemer-border)}.rebemer-field{display:flex;flex-direction:column;gap:4px;font-size:11px}.rebemer-field--inline{flex-direction:row;align-items:center;gap:6px}.rebemer-field__label{color:var(--rebemer-fg-muted);text-transform:uppercase;letter-spacing:.5px;font-size:10px}.rebemer-field select,.rebemer-field input[type=text]{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg);padding:4px 6px;font:inherit}.rebemer-field select:focus,.rebemer-field input:focus{outline:1px solid var(--rebemer-accent)}.rebemer-panel__mode-hint{margin:0;padding:5px 14px;font-size:11px;color:var(--rebemer-fg-muted);background:var(--rebemer-bg);border-bottom:1px solid var(--rebemer-border);line-height:1.4}.rebemer-panel__notice{margin:0;padding:8px 14px;background:#e2b93b14;border-bottom:1px solid var(--rebemer-border);color:var(--rebemer-fg);font-size:11px;line-height:1.5}.rebemer-panel__notice--warn{background:#e2b93b29}.rebemer-panel__notice strong{color:var(--rebemer-accent);font-weight:600}.rebemer-panel__notice-skip{display:block;margin-top:2px;color:var(--rebemer-fg-muted)}.rebemer-panel__body{flex:1;overflow-y:auto;padding:8px 14px;display:flex;flex-direction:column;gap:6px}.rebemer-row{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--rebemer-radius);background:#ffffff05;margin-left:calc(var(--rebemer-row-depth, 0) * 12px)}.rebemer-row:hover{background:#ffffff0a}.rebemer-row--disabled{opacity:.45}.rebemer-row__include input{cursor:pointer}.rebemer-row__meta{display:flex;gap:6px;align-items:baseline;min-width:0}.rebemer-row__label{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rebemer-row__type{font-size:9px;color:var(--rebemer-fg-muted);text-transform:uppercase;letter-spacing:.3px}.rebemer-row__type--toggle{background:transparent;border:0;padding:1px 3px;border-radius:2px;cursor:pointer;line-height:1}.rebemer-row__type--toggle:hover:not(:disabled){color:var(--rebemer-fg);background:#ffffff0f}.rebemer-row__type--toggle:disabled{cursor:default;opacity:.5}.rebemer-row__type--block{color:var(--rebemer-accent);background:#e2b93b1f}.rebemer-row__type--block:hover:not(:disabled){background:#e2b93b33}.rebemer-row__hint{font-size:9px;color:var(--rebemer-accent);text-transform:uppercase;letter-spacing:.5px;background:#e2b93b1f;padding:1px 4px;border-radius:2px}.rebemer-row__inputs{grid-column:1 / -1;display:flex;gap:6px;align-items:center}.rebemer-row__name{flex:1;display:flex;align-items:stretch;background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);overflow:hidden}.rebemer-row__prefix{padding:4px 6px;background:#00000040;color:var(--rebemer-fg-muted);font-size:11px;border-right:1px solid var(--rebemer-input-border);white-space:nowrap}.rebemer-row__name input{background:transparent;border:0;outline:0;color:var(--rebemer-fg);font:inherit;padding:4px 6px;flex:1;min-width:0}.rebemer-row--suggested .rebemer-row__name input:not(:focus){color:var(--rebemer-fg-muted);font-style:italic}.rebemer-row__modifier{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg);font:inherit;padding:4px 6px;width:90px}.rebemer-row__modifiers{display:flex;flex-direction:column;gap:4px;flex:1}.rebemer-row__modifier-row{display:flex;align-items:center;gap:4px}.rebemer-row__modifier-row .rebemer-row__modifier{flex:1;width:auto}.rebemer-row__modifier-remove{background:transparent;border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg-muted);font-size:13px;line-height:1;padding:2px 6px;cursor:pointer;flex:0 0 auto}.rebemer-row__modifier-remove:hover:not(:disabled){border-color:var(--rebemer-error);color:var(--rebemer-error)}.rebemer-row__modifier-add{background:transparent;border:1px dashed var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg-muted);font:inherit;font-size:10px;padding:3px 7px;cursor:pointer;text-align:left;width:fit-content}.rebemer-row__modifier-add:hover:not(:disabled){border-color:var(--rebemer-fg-muted);color:var(--rebemer-fg)}.rebemer-row__recommend{grid-column:1 / -1;margin:0;padding:6px 8px;background:#4ade8014;border-left:2px solid var(--rebemer-success);border-radius:2px;color:var(--rebemer-fg);font-size:11px;line-height:1.4}.rebemer-row__recommend code{background:#0000004d;padding:1px 4px;border-radius:2px;font:11px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-accent)}.rebemer-row__warn,.rebemer-row__info{grid-column:1 / -1;margin:0;padding:5px 8px;font-size:11px;line-height:1.4;border-radius:2px}.rebemer-row__warn{background:#e2b93b1f;border-left:2px solid #e2b93b;color:var(--rebemer-fg)}.rebemer-row__info{background:#63b3ed1a;border-left:2px solid #63b3ed;color:var(--rebemer-fg-muted)}.rebemer-row__chips{grid-column:1 / -1;display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:4px 0 0;font-size:10px}.rebemer-row__chips-label,.rebemer-row__chips-empty,.rebemer-row__chips-skip{color:var(--rebemer-fg-muted);text-transform:uppercase;letter-spacing:.5px;font-size:9px}.rebemer-row__chips-skip{margin-left:auto;cursor:help;color:#c8a038}.rebemer-chip{font:10px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:#0000004d;border:1px solid var(--rebemer-input-border);color:var(--rebemer-fg);padding:2px 5px;border-radius:2px;white-space:nowrap}.rebemer-panel__footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid var(--rebemer-border)}.rebemer-btn{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);color:var(--rebemer-fg);padding:6px 12px;border-radius:var(--rebemer-radius);font:inherit;cursor:pointer}.rebemer-btn:hover{border-color:var(--rebemer-fg-muted)}.rebemer-btn--primary{background:var(--rebemer-accent);border-color:var(--rebemer-accent);color:var(--rebemer-bg);font-weight:600}.rebemer-btn--primary:hover{background:var(--rebemer-accent-hover);border-color:var(--rebemer-accent-hover)}.rebemer-toast{position:fixed;bottom:16px;right:16px;z-index:100002;background:var(--rebemer-input-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);padding:8px 12px;font:12px/1.45 var(--rebemer-font);cursor:pointer;box-shadow:0 4px 12px #0006}.rebemer-toast--success{border-color:var(--rebemer-success)}.rebemer-toast--error{border-color:var(--rebemer-error);color:var(--rebemer-error)}.rebemer-class-hint{position:fixed;z-index:100003;max-width:280px;background:var(--rebemer-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);padding:8px 10px;font:12px/1.45 var(--rebemer-font);box-shadow:0 6px 20px #00000080;pointer-events:none}.rebemer-class-hint[hidden]{display:none}.rebemer-class-hint__name{font:600 11px/1.3 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-accent)}.rebemer-class-hint__cat{margin-left:6px;font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.rebemer-class-hint__cat[hidden]{display:none}.rebemer-class-hint__desc{margin:4px 0 0;color:var(--rebemer-fg)}.slashed-cp-launch{position:fixed;right:16px;bottom:16px;z-index:99999;display:inline-flex;align-items:center;gap:7px;padding:7px 12px;background:var(--rebemer-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:999px;font:600 11px/1 var(--rebemer-font);letter-spacing:.3px;cursor:pointer;box-shadow:0 4px 16px #00000073;transition:border-color .12s,color .12s,transform .12s}.slashed-cp-launch:hover{border-color:var(--rebemer-fg-muted);transform:translateY(-1px)}.slashed-cp-launch--on{border-color:var(--rebemer-accent);color:#fff}.slashed-cp-launch__dot{width:12px;height:12px;border-radius:50%;background:conic-gradient(from 210deg,#5b8cff,#b07cff,#ff6b6b,#ffd24a,#4ade80,#5b8cff);box-shadow:inset 0 0 0 1px #ffffff40}.slashed-cp-launch__txt{text-transform:uppercase}.slashed-cp{position:fixed;top:64px;right:16px;bottom:64px;width:372px;max-width:calc(100vw - 32px);z-index:100001;display:flex;flex-direction:column;background:var(--rebemer-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);box-shadow:0 12px 48px #0009;font:12px/1.45 var(--rebemer-font);overflow:hidden;outline:none}.slashed-cp__header{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--rebemer-border)}.slashed-cp__title{margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:#fff;flex:1}.slashed-cp__close{background:transparent;border:0;font-size:18px;line-height:1;color:var(--rebemer-fg-muted);cursor:pointer;padding:2px 4px}.slashed-cp__close:hover{color:#fff}.slashed-cp__seg{display:inline-flex;border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);overflow:hidden}.slashed-cp__seg-btn{background:var(--rebemer-input-bg);border:0;border-left:1px solid var(--rebemer-input-border);color:var(--rebemer-fg-muted);font:600 10px/1 var(--rebemer-font);padding:5px 9px;cursor:pointer;text-transform:uppercase;letter-spacing:.4px}.slashed-cp__seg-btn:first-child{border-left:0}.slashed-cp__seg-btn--on{background:var(--rebemer-accent);color:var(--rebemer-bg)}.slashed-cp__toolbar{display:flex;flex-direction:column;gap:8px;padding:10px 12px;border-bottom:1px solid var(--rebemer-border)}.slashed-cp__search{width:100%;background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg);font:inherit;padding:6px 8px;box-sizing:border-box}.slashed-cp__search:focus{outline:1px solid var(--rebemer-accent)}.slashed-cp__target{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.slashed-cp__target-label{font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.slashed-cp__chip{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:999px;color:var(--rebemer-fg-muted);font:600 10px/1 var(--rebemer-font);padding:4px 10px;cursor:pointer}.slashed-cp__chip--on{background:var(--rebemer-accent);border-color:var(--rebemer-accent);color:var(--rebemer-bg)}.slashed-cp__body{flex:1;overflow-y:auto;padding:6px 12px 12px}.slashed-cp__empty{color:var(--rebemer-fg-muted);font-size:11px;padding:12px 2px}.slashed-cp__group{padding:10px 0 6px;border-bottom:1px solid rgba(255,255,255,.05)}.slashed-cp__group:last-child{border-bottom:0}.slashed-cp__group-head{margin:0 0 8px}.slashed-cp__group-title{display:flex;align-items:baseline;gap:7px;margin:0;font-size:11px;font-weight:700;color:#fff;text-transform:capitalize}.slashed-cp__group-tag{font-size:10px;font-weight:500;color:var(--rebemer-fg-muted);text-transform:none}.slashed-cp__group-count{margin-left:auto;font:600 9px/1 var(--rebemer-font);color:var(--rebemer-fg-muted);background:#ffffff0f;border-radius:999px;padding:2px 6px;text-transform:none}.slashed-cp__group-use{margin:2px 0 0;font-size:10px;line-height:1.4;color:var(--rebemer-fg-muted)}.slashed-cp__section-label{margin:8px 0 5px;font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.slashed-cp__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(38px,1fr));gap:7px 6px}.slashed-cp__cell{display:flex;flex-direction:column;align-items:center;gap:3px;min-width:0}.slashed-cp__cap{font-size:9px;color:var(--rebemer-fg-muted);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slashed-cp__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.slashed-cp__list-item{display:flex;align-items:center;gap:8px}.slashed-cp__list-name{font-size:11px;color:var(--rebemer-fg);flex:0 0 auto}.slashed-cp__list-var{font:10px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-fg-muted);margin-left:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slashed-cp-swatch{width:28px;height:28px;flex:0 0 auto;padding:0;border:1px solid rgba(127,127,127,.45);border-radius:6px;background:none;cursor:pointer;position:relative;overflow:hidden}.slashed-cp-swatch:hover{border-color:var(--rebemer-accent)}.slashed-cp-swatch:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:1px}.slashed-cp-swatch__fill{position:absolute;inset:0;background:var(--cp-solid)}.slashed-cp-swatch--split .slashed-cp-swatch__fill{background:linear-gradient(135deg,var(--cp-l) 0 calc(50% - .5px),rgba(0,0,0,.35) calc(50% - .5px) calc(50% + .5px),var(--cp-d) calc(50% + .5px) 100%)}.slashed-cp-swatch--alpha{border-style:dashed}.slashed-cp__footer{display:flex;align-items:center;gap:10px;padding:8px 12px;border-top:1px solid var(--rebemer-border);font-size:10px;color:var(--rebemer-fg-muted)}.slashed-cp__hint{margin-left:auto}.slashed-cp__hint code,.slashed-cp__footer code{font:10px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-accent)}.slashed-cp__legend{display:inline-flex;align-items:center;gap:5px}.slashed-cp__legend-sw{width:12px;height:12px;border-radius:3px;border:1px solid rgba(127,127,127,.45);background:linear-gradient(135deg,#fff 0 50%,#222 50% 100%)}.rebemer-toast--info{border-color:#63b3ed}.slashed-sf-color-btn{display:inline-flex;align-items:center;justify-content:center;flex:0 0 28px;min-width:28px;width:28px;height:28px;border-radius:5px;cursor:pointer;opacity:.6;transition:opacity .12s,background .12s}.slashed-sf-color-btn:hover{opacity:1;background:#5b8cff26}.slashed-sf-color-btn--active{opacity:1}.slashed-sf-color-btn--active:hover{background:#ffffff0f}.slashed-sf-color-btn__dot{display:inline-block;width:20px;height:20px;border-radius:50%;background:conic-gradient(from 210deg,#5b8cff,#b07cff,#ff6b6b,#ffd24a,#4ade80,#5b8cff);box-shadow:inset 0 0 0 1px #fff3;flex-shrink:0;transition:width 80ms,height 80ms,border-radius .12s}.slashed-sf-color-btn--active .slashed-sf-color-btn__dot{width:28px;height:28px;border-radius:5px;transition:width 80ms,height 80ms,border-radius .12s;box-shadow:inset 0 0 0 1px #0000002e,0 0 0 1.5px #ffffff38}.slashed-var-swatch{flex:0 0 auto;display:inline-block;width:12px;height:12px;margin-right:7px;vertical-align:middle;border-radius:3px;border:1px solid rgba(127,127,127,.45);background-color:#fff;background-image:linear-gradient(var(--slashed-swatch-color, transparent),var(--slashed-swatch-color, transparent)),linear-gradient(45deg,rgba(127,127,127,.35) 25%,transparent 25%,transparent 75%,rgba(127,127,127,.35) 75%),linear-gradient(45deg,rgba(127,127,127,.35) 25%,transparent 25%,transparent 75%,rgba(127,127,127,.35) 75%);background-position:0 0,0 0,4px 4px;background-size:auto,8px 8px,8px 8px}.slashed-cp--docked{top:0;bottom:0;left:var(--cp-dock-left, 320px);right:auto;width:360px;border-top-left-radius:0;border-bottom-left-radius:0;box-shadow:6px 0 32px #0000008c}.slashed-cp[data-mode=both] .slashed-cp__qu-sw,.slashed-cp[data-mode=both] .slashed-cp__scan-base,.slashed-cp[data-mode=both] .slashed-cp__scan-pre-sw,.slashed-cp[data-mode=both] .slashed-cp__fam-banner,.slashed-cp[data-mode=both] .slashed-cp__strip-sw{background:linear-gradient(135deg,var(--sw-l) 0 calc(50% - .5px),rgba(0,0,0,.35) calc(50% - .5px) calc(50% + .5px),var(--sw-d) calc(50% + .5px) 100%)}.slashed-cp[data-mode=light] .slashed-cp__qu-sw,.slashed-cp[data-mode=light] .slashed-cp__scan-base,.slashed-cp[data-mode=light] .slashed-cp__scan-pre-sw,.slashed-cp[data-mode=light] .slashed-cp__fam-banner,.slashed-cp[data-mode=light] .slashed-cp__strip-sw{background:var(--sw-l)}.slashed-cp[data-mode=dark] .slashed-cp__qu-sw,.slashed-cp[data-mode=dark] .slashed-cp__scan-base,.slashed-cp[data-mode=dark] .slashed-cp__scan-pre-sw,.slashed-cp[data-mode=dark] .slashed-cp__fam-banner,.slashed-cp[data-mode=dark] .slashed-cp__strip-sw{background:var(--sw-d)}.slashed-cp__sec{padding:10px 0 6px;border-bottom:1px solid rgba(255,255,255,.05)}.slashed-cp__sec:last-child{border-bottom:0}.slashed-cp__sec-title{margin:0 0 10px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--rebemer-fg-muted)}.slashed-cp__sec--pal{padding-top:12px}.slashed-cp__qu-group{margin-bottom:10px}.slashed-cp__qu-group:last-child{margin-bottom:0}.slashed-cp__qu-label{margin:0 0 4px;font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.slashed-cp__qu-grid{display:grid;grid-template-columns:1fr 1fr;gap:2px}.slashed-cp__qu-cell{display:flex;align-items:center;gap:7px;padding:4px 6px;background:transparent;border:0;border-radius:5px;color:var(--rebemer-fg);font:11px/1.3 var(--rebemer-font);text-align:left;cursor:pointer;min-width:0;transition:background 80ms}.slashed-cp__qu-cell:hover{background:#ffffff0f}.slashed-cp__qu-sw{width:22px;height:22px;flex:0 0 22px;border-radius:5px;border:1px solid rgba(127,127,127,.35);transition:border-color 80ms}.slashed-cp__qu-sw--alpha{border-style:dashed}.slashed-cp__qu-cell:hover .slashed-cp__qu-sw{border-color:var(--rebemer-accent)}.slashed-cp__qu-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.slashed-cp__pal-cat{margin:10px 0 5px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:var(--rebemer-fg-muted)}.slashed-cp__pal-cat:first-of-type{margin-top:2px}.slashed-cp__scanner{border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);overflow:hidden;margin-bottom:4px}.slashed-cp__scan-item+.slashed-cp__scan-item{border-top:1px solid var(--rebemer-border)}.slashed-cp__scan-row{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;background:transparent;border:0;color:var(--rebemer-fg);font:11px/1 var(--rebemer-font);cursor:pointer;text-align:left;transition:background 80ms}.slashed-cp__scan-row:hover,.slashed-cp__scan-row--open{background:#ffffff0a}.slashed-cp__scan-base{width:18px;height:18px;flex:0 0 18px;border-radius:4px;border:1px solid rgba(127,127,127,.3)}.slashed-cp__scan-name{font-weight:600;flex:0 0 auto}.slashed-cp__scan-tagline{font-size:10px;color:var(--rebemer-fg-muted);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.slashed-cp__scan-pre{display:flex;gap:3px;flex:0 0 auto}.slashed-cp__scan-pre-sw{width:14px;height:14px;border-radius:3px;border:1px solid rgba(127,127,127,.2)}.slashed-cp__scan-chev{flex:0 0 auto;font-size:10px;color:var(--rebemer-fg-muted)}.slashed-cp__fam{padding:10px 10px 12px;border-top:1px solid var(--rebemer-border);background:#0000001f}.slashed-cp__fam-banner{display:flex;align-items:flex-end;width:100%;height:52px;padding:7px 10px;border:0;border-radius:7px;cursor:pointer;margin-bottom:10px;overflow:hidden;transition:opacity .12s;box-sizing:border-box}.slashed-cp__fam-banner:hover{opacity:.85}.slashed-cp__fam-banner-lbl{font:700 9px/1 var(--rebemer-font);text-transform:uppercase;letter-spacing:2px;color:#ffffffe6;text-shadow:0 1px 3px rgba(0,0,0,.6)}.slashed-cp__fam-sec{margin:8px 0 6px;font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.slashed-cp__fam-sec:first-child{margin-top:0}.slashed-cp__fam-sec-range{font-weight:400;text-transform:none;letter-spacing:0;color:#ffffff40}.slashed-cp__strip{display:flex;height:24px;border-radius:5px;overflow:hidden}.slashed-cp__strip--alpha{margin-top:4px;opacity:.8}.slashed-cp__strip-sw{flex:1;min-width:0;padding:0;border:0;cursor:pointer;transition:flex .1s ease-out;position:relative}.slashed-cp__strip-sw:hover{flex:2;box-shadow:inset 0 0 0 2px var(--rebemer-accent)}.slashed-cp__strip-sw--alpha{box-shadow:inset 0 0 0 1px #7f7f7f66}.slashed-cp__strip-sw--alpha:hover{box-shadow:inset 0 0 0 2px var(--rebemer-accent)}.slashed-cp__strip-sw:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:-2px;z-index:1}.slashed-cp__alpha-btn{display:flex;align-items:center;gap:5px;margin-top:8px;padding:0;background:transparent;border:0;color:var(--rebemer-fg-muted);font:10px/1 var(--rebemer-font);cursor:pointer}.slashed-cp__alpha-btn:hover{color:var(--rebemer-fg)}.slashed-cp__alpha-btn:focus-visible{outline:1px dotted var(--rebemer-accent);outline-offset:2px;color:var(--rebemer-fg)}.slashed-cp__qu-cell:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:-2px}.slashed-cp__scan-row:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:-2px}.slashed-cp__fam-banner:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:-2px}
#slashed-rebemer-host{--rebemer-bg: #161a1d;--rebemer-fg: #e1e1e1;--rebemer-fg-muted: #8a8d95;--rebemer-border: #3d4752;--rebemer-accent: #e2b93b;--rebemer-accent-hover: #ffd042;--rebemer-input-bg: #293038;--rebemer-input-border: #3d4752;--rebemer-error: #ff4c4c;--rebemer-success: #4ade80;--rebemer-radius: 4px;--rebemer-font: "Inter", -apple-system, BlinkMacSystemFont, sans-serif}.rebemer-badge-host{display:inline-flex;align-items:center;align-self:center;flex:0 0 auto;margin:0 4px;opacity:0;pointer-events:none;transition:opacity 80ms linear}.structure-item:hover .rebemer-badge-host,.structure-item:focus-within .rebemer-badge-host,li[data-id]:hover>.rebemer-badge-host,li[data-id]:focus-within>.rebemer-badge-host{opacity:1;pointer-events:auto}.rebemer-badge{font:600 9px/1 var(--rebemer-font, "Inter", -apple-system, BlinkMacSystemFont, sans-serif);letter-spacing:0;text-transform:none;color:var(--rebemer-fg-muted, #8a8d95);display:inline;background:transparent;padding:1px 3px;margin:0;cursor:pointer;border-radius:2px;pointer-events:auto}.rebemer-badge:hover{color:var(--rebemer-accent, #e2b93b);background:#e2b93b14}.rebemer-badge:focus-visible{outline:1px dotted var(--rebemer-accent, #e2b93b);outline-offset:1px;color:var(--rebemer-accent, #e2b93b)}.rebemer-panel{position:fixed;top:80px;left:50%;transform:translate(-50%);width:440px;max-width:calc(100vw - 40px);max-height:80vh;z-index:100000;background:var(--rebemer-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);box-shadow:0 10px 40px #0009;display:flex;flex-direction:column;font:12px/1.45 var(--rebemer-font);overflow:hidden;outline:none}.rebemer-panel__header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--rebemer-border)}.rebemer-panel__title{margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:#fff}.rebemer-panel__subject{color:var(--rebemer-accent);text-transform:none;font-weight:500}.rebemer-panel__close{background:transparent;border:0;font-size:18px;color:var(--rebemer-fg-muted);cursor:pointer;padding:2px 6px}.rebemer-panel__close:hover{color:#fff}.rebemer-panel__toolbar{padding:10px 14px;display:flex;gap:12px;align-items:center;flex-wrap:wrap;border-bottom:1px solid var(--rebemer-border)}.rebemer-field{display:flex;flex-direction:column;gap:4px;font-size:11px}.rebemer-field--inline{flex-direction:row;align-items:center;gap:6px}.rebemer-field__label{color:var(--rebemer-fg-muted);text-transform:uppercase;letter-spacing:.5px;font-size:10px}.rebemer-field select,.rebemer-field input[type=text]{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg);padding:4px 6px;font:inherit}.rebemer-field select:focus,.rebemer-field input:focus{outline:1px solid var(--rebemer-accent)}.rebemer-panel__mode-hint{margin:0;padding:5px 14px;font-size:11px;color:var(--rebemer-fg-muted);background:var(--rebemer-bg);border-bottom:1px solid var(--rebemer-border);line-height:1.4}.rebemer-panel__notice{margin:0;padding:8px 14px;background:#e2b93b14;border-bottom:1px solid var(--rebemer-border);color:var(--rebemer-fg);font-size:11px;line-height:1.5}.rebemer-panel__notice--warn{background:#e2b93b29}.rebemer-panel__notice strong{color:var(--rebemer-accent);font-weight:600}.rebemer-panel__notice-skip{display:block;margin-top:2px;color:var(--rebemer-fg-muted)}.rebemer-panel__body{flex:1;overflow-y:auto;padding:8px 14px;display:flex;flex-direction:column;gap:6px}.rebemer-row{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--rebemer-radius);background:#ffffff05;margin-left:calc(var(--rebemer-row-depth, 0) * 12px)}.rebemer-row:hover{background:#ffffff0a}.rebemer-row--disabled{opacity:.45}.rebemer-row__include input{cursor:pointer}.rebemer-row__meta{display:flex;gap:6px;align-items:baseline;min-width:0}.rebemer-row__label{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rebemer-row__type{font-size:9px;color:var(--rebemer-fg-muted);text-transform:uppercase;letter-spacing:.3px}.rebemer-row__type--toggle{background:transparent;border:0;padding:1px 3px;border-radius:2px;cursor:pointer;line-height:1}.rebemer-row__type--toggle:hover:not(:disabled){color:var(--rebemer-fg);background:#ffffff0f}.rebemer-row__type--toggle:disabled{cursor:default;opacity:.5}.rebemer-row__type--block{color:var(--rebemer-accent);background:#e2b93b1f}.rebemer-row__type--block:hover:not(:disabled){background:#e2b93b33}.rebemer-row__hint{font-size:9px;color:var(--rebemer-accent);text-transform:uppercase;letter-spacing:.5px;background:#e2b93b1f;padding:1px 4px;border-radius:2px}.rebemer-row__inputs{grid-column:1 / -1;display:flex;gap:6px;align-items:center}.rebemer-row__name{flex:1;display:flex;align-items:stretch;background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);overflow:hidden}.rebemer-row__prefix{padding:4px 6px;background:#00000040;color:var(--rebemer-fg-muted);font-size:11px;border-right:1px solid var(--rebemer-input-border);white-space:nowrap}.rebemer-row__name input{background:transparent;border:0;outline:0;color:var(--rebemer-fg);font:inherit;padding:4px 6px;flex:1;min-width:0}.rebemer-row--suggested .rebemer-row__name input:not(:focus){color:var(--rebemer-fg-muted);font-style:italic}.rebemer-row__modifier{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg);font:inherit;padding:4px 6px;width:90px}.rebemer-row__modifiers{display:flex;flex-direction:column;gap:4px;flex:1}.rebemer-row__modifier-row{display:flex;align-items:center;gap:4px}.rebemer-row__modifier-row .rebemer-row__modifier{flex:1;width:auto}.rebemer-row__modifier-remove{background:transparent;border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg-muted);font-size:13px;line-height:1;padding:2px 6px;cursor:pointer;flex:0 0 auto}.rebemer-row__modifier-remove:hover:not(:disabled){border-color:var(--rebemer-error);color:var(--rebemer-error)}.rebemer-row__modifier-add{background:transparent;border:1px dashed var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg-muted);font:inherit;font-size:10px;padding:3px 7px;cursor:pointer;text-align:left;width:fit-content}.rebemer-row__modifier-add:hover:not(:disabled){border-color:var(--rebemer-fg-muted);color:var(--rebemer-fg)}.rebemer-row__op-toggle{grid-column:1 / -1;display:inline-flex;align-items:center;border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);overflow:hidden;width:fit-content;margin-top:2px}.rebemer-row__op-btn{background:var(--rebemer-input-bg);border:0;border-left:1px solid var(--rebemer-input-border);color:var(--rebemer-fg-muted);font:600 10px/1 var(--rebemer-font);padding:4px 9px;cursor:pointer;text-transform:uppercase;letter-spacing:.4px;white-space:nowrap}.rebemer-row__op-btn:first-child{border-left:0}.rebemer-row__op-btn--on{color:var(--rebemer-accent);background:#e2b93b1f}.rebemer-row__op-btn:hover:not(.rebemer-row__op-btn--on){color:var(--rebemer-fg);background:#ffffff0f}.rebemer-row__family{grid-column:1 / -1;display:flex;align-items:center;gap:7px;margin-top:3px}.rebemer-row__family-label{font-size:9px;color:var(--rebemer-fg-muted);text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex:0 0 auto}.rebemer-row__family-select{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg);padding:3px 6px;font:inherit;font-size:11px;flex:1;min-width:0}.rebemer-row__family-select:focus{outline:1px solid var(--rebemer-accent)}.rebemer-row__info code,.rebemer-row__warn code{background:#0000004d;padding:1px 4px;border-radius:2px;font:11px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-accent)}.rebemer-row__recommend{grid-column:1 / -1;margin:0;padding:6px 8px;background:#4ade8014;border-left:2px solid var(--rebemer-success);border-radius:2px;color:var(--rebemer-fg);font-size:11px;line-height:1.4}.rebemer-row__recommend code{background:#0000004d;padding:1px 4px;border-radius:2px;font:11px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-accent)}.rebemer-row__warn,.rebemer-row__info{grid-column:1 / -1;margin:0;padding:5px 8px;font-size:11px;line-height:1.4;border-radius:2px}.rebemer-row__warn{background:#e2b93b1f;border-left:2px solid #e2b93b;color:var(--rebemer-fg)}.rebemer-row__info{background:#63b3ed1a;border-left:2px solid #63b3ed;color:var(--rebemer-fg-muted)}.rebemer-row__chips{grid-column:1 / -1;display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:4px 0 0;font-size:10px}.rebemer-row__chips-label,.rebemer-row__chips-empty,.rebemer-row__chips-skip{color:var(--rebemer-fg-muted);text-transform:uppercase;letter-spacing:.5px;font-size:9px}.rebemer-row__chips-skip{margin-left:auto;cursor:help;color:#c8a038}.rebemer-chip{font:10px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:#0000004d;border:1px solid var(--rebemer-input-border);color:var(--rebemer-fg);padding:2px 5px;border-radius:2px;white-space:nowrap}.rebemer-panel__footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid var(--rebemer-border)}.rebemer-btn{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);color:var(--rebemer-fg);padding:6px 12px;border-radius:var(--rebemer-radius);font:inherit;cursor:pointer}.rebemer-btn:hover{border-color:var(--rebemer-fg-muted)}.rebemer-btn--primary{background:var(--rebemer-accent);border-color:var(--rebemer-accent);color:var(--rebemer-bg);font-weight:600}.rebemer-btn--primary:hover{background:var(--rebemer-accent-hover);border-color:var(--rebemer-accent-hover)}.rebemer-toast{position:fixed;bottom:16px;right:16px;z-index:100002;background:var(--rebemer-input-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);padding:8px 12px;font:12px/1.45 var(--rebemer-font);cursor:pointer;box-shadow:0 4px 12px #0006}.rebemer-toast--success{border-color:var(--rebemer-success)}.rebemer-toast--error{border-color:var(--rebemer-error);color:var(--rebemer-error)}.rebemer-class-hint{position:fixed;z-index:100003;max-width:280px;background:var(--rebemer-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);padding:8px 10px;font:12px/1.45 var(--rebemer-font);box-shadow:0 6px 20px #00000080;pointer-events:none}.rebemer-class-hint[hidden]{display:none}.rebemer-class-hint__name{font:600 11px/1.3 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-accent)}.rebemer-class-hint__cat{margin-left:6px;font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.rebemer-class-hint__cat[hidden]{display:none}.rebemer-class-hint__desc{margin:4px 0 0;color:var(--rebemer-fg)}.slashed-cp-launch{position:fixed;right:16px;bottom:16px;z-index:99999;display:inline-flex;align-items:center;gap:7px;padding:7px 12px;background:var(--rebemer-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:999px;font:600 11px/1 var(--rebemer-font);letter-spacing:.3px;cursor:pointer;box-shadow:0 4px 16px #00000073;transition:border-color .12s,color .12s,transform .12s}.slashed-cp-launch:hover{border-color:var(--rebemer-fg-muted);transform:translateY(-1px)}.slashed-cp-launch--on{border-color:var(--rebemer-accent);color:#fff}.slashed-cp-launch__dot{width:12px;height:12px;border-radius:50%;background:conic-gradient(from 210deg,#5b8cff,#b07cff,#ff6b6b,#ffd24a,#4ade80,#5b8cff);box-shadow:inset 0 0 0 1px #ffffff40}.slashed-cp-launch__txt{text-transform:uppercase}.slashed-cp{position:fixed;top:64px;right:16px;bottom:64px;width:372px;max-width:calc(100vw - 32px);z-index:100001;display:flex;flex-direction:column;background:var(--rebemer-bg);color:var(--rebemer-fg);border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);box-shadow:0 12px 48px #0009;font:12px/1.45 var(--rebemer-font);overflow:hidden;outline:none}.slashed-cp__header{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--rebemer-border)}.slashed-cp__title{margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:#fff;flex:1}.slashed-cp__close{background:transparent;border:0;font-size:18px;line-height:1;color:var(--rebemer-fg-muted);cursor:pointer;padding:2px 4px}.slashed-cp__close:hover{color:#fff}.slashed-cp__seg{display:inline-flex;border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);overflow:hidden}.slashed-cp__seg-btn{background:var(--rebemer-input-bg);border:0;border-left:1px solid var(--rebemer-input-border);color:var(--rebemer-fg-muted);font:600 10px/1 var(--rebemer-font);padding:5px 9px;cursor:pointer;text-transform:uppercase;letter-spacing:.4px}.slashed-cp__seg-btn:first-child{border-left:0}.slashed-cp__seg-btn--on{background:var(--rebemer-accent);color:var(--rebemer-bg)}.slashed-cp__toolbar{display:flex;flex-direction:column;gap:8px;padding:10px 12px;border-bottom:1px solid var(--rebemer-border)}.slashed-cp__search{width:100%;background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:var(--rebemer-radius);color:var(--rebemer-fg);font:inherit;padding:6px 8px;box-sizing:border-box}.slashed-cp__search:focus{outline:1px solid var(--rebemer-accent)}.slashed-cp__target{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.slashed-cp__target-label{font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.slashed-cp__chip{background:var(--rebemer-input-bg);border:1px solid var(--rebemer-input-border);border-radius:999px;color:var(--rebemer-fg-muted);font:600 10px/1 var(--rebemer-font);padding:4px 10px;cursor:pointer}.slashed-cp__chip--on{background:var(--rebemer-accent);border-color:var(--rebemer-accent);color:var(--rebemer-bg)}.slashed-cp__body{flex:1;overflow-y:auto;padding:6px 12px 12px}.slashed-cp__empty{color:var(--rebemer-fg-muted);font-size:11px;padding:12px 2px}.slashed-cp__group{padding:10px 0 6px;border-bottom:1px solid rgba(255,255,255,.05)}.slashed-cp__group:last-child{border-bottom:0}.slashed-cp__group-head{margin:0 0 8px}.slashed-cp__group-title{display:flex;align-items:baseline;gap:7px;margin:0;font-size:11px;font-weight:700;color:#fff;text-transform:capitalize}.slashed-cp__group-tag{font-size:10px;font-weight:500;color:var(--rebemer-fg-muted);text-transform:none}.slashed-cp__group-count{margin-left:auto;font:600 9px/1 var(--rebemer-font);color:var(--rebemer-fg-muted);background:#ffffff0f;border-radius:999px;padding:2px 6px;text-transform:none}.slashed-cp__group-use{margin:2px 0 0;font-size:10px;line-height:1.4;color:var(--rebemer-fg-muted)}.slashed-cp__section-label{margin:8px 0 5px;font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.slashed-cp__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(38px,1fr));gap:7px 6px}.slashed-cp__cell{display:flex;flex-direction:column;align-items:center;gap:3px;min-width:0}.slashed-cp__cap{font-size:9px;color:var(--rebemer-fg-muted);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slashed-cp__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.slashed-cp__list-item{display:flex;align-items:center;gap:8px}.slashed-cp__list-name{font-size:11px;color:var(--rebemer-fg);flex:0 0 auto}.slashed-cp__list-var{font:10px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-fg-muted);margin-left:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slashed-cp-swatch{width:28px;height:28px;flex:0 0 auto;padding:0;border:1px solid rgba(127,127,127,.45);border-radius:6px;background:none;cursor:pointer;position:relative;overflow:hidden}.slashed-cp-swatch:hover{border-color:var(--rebemer-accent)}.slashed-cp-swatch:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:1px}.slashed-cp-swatch__fill{position:absolute;inset:0;background:var(--cp-solid)}.slashed-cp-swatch--split .slashed-cp-swatch__fill{background:linear-gradient(135deg,var(--cp-l) 0 calc(50% - .5px),rgba(0,0,0,.35) calc(50% - .5px) calc(50% + .5px),var(--cp-d) calc(50% + .5px) 100%)}.slashed-cp-swatch--alpha{border-style:dashed}.slashed-cp__footer{display:flex;align-items:center;gap:10px;padding:8px 12px;border-top:1px solid var(--rebemer-border);font-size:10px;color:var(--rebemer-fg-muted)}.slashed-cp__hint{margin-left:auto}.slashed-cp__hint code,.slashed-cp__footer code{font:10px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--rebemer-accent)}.slashed-cp__legend{display:inline-flex;align-items:center;gap:5px}.slashed-cp__legend-sw{width:12px;height:12px;border-radius:3px;border:1px solid rgba(127,127,127,.45);background:linear-gradient(135deg,#fff 0 50%,#222 50% 100%)}.rebemer-toast--info{border-color:#63b3ed}.slashed-sf-color-btn{display:inline-flex;align-items:center;justify-content:center;flex:0 0 28px;min-width:28px;width:28px;height:28px;border-radius:5px;cursor:pointer;opacity:.6;transition:opacity .12s,background .12s}.slashed-sf-color-btn:hover{opacity:1;background:#5b8cff26}.slashed-sf-color-btn--active{opacity:1}.slashed-sf-color-btn--active:hover{background:#ffffff0f}.slashed-sf-color-btn__dot{display:inline-block;width:20px;height:20px;border-radius:50%;background:conic-gradient(from 210deg,#5b8cff,#b07cff,#ff6b6b,#ffd24a,#4ade80,#5b8cff);box-shadow:inset 0 0 0 1px #fff3;flex-shrink:0;transition:width 80ms,height 80ms,border-radius .12s}.slashed-sf-color-btn--active .slashed-sf-color-btn__dot{width:28px;height:28px;border-radius:5px;transition:width 80ms,height 80ms,border-radius .12s;box-shadow:inset 0 0 0 1px #0000002e,0 0 0 1.5px #ffffff38}.slashed-var-swatch{flex:0 0 auto;display:inline-block;width:12px;height:12px;margin-right:7px;vertical-align:middle;border-radius:3px;border:1px solid rgba(127,127,127,.45);background-color:#fff;background-image:linear-gradient(var(--slashed-swatch-color, transparent),var(--slashed-swatch-color, transparent)),linear-gradient(45deg,rgba(127,127,127,.35) 25%,transparent 25%,transparent 75%,rgba(127,127,127,.35) 75%),linear-gradient(45deg,rgba(127,127,127,.35) 25%,transparent 25%,transparent 75%,rgba(127,127,127,.35) 75%);background-position:0 0,0 0,4px 4px;background-size:auto,8px 8px,8px 8px}.slashed-cp--docked{top:0;bottom:0;left:var(--cp-dock-left, 320px);right:auto;width:360px;border-top-left-radius:0;border-bottom-left-radius:0;box-shadow:6px 0 32px #0000008c}.slashed-cp[data-mode=both] .slashed-cp__qu-sw,.slashed-cp[data-mode=both] .slashed-cp__scan-base,.slashed-cp[data-mode=both] .slashed-cp__scan-pre-sw,.slashed-cp[data-mode=both] .slashed-cp__fam-banner,.slashed-cp[data-mode=both] .slashed-cp__strip-sw{background:linear-gradient(135deg,var(--sw-l) 0 calc(50% - .5px),rgba(0,0,0,.35) calc(50% - .5px) calc(50% + .5px),var(--sw-d) calc(50% + .5px) 100%)}.slashed-cp[data-mode=light] .slashed-cp__qu-sw,.slashed-cp[data-mode=light] .slashed-cp__scan-base,.slashed-cp[data-mode=light] .slashed-cp__scan-pre-sw,.slashed-cp[data-mode=light] .slashed-cp__fam-banner,.slashed-cp[data-mode=light] .slashed-cp__strip-sw{background:var(--sw-l)}.slashed-cp[data-mode=dark] .slashed-cp__qu-sw,.slashed-cp[data-mode=dark] .slashed-cp__scan-base,.slashed-cp[data-mode=dark] .slashed-cp__scan-pre-sw,.slashed-cp[data-mode=dark] .slashed-cp__fam-banner,.slashed-cp[data-mode=dark] .slashed-cp__strip-sw{background:var(--sw-d)}.slashed-cp__sec{padding:10px 0 6px;border-bottom:1px solid rgba(255,255,255,.05)}.slashed-cp__sec:last-child{border-bottom:0}.slashed-cp__sec-title{margin:0 0 10px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--rebemer-fg-muted)}.slashed-cp__sec--pal{padding-top:12px}.slashed-cp__qu-group{margin-bottom:10px}.slashed-cp__qu-group:last-child{margin-bottom:0}.slashed-cp__qu-label{margin:0 0 4px;font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.slashed-cp__qu-grid{display:grid;grid-template-columns:1fr 1fr;gap:2px}.slashed-cp__qu-cell{display:flex;align-items:center;gap:7px;padding:4px 6px;background:transparent;border:0;border-radius:5px;color:var(--rebemer-fg);font:11px/1.3 var(--rebemer-font);text-align:left;cursor:pointer;min-width:0;transition:background 80ms}.slashed-cp__qu-cell:hover{background:#ffffff0f}.slashed-cp__qu-sw{width:22px;height:22px;flex:0 0 22px;border-radius:5px;border:1px solid rgba(127,127,127,.35);transition:border-color 80ms}.slashed-cp__qu-sw--alpha{border-style:dashed}.slashed-cp__qu-cell:hover .slashed-cp__qu-sw{border-color:var(--rebemer-accent)}.slashed-cp__qu-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.slashed-cp__pal-cat{margin:10px 0 5px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:var(--rebemer-fg-muted)}.slashed-cp__pal-cat:first-of-type{margin-top:2px}.slashed-cp__scanner{border:1px solid var(--rebemer-border);border-radius:var(--rebemer-radius);overflow:hidden;margin-bottom:4px}.slashed-cp__scan-item+.slashed-cp__scan-item{border-top:1px solid var(--rebemer-border)}.slashed-cp__scan-row{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;background:transparent;border:0;color:var(--rebemer-fg);font:11px/1 var(--rebemer-font);cursor:pointer;text-align:left;transition:background 80ms}.slashed-cp__scan-row:hover,.slashed-cp__scan-row--open{background:#ffffff0a}.slashed-cp__scan-base{width:18px;height:18px;flex:0 0 18px;border-radius:4px;border:1px solid rgba(127,127,127,.3)}.slashed-cp__scan-name{font-weight:600;flex:0 0 auto}.slashed-cp__scan-tagline{font-size:10px;color:var(--rebemer-fg-muted);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.slashed-cp__scan-pre{display:flex;gap:3px;flex:0 0 auto}.slashed-cp__scan-pre-sw{width:14px;height:14px;border-radius:3px;border:1px solid rgba(127,127,127,.2)}.slashed-cp__scan-chev{flex:0 0 auto;font-size:10px;color:var(--rebemer-fg-muted)}.slashed-cp__fam{padding:10px 10px 12px;border-top:1px solid var(--rebemer-border);background:#0000001f}.slashed-cp__fam-banner{display:flex;align-items:flex-end;width:100%;height:52px;padding:7px 10px;border:0;border-radius:7px;cursor:pointer;margin-bottom:10px;overflow:hidden;transition:opacity .12s;box-sizing:border-box}.slashed-cp__fam-banner:hover{opacity:.85}.slashed-cp__fam-banner-lbl{font:700 9px/1 var(--rebemer-font);text-transform:uppercase;letter-spacing:2px;color:#ffffffe6;text-shadow:0 1px 3px rgba(0,0,0,.6)}.slashed-cp__fam-sec{margin:8px 0 6px;font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--rebemer-fg-muted)}.slashed-cp__fam-sec:first-child{margin-top:0}.slashed-cp__fam-sec-range{font-weight:400;text-transform:none;letter-spacing:0;color:#ffffff40}.slashed-cp__strip{display:flex;height:24px;border-radius:5px;overflow:hidden}.slashed-cp__strip--alpha{margin-top:4px;opacity:.8}.slashed-cp__strip-sw{flex:1;min-width:0;padding:0;border:0;cursor:pointer;transition:flex .1s ease-out;position:relative}.slashed-cp__strip-sw:hover{flex:2;box-shadow:inset 0 0 0 2px var(--rebemer-accent)}.slashed-cp__strip-sw--alpha{box-shadow:inset 0 0 0 1px #7f7f7f66}.slashed-cp__strip-sw--alpha:hover{box-shadow:inset 0 0 0 2px var(--rebemer-accent)}.slashed-cp__strip-sw:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:-2px;z-index:1}.slashed-cp__alpha-btn{display:flex;align-items:center;gap:5px;margin-top:8px;padding:0;background:transparent;border:0;color:var(--rebemer-fg-muted);font:10px/1 var(--rebemer-font);cursor:pointer}.slashed-cp__alpha-btn:hover{color:var(--rebemer-fg)}.slashed-cp__alpha-btn:focus-visible{outline:1px dotted var(--rebemer-accent);outline-offset:2px;color:var(--rebemer-fg)}.slashed-cp__qu-cell:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:-2px}.slashed-cp__scan-row:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:-2px}.slashed-cp__fam-banner:focus-visible{outline:2px solid var(--rebemer-accent);outline-offset:-2px}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Inconsistency: Layer description claims "class picker" but change affects color picker grid.

The layer description states "Updates class picker grid from fixed 2-column layout to responsive auto-fill layout" but this change actually modifies .slashed-cp__qu-grid, which is the color picker's Quick Use swatch grid (confirmed by ColorPanel.svelte usage). This appears unrelated to reBEMer's BEM class management features described in the PR objectives.

Either:

  1. The layer description is incorrect and should reference the color picker, or
  2. This change was included in the wrong PR/cohort.
🤖 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 `@plugins/SLASHED-for-WP/integrations/bricks/assets/editor-app/app.css` at line
1, The PR layer description incorrectly references the "class picker" while the
diff modifies the color picker quick-use grid (.slashed-cp__qu-grid) used by
ColorPanel.svelte; either correct the description to state that the change
updates the color picker's quick-use swatch grid from a fixed 2-column layout to
a responsive auto-fill layout, or remove/relocate this CSS change from this PR
if it was meant for a different cohort. Locate the rule for .slashed-cp__qu-grid
and the ColorPanel.svelte usage to decide whether to update the commit
message/PR description or move the change to the proper branch/PR. Ensure the
updated layer description clearly names ".slashed-cp__qu-grid" and
"ColorPanel.svelte" if you keep the change here.

Comment thread plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js Outdated
- apply.js: update module docstring from "Four modes" to "Five modes"
  with mixed mode description
- apply.js: add 'mixed' to JSDoc @param mode type union in buildPlan
  and applyToSubtree
- apply.js: validate op.row.op against allowlist ['add','rename',
  'replace'] before using as effectiveMode; unknown values fall back
  to 'add'
- BemPanel.svelte: update mixed mode hint to mention Replace can target
  a specific family
- docs/rebemer.md: update All-in-one table row to document targeted
  family replace behaviour
- Row.svelte: add aria-pressed to each op toggle button; add role=group
  and aria-label=Operation to the toggle container

https://claude.ai/code/session_013GzAkod2MTBtqia44QhStB
@jackgranatowski
jackgranatowski merged commit a232142 into main Jun 4, 2026
9 checks passed
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