refactor(ui): refine Button proportions and interaction hierarchy - #901

Merged
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy
Jul 13, 2026
Merged

refactor(ui): refine Button proportions and interaction hierarchy#901
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

  • Refine the shared Button primitive into governed 32px default and 28px compact tiers with one 13px bilingual type tier.
  • Simplify the neutral hierarchy to secondary, ghost, and quiet; remove the outline and layout-free nav escape hatches.
  • Make hover, active, focus, and disabled states visually distinct, and expand Storybook coverage for CJK, English, mixed labels, icons, sizes, variants, and disabled controls.

Why

The shared Button had accumulated 28px, 30px, 32px, 36px, and 40px paths, while compact consumers compensated with local geometry and hover rules. That made Chinese and English labels appear inconsistent and blurred the hierarchy between solid actions, bordered secondary actions, and quiet controls.

This change restores the primitive as the single authority for action proportions and interaction states. Composite navigation rows remain in their existing semantic seams instead of pretending to be another Button size.

Closes#878.

Scope

  • No per-language CSS or language-specific sizing.
  • No new typography, control-height, or interaction-state tokens.
  • No parallel Button primitive.
  • Composite sidebar, session, and artifact rows keep their semantic layouts; standard actions use the governed Button tiers.

Verification

  • npm --workspace @maka/ui test — 128 tests passed.
  • npm --workspace @maka/desktop test — 2,415 tests passed.
  • npm run typecheck — all workspaces passed.
  • Storybook real-browser computed styles, light and dark:
    • default / compact heights: 32px / 28px
    • CJK and English labels: 13px
    • solid / neutral weights: 500 / 400
    • secondary border: 1px
    • hover, active, focus, and disabled states are pairwise distinguishable
    • disabled opacity: 0.45
  • Representative Electron visual smoke reviewed for settings actions, compact chat actions, destructive permission dialog, and composite sidebar rows. All four screenshots rendered successfully; the existing macOS harness reached its 60s cleanup threshold after capture.

Button hierarchy

BeforeAfter
Button variants beforeButton variants after

Interaction states

BeforeAfter
Interaction states beforeInteraction states after

Impact

Button consumers now use a smaller governed default height, neutral text uses normal weight, and outline, lg, and nav are no longer valid Button options. Existing consumers are migrated in this PR; no operator action or data migration is required.

Reviewer notes

Please focus on the shared variant matrix, the distinction between ghost and quiet text tone, and the semantic separation between standard actions and composite navigation rows.

Ready for review

  • Verification is complete and the results above are current
  • Impact, compatibility, migration, documentation, and release-note needs are addressed
  • User-visible UI/UX changes include visual evidence, or Verification explains why it is not applicable

@Astro-Han
Astro-Hanforce-pushed the refactor/ui-button-hierarchy branch from 4a20293 to 6c35908CompareJuly 13, 2026 18:10
@Astro-Han
Astro-Han marked this pull request as ready for review July 13, 2026 19:24
@Astro-Han
Astro-Han merged commit 0af06d3 into mainJul 13, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the refactor/ui-button-hierarchy branch July 13, 2026 19:25
Astro-Han added a commit that referenced this pull request Jul 15, 2026
…ill shape (#1028)
#901 retired the composer consumer-layer button CSS
(maka-composer-tool-button / maka-composer-context-plus /
maka-composer-send-button) onto the shared Button, but the shared
primitive had no governed replacement for the circle — its only radius
is the control-tier rounded-sm — so the "+" affordance (hover included)
and the send button silently went square.
Add a `shape` axis to buttonVariants (default / pill) so the pill tier
lives on the governed primitive, opt the composer "+" and send buttons
into shape="pill", and extend the radius-converge contract with
`alsoTiers` so a component can legitimately serve more than one radius
tier (buttonVariants: control + pill). The utility-primitives contract
now asserts the composer buttons carry shape="pill", and button.test.ts
locks that tailwind-merge resolves pill over the base rounded-sm.
Astro-Han added a commit that referenced this pull request Jul 16, 2026
docs/screenshots/ holds issue-878 and AskUserQuestion evidence images
(#901, #939). No tracked file references them, and the PR bodies embed
them via raw URLs pinned to PR-branch SHAs, which GitHub keeps serving
(verified HTTP 200) independently of main.
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.

refactor(ui): refine Button primitive proportions and interaction hierarchy

1 participant

@Astro-Han
, '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

refactor(ui): refine Button proportions and interaction hierarchy - #901

Merged
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy
Jul 13, 2026
Merged

refactor(ui): refine Button proportions and interaction hierarchy#901
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

  • Refine the shared Button primitive into governed 32px default and 28px compact tiers with one 13px bilingual type tier.
  • Simplify the neutral hierarchy to secondary, ghost, and quiet; remove the outline and layout-free nav escape hatches.
  • Make hover, active, focus, and disabled states visually distinct, and expand Storybook coverage for CJK, English, mixed labels, icons, sizes, variants, and disabled controls.

Why

The shared Button had accumulated 28px, 30px, 32px, 36px, and 40px paths, while compact consumers compensated with local geometry and hover rules. That made Chinese and English labels appear inconsistent and blurred the hierarchy between solid actions, bordered secondary actions, and quiet controls.

This change restores the primitive as the single authority for action proportions and interaction states. Composite navigation rows remain in their existing semantic seams instead of pretending to be another Button size.

Closes#878.

Scope

  • No per-language CSS or language-specific sizing.
  • No new typography, control-height, or interaction-state tokens.
  • No parallel Button primitive.
  • Composite sidebar, session, and artifact rows keep their semantic layouts; standard actions use the governed Button tiers.

Verification

  • npm --workspace @maka/ui test — 128 tests passed.
  • npm --workspace @maka/desktop test — 2,415 tests passed.
  • npm run typecheck — all workspaces passed.
  • Storybook real-browser computed styles, light and dark:
    • default / compact heights: 32px / 28px
    • CJK and English labels: 13px
    • solid / neutral weights: 500 / 400
    • secondary border: 1px
    • hover, active, focus, and disabled states are pairwise distinguishable
    • disabled opacity: 0.45
  • Representative Electron visual smoke reviewed for settings actions, compact chat actions, destructive permission dialog, and composite sidebar rows. All four screenshots rendered successfully; the existing macOS harness reached its 60s cleanup threshold after capture.

Button hierarchy

BeforeAfter
Button variants beforeButton variants after

Interaction states

BeforeAfter
Interaction states beforeInteraction states after

Impact

Button consumers now use a smaller governed default height, neutral text uses normal weight, and outline, lg, and nav are no longer valid Button options. Existing consumers are migrated in this PR; no operator action or data migration is required.

Reviewer notes

Please focus on the shared variant matrix, the distinction between ghost and quiet text tone, and the semantic separation between standard actions and composite navigation rows.

Ready for review

  • Verification is complete and the results above are current
  • Impact, compatibility, migration, documentation, and release-note needs are addressed
  • User-visible UI/UX changes include visual evidence, or Verification explains why it is not applicable

@Astro-Han
Astro-Hanforce-pushed the refactor/ui-button-hierarchy branch from 4a20293 to 6c35908CompareJuly 13, 2026 18:10
@Astro-Han
Astro-Han marked this pull request as ready for review July 13, 2026 19:24
@Astro-Han
Astro-Han merged commit 0af06d3 into mainJul 13, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the refactor/ui-button-hierarchy branch July 13, 2026 19:25
Astro-Han added a commit that referenced this pull request Jul 15, 2026
…ill shape (#1028)
#901 retired the composer consumer-layer button CSS
(maka-composer-tool-button / maka-composer-context-plus /
maka-composer-send-button) onto the shared Button, but the shared
primitive had no governed replacement for the circle — its only radius
is the control-tier rounded-sm — so the "+" affordance (hover included)
and the send button silently went square.
Add a `shape` axis to buttonVariants (default / pill) so the pill tier
lives on the governed primitive, opt the composer "+" and send buttons
into shape="pill", and extend the radius-converge contract with
`alsoTiers` so a component can legitimately serve more than one radius
tier (buttonVariants: control + pill). The utility-primitives contract
now asserts the composer buttons carry shape="pill", and button.test.ts
locks that tailwind-merge resolves pill over the base rounded-sm.
Astro-Han added a commit that referenced this pull request Jul 16, 2026
docs/screenshots/ holds issue-878 and AskUserQuestion evidence images
(#901, #939). No tracked file references them, and the PR bodies embed
them via raw URLs pinned to PR-branch SHAs, which GitHub keeps serving
(verified HTTP 200) independently of main.
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.

refactor(ui): refine Button primitive proportions and interaction hierarchy

1 participant

@Astro-Han
, '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

refactor(ui): refine Button proportions and interaction hierarchy - #901

Merged
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy
Jul 13, 2026
Merged

refactor(ui): refine Button proportions and interaction hierarchy#901
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

  • Refine the shared Button primitive into governed 32px default and 28px compact tiers with one 13px bilingual type tier.
  • Simplify the neutral hierarchy to secondary, ghost, and quiet; remove the outline and layout-free nav escape hatches.
  • Make hover, active, focus, and disabled states visually distinct, and expand Storybook coverage for CJK, English, mixed labels, icons, sizes, variants, and disabled controls.

Why

The shared Button had accumulated 28px, 30px, 32px, 36px, and 40px paths, while compact consumers compensated with local geometry and hover rules. That made Chinese and English labels appear inconsistent and blurred the hierarchy between solid actions, bordered secondary actions, and quiet controls.

This change restores the primitive as the single authority for action proportions and interaction states. Composite navigation rows remain in their existing semantic seams instead of pretending to be another Button size.

Closes#878.

Scope

  • No per-language CSS or language-specific sizing.
  • No new typography, control-height, or interaction-state tokens.
  • No parallel Button primitive.
  • Composite sidebar, session, and artifact rows keep their semantic layouts; standard actions use the governed Button tiers.

Verification

  • npm --workspace @maka/ui test — 128 tests passed.
  • npm --workspace @maka/desktop test — 2,415 tests passed.
  • npm run typecheck — all workspaces passed.
  • Storybook real-browser computed styles, light and dark:
    • default / compact heights: 32px / 28px
    • CJK and English labels: 13px
    • solid / neutral weights: 500 / 400
    • secondary border: 1px
    • hover, active, focus, and disabled states are pairwise distinguishable
    • disabled opacity: 0.45
  • Representative Electron visual smoke reviewed for settings actions, compact chat actions, destructive permission dialog, and composite sidebar rows. All four screenshots rendered successfully; the existing macOS harness reached its 60s cleanup threshold after capture.

Button hierarchy

BeforeAfter
Button variants beforeButton variants after

Interaction states

BeforeAfter
Interaction states beforeInteraction states after

Impact

Button consumers now use a smaller governed default height, neutral text uses normal weight, and outline, lg, and nav are no longer valid Button options. Existing consumers are migrated in this PR; no operator action or data migration is required.

Reviewer notes

Please focus on the shared variant matrix, the distinction between ghost and quiet text tone, and the semantic separation between standard actions and composite navigation rows.

Ready for review

  • Verification is complete and the results above are current
  • Impact, compatibility, migration, documentation, and release-note needs are addressed
  • User-visible UI/UX changes include visual evidence, or Verification explains why it is not applicable

@Astro-Han
Astro-Hanforce-pushed the refactor/ui-button-hierarchy branch from 4a20293 to 6c35908CompareJuly 13, 2026 18:10
@Astro-Han
Astro-Han marked this pull request as ready for review July 13, 2026 19:24
@Astro-Han
Astro-Han merged commit 0af06d3 into mainJul 13, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the refactor/ui-button-hierarchy branch July 13, 2026 19:25
Astro-Han added a commit that referenced this pull request Jul 15, 2026
…ill shape (#1028)
#901 retired the composer consumer-layer button CSS
(maka-composer-tool-button / maka-composer-context-plus /
maka-composer-send-button) onto the shared Button, but the shared
primitive had no governed replacement for the circle — its only radius
is the control-tier rounded-sm — so the "+" affordance (hover included)
and the send button silently went square.
Add a `shape` axis to buttonVariants (default / pill) so the pill tier
lives on the governed primitive, opt the composer "+" and send buttons
into shape="pill", and extend the radius-converge contract with
`alsoTiers` so a component can legitimately serve more than one radius
tier (buttonVariants: control + pill). The utility-primitives contract
now asserts the composer buttons carry shape="pill", and button.test.ts
locks that tailwind-merge resolves pill over the base rounded-sm.
Astro-Han added a commit that referenced this pull request Jul 16, 2026
docs/screenshots/ holds issue-878 and AskUserQuestion evidence images
(#901, #939). No tracked file references them, and the PR bodies embed
them via raw URLs pinned to PR-branch SHAs, which GitHub keeps serving
(verified HTTP 200) independently of main.
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.

refactor(ui): refine Button primitive proportions and interaction hierarchy

1 participant

@Astro-Han
, '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

refactor(ui): refine Button proportions and interaction hierarchy - #901

Merged
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy
Jul 13, 2026
Merged

refactor(ui): refine Button proportions and interaction hierarchy#901
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

  • Refine the shared Button primitive into governed 32px default and 28px compact tiers with one 13px bilingual type tier.
  • Simplify the neutral hierarchy to secondary, ghost, and quiet; remove the outline and layout-free nav escape hatches.
  • Make hover, active, focus, and disabled states visually distinct, and expand Storybook coverage for CJK, English, mixed labels, icons, sizes, variants, and disabled controls.

Why

The shared Button had accumulated 28px, 30px, 32px, 36px, and 40px paths, while compact consumers compensated with local geometry and hover rules. That made Chinese and English labels appear inconsistent and blurred the hierarchy between solid actions, bordered secondary actions, and quiet controls.

This change restores the primitive as the single authority for action proportions and interaction states. Composite navigation rows remain in their existing semantic seams instead of pretending to be another Button size.

Closes#878.

Scope

  • No per-language CSS or language-specific sizing.
  • No new typography, control-height, or interaction-state tokens.
  • No parallel Button primitive.
  • Composite sidebar, session, and artifact rows keep their semantic layouts; standard actions use the governed Button tiers.

Verification

  • npm --workspace @maka/ui test — 128 tests passed.
  • npm --workspace @maka/desktop test — 2,415 tests passed.
  • npm run typecheck — all workspaces passed.
  • Storybook real-browser computed styles, light and dark:
    • default / compact heights: 32px / 28px
    • CJK and English labels: 13px
    • solid / neutral weights: 500 / 400
    • secondary border: 1px
    • hover, active, focus, and disabled states are pairwise distinguishable
    • disabled opacity: 0.45
  • Representative Electron visual smoke reviewed for settings actions, compact chat actions, destructive permission dialog, and composite sidebar rows. All four screenshots rendered successfully; the existing macOS harness reached its 60s cleanup threshold after capture.

Button hierarchy

BeforeAfter
Button variants beforeButton variants after

Interaction states

BeforeAfter
Interaction states beforeInteraction states after

Impact

Button consumers now use a smaller governed default height, neutral text uses normal weight, and outline, lg, and nav are no longer valid Button options. Existing consumers are migrated in this PR; no operator action or data migration is required.

Reviewer notes

Please focus on the shared variant matrix, the distinction between ghost and quiet text tone, and the semantic separation between standard actions and composite navigation rows.

Ready for review

  • Verification is complete and the results above are current
  • Impact, compatibility, migration, documentation, and release-note needs are addressed
  • User-visible UI/UX changes include visual evidence, or Verification explains why it is not applicable

@Astro-Han
Astro-Hanforce-pushed the refactor/ui-button-hierarchy branch from 4a20293 to 6c35908CompareJuly 13, 2026 18:10
@Astro-Han
Astro-Han marked this pull request as ready for review July 13, 2026 19:24
@Astro-Han
Astro-Han merged commit 0af06d3 into mainJul 13, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the refactor/ui-button-hierarchy branch July 13, 2026 19:25
Astro-Han added a commit that referenced this pull request Jul 15, 2026
…ill shape (#1028)
#901 retired the composer consumer-layer button CSS
(maka-composer-tool-button / maka-composer-context-plus /
maka-composer-send-button) onto the shared Button, but the shared
primitive had no governed replacement for the circle — its only radius
is the control-tier rounded-sm — so the "+" affordance (hover included)
and the send button silently went square.
Add a `shape` axis to buttonVariants (default / pill) so the pill tier
lives on the governed primitive, opt the composer "+" and send buttons
into shape="pill", and extend the radius-converge contract with
`alsoTiers` so a component can legitimately serve more than one radius
tier (buttonVariants: control + pill). The utility-primitives contract
now asserts the composer buttons carry shape="pill", and button.test.ts
locks that tailwind-merge resolves pill over the base rounded-sm.
Astro-Han added a commit that referenced this pull request Jul 16, 2026
docs/screenshots/ holds issue-878 and AskUserQuestion evidence images
(#901, #939). No tracked file references them, and the PR bodies embed
them via raw URLs pinned to PR-branch SHAs, which GitHub keeps serving
(verified HTTP 200) independently of main.
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.

refactor(ui): refine Button primitive proportions and interaction hierarchy

1 participant

@Astro-Han
, '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

refactor(ui): refine Button proportions and interaction hierarchy - #901

Merged
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy
Jul 13, 2026
Merged

refactor(ui): refine Button proportions and interaction hierarchy#901
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

  • Refine the shared Button primitive into governed 32px default and 28px compact tiers with one 13px bilingual type tier.
  • Simplify the neutral hierarchy to secondary, ghost, and quiet; remove the outline and layout-free nav escape hatches.
  • Make hover, active, focus, and disabled states visually distinct, and expand Storybook coverage for CJK, English, mixed labels, icons, sizes, variants, and disabled controls.

Why

The shared Button had accumulated 28px, 30px, 32px, 36px, and 40px paths, while compact consumers compensated with local geometry and hover rules. That made Chinese and English labels appear inconsistent and blurred the hierarchy between solid actions, bordered secondary actions, and quiet controls.

This change restores the primitive as the single authority for action proportions and interaction states. Composite navigation rows remain in their existing semantic seams instead of pretending to be another Button size.

Closes#878.

Scope

  • No per-language CSS or language-specific sizing.
  • No new typography, control-height, or interaction-state tokens.
  • No parallel Button primitive.
  • Composite sidebar, session, and artifact rows keep their semantic layouts; standard actions use the governed Button tiers.

Verification

  • npm --workspace @maka/ui test — 128 tests passed.
  • npm --workspace @maka/desktop test — 2,415 tests passed.
  • npm run typecheck — all workspaces passed.
  • Storybook real-browser computed styles, light and dark:
    • default / compact heights: 32px / 28px
    • CJK and English labels: 13px
    • solid / neutral weights: 500 / 400
    • secondary border: 1px
    • hover, active, focus, and disabled states are pairwise distinguishable
    • disabled opacity: 0.45
  • Representative Electron visual smoke reviewed for settings actions, compact chat actions, destructive permission dialog, and composite sidebar rows. All four screenshots rendered successfully; the existing macOS harness reached its 60s cleanup threshold after capture.

Button hierarchy

BeforeAfter
Button variants beforeButton variants after

Interaction states

BeforeAfter
Interaction states beforeInteraction states after

Impact

Button consumers now use a smaller governed default height, neutral text uses normal weight, and outline, lg, and nav are no longer valid Button options. Existing consumers are migrated in this PR; no operator action or data migration is required.

Reviewer notes

Please focus on the shared variant matrix, the distinction between ghost and quiet text tone, and the semantic separation between standard actions and composite navigation rows.

Ready for review

  • Verification is complete and the results above are current
  • Impact, compatibility, migration, documentation, and release-note needs are addressed
  • User-visible UI/UX changes include visual evidence, or Verification explains why it is not applicable

@Astro-Han
Astro-Hanforce-pushed the refactor/ui-button-hierarchy branch from 4a20293 to 6c35908CompareJuly 13, 2026 18:10
@Astro-Han
Astro-Han marked this pull request as ready for review July 13, 2026 19:24
@Astro-Han
Astro-Han merged commit 0af06d3 into mainJul 13, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the refactor/ui-button-hierarchy branch July 13, 2026 19:25
Astro-Han added a commit that referenced this pull request Jul 15, 2026
…ill shape (#1028)
#901 retired the composer consumer-layer button CSS
(maka-composer-tool-button / maka-composer-context-plus /
maka-composer-send-button) onto the shared Button, but the shared
primitive had no governed replacement for the circle — its only radius
is the control-tier rounded-sm — so the "+" affordance (hover included)
and the send button silently went square.
Add a `shape` axis to buttonVariants (default / pill) so the pill tier
lives on the governed primitive, opt the composer "+" and send buttons
into shape="pill", and extend the radius-converge contract with
`alsoTiers` so a component can legitimately serve more than one radius
tier (buttonVariants: control + pill). The utility-primitives contract
now asserts the composer buttons carry shape="pill", and button.test.ts
locks that tailwind-merge resolves pill over the base rounded-sm.
Astro-Han added a commit that referenced this pull request Jul 16, 2026
docs/screenshots/ holds issue-878 and AskUserQuestion evidence images
(#901, #939). No tracked file references them, and the PR bodies embed
them via raw URLs pinned to PR-branch SHAs, which GitHub keeps serving
(verified HTTP 200) independently of main.
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.

refactor(ui): refine Button primitive proportions and interaction hierarchy

1 participant

@Astro-Han
, '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

refactor(ui): refine Button proportions and interaction hierarchy - #901

Merged
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy
Jul 13, 2026
Merged

refactor(ui): refine Button proportions and interaction hierarchy#901
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

  • Refine the shared Button primitive into governed 32px default and 28px compact tiers with one 13px bilingual type tier.
  • Simplify the neutral hierarchy to secondary, ghost, and quiet; remove the outline and layout-free nav escape hatches.
  • Make hover, active, focus, and disabled states visually distinct, and expand Storybook coverage for CJK, English, mixed labels, icons, sizes, variants, and disabled controls.

Why

The shared Button had accumulated 28px, 30px, 32px, 36px, and 40px paths, while compact consumers compensated with local geometry and hover rules. That made Chinese and English labels appear inconsistent and blurred the hierarchy between solid actions, bordered secondary actions, and quiet controls.

This change restores the primitive as the single authority for action proportions and interaction states. Composite navigation rows remain in their existing semantic seams instead of pretending to be another Button size.

Closes#878.

Scope

  • No per-language CSS or language-specific sizing.
  • No new typography, control-height, or interaction-state tokens.
  • No parallel Button primitive.
  • Composite sidebar, session, and artifact rows keep their semantic layouts; standard actions use the governed Button tiers.

Verification

  • npm --workspace @maka/ui test — 128 tests passed.
  • npm --workspace @maka/desktop test — 2,415 tests passed.
  • npm run typecheck — all workspaces passed.
  • Storybook real-browser computed styles, light and dark:
    • default / compact heights: 32px / 28px
    • CJK and English labels: 13px
    • solid / neutral weights: 500 / 400
    • secondary border: 1px
    • hover, active, focus, and disabled states are pairwise distinguishable
    • disabled opacity: 0.45
  • Representative Electron visual smoke reviewed for settings actions, compact chat actions, destructive permission dialog, and composite sidebar rows. All four screenshots rendered successfully; the existing macOS harness reached its 60s cleanup threshold after capture.

Button hierarchy

BeforeAfter
Button variants beforeButton variants after

Interaction states

BeforeAfter
Interaction states beforeInteraction states after

Impact

Button consumers now use a smaller governed default height, neutral text uses normal weight, and outline, lg, and nav are no longer valid Button options. Existing consumers are migrated in this PR; no operator action or data migration is required.

Reviewer notes

Please focus on the shared variant matrix, the distinction between ghost and quiet text tone, and the semantic separation between standard actions and composite navigation rows.

Ready for review

  • Verification is complete and the results above are current
  • Impact, compatibility, migration, documentation, and release-note needs are addressed
  • User-visible UI/UX changes include visual evidence, or Verification explains why it is not applicable

@Astro-Han
Astro-Hanforce-pushed the refactor/ui-button-hierarchy branch from 4a20293 to 6c35908CompareJuly 13, 2026 18:10
@Astro-Han
Astro-Han marked this pull request as ready for review July 13, 2026 19:24
@Astro-Han
Astro-Han merged commit 0af06d3 into mainJul 13, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the refactor/ui-button-hierarchy branch July 13, 2026 19:25
Astro-Han added a commit that referenced this pull request Jul 15, 2026
…ill shape (#1028)
#901 retired the composer consumer-layer button CSS
(maka-composer-tool-button / maka-composer-context-plus /
maka-composer-send-button) onto the shared Button, but the shared
primitive had no governed replacement for the circle — its only radius
is the control-tier rounded-sm — so the "+" affordance (hover included)
and the send button silently went square.
Add a `shape` axis to buttonVariants (default / pill) so the pill tier
lives on the governed primitive, opt the composer "+" and send buttons
into shape="pill", and extend the radius-converge contract with
`alsoTiers` so a component can legitimately serve more than one radius
tier (buttonVariants: control + pill). The utility-primitives contract
now asserts the composer buttons carry shape="pill", and button.test.ts
locks that tailwind-merge resolves pill over the base rounded-sm.
Astro-Han added a commit that referenced this pull request Jul 16, 2026
docs/screenshots/ holds issue-878 and AskUserQuestion evidence images
(#901, #939). No tracked file references them, and the PR bodies embed
them via raw URLs pinned to PR-branch SHAs, which GitHub keeps serving
(verified HTTP 200) independently of main.
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.

refactor(ui): refine Button primitive proportions and interaction hierarchy

1 participant

@Astro-Han
, '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

refactor(ui): refine Button proportions and interaction hierarchy - #901

Merged
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy
Jul 13, 2026
Merged

refactor(ui): refine Button proportions and interaction hierarchy#901
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

  • Refine the shared Button primitive into governed 32px default and 28px compact tiers with one 13px bilingual type tier.
  • Simplify the neutral hierarchy to secondary, ghost, and quiet; remove the outline and layout-free nav escape hatches.
  • Make hover, active, focus, and disabled states visually distinct, and expand Storybook coverage for CJK, English, mixed labels, icons, sizes, variants, and disabled controls.

Why

The shared Button had accumulated 28px, 30px, 32px, 36px, and 40px paths, while compact consumers compensated with local geometry and hover rules. That made Chinese and English labels appear inconsistent and blurred the hierarchy between solid actions, bordered secondary actions, and quiet controls.

This change restores the primitive as the single authority for action proportions and interaction states. Composite navigation rows remain in their existing semantic seams instead of pretending to be another Button size.

Closes#878.

Scope

  • No per-language CSS or language-specific sizing.
  • No new typography, control-height, or interaction-state tokens.
  • No parallel Button primitive.
  • Composite sidebar, session, and artifact rows keep their semantic layouts; standard actions use the governed Button tiers.

Verification

  • npm --workspace @maka/ui test — 128 tests passed.
  • npm --workspace @maka/desktop test — 2,415 tests passed.
  • npm run typecheck — all workspaces passed.
  • Storybook real-browser computed styles, light and dark:
    • default / compact heights: 32px / 28px
    • CJK and English labels: 13px
    • solid / neutral weights: 500 / 400
    • secondary border: 1px
    • hover, active, focus, and disabled states are pairwise distinguishable
    • disabled opacity: 0.45
  • Representative Electron visual smoke reviewed for settings actions, compact chat actions, destructive permission dialog, and composite sidebar rows. All four screenshots rendered successfully; the existing macOS harness reached its 60s cleanup threshold after capture.

Button hierarchy

BeforeAfter
Button variants beforeButton variants after

Interaction states

BeforeAfter
Interaction states beforeInteraction states after

Impact

Button consumers now use a smaller governed default height, neutral text uses normal weight, and outline, lg, and nav are no longer valid Button options. Existing consumers are migrated in this PR; no operator action or data migration is required.

Reviewer notes

Please focus on the shared variant matrix, the distinction between ghost and quiet text tone, and the semantic separation between standard actions and composite navigation rows.

Ready for review

  • Verification is complete and the results above are current
  • Impact, compatibility, migration, documentation, and release-note needs are addressed
  • User-visible UI/UX changes include visual evidence, or Verification explains why it is not applicable

@Astro-Han
Astro-Hanforce-pushed the refactor/ui-button-hierarchy branch from 4a20293 to 6c35908CompareJuly 13, 2026 18:10
@Astro-Han
Astro-Han marked this pull request as ready for review July 13, 2026 19:24
@Astro-Han
Astro-Han merged commit 0af06d3 into mainJul 13, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the refactor/ui-button-hierarchy branch July 13, 2026 19:25
Astro-Han added a commit that referenced this pull request Jul 15, 2026
…ill shape (#1028)
#901 retired the composer consumer-layer button CSS
(maka-composer-tool-button / maka-composer-context-plus /
maka-composer-send-button) onto the shared Button, but the shared
primitive had no governed replacement for the circle — its only radius
is the control-tier rounded-sm — so the "+" affordance (hover included)
and the send button silently went square.
Add a `shape` axis to buttonVariants (default / pill) so the pill tier
lives on the governed primitive, opt the composer "+" and send buttons
into shape="pill", and extend the radius-converge contract with
`alsoTiers` so a component can legitimately serve more than one radius
tier (buttonVariants: control + pill). The utility-primitives contract
now asserts the composer buttons carry shape="pill", and button.test.ts
locks that tailwind-merge resolves pill over the base rounded-sm.
Astro-Han added a commit that referenced this pull request Jul 16, 2026
docs/screenshots/ holds issue-878 and AskUserQuestion evidence images
(#901, #939). No tracked file references them, and the PR bodies embed
them via raw URLs pinned to PR-branch SHAs, which GitHub keeps serving
(verified HTTP 200) independently of main.
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.

refactor(ui): refine Button primitive proportions and interaction hierarchy

1 participant

@Astro-Han
, '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

refactor(ui): refine Button proportions and interaction hierarchy - #901

Merged
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy
Jul 13, 2026
Merged

refactor(ui): refine Button proportions and interaction hierarchy#901
Astro-Han merged 16 commits into
mainfrom
refactor/ui-button-hierarchy

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

  • Refine the shared Button primitive into governed 32px default and 28px compact tiers with one 13px bilingual type tier.
  • Simplify the neutral hierarchy to secondary, ghost, and quiet; remove the outline and layout-free nav escape hatches.
  • Make hover, active, focus, and disabled states visually distinct, and expand Storybook coverage for CJK, English, mixed labels, icons, sizes, variants, and disabled controls.

Why

The shared Button had accumulated 28px, 30px, 32px, 36px, and 40px paths, while compact consumers compensated with local geometry and hover rules. That made Chinese and English labels appear inconsistent and blurred the hierarchy between solid actions, bordered secondary actions, and quiet controls.

This change restores the primitive as the single authority for action proportions and interaction states. Composite navigation rows remain in their existing semantic seams instead of pretending to be another Button size.

Closes#878.

Scope

  • No per-language CSS or language-specific sizing.
  • No new typography, control-height, or interaction-state tokens.
  • No parallel Button primitive.
  • Composite sidebar, session, and artifact rows keep their semantic layouts; standard actions use the governed Button tiers.

Verification

  • npm --workspace @maka/ui test — 128 tests passed.
  • npm --workspace @maka/desktop test — 2,415 tests passed.
  • npm run typecheck — all workspaces passed.
  • Storybook real-browser computed styles, light and dark:
    • default / compact heights: 32px / 28px
    • CJK and English labels: 13px
    • solid / neutral weights: 500 / 400
    • secondary border: 1px
    • hover, active, focus, and disabled states are pairwise distinguishable
    • disabled opacity: 0.45
  • Representative Electron visual smoke reviewed for settings actions, compact chat actions, destructive permission dialog, and composite sidebar rows. All four screenshots rendered successfully; the existing macOS harness reached its 60s cleanup threshold after capture.

Button hierarchy

BeforeAfter
Button variants beforeButton variants after

Interaction states

BeforeAfter
Interaction states beforeInteraction states after

Impact

Button consumers now use a smaller governed default height, neutral text uses normal weight, and outline, lg, and nav are no longer valid Button options. Existing consumers are migrated in this PR; no operator action or data migration is required.

Reviewer notes

Please focus on the shared variant matrix, the distinction between ghost and quiet text tone, and the semantic separation between standard actions and composite navigation rows.

Ready for review

  • Verification is complete and the results above are current
  • Impact, compatibility, migration, documentation, and release-note needs are addressed
  • User-visible UI/UX changes include visual evidence, or Verification explains why it is not applicable

@Astro-Han
Astro-Hanforce-pushed the refactor/ui-button-hierarchy branch from 4a20293 to 6c35908CompareJuly 13, 2026 18:10
@Astro-Han
Astro-Han marked this pull request as ready for review July 13, 2026 19:24
@Astro-Han
Astro-Han merged commit 0af06d3 into mainJul 13, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the refactor/ui-button-hierarchy branch July 13, 2026 19:25
Astro-Han added a commit that referenced this pull request Jul 15, 2026
…ill shape (#1028)
#901 retired the composer consumer-layer button CSS
(maka-composer-tool-button / maka-composer-context-plus /
maka-composer-send-button) onto the shared Button, but the shared
primitive had no governed replacement for the circle — its only radius
is the control-tier rounded-sm — so the "+" affordance (hover included)
and the send button silently went square.
Add a `shape` axis to buttonVariants (default / pill) so the pill tier
lives on the governed primitive, opt the composer "+" and send buttons
into shape="pill", and extend the radius-converge contract with
`alsoTiers` so a component can legitimately serve more than one radius
tier (buttonVariants: control + pill). The utility-primitives contract
now asserts the composer buttons carry shape="pill", and button.test.ts
locks that tailwind-merge resolves pill over the base rounded-sm.
Astro-Han added a commit that referenced this pull request Jul 16, 2026
docs/screenshots/ holds issue-878 and AskUserQuestion evidence images
(#901, #939). No tracked file references them, and the PR bodies embed
them via raw URLs pinned to PR-branch SHAs, which GitHub keeps serving
(verified HTTP 200) independently of main.
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.

refactor(ui): refine Button primitive proportions and interaction hierarchy

1 participant

@Astro-Han