Swap amico.svg - #99

Merged
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh
Jul 9, 2026
Merged

Swap amico.svg#99
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh

Conversation

@kateebonner

@kateebonnerkateebonner commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace packages/extension/media/amico.svg with Kate's redesigned mark
  • Consolidate to two SVG assets total: amico.svg (detailed, large contexts) and amico_reduced.svg (the same mark's outer bracket path only, no internal accents — small contexts). Both carry a single fill="currentColor" on their <svg> root (inherited by every child shape, none of which declare their own fill) — no per-file hardcoded colors, no per-consumer file variants.
  • atoms/icon.ts's inline mark is a canonical .svg file import (esbuild loader: {".svg": "text"}) instead of a hand-duplicated TS literal — the single-source-of-truth fix that prevents the exact drift this redesign otherwise re-triggered (see opencode PR β.1: amico-run thin process orchestrator (closes #1) #7, which caught the previous version of this mark going stale in the fork).

Not in this PR (scoped out on request)

Chat panel tab icon theming was cut: VS Code's webview tab icon (panel.iconPath) renders outside any live DOM, so fill="currentColor" can't resolve there — the platform's only mechanism for a theme-adaptive tab icon is two static {light, dark} files, which contradicts the two-file goal above. chat_panel.ts stays on its pre-existing single-file behavior (now pointed at the new amico.svg). The light/dark tab legibility question is deferred, not solved wrong.

Test plan

  • pnpm --filter amicode-v2 test — 431 passed, 0 failed
  • pnpm --filter amicode-v2 typecheck — clean
  • Open in the Extension Development Host and eyeball the activity-bar icon and an open chat panel tab in both a light and dark VS Code theme

@kateebonnerkateebonner changed the title Swap amico.svg to the hackathon repo's markSwap amico.svgJul 8, 2026
kateebonner added a commit that referenced this pull request Jul 9, 2026
…ntext
The tab icon rendered solid black regardless of theme: amico_reduced.svg
carries fill="currentColor" for live-DOM consumers (icon.ts's inline
mark, which correctly inherits --vscode-foreground), but a WebviewPanel
tab icon is a static image with no DOM to inherit from — currentColor
there resolves to nothing and falls back to black.
Fix: tabIconPaths() derives the two literal-fill files VS Code's
{light,dark} iconPath API requires from the SAME single authored
amico_reduced.svg (string-substituting the fill), generated once into
globalStorageUri rather than checked into the repo — keeps the "two
authored SVG files" design while the tab icon actually adapts.
Also: package.json's activitybar/panel viewsContainers icons now point
at amico_reduced.svg instead of amico.svg — same small-size legibility
argument PR #99 already established for the tab icon and inline mark
applies here too (VS Code masks/recolors these regardless of fill, but
the fine circuit-pattern geometry still doesn't resolve at that size).
amico.svg is now unreferenced by code — kept as the large/detailed asset
for whatever future context actually renders it big enough to matter.
Tests: 433 pass (431 + 2 new for tabIconPaths), 0 fail. Typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swaps in the redesigned Amico mark and reshapes how it is consumed so
the geometry lives in the .svg files, not in duplicated code.
Assets (media/):
- amico.svg — the detailed mark (redesigned).
- amico_reduced.svg — the same mark's outer bracket only, for small
sizes. Both carry fill="currentColor" on the <svg> root so their
color is driven by the host, not baked in.
logo() atom (media/ui/atoms/logo.ts, replaces icon.ts's mark()):
logo({ variant?, fill? })
variant "full" (default) → amico.svg; "reduced" → amico_reduced.svg
fill defaults to var(--vscode-foreground) (theme-responsive) via
currentColor; overridable.
Both files are imported as raw text (esbuild {".svg":"text"} loader +
a matching vitest transform + svg.d.ts), so the .svg is the single
source of truth — no path data duplicated in TS (the exact thing that
silently drifted before). inspector.ts's brand mark now calls
logo({ variant: "reduced" }).
Small-context consumers use the reduced mark: package.json's
activitybar/panel icons → amico_reduced.svg (VS Code auto-recolors
these monochrome masks per theme).
Chat panel native tab icon (chat_panel.ts): a WebviewPanel tab icon is
a static image with no DOM, so currentColor can't resolve there (it
rendered dark). VS Code's only theme-adaptive path is a committed
{light, dark} pair inside the extension folder — verified via probe
that an icon in globalStorageUri renders as nothing, and the .vsix
extension folder is read-only so runtime generation is impossible.
media/amico-tab-{light,dark}.svg are therefore committed, derived from
amico_reduced.svg with a theme-foreground gray fill; a unit test keeps
them in lockstep with the source geometry.
Tests: logo.test.ts (both variants, theme default, fill override) +
chat_panel_icon.test.ts (tab pair fills + geometry sync). 435 pass,
typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonnerforce-pushed the kate/amico-mark-refresh branch from 576d444 to 84ab68cCompareJuly 9, 2026 01:23
@kateebonner
kateebonner merged commit afa9ecc into mainJul 9, 2026
5 checks passed
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.

1 participant

@kateebonner
, '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

Swap amico.svg - #99

Merged
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh
Jul 9, 2026
Merged

Swap amico.svg#99
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh

Conversation

@kateebonner

@kateebonnerkateebonner commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace packages/extension/media/amico.svg with Kate's redesigned mark
  • Consolidate to two SVG assets total: amico.svg (detailed, large contexts) and amico_reduced.svg (the same mark's outer bracket path only, no internal accents — small contexts). Both carry a single fill="currentColor" on their <svg> root (inherited by every child shape, none of which declare their own fill) — no per-file hardcoded colors, no per-consumer file variants.
  • atoms/icon.ts's inline mark is a canonical .svg file import (esbuild loader: {".svg": "text"}) instead of a hand-duplicated TS literal — the single-source-of-truth fix that prevents the exact drift this redesign otherwise re-triggered (see opencode PR β.1: amico-run thin process orchestrator (closes #1) #7, which caught the previous version of this mark going stale in the fork).

Not in this PR (scoped out on request)

Chat panel tab icon theming was cut: VS Code's webview tab icon (panel.iconPath) renders outside any live DOM, so fill="currentColor" can't resolve there — the platform's only mechanism for a theme-adaptive tab icon is two static {light, dark} files, which contradicts the two-file goal above. chat_panel.ts stays on its pre-existing single-file behavior (now pointed at the new amico.svg). The light/dark tab legibility question is deferred, not solved wrong.

Test plan

  • pnpm --filter amicode-v2 test — 431 passed, 0 failed
  • pnpm --filter amicode-v2 typecheck — clean
  • Open in the Extension Development Host and eyeball the activity-bar icon and an open chat panel tab in both a light and dark VS Code theme

@kateebonnerkateebonner changed the title Swap amico.svg to the hackathon repo's markSwap amico.svgJul 8, 2026
kateebonner added a commit that referenced this pull request Jul 9, 2026
…ntext
The tab icon rendered solid black regardless of theme: amico_reduced.svg
carries fill="currentColor" for live-DOM consumers (icon.ts's inline
mark, which correctly inherits --vscode-foreground), but a WebviewPanel
tab icon is a static image with no DOM to inherit from — currentColor
there resolves to nothing and falls back to black.
Fix: tabIconPaths() derives the two literal-fill files VS Code's
{light,dark} iconPath API requires from the SAME single authored
amico_reduced.svg (string-substituting the fill), generated once into
globalStorageUri rather than checked into the repo — keeps the "two
authored SVG files" design while the tab icon actually adapts.
Also: package.json's activitybar/panel viewsContainers icons now point
at amico_reduced.svg instead of amico.svg — same small-size legibility
argument PR #99 already established for the tab icon and inline mark
applies here too (VS Code masks/recolors these regardless of fill, but
the fine circuit-pattern geometry still doesn't resolve at that size).
amico.svg is now unreferenced by code — kept as the large/detailed asset
for whatever future context actually renders it big enough to matter.
Tests: 433 pass (431 + 2 new for tabIconPaths), 0 fail. Typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swaps in the redesigned Amico mark and reshapes how it is consumed so
the geometry lives in the .svg files, not in duplicated code.
Assets (media/):
- amico.svg — the detailed mark (redesigned).
- amico_reduced.svg — the same mark's outer bracket only, for small
sizes. Both carry fill="currentColor" on the <svg> root so their
color is driven by the host, not baked in.
logo() atom (media/ui/atoms/logo.ts, replaces icon.ts's mark()):
logo({ variant?, fill? })
variant "full" (default) → amico.svg; "reduced" → amico_reduced.svg
fill defaults to var(--vscode-foreground) (theme-responsive) via
currentColor; overridable.
Both files are imported as raw text (esbuild {".svg":"text"} loader +
a matching vitest transform + svg.d.ts), so the .svg is the single
source of truth — no path data duplicated in TS (the exact thing that
silently drifted before). inspector.ts's brand mark now calls
logo({ variant: "reduced" }).
Small-context consumers use the reduced mark: package.json's
activitybar/panel icons → amico_reduced.svg (VS Code auto-recolors
these monochrome masks per theme).
Chat panel native tab icon (chat_panel.ts): a WebviewPanel tab icon is
a static image with no DOM, so currentColor can't resolve there (it
rendered dark). VS Code's only theme-adaptive path is a committed
{light, dark} pair inside the extension folder — verified via probe
that an icon in globalStorageUri renders as nothing, and the .vsix
extension folder is read-only so runtime generation is impossible.
media/amico-tab-{light,dark}.svg are therefore committed, derived from
amico_reduced.svg with a theme-foreground gray fill; a unit test keeps
them in lockstep with the source geometry.
Tests: logo.test.ts (both variants, theme default, fill override) +
chat_panel_icon.test.ts (tab pair fills + geometry sync). 435 pass,
typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonnerforce-pushed the kate/amico-mark-refresh branch from 576d444 to 84ab68cCompareJuly 9, 2026 01:23
@kateebonner
kateebonner merged commit afa9ecc into mainJul 9, 2026
5 checks passed
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.

1 participant

@kateebonner
, '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

Swap amico.svg - #99

Merged
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh
Jul 9, 2026
Merged

Swap amico.svg#99
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh

Conversation

@kateebonner

@kateebonnerkateebonner commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace packages/extension/media/amico.svg with Kate's redesigned mark
  • Consolidate to two SVG assets total: amico.svg (detailed, large contexts) and amico_reduced.svg (the same mark's outer bracket path only, no internal accents — small contexts). Both carry a single fill="currentColor" on their <svg> root (inherited by every child shape, none of which declare their own fill) — no per-file hardcoded colors, no per-consumer file variants.
  • atoms/icon.ts's inline mark is a canonical .svg file import (esbuild loader: {".svg": "text"}) instead of a hand-duplicated TS literal — the single-source-of-truth fix that prevents the exact drift this redesign otherwise re-triggered (see opencode PR β.1: amico-run thin process orchestrator (closes #1) #7, which caught the previous version of this mark going stale in the fork).

Not in this PR (scoped out on request)

Chat panel tab icon theming was cut: VS Code's webview tab icon (panel.iconPath) renders outside any live DOM, so fill="currentColor" can't resolve there — the platform's only mechanism for a theme-adaptive tab icon is two static {light, dark} files, which contradicts the two-file goal above. chat_panel.ts stays on its pre-existing single-file behavior (now pointed at the new amico.svg). The light/dark tab legibility question is deferred, not solved wrong.

Test plan

  • pnpm --filter amicode-v2 test — 431 passed, 0 failed
  • pnpm --filter amicode-v2 typecheck — clean
  • Open in the Extension Development Host and eyeball the activity-bar icon and an open chat panel tab in both a light and dark VS Code theme

@kateebonnerkateebonner changed the title Swap amico.svg to the hackathon repo's markSwap amico.svgJul 8, 2026
kateebonner added a commit that referenced this pull request Jul 9, 2026
…ntext
The tab icon rendered solid black regardless of theme: amico_reduced.svg
carries fill="currentColor" for live-DOM consumers (icon.ts's inline
mark, which correctly inherits --vscode-foreground), but a WebviewPanel
tab icon is a static image with no DOM to inherit from — currentColor
there resolves to nothing and falls back to black.
Fix: tabIconPaths() derives the two literal-fill files VS Code's
{light,dark} iconPath API requires from the SAME single authored
amico_reduced.svg (string-substituting the fill), generated once into
globalStorageUri rather than checked into the repo — keeps the "two
authored SVG files" design while the tab icon actually adapts.
Also: package.json's activitybar/panel viewsContainers icons now point
at amico_reduced.svg instead of amico.svg — same small-size legibility
argument PR #99 already established for the tab icon and inline mark
applies here too (VS Code masks/recolors these regardless of fill, but
the fine circuit-pattern geometry still doesn't resolve at that size).
amico.svg is now unreferenced by code — kept as the large/detailed asset
for whatever future context actually renders it big enough to matter.
Tests: 433 pass (431 + 2 new for tabIconPaths), 0 fail. Typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swaps in the redesigned Amico mark and reshapes how it is consumed so
the geometry lives in the .svg files, not in duplicated code.
Assets (media/):
- amico.svg — the detailed mark (redesigned).
- amico_reduced.svg — the same mark's outer bracket only, for small
sizes. Both carry fill="currentColor" on the <svg> root so their
color is driven by the host, not baked in.
logo() atom (media/ui/atoms/logo.ts, replaces icon.ts's mark()):
logo({ variant?, fill? })
variant "full" (default) → amico.svg; "reduced" → amico_reduced.svg
fill defaults to var(--vscode-foreground) (theme-responsive) via
currentColor; overridable.
Both files are imported as raw text (esbuild {".svg":"text"} loader +
a matching vitest transform + svg.d.ts), so the .svg is the single
source of truth — no path data duplicated in TS (the exact thing that
silently drifted before). inspector.ts's brand mark now calls
logo({ variant: "reduced" }).
Small-context consumers use the reduced mark: package.json's
activitybar/panel icons → amico_reduced.svg (VS Code auto-recolors
these monochrome masks per theme).
Chat panel native tab icon (chat_panel.ts): a WebviewPanel tab icon is
a static image with no DOM, so currentColor can't resolve there (it
rendered dark). VS Code's only theme-adaptive path is a committed
{light, dark} pair inside the extension folder — verified via probe
that an icon in globalStorageUri renders as nothing, and the .vsix
extension folder is read-only so runtime generation is impossible.
media/amico-tab-{light,dark}.svg are therefore committed, derived from
amico_reduced.svg with a theme-foreground gray fill; a unit test keeps
them in lockstep with the source geometry.
Tests: logo.test.ts (both variants, theme default, fill override) +
chat_panel_icon.test.ts (tab pair fills + geometry sync). 435 pass,
typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonnerforce-pushed the kate/amico-mark-refresh branch from 576d444 to 84ab68cCompareJuly 9, 2026 01:23
@kateebonner
kateebonner merged commit afa9ecc into mainJul 9, 2026
5 checks passed
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.

1 participant

@kateebonner
, '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

Swap amico.svg - #99

Merged
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh
Jul 9, 2026
Merged

Swap amico.svg#99
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh

Conversation

@kateebonner

@kateebonnerkateebonner commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace packages/extension/media/amico.svg with Kate's redesigned mark
  • Consolidate to two SVG assets total: amico.svg (detailed, large contexts) and amico_reduced.svg (the same mark's outer bracket path only, no internal accents — small contexts). Both carry a single fill="currentColor" on their <svg> root (inherited by every child shape, none of which declare their own fill) — no per-file hardcoded colors, no per-consumer file variants.
  • atoms/icon.ts's inline mark is a canonical .svg file import (esbuild loader: {".svg": "text"}) instead of a hand-duplicated TS literal — the single-source-of-truth fix that prevents the exact drift this redesign otherwise re-triggered (see opencode PR β.1: amico-run thin process orchestrator (closes #1) #7, which caught the previous version of this mark going stale in the fork).

Not in this PR (scoped out on request)

Chat panel tab icon theming was cut: VS Code's webview tab icon (panel.iconPath) renders outside any live DOM, so fill="currentColor" can't resolve there — the platform's only mechanism for a theme-adaptive tab icon is two static {light, dark} files, which contradicts the two-file goal above. chat_panel.ts stays on its pre-existing single-file behavior (now pointed at the new amico.svg). The light/dark tab legibility question is deferred, not solved wrong.

Test plan

  • pnpm --filter amicode-v2 test — 431 passed, 0 failed
  • pnpm --filter amicode-v2 typecheck — clean
  • Open in the Extension Development Host and eyeball the activity-bar icon and an open chat panel tab in both a light and dark VS Code theme

@kateebonnerkateebonner changed the title Swap amico.svg to the hackathon repo's markSwap amico.svgJul 8, 2026
kateebonner added a commit that referenced this pull request Jul 9, 2026
…ntext
The tab icon rendered solid black regardless of theme: amico_reduced.svg
carries fill="currentColor" for live-DOM consumers (icon.ts's inline
mark, which correctly inherits --vscode-foreground), but a WebviewPanel
tab icon is a static image with no DOM to inherit from — currentColor
there resolves to nothing and falls back to black.
Fix: tabIconPaths() derives the two literal-fill files VS Code's
{light,dark} iconPath API requires from the SAME single authored
amico_reduced.svg (string-substituting the fill), generated once into
globalStorageUri rather than checked into the repo — keeps the "two
authored SVG files" design while the tab icon actually adapts.
Also: package.json's activitybar/panel viewsContainers icons now point
at amico_reduced.svg instead of amico.svg — same small-size legibility
argument PR #99 already established for the tab icon and inline mark
applies here too (VS Code masks/recolors these regardless of fill, but
the fine circuit-pattern geometry still doesn't resolve at that size).
amico.svg is now unreferenced by code — kept as the large/detailed asset
for whatever future context actually renders it big enough to matter.
Tests: 433 pass (431 + 2 new for tabIconPaths), 0 fail. Typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swaps in the redesigned Amico mark and reshapes how it is consumed so
the geometry lives in the .svg files, not in duplicated code.
Assets (media/):
- amico.svg — the detailed mark (redesigned).
- amico_reduced.svg — the same mark's outer bracket only, for small
sizes. Both carry fill="currentColor" on the <svg> root so their
color is driven by the host, not baked in.
logo() atom (media/ui/atoms/logo.ts, replaces icon.ts's mark()):
logo({ variant?, fill? })
variant "full" (default) → amico.svg; "reduced" → amico_reduced.svg
fill defaults to var(--vscode-foreground) (theme-responsive) via
currentColor; overridable.
Both files are imported as raw text (esbuild {".svg":"text"} loader +
a matching vitest transform + svg.d.ts), so the .svg is the single
source of truth — no path data duplicated in TS (the exact thing that
silently drifted before). inspector.ts's brand mark now calls
logo({ variant: "reduced" }).
Small-context consumers use the reduced mark: package.json's
activitybar/panel icons → amico_reduced.svg (VS Code auto-recolors
these monochrome masks per theme).
Chat panel native tab icon (chat_panel.ts): a WebviewPanel tab icon is
a static image with no DOM, so currentColor can't resolve there (it
rendered dark). VS Code's only theme-adaptive path is a committed
{light, dark} pair inside the extension folder — verified via probe
that an icon in globalStorageUri renders as nothing, and the .vsix
extension folder is read-only so runtime generation is impossible.
media/amico-tab-{light,dark}.svg are therefore committed, derived from
amico_reduced.svg with a theme-foreground gray fill; a unit test keeps
them in lockstep with the source geometry.
Tests: logo.test.ts (both variants, theme default, fill override) +
chat_panel_icon.test.ts (tab pair fills + geometry sync). 435 pass,
typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonnerforce-pushed the kate/amico-mark-refresh branch from 576d444 to 84ab68cCompareJuly 9, 2026 01:23
@kateebonner
kateebonner merged commit afa9ecc into mainJul 9, 2026
5 checks passed
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.

1 participant

@kateebonner
, '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

Swap amico.svg - #99

Merged
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh
Jul 9, 2026
Merged

Swap amico.svg#99
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh

Conversation

@kateebonner

@kateebonnerkateebonner commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace packages/extension/media/amico.svg with Kate's redesigned mark
  • Consolidate to two SVG assets total: amico.svg (detailed, large contexts) and amico_reduced.svg (the same mark's outer bracket path only, no internal accents — small contexts). Both carry a single fill="currentColor" on their <svg> root (inherited by every child shape, none of which declare their own fill) — no per-file hardcoded colors, no per-consumer file variants.
  • atoms/icon.ts's inline mark is a canonical .svg file import (esbuild loader: {".svg": "text"}) instead of a hand-duplicated TS literal — the single-source-of-truth fix that prevents the exact drift this redesign otherwise re-triggered (see opencode PR β.1: amico-run thin process orchestrator (closes #1) #7, which caught the previous version of this mark going stale in the fork).

Not in this PR (scoped out on request)

Chat panel tab icon theming was cut: VS Code's webview tab icon (panel.iconPath) renders outside any live DOM, so fill="currentColor" can't resolve there — the platform's only mechanism for a theme-adaptive tab icon is two static {light, dark} files, which contradicts the two-file goal above. chat_panel.ts stays on its pre-existing single-file behavior (now pointed at the new amico.svg). The light/dark tab legibility question is deferred, not solved wrong.

Test plan

  • pnpm --filter amicode-v2 test — 431 passed, 0 failed
  • pnpm --filter amicode-v2 typecheck — clean
  • Open in the Extension Development Host and eyeball the activity-bar icon and an open chat panel tab in both a light and dark VS Code theme

@kateebonnerkateebonner changed the title Swap amico.svg to the hackathon repo's markSwap amico.svgJul 8, 2026
kateebonner added a commit that referenced this pull request Jul 9, 2026
…ntext
The tab icon rendered solid black regardless of theme: amico_reduced.svg
carries fill="currentColor" for live-DOM consumers (icon.ts's inline
mark, which correctly inherits --vscode-foreground), but a WebviewPanel
tab icon is a static image with no DOM to inherit from — currentColor
there resolves to nothing and falls back to black.
Fix: tabIconPaths() derives the two literal-fill files VS Code's
{light,dark} iconPath API requires from the SAME single authored
amico_reduced.svg (string-substituting the fill), generated once into
globalStorageUri rather than checked into the repo — keeps the "two
authored SVG files" design while the tab icon actually adapts.
Also: package.json's activitybar/panel viewsContainers icons now point
at amico_reduced.svg instead of amico.svg — same small-size legibility
argument PR #99 already established for the tab icon and inline mark
applies here too (VS Code masks/recolors these regardless of fill, but
the fine circuit-pattern geometry still doesn't resolve at that size).
amico.svg is now unreferenced by code — kept as the large/detailed asset
for whatever future context actually renders it big enough to matter.
Tests: 433 pass (431 + 2 new for tabIconPaths), 0 fail. Typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swaps in the redesigned Amico mark and reshapes how it is consumed so
the geometry lives in the .svg files, not in duplicated code.
Assets (media/):
- amico.svg — the detailed mark (redesigned).
- amico_reduced.svg — the same mark's outer bracket only, for small
sizes. Both carry fill="currentColor" on the <svg> root so their
color is driven by the host, not baked in.
logo() atom (media/ui/atoms/logo.ts, replaces icon.ts's mark()):
logo({ variant?, fill? })
variant "full" (default) → amico.svg; "reduced" → amico_reduced.svg
fill defaults to var(--vscode-foreground) (theme-responsive) via
currentColor; overridable.
Both files are imported as raw text (esbuild {".svg":"text"} loader +
a matching vitest transform + svg.d.ts), so the .svg is the single
source of truth — no path data duplicated in TS (the exact thing that
silently drifted before). inspector.ts's brand mark now calls
logo({ variant: "reduced" }).
Small-context consumers use the reduced mark: package.json's
activitybar/panel icons → amico_reduced.svg (VS Code auto-recolors
these monochrome masks per theme).
Chat panel native tab icon (chat_panel.ts): a WebviewPanel tab icon is
a static image with no DOM, so currentColor can't resolve there (it
rendered dark). VS Code's only theme-adaptive path is a committed
{light, dark} pair inside the extension folder — verified via probe
that an icon in globalStorageUri renders as nothing, and the .vsix
extension folder is read-only so runtime generation is impossible.
media/amico-tab-{light,dark}.svg are therefore committed, derived from
amico_reduced.svg with a theme-foreground gray fill; a unit test keeps
them in lockstep with the source geometry.
Tests: logo.test.ts (both variants, theme default, fill override) +
chat_panel_icon.test.ts (tab pair fills + geometry sync). 435 pass,
typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonnerforce-pushed the kate/amico-mark-refresh branch from 576d444 to 84ab68cCompareJuly 9, 2026 01:23
@kateebonner
kateebonner merged commit afa9ecc into mainJul 9, 2026
5 checks passed
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.

1 participant

@kateebonner
, '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

Swap amico.svg - #99

Merged
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh
Jul 9, 2026
Merged

Swap amico.svg#99
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh

Conversation

@kateebonner

@kateebonnerkateebonner commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace packages/extension/media/amico.svg with Kate's redesigned mark
  • Consolidate to two SVG assets total: amico.svg (detailed, large contexts) and amico_reduced.svg (the same mark's outer bracket path only, no internal accents — small contexts). Both carry a single fill="currentColor" on their <svg> root (inherited by every child shape, none of which declare their own fill) — no per-file hardcoded colors, no per-consumer file variants.
  • atoms/icon.ts's inline mark is a canonical .svg file import (esbuild loader: {".svg": "text"}) instead of a hand-duplicated TS literal — the single-source-of-truth fix that prevents the exact drift this redesign otherwise re-triggered (see opencode PR β.1: amico-run thin process orchestrator (closes #1) #7, which caught the previous version of this mark going stale in the fork).

Not in this PR (scoped out on request)

Chat panel tab icon theming was cut: VS Code's webview tab icon (panel.iconPath) renders outside any live DOM, so fill="currentColor" can't resolve there — the platform's only mechanism for a theme-adaptive tab icon is two static {light, dark} files, which contradicts the two-file goal above. chat_panel.ts stays on its pre-existing single-file behavior (now pointed at the new amico.svg). The light/dark tab legibility question is deferred, not solved wrong.

Test plan

  • pnpm --filter amicode-v2 test — 431 passed, 0 failed
  • pnpm --filter amicode-v2 typecheck — clean
  • Open in the Extension Development Host and eyeball the activity-bar icon and an open chat panel tab in both a light and dark VS Code theme

@kateebonnerkateebonner changed the title Swap amico.svg to the hackathon repo's markSwap amico.svgJul 8, 2026
kateebonner added a commit that referenced this pull request Jul 9, 2026
…ntext
The tab icon rendered solid black regardless of theme: amico_reduced.svg
carries fill="currentColor" for live-DOM consumers (icon.ts's inline
mark, which correctly inherits --vscode-foreground), but a WebviewPanel
tab icon is a static image with no DOM to inherit from — currentColor
there resolves to nothing and falls back to black.
Fix: tabIconPaths() derives the two literal-fill files VS Code's
{light,dark} iconPath API requires from the SAME single authored
amico_reduced.svg (string-substituting the fill), generated once into
globalStorageUri rather than checked into the repo — keeps the "two
authored SVG files" design while the tab icon actually adapts.
Also: package.json's activitybar/panel viewsContainers icons now point
at amico_reduced.svg instead of amico.svg — same small-size legibility
argument PR #99 already established for the tab icon and inline mark
applies here too (VS Code masks/recolors these regardless of fill, but
the fine circuit-pattern geometry still doesn't resolve at that size).
amico.svg is now unreferenced by code — kept as the large/detailed asset
for whatever future context actually renders it big enough to matter.
Tests: 433 pass (431 + 2 new for tabIconPaths), 0 fail. Typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swaps in the redesigned Amico mark and reshapes how it is consumed so
the geometry lives in the .svg files, not in duplicated code.
Assets (media/):
- amico.svg — the detailed mark (redesigned).
- amico_reduced.svg — the same mark's outer bracket only, for small
sizes. Both carry fill="currentColor" on the <svg> root so their
color is driven by the host, not baked in.
logo() atom (media/ui/atoms/logo.ts, replaces icon.ts's mark()):
logo({ variant?, fill? })
variant "full" (default) → amico.svg; "reduced" → amico_reduced.svg
fill defaults to var(--vscode-foreground) (theme-responsive) via
currentColor; overridable.
Both files are imported as raw text (esbuild {".svg":"text"} loader +
a matching vitest transform + svg.d.ts), so the .svg is the single
source of truth — no path data duplicated in TS (the exact thing that
silently drifted before). inspector.ts's brand mark now calls
logo({ variant: "reduced" }).
Small-context consumers use the reduced mark: package.json's
activitybar/panel icons → amico_reduced.svg (VS Code auto-recolors
these monochrome masks per theme).
Chat panel native tab icon (chat_panel.ts): a WebviewPanel tab icon is
a static image with no DOM, so currentColor can't resolve there (it
rendered dark). VS Code's only theme-adaptive path is a committed
{light, dark} pair inside the extension folder — verified via probe
that an icon in globalStorageUri renders as nothing, and the .vsix
extension folder is read-only so runtime generation is impossible.
media/amico-tab-{light,dark}.svg are therefore committed, derived from
amico_reduced.svg with a theme-foreground gray fill; a unit test keeps
them in lockstep with the source geometry.
Tests: logo.test.ts (both variants, theme default, fill override) +
chat_panel_icon.test.ts (tab pair fills + geometry sync). 435 pass,
typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonnerforce-pushed the kate/amico-mark-refresh branch from 576d444 to 84ab68cCompareJuly 9, 2026 01:23
@kateebonner
kateebonner merged commit afa9ecc into mainJul 9, 2026
5 checks passed
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.

1 participant

@kateebonner
, '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

Swap amico.svg - #99

Merged
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh
Jul 9, 2026
Merged

Swap amico.svg#99
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh

Conversation

@kateebonner

@kateebonnerkateebonner commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace packages/extension/media/amico.svg with Kate's redesigned mark
  • Consolidate to two SVG assets total: amico.svg (detailed, large contexts) and amico_reduced.svg (the same mark's outer bracket path only, no internal accents — small contexts). Both carry a single fill="currentColor" on their <svg> root (inherited by every child shape, none of which declare their own fill) — no per-file hardcoded colors, no per-consumer file variants.
  • atoms/icon.ts's inline mark is a canonical .svg file import (esbuild loader: {".svg": "text"}) instead of a hand-duplicated TS literal — the single-source-of-truth fix that prevents the exact drift this redesign otherwise re-triggered (see opencode PR β.1: amico-run thin process orchestrator (closes #1) #7, which caught the previous version of this mark going stale in the fork).

Not in this PR (scoped out on request)

Chat panel tab icon theming was cut: VS Code's webview tab icon (panel.iconPath) renders outside any live DOM, so fill="currentColor" can't resolve there — the platform's only mechanism for a theme-adaptive tab icon is two static {light, dark} files, which contradicts the two-file goal above. chat_panel.ts stays on its pre-existing single-file behavior (now pointed at the new amico.svg). The light/dark tab legibility question is deferred, not solved wrong.

Test plan

  • pnpm --filter amicode-v2 test — 431 passed, 0 failed
  • pnpm --filter amicode-v2 typecheck — clean
  • Open in the Extension Development Host and eyeball the activity-bar icon and an open chat panel tab in both a light and dark VS Code theme

@kateebonnerkateebonner changed the title Swap amico.svg to the hackathon repo's markSwap amico.svgJul 8, 2026
kateebonner added a commit that referenced this pull request Jul 9, 2026
…ntext
The tab icon rendered solid black regardless of theme: amico_reduced.svg
carries fill="currentColor" for live-DOM consumers (icon.ts's inline
mark, which correctly inherits --vscode-foreground), but a WebviewPanel
tab icon is a static image with no DOM to inherit from — currentColor
there resolves to nothing and falls back to black.
Fix: tabIconPaths() derives the two literal-fill files VS Code's
{light,dark} iconPath API requires from the SAME single authored
amico_reduced.svg (string-substituting the fill), generated once into
globalStorageUri rather than checked into the repo — keeps the "two
authored SVG files" design while the tab icon actually adapts.
Also: package.json's activitybar/panel viewsContainers icons now point
at amico_reduced.svg instead of amico.svg — same small-size legibility
argument PR #99 already established for the tab icon and inline mark
applies here too (VS Code masks/recolors these regardless of fill, but
the fine circuit-pattern geometry still doesn't resolve at that size).
amico.svg is now unreferenced by code — kept as the large/detailed asset
for whatever future context actually renders it big enough to matter.
Tests: 433 pass (431 + 2 new for tabIconPaths), 0 fail. Typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swaps in the redesigned Amico mark and reshapes how it is consumed so
the geometry lives in the .svg files, not in duplicated code.
Assets (media/):
- amico.svg — the detailed mark (redesigned).
- amico_reduced.svg — the same mark's outer bracket only, for small
sizes. Both carry fill="currentColor" on the <svg> root so their
color is driven by the host, not baked in.
logo() atom (media/ui/atoms/logo.ts, replaces icon.ts's mark()):
logo({ variant?, fill? })
variant "full" (default) → amico.svg; "reduced" → amico_reduced.svg
fill defaults to var(--vscode-foreground) (theme-responsive) via
currentColor; overridable.
Both files are imported as raw text (esbuild {".svg":"text"} loader +
a matching vitest transform + svg.d.ts), so the .svg is the single
source of truth — no path data duplicated in TS (the exact thing that
silently drifted before). inspector.ts's brand mark now calls
logo({ variant: "reduced" }).
Small-context consumers use the reduced mark: package.json's
activitybar/panel icons → amico_reduced.svg (VS Code auto-recolors
these monochrome masks per theme).
Chat panel native tab icon (chat_panel.ts): a WebviewPanel tab icon is
a static image with no DOM, so currentColor can't resolve there (it
rendered dark). VS Code's only theme-adaptive path is a committed
{light, dark} pair inside the extension folder — verified via probe
that an icon in globalStorageUri renders as nothing, and the .vsix
extension folder is read-only so runtime generation is impossible.
media/amico-tab-{light,dark}.svg are therefore committed, derived from
amico_reduced.svg with a theme-foreground gray fill; a unit test keeps
them in lockstep with the source geometry.
Tests: logo.test.ts (both variants, theme default, fill override) +
chat_panel_icon.test.ts (tab pair fills + geometry sync). 435 pass,
typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonnerforce-pushed the kate/amico-mark-refresh branch from 576d444 to 84ab68cCompareJuly 9, 2026 01:23
@kateebonner
kateebonner merged commit afa9ecc into mainJul 9, 2026
5 checks passed
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.

1 participant

@kateebonner
, '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

Swap amico.svg - #99

Merged
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh
Jul 9, 2026
Merged

Swap amico.svg#99
kateebonner merged 1 commit into
mainfrom
kate/amico-mark-refresh

Conversation

@kateebonner

@kateebonnerkateebonner commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace packages/extension/media/amico.svg with Kate's redesigned mark
  • Consolidate to two SVG assets total: amico.svg (detailed, large contexts) and amico_reduced.svg (the same mark's outer bracket path only, no internal accents — small contexts). Both carry a single fill="currentColor" on their <svg> root (inherited by every child shape, none of which declare their own fill) — no per-file hardcoded colors, no per-consumer file variants.
  • atoms/icon.ts's inline mark is a canonical .svg file import (esbuild loader: {".svg": "text"}) instead of a hand-duplicated TS literal — the single-source-of-truth fix that prevents the exact drift this redesign otherwise re-triggered (see opencode PR β.1: amico-run thin process orchestrator (closes #1) #7, which caught the previous version of this mark going stale in the fork).

Not in this PR (scoped out on request)

Chat panel tab icon theming was cut: VS Code's webview tab icon (panel.iconPath) renders outside any live DOM, so fill="currentColor" can't resolve there — the platform's only mechanism for a theme-adaptive tab icon is two static {light, dark} files, which contradicts the two-file goal above. chat_panel.ts stays on its pre-existing single-file behavior (now pointed at the new amico.svg). The light/dark tab legibility question is deferred, not solved wrong.

Test plan

  • pnpm --filter amicode-v2 test — 431 passed, 0 failed
  • pnpm --filter amicode-v2 typecheck — clean
  • Open in the Extension Development Host and eyeball the activity-bar icon and an open chat panel tab in both a light and dark VS Code theme

@kateebonnerkateebonner changed the title Swap amico.svg to the hackathon repo's markSwap amico.svgJul 8, 2026
kateebonner added a commit that referenced this pull request Jul 9, 2026
…ntext
The tab icon rendered solid black regardless of theme: amico_reduced.svg
carries fill="currentColor" for live-DOM consumers (icon.ts's inline
mark, which correctly inherits --vscode-foreground), but a WebviewPanel
tab icon is a static image with no DOM to inherit from — currentColor
there resolves to nothing and falls back to black.
Fix: tabIconPaths() derives the two literal-fill files VS Code's
{light,dark} iconPath API requires from the SAME single authored
amico_reduced.svg (string-substituting the fill), generated once into
globalStorageUri rather than checked into the repo — keeps the "two
authored SVG files" design while the tab icon actually adapts.
Also: package.json's activitybar/panel viewsContainers icons now point
at amico_reduced.svg instead of amico.svg — same small-size legibility
argument PR #99 already established for the tab icon and inline mark
applies here too (VS Code masks/recolors these regardless of fill, but
the fine circuit-pattern geometry still doesn't resolve at that size).
amico.svg is now unreferenced by code — kept as the large/detailed asset
for whatever future context actually renders it big enough to matter.
Tests: 433 pass (431 + 2 new for tabIconPaths), 0 fail. Typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swaps in the redesigned Amico mark and reshapes how it is consumed so
the geometry lives in the .svg files, not in duplicated code.
Assets (media/):
- amico.svg — the detailed mark (redesigned).
- amico_reduced.svg — the same mark's outer bracket only, for small
sizes. Both carry fill="currentColor" on the <svg> root so their
color is driven by the host, not baked in.
logo() atom (media/ui/atoms/logo.ts, replaces icon.ts's mark()):
logo({ variant?, fill? })
variant "full" (default) → amico.svg; "reduced" → amico_reduced.svg
fill defaults to var(--vscode-foreground) (theme-responsive) via
currentColor; overridable.
Both files are imported as raw text (esbuild {".svg":"text"} loader +
a matching vitest transform + svg.d.ts), so the .svg is the single
source of truth — no path data duplicated in TS (the exact thing that
silently drifted before). inspector.ts's brand mark now calls
logo({ variant: "reduced" }).
Small-context consumers use the reduced mark: package.json's
activitybar/panel icons → amico_reduced.svg (VS Code auto-recolors
these monochrome masks per theme).
Chat panel native tab icon (chat_panel.ts): a WebviewPanel tab icon is
a static image with no DOM, so currentColor can't resolve there (it
rendered dark). VS Code's only theme-adaptive path is a committed
{light, dark} pair inside the extension folder — verified via probe
that an icon in globalStorageUri renders as nothing, and the .vsix
extension folder is read-only so runtime generation is impossible.
media/amico-tab-{light,dark}.svg are therefore committed, derived from
amico_reduced.svg with a theme-foreground gray fill; a unit test keeps
them in lockstep with the source geometry.
Tests: logo.test.ts (both variants, theme default, fill override) +
chat_panel_icon.test.ts (tab pair fills + geometry sync). 435 pass,
typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonnerforce-pushed the kate/amico-mark-refresh branch from 576d444 to 84ab68cCompareJuly 9, 2026 01:23
@kateebonner
kateebonner merged commit afa9ecc into mainJul 9, 2026
5 checks passed
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.

1 participant

@kateebonner