feat: collapsible, reorderable categories with draggable actions - #2

Merged
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder
May 31, 2026
Merged

feat: collapsible, reorderable categories with draggable actions#2
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder

Conversation

@PalmarHealer

Copy link
Copy Markdown
Contributor

Summary

Three requested enhancements to the categories view (sliders & buttons):

  1. Collapsible categories — a chevron per card collapses/expands it; the state is persisted in the profile.
  2. Reorderable category cards — drag the ⠿ grip on a card header to reorder (cosmetic, but saved via list order).
  3. Draggable actions — drag the ⠿ grip on an action row to reorder within a category, or move it to another category of the same kind (drop onto a collapsed/empty card appends).

What changed

  • model: collapsed flag added to SliderCategory/ButtonCategory (serde default, so existing profiles load fine). Card order is the Vec order, so reordering persists automatically; assignments key off id, not position, so reordering is purely cosmetic.
  • glue: handlers for toggle-category-collapse, reorder-category (move a card to an insertion index), and move-line (relocate an action/stream within or between categories), each with the index-shift math, then persist + re-push.
  • UI (Slint): collapse chevron; ⠿ grip handles drive a hand-rolled drag-and-drop (Slint 1.16 has no native DnD). Drop targets are hit-tested from the global pointer vs each element's absolute-position, shown with an accent drop-line and a dimmed source row/card.

Implementation note

absolute-position reads are ternary-guarded so they only execute during an active drag. Reading absolute-position in a binding evaluated at init recurses through text layout (Recursion detected panic) — and Slint's && does not short-circuit the operand away, so the guard must be a ? :, not &&.

Known limitations (hand-rolled DnD)

  • No auto-scroll near list edges while dragging.
  • No floating drag "ghost" — feedback is the dimmed source + the accent drop-line.
  • Dropping on an expanded card's header area (above the first row) may not register a slot; aim for an actual row.

Testing

  • cargo build clean; cargo test passes.
  • Manually verified on Windows: collapse persists across restart; cards and actions reorder; actions move between categories.

🤖 Generated with Claude Code

Categories view gains drag-and-drop and persistent collapse:
- model: add `collapsed` to Slider/ButtonCategory (serde default), saved
in the profile. Card order is the Vec order, so reordering persists.
- glue: handlers for toggle-collapse, reorder-category (move card to an
insertion index), and move-line (relocate an action/stream within or
between categories of the same kind), each with the index-shift math.
- UI: a collapse chevron per card; ⠿ grip handles on category headers and
action rows drive a hand-rolled drag (Slint has no native DnD). Drop
targets are hit-tested from the global pointer vs each element's
absolute-position, with an accent drop-line indicator and a dimmed
source. Geometry reads are ternary-guarded so absolute-position is only
touched during an active drag — reading it at init recurses through
text layout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Pull request overview

Adds collapsible/reorderable category cards and draggable action/stream rows to the categories view. State is persisted in the profile via a new collapsed flag and the existing Vec order. Hand-rolled drag-and-drop is implemented in Slint using absolute-position hit-testing guarded by ternaries to avoid recursion during initial layout.

Changes:

  • Adds collapsed: bool (serde default) to SliderCategory/ButtonCategory and propagates it through CategorySummary to the UI.
  • Adds three new callbacks (toggle-category-collapse, reorder-category, move-line) with Rust handlers (reorder_by_id, move_line) that handle index-shift math and persist the preset.
  • Rewrites the category card layout to include a chevron toggle, drag grips for cards and rows, drop-mark indicators, and ternary-guarded absolute-position reads.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
src/model.rsAdds collapsed field to both category structs and updates a test constructor.
src/main.rsUpdates seed CategorySummary literals with collapsed: false.
src/glue.rsWires three new callbacks; adds reorder_by_id and move_line helpers; includes collapsed in pushed summaries.
ui/app.slintAdds collapsed to CategorySummary, introduces DropMark, drag state, grips, hit-test logic, and forwards new callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@PalmarHealer
PalmarHealer merged commit 2146340 into mainMay 31, 2026
1 check passed
@PalmarHealer
PalmarHealer deleted the feat/category-reorder branch May 31, 2026 17:41
Sign up for freeto 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

@PalmarHealer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: collapsible, reorderable categories with draggable actions - #2

Merged
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder
May 31, 2026
Merged

feat: collapsible, reorderable categories with draggable actions#2
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder

Conversation

@PalmarHealer

Copy link
Copy Markdown
Contributor

Summary

Three requested enhancements to the categories view (sliders & buttons):

  1. Collapsible categories — a chevron per card collapses/expands it; the state is persisted in the profile.
  2. Reorderable category cards — drag the ⠿ grip on a card header to reorder (cosmetic, but saved via list order).
  3. Draggable actions — drag the ⠿ grip on an action row to reorder within a category, or move it to another category of the same kind (drop onto a collapsed/empty card appends).

What changed

  • model: collapsed flag added to SliderCategory/ButtonCategory (serde default, so existing profiles load fine). Card order is the Vec order, so reordering persists automatically; assignments key off id, not position, so reordering is purely cosmetic.
  • glue: handlers for toggle-category-collapse, reorder-category (move a card to an insertion index), and move-line (relocate an action/stream within or between categories), each with the index-shift math, then persist + re-push.
  • UI (Slint): collapse chevron; ⠿ grip handles drive a hand-rolled drag-and-drop (Slint 1.16 has no native DnD). Drop targets are hit-tested from the global pointer vs each element's absolute-position, shown with an accent drop-line and a dimmed source row/card.

Implementation note

absolute-position reads are ternary-guarded so they only execute during an active drag. Reading absolute-position in a binding evaluated at init recurses through text layout (Recursion detected panic) — and Slint's && does not short-circuit the operand away, so the guard must be a ? :, not &&.

Known limitations (hand-rolled DnD)

  • No auto-scroll near list edges while dragging.
  • No floating drag "ghost" — feedback is the dimmed source + the accent drop-line.
  • Dropping on an expanded card's header area (above the first row) may not register a slot; aim for an actual row.

Testing

  • cargo build clean; cargo test passes.
  • Manually verified on Windows: collapse persists across restart; cards and actions reorder; actions move between categories.

🤖 Generated with Claude Code

Categories view gains drag-and-drop and persistent collapse:
- model: add `collapsed` to Slider/ButtonCategory (serde default), saved
in the profile. Card order is the Vec order, so reordering persists.
- glue: handlers for toggle-collapse, reorder-category (move card to an
insertion index), and move-line (relocate an action/stream within or
between categories of the same kind), each with the index-shift math.
- UI: a collapse chevron per card; ⠿ grip handles on category headers and
action rows drive a hand-rolled drag (Slint has no native DnD). Drop
targets are hit-tested from the global pointer vs each element's
absolute-position, with an accent drop-line indicator and a dimmed
source. Geometry reads are ternary-guarded so absolute-position is only
touched during an active drag — reading it at init recurses through
text layout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Pull request overview

Adds collapsible/reorderable category cards and draggable action/stream rows to the categories view. State is persisted in the profile via a new collapsed flag and the existing Vec order. Hand-rolled drag-and-drop is implemented in Slint using absolute-position hit-testing guarded by ternaries to avoid recursion during initial layout.

Changes:

  • Adds collapsed: bool (serde default) to SliderCategory/ButtonCategory and propagates it through CategorySummary to the UI.
  • Adds three new callbacks (toggle-category-collapse, reorder-category, move-line) with Rust handlers (reorder_by_id, move_line) that handle index-shift math and persist the preset.
  • Rewrites the category card layout to include a chevron toggle, drag grips for cards and rows, drop-mark indicators, and ternary-guarded absolute-position reads.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
src/model.rsAdds collapsed field to both category structs and updates a test constructor.
src/main.rsUpdates seed CategorySummary literals with collapsed: false.
src/glue.rsWires three new callbacks; adds reorder_by_id and move_line helpers; includes collapsed in pushed summaries.
ui/app.slintAdds collapsed to CategorySummary, introduces DropMark, drag state, grips, hit-test logic, and forwards new callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@PalmarHealer
PalmarHealer merged commit 2146340 into mainMay 31, 2026
1 check passed
@PalmarHealer
PalmarHealer deleted the feat/category-reorder branch May 31, 2026 17:41
Sign up for freeto 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

@PalmarHealer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: collapsible, reorderable categories with draggable actions - #2

Merged
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder
May 31, 2026
Merged

feat: collapsible, reorderable categories with draggable actions#2
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder

Conversation

@PalmarHealer

Copy link
Copy Markdown
Contributor

Summary

Three requested enhancements to the categories view (sliders & buttons):

  1. Collapsible categories — a chevron per card collapses/expands it; the state is persisted in the profile.
  2. Reorderable category cards — drag the ⠿ grip on a card header to reorder (cosmetic, but saved via list order).
  3. Draggable actions — drag the ⠿ grip on an action row to reorder within a category, or move it to another category of the same kind (drop onto a collapsed/empty card appends).

What changed

  • model: collapsed flag added to SliderCategory/ButtonCategory (serde default, so existing profiles load fine). Card order is the Vec order, so reordering persists automatically; assignments key off id, not position, so reordering is purely cosmetic.
  • glue: handlers for toggle-category-collapse, reorder-category (move a card to an insertion index), and move-line (relocate an action/stream within or between categories), each with the index-shift math, then persist + re-push.
  • UI (Slint): collapse chevron; ⠿ grip handles drive a hand-rolled drag-and-drop (Slint 1.16 has no native DnD). Drop targets are hit-tested from the global pointer vs each element's absolute-position, shown with an accent drop-line and a dimmed source row/card.

Implementation note

absolute-position reads are ternary-guarded so they only execute during an active drag. Reading absolute-position in a binding evaluated at init recurses through text layout (Recursion detected panic) — and Slint's && does not short-circuit the operand away, so the guard must be a ? :, not &&.

Known limitations (hand-rolled DnD)

  • No auto-scroll near list edges while dragging.
  • No floating drag "ghost" — feedback is the dimmed source + the accent drop-line.
  • Dropping on an expanded card's header area (above the first row) may not register a slot; aim for an actual row.

Testing

  • cargo build clean; cargo test passes.
  • Manually verified on Windows: collapse persists across restart; cards and actions reorder; actions move between categories.

🤖 Generated with Claude Code

Categories view gains drag-and-drop and persistent collapse:
- model: add `collapsed` to Slider/ButtonCategory (serde default), saved
in the profile. Card order is the Vec order, so reordering persists.
- glue: handlers for toggle-collapse, reorder-category (move card to an
insertion index), and move-line (relocate an action/stream within or
between categories of the same kind), each with the index-shift math.
- UI: a collapse chevron per card; ⠿ grip handles on category headers and
action rows drive a hand-rolled drag (Slint has no native DnD). Drop
targets are hit-tested from the global pointer vs each element's
absolute-position, with an accent drop-line indicator and a dimmed
source. Geometry reads are ternary-guarded so absolute-position is only
touched during an active drag — reading it at init recurses through
text layout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Pull request overview

Adds collapsible/reorderable category cards and draggable action/stream rows to the categories view. State is persisted in the profile via a new collapsed flag and the existing Vec order. Hand-rolled drag-and-drop is implemented in Slint using absolute-position hit-testing guarded by ternaries to avoid recursion during initial layout.

Changes:

  • Adds collapsed: bool (serde default) to SliderCategory/ButtonCategory and propagates it through CategorySummary to the UI.
  • Adds three new callbacks (toggle-category-collapse, reorder-category, move-line) with Rust handlers (reorder_by_id, move_line) that handle index-shift math and persist the preset.
  • Rewrites the category card layout to include a chevron toggle, drag grips for cards and rows, drop-mark indicators, and ternary-guarded absolute-position reads.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
src/model.rsAdds collapsed field to both category structs and updates a test constructor.
src/main.rsUpdates seed CategorySummary literals with collapsed: false.
src/glue.rsWires three new callbacks; adds reorder_by_id and move_line helpers; includes collapsed in pushed summaries.
ui/app.slintAdds collapsed to CategorySummary, introduces DropMark, drag state, grips, hit-test logic, and forwards new callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@PalmarHealer
PalmarHealer merged commit 2146340 into mainMay 31, 2026
1 check passed
@PalmarHealer
PalmarHealer deleted the feat/category-reorder branch May 31, 2026 17:41
Sign up for freeto 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

@PalmarHealer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: collapsible, reorderable categories with draggable actions - #2

Merged
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder
May 31, 2026
Merged

feat: collapsible, reorderable categories with draggable actions#2
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder

Conversation

@PalmarHealer

Copy link
Copy Markdown
Contributor

Summary

Three requested enhancements to the categories view (sliders & buttons):

  1. Collapsible categories — a chevron per card collapses/expands it; the state is persisted in the profile.
  2. Reorderable category cards — drag the ⠿ grip on a card header to reorder (cosmetic, but saved via list order).
  3. Draggable actions — drag the ⠿ grip on an action row to reorder within a category, or move it to another category of the same kind (drop onto a collapsed/empty card appends).

What changed

  • model: collapsed flag added to SliderCategory/ButtonCategory (serde default, so existing profiles load fine). Card order is the Vec order, so reordering persists automatically; assignments key off id, not position, so reordering is purely cosmetic.
  • glue: handlers for toggle-category-collapse, reorder-category (move a card to an insertion index), and move-line (relocate an action/stream within or between categories), each with the index-shift math, then persist + re-push.
  • UI (Slint): collapse chevron; ⠿ grip handles drive a hand-rolled drag-and-drop (Slint 1.16 has no native DnD). Drop targets are hit-tested from the global pointer vs each element's absolute-position, shown with an accent drop-line and a dimmed source row/card.

Implementation note

absolute-position reads are ternary-guarded so they only execute during an active drag. Reading absolute-position in a binding evaluated at init recurses through text layout (Recursion detected panic) — and Slint's && does not short-circuit the operand away, so the guard must be a ? :, not &&.

Known limitations (hand-rolled DnD)

  • No auto-scroll near list edges while dragging.
  • No floating drag "ghost" — feedback is the dimmed source + the accent drop-line.
  • Dropping on an expanded card's header area (above the first row) may not register a slot; aim for an actual row.

Testing

  • cargo build clean; cargo test passes.
  • Manually verified on Windows: collapse persists across restart; cards and actions reorder; actions move between categories.

🤖 Generated with Claude Code

Categories view gains drag-and-drop and persistent collapse:
- model: add `collapsed` to Slider/ButtonCategory (serde default), saved
in the profile. Card order is the Vec order, so reordering persists.
- glue: handlers for toggle-collapse, reorder-category (move card to an
insertion index), and move-line (relocate an action/stream within or
between categories of the same kind), each with the index-shift math.
- UI: a collapse chevron per card; ⠿ grip handles on category headers and
action rows drive a hand-rolled drag (Slint has no native DnD). Drop
targets are hit-tested from the global pointer vs each element's
absolute-position, with an accent drop-line indicator and a dimmed
source. Geometry reads are ternary-guarded so absolute-position is only
touched during an active drag — reading it at init recurses through
text layout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Pull request overview

Adds collapsible/reorderable category cards and draggable action/stream rows to the categories view. State is persisted in the profile via a new collapsed flag and the existing Vec order. Hand-rolled drag-and-drop is implemented in Slint using absolute-position hit-testing guarded by ternaries to avoid recursion during initial layout.

Changes:

  • Adds collapsed: bool (serde default) to SliderCategory/ButtonCategory and propagates it through CategorySummary to the UI.
  • Adds three new callbacks (toggle-category-collapse, reorder-category, move-line) with Rust handlers (reorder_by_id, move_line) that handle index-shift math and persist the preset.
  • Rewrites the category card layout to include a chevron toggle, drag grips for cards and rows, drop-mark indicators, and ternary-guarded absolute-position reads.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
src/model.rsAdds collapsed field to both category structs and updates a test constructor.
src/main.rsUpdates seed CategorySummary literals with collapsed: false.
src/glue.rsWires three new callbacks; adds reorder_by_id and move_line helpers; includes collapsed in pushed summaries.
ui/app.slintAdds collapsed to CategorySummary, introduces DropMark, drag state, grips, hit-test logic, and forwards new callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@PalmarHealer
PalmarHealer merged commit 2146340 into mainMay 31, 2026
1 check passed
@PalmarHealer
PalmarHealer deleted the feat/category-reorder branch May 31, 2026 17:41
Sign up for freeto 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

@PalmarHealer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: collapsible, reorderable categories with draggable actions - #2

Merged
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder
May 31, 2026
Merged

feat: collapsible, reorderable categories with draggable actions#2
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder

Conversation

@PalmarHealer

Copy link
Copy Markdown
Contributor

Summary

Three requested enhancements to the categories view (sliders & buttons):

  1. Collapsible categories — a chevron per card collapses/expands it; the state is persisted in the profile.
  2. Reorderable category cards — drag the ⠿ grip on a card header to reorder (cosmetic, but saved via list order).
  3. Draggable actions — drag the ⠿ grip on an action row to reorder within a category, or move it to another category of the same kind (drop onto a collapsed/empty card appends).

What changed

  • model: collapsed flag added to SliderCategory/ButtonCategory (serde default, so existing profiles load fine). Card order is the Vec order, so reordering persists automatically; assignments key off id, not position, so reordering is purely cosmetic.
  • glue: handlers for toggle-category-collapse, reorder-category (move a card to an insertion index), and move-line (relocate an action/stream within or between categories), each with the index-shift math, then persist + re-push.
  • UI (Slint): collapse chevron; ⠿ grip handles drive a hand-rolled drag-and-drop (Slint 1.16 has no native DnD). Drop targets are hit-tested from the global pointer vs each element's absolute-position, shown with an accent drop-line and a dimmed source row/card.

Implementation note

absolute-position reads are ternary-guarded so they only execute during an active drag. Reading absolute-position in a binding evaluated at init recurses through text layout (Recursion detected panic) — and Slint's && does not short-circuit the operand away, so the guard must be a ? :, not &&.

Known limitations (hand-rolled DnD)

  • No auto-scroll near list edges while dragging.
  • No floating drag "ghost" — feedback is the dimmed source + the accent drop-line.
  • Dropping on an expanded card's header area (above the first row) may not register a slot; aim for an actual row.

Testing

  • cargo build clean; cargo test passes.
  • Manually verified on Windows: collapse persists across restart; cards and actions reorder; actions move between categories.

🤖 Generated with Claude Code

Categories view gains drag-and-drop and persistent collapse:
- model: add `collapsed` to Slider/ButtonCategory (serde default), saved
in the profile. Card order is the Vec order, so reordering persists.
- glue: handlers for toggle-collapse, reorder-category (move card to an
insertion index), and move-line (relocate an action/stream within or
between categories of the same kind), each with the index-shift math.
- UI: a collapse chevron per card; ⠿ grip handles on category headers and
action rows drive a hand-rolled drag (Slint has no native DnD). Drop
targets are hit-tested from the global pointer vs each element's
absolute-position, with an accent drop-line indicator and a dimmed
source. Geometry reads are ternary-guarded so absolute-position is only
touched during an active drag — reading it at init recurses through
text layout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Pull request overview

Adds collapsible/reorderable category cards and draggable action/stream rows to the categories view. State is persisted in the profile via a new collapsed flag and the existing Vec order. Hand-rolled drag-and-drop is implemented in Slint using absolute-position hit-testing guarded by ternaries to avoid recursion during initial layout.

Changes:

  • Adds collapsed: bool (serde default) to SliderCategory/ButtonCategory and propagates it through CategorySummary to the UI.
  • Adds three new callbacks (toggle-category-collapse, reorder-category, move-line) with Rust handlers (reorder_by_id, move_line) that handle index-shift math and persist the preset.
  • Rewrites the category card layout to include a chevron toggle, drag grips for cards and rows, drop-mark indicators, and ternary-guarded absolute-position reads.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
src/model.rsAdds collapsed field to both category structs and updates a test constructor.
src/main.rsUpdates seed CategorySummary literals with collapsed: false.
src/glue.rsWires three new callbacks; adds reorder_by_id and move_line helpers; includes collapsed in pushed summaries.
ui/app.slintAdds collapsed to CategorySummary, introduces DropMark, drag state, grips, hit-test logic, and forwards new callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@PalmarHealer
PalmarHealer merged commit 2146340 into mainMay 31, 2026
1 check passed
@PalmarHealer
PalmarHealer deleted the feat/category-reorder branch May 31, 2026 17:41
Sign up for freeto 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

@PalmarHealer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: collapsible, reorderable categories with draggable actions - #2

Merged
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder
May 31, 2026
Merged

feat: collapsible, reorderable categories with draggable actions#2
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder

Conversation

@PalmarHealer

Copy link
Copy Markdown
Contributor

Summary

Three requested enhancements to the categories view (sliders & buttons):

  1. Collapsible categories — a chevron per card collapses/expands it; the state is persisted in the profile.
  2. Reorderable category cards — drag the ⠿ grip on a card header to reorder (cosmetic, but saved via list order).
  3. Draggable actions — drag the ⠿ grip on an action row to reorder within a category, or move it to another category of the same kind (drop onto a collapsed/empty card appends).

What changed

  • model: collapsed flag added to SliderCategory/ButtonCategory (serde default, so existing profiles load fine). Card order is the Vec order, so reordering persists automatically; assignments key off id, not position, so reordering is purely cosmetic.
  • glue: handlers for toggle-category-collapse, reorder-category (move a card to an insertion index), and move-line (relocate an action/stream within or between categories), each with the index-shift math, then persist + re-push.
  • UI (Slint): collapse chevron; ⠿ grip handles drive a hand-rolled drag-and-drop (Slint 1.16 has no native DnD). Drop targets are hit-tested from the global pointer vs each element's absolute-position, shown with an accent drop-line and a dimmed source row/card.

Implementation note

absolute-position reads are ternary-guarded so they only execute during an active drag. Reading absolute-position in a binding evaluated at init recurses through text layout (Recursion detected panic) — and Slint's && does not short-circuit the operand away, so the guard must be a ? :, not &&.

Known limitations (hand-rolled DnD)

  • No auto-scroll near list edges while dragging.
  • No floating drag "ghost" — feedback is the dimmed source + the accent drop-line.
  • Dropping on an expanded card's header area (above the first row) may not register a slot; aim for an actual row.

Testing

  • cargo build clean; cargo test passes.
  • Manually verified on Windows: collapse persists across restart; cards and actions reorder; actions move between categories.

🤖 Generated with Claude Code

Categories view gains drag-and-drop and persistent collapse:
- model: add `collapsed` to Slider/ButtonCategory (serde default), saved
in the profile. Card order is the Vec order, so reordering persists.
- glue: handlers for toggle-collapse, reorder-category (move card to an
insertion index), and move-line (relocate an action/stream within or
between categories of the same kind), each with the index-shift math.
- UI: a collapse chevron per card; ⠿ grip handles on category headers and
action rows drive a hand-rolled drag (Slint has no native DnD). Drop
targets are hit-tested from the global pointer vs each element's
absolute-position, with an accent drop-line indicator and a dimmed
source. Geometry reads are ternary-guarded so absolute-position is only
touched during an active drag — reading it at init recurses through
text layout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Pull request overview

Adds collapsible/reorderable category cards and draggable action/stream rows to the categories view. State is persisted in the profile via a new collapsed flag and the existing Vec order. Hand-rolled drag-and-drop is implemented in Slint using absolute-position hit-testing guarded by ternaries to avoid recursion during initial layout.

Changes:

  • Adds collapsed: bool (serde default) to SliderCategory/ButtonCategory and propagates it through CategorySummary to the UI.
  • Adds three new callbacks (toggle-category-collapse, reorder-category, move-line) with Rust handlers (reorder_by_id, move_line) that handle index-shift math and persist the preset.
  • Rewrites the category card layout to include a chevron toggle, drag grips for cards and rows, drop-mark indicators, and ternary-guarded absolute-position reads.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
src/model.rsAdds collapsed field to both category structs and updates a test constructor.
src/main.rsUpdates seed CategorySummary literals with collapsed: false.
src/glue.rsWires three new callbacks; adds reorder_by_id and move_line helpers; includes collapsed in pushed summaries.
ui/app.slintAdds collapsed to CategorySummary, introduces DropMark, drag state, grips, hit-test logic, and forwards new callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@PalmarHealer
PalmarHealer merged commit 2146340 into mainMay 31, 2026
1 check passed
@PalmarHealer
PalmarHealer deleted the feat/category-reorder branch May 31, 2026 17:41
Sign up for freeto 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

@PalmarHealer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: collapsible, reorderable categories with draggable actions - #2

Merged
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder
May 31, 2026
Merged

feat: collapsible, reorderable categories with draggable actions#2
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder

Conversation

@PalmarHealer

Copy link
Copy Markdown
Contributor

Summary

Three requested enhancements to the categories view (sliders & buttons):

  1. Collapsible categories — a chevron per card collapses/expands it; the state is persisted in the profile.
  2. Reorderable category cards — drag the ⠿ grip on a card header to reorder (cosmetic, but saved via list order).
  3. Draggable actions — drag the ⠿ grip on an action row to reorder within a category, or move it to another category of the same kind (drop onto a collapsed/empty card appends).

What changed

  • model: collapsed flag added to SliderCategory/ButtonCategory (serde default, so existing profiles load fine). Card order is the Vec order, so reordering persists automatically; assignments key off id, not position, so reordering is purely cosmetic.
  • glue: handlers for toggle-category-collapse, reorder-category (move a card to an insertion index), and move-line (relocate an action/stream within or between categories), each with the index-shift math, then persist + re-push.
  • UI (Slint): collapse chevron; ⠿ grip handles drive a hand-rolled drag-and-drop (Slint 1.16 has no native DnD). Drop targets are hit-tested from the global pointer vs each element's absolute-position, shown with an accent drop-line and a dimmed source row/card.

Implementation note

absolute-position reads are ternary-guarded so they only execute during an active drag. Reading absolute-position in a binding evaluated at init recurses through text layout (Recursion detected panic) — and Slint's && does not short-circuit the operand away, so the guard must be a ? :, not &&.

Known limitations (hand-rolled DnD)

  • No auto-scroll near list edges while dragging.
  • No floating drag "ghost" — feedback is the dimmed source + the accent drop-line.
  • Dropping on an expanded card's header area (above the first row) may not register a slot; aim for an actual row.

Testing

  • cargo build clean; cargo test passes.
  • Manually verified on Windows: collapse persists across restart; cards and actions reorder; actions move between categories.

🤖 Generated with Claude Code

Categories view gains drag-and-drop and persistent collapse:
- model: add `collapsed` to Slider/ButtonCategory (serde default), saved
in the profile. Card order is the Vec order, so reordering persists.
- glue: handlers for toggle-collapse, reorder-category (move card to an
insertion index), and move-line (relocate an action/stream within or
between categories of the same kind), each with the index-shift math.
- UI: a collapse chevron per card; ⠿ grip handles on category headers and
action rows drive a hand-rolled drag (Slint has no native DnD). Drop
targets are hit-tested from the global pointer vs each element's
absolute-position, with an accent drop-line indicator and a dimmed
source. Geometry reads are ternary-guarded so absolute-position is only
touched during an active drag — reading it at init recurses through
text layout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Pull request overview

Adds collapsible/reorderable category cards and draggable action/stream rows to the categories view. State is persisted in the profile via a new collapsed flag and the existing Vec order. Hand-rolled drag-and-drop is implemented in Slint using absolute-position hit-testing guarded by ternaries to avoid recursion during initial layout.

Changes:

  • Adds collapsed: bool (serde default) to SliderCategory/ButtonCategory and propagates it through CategorySummary to the UI.
  • Adds three new callbacks (toggle-category-collapse, reorder-category, move-line) with Rust handlers (reorder_by_id, move_line) that handle index-shift math and persist the preset.
  • Rewrites the category card layout to include a chevron toggle, drag grips for cards and rows, drop-mark indicators, and ternary-guarded absolute-position reads.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
src/model.rsAdds collapsed field to both category structs and updates a test constructor.
src/main.rsUpdates seed CategorySummary literals with collapsed: false.
src/glue.rsWires three new callbacks; adds reorder_by_id and move_line helpers; includes collapsed in pushed summaries.
ui/app.slintAdds collapsed to CategorySummary, introduces DropMark, drag state, grips, hit-test logic, and forwards new callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@PalmarHealer
PalmarHealer merged commit 2146340 into mainMay 31, 2026
1 check passed
@PalmarHealer
PalmarHealer deleted the feat/category-reorder branch May 31, 2026 17:41
Sign up for freeto 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

@PalmarHealer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: collapsible, reorderable categories with draggable actions - #2

Merged
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder
May 31, 2026
Merged

feat: collapsible, reorderable categories with draggable actions#2
PalmarHealer merged 1 commit into
mainfrom
feat/category-reorder

Conversation

@PalmarHealer

Copy link
Copy Markdown
Contributor

Summary

Three requested enhancements to the categories view (sliders & buttons):

  1. Collapsible categories — a chevron per card collapses/expands it; the state is persisted in the profile.
  2. Reorderable category cards — drag the ⠿ grip on a card header to reorder (cosmetic, but saved via list order).
  3. Draggable actions — drag the ⠿ grip on an action row to reorder within a category, or move it to another category of the same kind (drop onto a collapsed/empty card appends).

What changed

  • model: collapsed flag added to SliderCategory/ButtonCategory (serde default, so existing profiles load fine). Card order is the Vec order, so reordering persists automatically; assignments key off id, not position, so reordering is purely cosmetic.
  • glue: handlers for toggle-category-collapse, reorder-category (move a card to an insertion index), and move-line (relocate an action/stream within or between categories), each with the index-shift math, then persist + re-push.
  • UI (Slint): collapse chevron; ⠿ grip handles drive a hand-rolled drag-and-drop (Slint 1.16 has no native DnD). Drop targets are hit-tested from the global pointer vs each element's absolute-position, shown with an accent drop-line and a dimmed source row/card.

Implementation note

absolute-position reads are ternary-guarded so they only execute during an active drag. Reading absolute-position in a binding evaluated at init recurses through text layout (Recursion detected panic) — and Slint's && does not short-circuit the operand away, so the guard must be a ? :, not &&.

Known limitations (hand-rolled DnD)

  • No auto-scroll near list edges while dragging.
  • No floating drag "ghost" — feedback is the dimmed source + the accent drop-line.
  • Dropping on an expanded card's header area (above the first row) may not register a slot; aim for an actual row.

Testing

  • cargo build clean; cargo test passes.
  • Manually verified on Windows: collapse persists across restart; cards and actions reorder; actions move between categories.

🤖 Generated with Claude Code

Categories view gains drag-and-drop and persistent collapse:
- model: add `collapsed` to Slider/ButtonCategory (serde default), saved
in the profile. Card order is the Vec order, so reordering persists.
- glue: handlers for toggle-collapse, reorder-category (move card to an
insertion index), and move-line (relocate an action/stream within or
between categories of the same kind), each with the index-shift math.
- UI: a collapse chevron per card; ⠿ grip handles on category headers and
action rows drive a hand-rolled drag (Slint has no native DnD). Drop
targets are hit-tested from the global pointer vs each element's
absolute-position, with an accent drop-line indicator and a dimmed
source. Geometry reads are ternary-guarded so absolute-position is only
touched during an active drag — reading it at init recurses through
text layout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

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

Pull request overview

Adds collapsible/reorderable category cards and draggable action/stream rows to the categories view. State is persisted in the profile via a new collapsed flag and the existing Vec order. Hand-rolled drag-and-drop is implemented in Slint using absolute-position hit-testing guarded by ternaries to avoid recursion during initial layout.

Changes:

  • Adds collapsed: bool (serde default) to SliderCategory/ButtonCategory and propagates it through CategorySummary to the UI.
  • Adds three new callbacks (toggle-category-collapse, reorder-category, move-line) with Rust handlers (reorder_by_id, move_line) that handle index-shift math and persist the preset.
  • Rewrites the category card layout to include a chevron toggle, drag grips for cards and rows, drop-mark indicators, and ternary-guarded absolute-position reads.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
src/model.rsAdds collapsed field to both category structs and updates a test constructor.
src/main.rsUpdates seed CategorySummary literals with collapsed: false.
src/glue.rsWires three new callbacks; adds reorder_by_id and move_line helpers; includes collapsed in pushed summaries.
ui/app.slintAdds collapsed to CategorySummary, introduces DropMark, drag state, grips, hit-test logic, and forwards new callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@PalmarHealer
PalmarHealer merged commit 2146340 into mainMay 31, 2026
1 check passed
@PalmarHealer
PalmarHealer deleted the feat/category-reorder branch May 31, 2026 17:41
Sign up for freeto 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

@PalmarHealer