feat(toast): port upstream close buttons (#2023) - #67

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons
Apr 24, 2026
Merged

feat(toast): port upstream close buttons (#2023)#67
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons

Conversation

@tyulyukov

Copy link
Copy Markdown
Owner

Summary

Ports upstream #2023 toast refactor — adds visible X close buttons, ToastBodyContent extraction, and expandable body fields (expandableContent, expandableLabels, expandableDescriptionTrigger).

Conflicts resolved

  • apps/web/src/components/ui/toast.tsx: Took upstream's version wholesale (492 → 719 lines). Upstream already re-integrated our CopyErrorButton (line 93) on error toasts, so nothing to hand-merge there.
  • apps/web/src/components/Sidebar.tsx: Preserved MarCode's richer "Delete anyway" warning toast in SidebarProjectItem — action button, deferred close, api.dialogs.confirm(...) with thread-count messaging, removeProject(..., { force: true }), and inline error toast on failure. Migrated the outer toast calls to the new stackedThreadToast(...) helper for layout consistency with the rest of the file and the error-toast path that upstream already migrated.

Why this is isolated

Dedicated branch on top of origin/main — intentionally not mixed into PR #66 because:

  1. toast.tsx is a large refactor (+227 net lines) and deserves its own review window.
  2. The Sidebar "Delete anyway" preservation is a MarCode-specific behavior the reviewer should confirm on its own.

Test plan

  • Local: bun run typecheck clean
  • Local: apps/web full test suite — 1088/1088 passing (incl. toast.logic.test.ts 10/10)
  • Local: oxlint — 0 errors (67 pre-existing warnings)
  • Manual smoke:
    • Info / success / warning / error toast all render with an X close button
    • Clicking X dismisses the toast
    • Long error messages still show the Copy button + expandable body
    • Right-click → Delete project:
      • Empty project → confirms + removes
      • Non-empty project → shows "Delete anyway" warning; clicking it opens confirm dialog with thread count; Cancel aborts; OK deletes threads and project
      • Delete failure → stacked error toast
  • FEATURES.md checklist — no MarCode exclusive feature regresses

Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit 542dda095a958c2f5ff856af7584233ee460bf4e)
@tyulyukov
tyulyukov merged commit 9f6411d into mainApr 24, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tyulyukov@noxire-dev
, '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(toast): port upstream close buttons (#2023) - #67

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons
Apr 24, 2026
Merged

feat(toast): port upstream close buttons (#2023)#67
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons

Conversation

@tyulyukov

Copy link
Copy Markdown
Owner

Summary

Ports upstream #2023 toast refactor — adds visible X close buttons, ToastBodyContent extraction, and expandable body fields (expandableContent, expandableLabels, expandableDescriptionTrigger).

Conflicts resolved

  • apps/web/src/components/ui/toast.tsx: Took upstream's version wholesale (492 → 719 lines). Upstream already re-integrated our CopyErrorButton (line 93) on error toasts, so nothing to hand-merge there.
  • apps/web/src/components/Sidebar.tsx: Preserved MarCode's richer "Delete anyway" warning toast in SidebarProjectItem — action button, deferred close, api.dialogs.confirm(...) with thread-count messaging, removeProject(..., { force: true }), and inline error toast on failure. Migrated the outer toast calls to the new stackedThreadToast(...) helper for layout consistency with the rest of the file and the error-toast path that upstream already migrated.

Why this is isolated

Dedicated branch on top of origin/main — intentionally not mixed into PR #66 because:

  1. toast.tsx is a large refactor (+227 net lines) and deserves its own review window.
  2. The Sidebar "Delete anyway" preservation is a MarCode-specific behavior the reviewer should confirm on its own.

Test plan

  • Local: bun run typecheck clean
  • Local: apps/web full test suite — 1088/1088 passing (incl. toast.logic.test.ts 10/10)
  • Local: oxlint — 0 errors (67 pre-existing warnings)
  • Manual smoke:
    • Info / success / warning / error toast all render with an X close button
    • Clicking X dismisses the toast
    • Long error messages still show the Copy button + expandable body
    • Right-click → Delete project:
      • Empty project → confirms + removes
      • Non-empty project → shows "Delete anyway" warning; clicking it opens confirm dialog with thread count; Cancel aborts; OK deletes threads and project
      • Delete failure → stacked error toast
  • FEATURES.md checklist — no MarCode exclusive feature regresses

Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit 542dda095a958c2f5ff856af7584233ee460bf4e)
@tyulyukov
tyulyukov merged commit 9f6411d into mainApr 24, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tyulyukov@noxire-dev
, '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(toast): port upstream close buttons (#2023) - #67

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons
Apr 24, 2026
Merged

feat(toast): port upstream close buttons (#2023)#67
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons

Conversation

@tyulyukov

Copy link
Copy Markdown
Owner

Summary

Ports upstream #2023 toast refactor — adds visible X close buttons, ToastBodyContent extraction, and expandable body fields (expandableContent, expandableLabels, expandableDescriptionTrigger).

Conflicts resolved

  • apps/web/src/components/ui/toast.tsx: Took upstream's version wholesale (492 → 719 lines). Upstream already re-integrated our CopyErrorButton (line 93) on error toasts, so nothing to hand-merge there.
  • apps/web/src/components/Sidebar.tsx: Preserved MarCode's richer "Delete anyway" warning toast in SidebarProjectItem — action button, deferred close, api.dialogs.confirm(...) with thread-count messaging, removeProject(..., { force: true }), and inline error toast on failure. Migrated the outer toast calls to the new stackedThreadToast(...) helper for layout consistency with the rest of the file and the error-toast path that upstream already migrated.

Why this is isolated

Dedicated branch on top of origin/main — intentionally not mixed into PR #66 because:

  1. toast.tsx is a large refactor (+227 net lines) and deserves its own review window.
  2. The Sidebar "Delete anyway" preservation is a MarCode-specific behavior the reviewer should confirm on its own.

Test plan

  • Local: bun run typecheck clean
  • Local: apps/web full test suite — 1088/1088 passing (incl. toast.logic.test.ts 10/10)
  • Local: oxlint — 0 errors (67 pre-existing warnings)
  • Manual smoke:
    • Info / success / warning / error toast all render with an X close button
    • Clicking X dismisses the toast
    • Long error messages still show the Copy button + expandable body
    • Right-click → Delete project:
      • Empty project → confirms + removes
      • Non-empty project → shows "Delete anyway" warning; clicking it opens confirm dialog with thread count; Cancel aborts; OK deletes threads and project
      • Delete failure → stacked error toast
  • FEATURES.md checklist — no MarCode exclusive feature regresses

Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit 542dda095a958c2f5ff856af7584233ee460bf4e)
@tyulyukov
tyulyukov merged commit 9f6411d into mainApr 24, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tyulyukov@noxire-dev
, '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(toast): port upstream close buttons (#2023) - #67

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons
Apr 24, 2026
Merged

feat(toast): port upstream close buttons (#2023)#67
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons

Conversation

@tyulyukov

Copy link
Copy Markdown
Owner

Summary

Ports upstream #2023 toast refactor — adds visible X close buttons, ToastBodyContent extraction, and expandable body fields (expandableContent, expandableLabels, expandableDescriptionTrigger).

Conflicts resolved

  • apps/web/src/components/ui/toast.tsx: Took upstream's version wholesale (492 → 719 lines). Upstream already re-integrated our CopyErrorButton (line 93) on error toasts, so nothing to hand-merge there.
  • apps/web/src/components/Sidebar.tsx: Preserved MarCode's richer "Delete anyway" warning toast in SidebarProjectItem — action button, deferred close, api.dialogs.confirm(...) with thread-count messaging, removeProject(..., { force: true }), and inline error toast on failure. Migrated the outer toast calls to the new stackedThreadToast(...) helper for layout consistency with the rest of the file and the error-toast path that upstream already migrated.

Why this is isolated

Dedicated branch on top of origin/main — intentionally not mixed into PR #66 because:

  1. toast.tsx is a large refactor (+227 net lines) and deserves its own review window.
  2. The Sidebar "Delete anyway" preservation is a MarCode-specific behavior the reviewer should confirm on its own.

Test plan

  • Local: bun run typecheck clean
  • Local: apps/web full test suite — 1088/1088 passing (incl. toast.logic.test.ts 10/10)
  • Local: oxlint — 0 errors (67 pre-existing warnings)
  • Manual smoke:
    • Info / success / warning / error toast all render with an X close button
    • Clicking X dismisses the toast
    • Long error messages still show the Copy button + expandable body
    • Right-click → Delete project:
      • Empty project → confirms + removes
      • Non-empty project → shows "Delete anyway" warning; clicking it opens confirm dialog with thread count; Cancel aborts; OK deletes threads and project
      • Delete failure → stacked error toast
  • FEATURES.md checklist — no MarCode exclusive feature regresses

Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit 542dda095a958c2f5ff856af7584233ee460bf4e)
@tyulyukov
tyulyukov merged commit 9f6411d into mainApr 24, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tyulyukov@noxire-dev
, '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(toast): port upstream close buttons (#2023) - #67

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons
Apr 24, 2026
Merged

feat(toast): port upstream close buttons (#2023)#67
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons

Conversation

@tyulyukov

Copy link
Copy Markdown
Owner

Summary

Ports upstream #2023 toast refactor — adds visible X close buttons, ToastBodyContent extraction, and expandable body fields (expandableContent, expandableLabels, expandableDescriptionTrigger).

Conflicts resolved

  • apps/web/src/components/ui/toast.tsx: Took upstream's version wholesale (492 → 719 lines). Upstream already re-integrated our CopyErrorButton (line 93) on error toasts, so nothing to hand-merge there.
  • apps/web/src/components/Sidebar.tsx: Preserved MarCode's richer "Delete anyway" warning toast in SidebarProjectItem — action button, deferred close, api.dialogs.confirm(...) with thread-count messaging, removeProject(..., { force: true }), and inline error toast on failure. Migrated the outer toast calls to the new stackedThreadToast(...) helper for layout consistency with the rest of the file and the error-toast path that upstream already migrated.

Why this is isolated

Dedicated branch on top of origin/main — intentionally not mixed into PR #66 because:

  1. toast.tsx is a large refactor (+227 net lines) and deserves its own review window.
  2. The Sidebar "Delete anyway" preservation is a MarCode-specific behavior the reviewer should confirm on its own.

Test plan

  • Local: bun run typecheck clean
  • Local: apps/web full test suite — 1088/1088 passing (incl. toast.logic.test.ts 10/10)
  • Local: oxlint — 0 errors (67 pre-existing warnings)
  • Manual smoke:
    • Info / success / warning / error toast all render with an X close button
    • Clicking X dismisses the toast
    • Long error messages still show the Copy button + expandable body
    • Right-click → Delete project:
      • Empty project → confirms + removes
      • Non-empty project → shows "Delete anyway" warning; clicking it opens confirm dialog with thread count; Cancel aborts; OK deletes threads and project
      • Delete failure → stacked error toast
  • FEATURES.md checklist — no MarCode exclusive feature regresses

Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit 542dda095a958c2f5ff856af7584233ee460bf4e)
@tyulyukov
tyulyukov merged commit 9f6411d into mainApr 24, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tyulyukov@noxire-dev
, '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(toast): port upstream close buttons (#2023) - #67

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons
Apr 24, 2026
Merged

feat(toast): port upstream close buttons (#2023)#67
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons

Conversation

@tyulyukov

Copy link
Copy Markdown
Owner

Summary

Ports upstream #2023 toast refactor — adds visible X close buttons, ToastBodyContent extraction, and expandable body fields (expandableContent, expandableLabels, expandableDescriptionTrigger).

Conflicts resolved

  • apps/web/src/components/ui/toast.tsx: Took upstream's version wholesale (492 → 719 lines). Upstream already re-integrated our CopyErrorButton (line 93) on error toasts, so nothing to hand-merge there.
  • apps/web/src/components/Sidebar.tsx: Preserved MarCode's richer "Delete anyway" warning toast in SidebarProjectItem — action button, deferred close, api.dialogs.confirm(...) with thread-count messaging, removeProject(..., { force: true }), and inline error toast on failure. Migrated the outer toast calls to the new stackedThreadToast(...) helper for layout consistency with the rest of the file and the error-toast path that upstream already migrated.

Why this is isolated

Dedicated branch on top of origin/main — intentionally not mixed into PR #66 because:

  1. toast.tsx is a large refactor (+227 net lines) and deserves its own review window.
  2. The Sidebar "Delete anyway" preservation is a MarCode-specific behavior the reviewer should confirm on its own.

Test plan

  • Local: bun run typecheck clean
  • Local: apps/web full test suite — 1088/1088 passing (incl. toast.logic.test.ts 10/10)
  • Local: oxlint — 0 errors (67 pre-existing warnings)
  • Manual smoke:
    • Info / success / warning / error toast all render with an X close button
    • Clicking X dismisses the toast
    • Long error messages still show the Copy button + expandable body
    • Right-click → Delete project:
      • Empty project → confirms + removes
      • Non-empty project → shows "Delete anyway" warning; clicking it opens confirm dialog with thread count; Cancel aborts; OK deletes threads and project
      • Delete failure → stacked error toast
  • FEATURES.md checklist — no MarCode exclusive feature regresses

Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit 542dda095a958c2f5ff856af7584233ee460bf4e)
@tyulyukov
tyulyukov merged commit 9f6411d into mainApr 24, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tyulyukov@noxire-dev
, '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(toast): port upstream close buttons (#2023) - #67

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons
Apr 24, 2026
Merged

feat(toast): port upstream close buttons (#2023)#67
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons

Conversation

@tyulyukov

Copy link
Copy Markdown
Owner

Summary

Ports upstream #2023 toast refactor — adds visible X close buttons, ToastBodyContent extraction, and expandable body fields (expandableContent, expandableLabels, expandableDescriptionTrigger).

Conflicts resolved

  • apps/web/src/components/ui/toast.tsx: Took upstream's version wholesale (492 → 719 lines). Upstream already re-integrated our CopyErrorButton (line 93) on error toasts, so nothing to hand-merge there.
  • apps/web/src/components/Sidebar.tsx: Preserved MarCode's richer "Delete anyway" warning toast in SidebarProjectItem — action button, deferred close, api.dialogs.confirm(...) with thread-count messaging, removeProject(..., { force: true }), and inline error toast on failure. Migrated the outer toast calls to the new stackedThreadToast(...) helper for layout consistency with the rest of the file and the error-toast path that upstream already migrated.

Why this is isolated

Dedicated branch on top of origin/main — intentionally not mixed into PR #66 because:

  1. toast.tsx is a large refactor (+227 net lines) and deserves its own review window.
  2. The Sidebar "Delete anyway" preservation is a MarCode-specific behavior the reviewer should confirm on its own.

Test plan

  • Local: bun run typecheck clean
  • Local: apps/web full test suite — 1088/1088 passing (incl. toast.logic.test.ts 10/10)
  • Local: oxlint — 0 errors (67 pre-existing warnings)
  • Manual smoke:
    • Info / success / warning / error toast all render with an X close button
    • Clicking X dismisses the toast
    • Long error messages still show the Copy button + expandable body
    • Right-click → Delete project:
      • Empty project → confirms + removes
      • Non-empty project → shows "Delete anyway" warning; clicking it opens confirm dialog with thread count; Cancel aborts; OK deletes threads and project
      • Delete failure → stacked error toast
  • FEATURES.md checklist — no MarCode exclusive feature regresses

Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit 542dda095a958c2f5ff856af7584233ee460bf4e)
@tyulyukov
tyulyukov merged commit 9f6411d into mainApr 24, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tyulyukov@noxire-dev
, '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(toast): port upstream close buttons (#2023) - #67

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons
Apr 24, 2026
Merged

feat(toast): port upstream close buttons (#2023)#67
tyulyukov merged 1 commit into
mainfrom
marcode/port-toast-close-buttons

Conversation

@tyulyukov

Copy link
Copy Markdown
Owner

Summary

Ports upstream #2023 toast refactor — adds visible X close buttons, ToastBodyContent extraction, and expandable body fields (expandableContent, expandableLabels, expandableDescriptionTrigger).

Conflicts resolved

  • apps/web/src/components/ui/toast.tsx: Took upstream's version wholesale (492 → 719 lines). Upstream already re-integrated our CopyErrorButton (line 93) on error toasts, so nothing to hand-merge there.
  • apps/web/src/components/Sidebar.tsx: Preserved MarCode's richer "Delete anyway" warning toast in SidebarProjectItem — action button, deferred close, api.dialogs.confirm(...) with thread-count messaging, removeProject(..., { force: true }), and inline error toast on failure. Migrated the outer toast calls to the new stackedThreadToast(...) helper for layout consistency with the rest of the file and the error-toast path that upstream already migrated.

Why this is isolated

Dedicated branch on top of origin/main — intentionally not mixed into PR #66 because:

  1. toast.tsx is a large refactor (+227 net lines) and deserves its own review window.
  2. The Sidebar "Delete anyway" preservation is a MarCode-specific behavior the reviewer should confirm on its own.

Test plan

  • Local: bun run typecheck clean
  • Local: apps/web full test suite — 1088/1088 passing (incl. toast.logic.test.ts 10/10)
  • Local: oxlint — 0 errors (67 pre-existing warnings)
  • Manual smoke:
    • Info / success / warning / error toast all render with an X close button
    • Clicking X dismisses the toast
    • Long error messages still show the Copy button + expandable body
    • Right-click → Delete project:
      • Empty project → confirms + removes
      • Non-empty project → shows "Delete anyway" warning; clicking it opens confirm dialog with thread count; Cancel aborts; OK deletes threads and project
      • Delete failure → stacked error toast
  • FEATURES.md checklist — no MarCode exclusive feature regresses

Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit 542dda095a958c2f5ff856af7584233ee460bf4e)
@tyulyukov
tyulyukov merged commit 9f6411d into mainApr 24, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tyulyukov@noxire-dev