feat(rebemer): add All-in-one (mixed) mode with per-row op toggle and family picker - #226
Conversation
… 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
|
Warning Review limit reached
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 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 configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (5)
📝 WalkthroughWalkthroughThis 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. ChangesAll-in-one (Mixed) Operation Mode
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
- 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
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (3)
plugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.js (2)
166-167: 💤 Low valueJSDoc type annotation doesn't include
'mixed'.The
@paramtype foropts.modeis'add'|'rename'|'replace'|'migrate'but 'mixed' is now valid perVALID_MODES. Same issue exists at line 252 forapplyToSubtree.📝 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 valueUpdate 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 winExpose mixed op-toggle state to assistive tech.
The selected Add/Rename/Replace state is visual-only. Add
aria-pressedper 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
📒 Files selected for processing (7)
docs/rebemer.mdplugins/SLASHED-for-WP/integrations/bricks/assets/editor-app/app.cssplugins/SLASHED-for-WP/integrations/bricks/assets/editor-app/app.jsplugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/BemPanel.svelteplugins/SLASHED-for-WP/integrations/bricks/editor-app/src/components/Row.svelteplugins/SLASHED-for-WP/integrations/bricks/editor-app/src/lib/apply.jsplugins/SLASHED-for-WP/integrations/bricks/editor-app/src/styles/panel.css
| @@ -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} | |||
There was a problem hiding this comment.
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:
- The layer description is incorrect and should reference the color picker, or
- 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.
- 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
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.
via a compact three-button toggle rendered inline on each row.
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.