Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 65 additions & 18 deletions apps/desktop/src/renderer/styles.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -7068,13 +7068,15 @@ button:active {
.settingsNavItem[data-active="true"] {
/* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from
the muted `--settings-nav-row-selected-bg` token to a slightly
more visible 6.5% foreground overlay + 500 weight. The previous
fill was reading as "muted disabled" against the now-bigger
nav row typography. */
more visible 6.5% foreground overlay + 500 weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): add 3px inset
accent bar on the LEFT edge — Redesign-Skill recipe. Carries
brand into the most-used surface without recoloring the fill.
Inset shadow (not actual border) so the 38px row geometry stays. */
background: oklch(from var(--foreground) l c h / 0.065);
color: var(--foreground);
font-weight: 500;
box-shadow: none !important;
box-shadow: inset 3px 0 0 var(--accent) !important;
}

.settingsNavItem:focus-visible {
Expand DownExpand Up@@ -7342,30 +7344,31 @@ button:active {
}

.settingsPageHeader h2 {
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15, WAWQAQ msg
`f7e9d166`): tighten the h2 with negative tracking + slightly
softer weight. 28 / 700 was too loud; 26 / 650 reads as
authoritative without shouting. Add a touch of `-0.012em`
tracking like reference's display face. */
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2
with negative tracking + slightly softer weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap:
balance` so 1-2 word titles don't orphan on long pages and
2-word titles like 「记忆与回顾」don't break across an awkward
line. */
margin: 0;
color: var(--foreground);
font-size: 26px;
font-weight: 650;
letter-spacing: -0.012em;
line-height: 1.2;
text-wrap: balance;
}

/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15): one-line page description
below the h2 — matches reference's per-tab meta line.
PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): cap width so long
descriptions don't span the full 768px column — caps at 56ch which
keeps the meta-line readable. */
/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap +
round 15/15 `text-wrap: pretty` so the last line isn't a single
orphan word (per baseline-ui typography rule). */
.settingsPageHeaderDescription {
margin: 0;
max-width: 56ch;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
font-size: 14px;
line-height: 1.5;
text-wrap: pretty;
}

.settingsPageContent {
Expand DownExpand Up@@ -7397,6 +7400,19 @@ button:active {
padding: 40px 24px 64px;
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15, WAWQAQ msg
`f7e9d166` + UI-skill deep read 2026-06-23): shared motion tokens
for the settings surface so timing/easing stay consistent across
nav rows, form rows, switches, and inputs. `--motion-fast` is the
default for state changes; `--motion-ease-out` is the cubic-bezier
recommended by Taste-Skill + 12-principles. */
.settingsSurface,
.settingsMainPane,
.settingsSidebar {
--motion-fast: 160ms;
--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested
card-in-card was the previous problem — `.settingsStructuredPage`
was a card AND it contained `<SettingsRows>` cards AND orphan
Expand DownExpand Up@@ -7484,6 +7500,29 @@ button:active {
background: oklch(from var(--foreground) l c h / 0.025);
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press
feedback. 12-principles `physics-active-state` + Taste-Skill +
UIDB all converge on `:active { scale(0.98) }` as the cheapest way
to make UI feel handled vs simulated. Applied only when reduced-
motion is not preferred — the @media block above already strips
transition; here we keep `transform` declarations so the
`:active` *snap* still fires (it's instant, not animated). */
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: scale(0.985);
transition: transform 100ms var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}
@media (prefers-reduced-motion: reduce) {
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: none;
}
}

/* PR-SETTINGS-A11Y-POLISH-0 (round 11/15) — keyboard-only focus ring
on settings rows + inputs. Reference's settings cards use a 2px
ring on focus-visible; maka had no visible affordance. Use the
Expand DownExpand Up@@ -7566,8 +7605,11 @@ button:active {
display: block;
margin-top: 6px;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): 13 → 14 to clear
the 14px legibility floor cited by baseline-ui + UIDB + Impeccable
`/typeset`. Hint is the most-read body text on the page. */
font-size: 14px;
line-height: 1.5;
}

.settingsFieldWarning {
Expand DownExpand Up@@ -9907,9 +9949,14 @@ button:active {
}

.settingsRow > span {
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `tabular-nums` so
numeric values (version strings, model IDs, counts) align cleanly
when stacked vertically. baseline-ui + /typeset both require this
for any numeric data. */
min-width: 0;
color: var(--foreground-60);
font-size: 13px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
text-align: right;
}
Expand Down
106 changes: 106 additions & 0 deletions notes/ui-skills-deep-read-2026-06-23.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
# UI Skills Deep Read — 2026-06-23 (yuejing)

3 parallel Explore agents deep-read 5 design-skill collections per WAWQAQ
ask `f424c6b5`. Synthesis below — converged rules + maka delta + 1 final
ship list.

## Sources

| Source | Type | Repo |
|--------|------|------|
| Impeccable | 26 commands + 44-rule SLOP catalog | github.com/pbakaus/impeccable |
| UI Skills | 15-skill collection (baseline-ui, fixing-a11y, fixing-motion-performance, 12-principles-of-animation, fixing-metadata, etc.) | github.com/ibelick/ui-skills + github.com/raphaelsalaja/skill |
| Taste-Skill | taste / redesign / soft variants | github.com/Leonxlnx/taste-skill |
| UI Design Brain | 60+ component best practices | github.com/carmahhawwari/ui-design-brain |
| Better Icons | MCP + skill, 200k icons | github.com/better-auth/better-icons |

## Convergent rules across all 5 sources

These showed up in **3+ sources** independently. Highest signal.

| Rule | Sources | Maka delta |
|------|---------|-----------|
| Body text ≥ 14-16px, weights 400/500/600 with semantic contrast | Impeccable /typeset, baseline-ui, Taste-Skill, UIDB | hint 13px → 14, no display face |
| **Tactile :active = `scale(0.98)` or `translateY(1px)`** | Taste-Skill, UIDB, 12-principles | rows/nav/back have no `:active` |
| Compositor-only motion (`transform`/`opacity` only, ≤ 200ms) | baseline-ui, fixing-motion-perf, Impeccable /animate | Maka may transition `background-color` on hover (paint) — acceptable but verify nothing animates layout |
| Reduced-motion guards | All 5 | ✅ done round 11 |
| Single accent, saturation < 80%, OKLCH neutrals tinted toward brand | Taste-Skill, Impeccable /colorize | maka uses raw `%foreground` overlays, no brand tint |
| 8px grid; double whitespace as redesign default | Taste-Skill, UIDB, Impeccable /layout | row padding 20/24 off-grid (should be 16/24 or 24/24) |
| Toggle/touch target ≥ 44px hit area | Taste-Skill, UIDB | switch 26×46 visual, no hit padding |
| Sidebar primary nav 5-7 items, distinct active state | UIDB, Taste-Skill | maka has more than 7 in "AI 与集成" group — could collapse; active state is light-fill, no accent bar |
| One CSS variable for all motion timings (no scattered ms values) | 12-principles "timing-consistent" | Maka has scattered 150ms values, no `--motion-fast` token |
| `text-balance` on heading, `text-pretty` on body | baseline-ui | not used |
| `tabular-nums` on data/numeric labels | baseline-ui, Impeccable /typeset | not used; value cells `已启用 / zai-live` would benefit |
| No display tracking modification unless explicit | baseline-ui | h2 has `-0.012em` (intentional, OK) |
| Em-dash ban | Taste-Skill, redesign | grep needed |
| Inter/system as default font flagged as "AI tell" | Taste-Skill, redesign, soft | maka is system-ui default — flagged |
| Lucide-as-default flagged | Taste-Skill | maka is lucide-react — flagged, Better Icons proposed |
| Card OR border, not both | Impeccable rule 36, UIDB, Taste-Skill | mostly ✅ (.settingsRows is border-only) but `.settingsConnectionRow` still has border + shadow |
| Visible focus ring (`:focus-visible` 2px) | fixing-a11y, Impeccable /audit | ✅ done round 11 |
| Page header height 56-72px | UIDB | maka uses padding stack, not a true bar — partial |

## Anti-patterns triggered by maka today

- **Impeccable rule 11 (card overuse / nested cards):** every settings page renders multiple `.settingsRows` blocks stacked, each with own card chrome. Could be one card with section dividers (per /distill).
- **Impeccable rule 25 (raw neutrals not tinted toward brand):** `.settingsRows` border is `oklch(from var(--foreground) l c h / 0.08)`. Tinting toward `--accent` at 0.005-0.01 chroma would carry brand into chrome.
- **Taste-Skill banned: border-b on every row.** ❌ — wait, maka DOES use `border-bottom` hairlines between rows. WAWQAQ asked for this explicitly in PR-GROUPED-CARD-0 ("内容紧密、用分隔线划开"), so this disagreement stays unresolved between Taste-Skill and WAWQAQ. Defer to WAWQAQ.

## 10 highest-value action items for maka

Ranked by impact / effort:

1. **Tactile `:active` scale** on rows, nav items, back button.
- `.settingsFormRow:active, .settingsRow:active, .settingsNavItem:active, .settingsBackButton:active { transform: scale(0.985); transition: transform 100ms cubic-bezier(0.16, 1, 0.3, 1); }`
- Reduced-motion gate already in place — fires inside the `@media (no-preference)` branch.

2. **Sidebar active accent bar** (Redesign-Skill).
- `.settingsNavItem[data-active="true"] { box-shadow: inset 3px 0 0 var(--accent); }`
- Carries brand into the most-used surface.

3. **`tabular-nums` on value cells**.
- `.settingsRow > span { font-variant-numeric: tabular-nums; }`
- Numeric values like `zai-live`, version strings, counts align cleanly.

4. **`text-balance` / `text-pretty`** on page header.
- `.settingsPageHeader h2 { text-wrap: balance; }`
- `.settingsPageHeaderDescription { text-wrap: pretty; }`

5. **Hint floor 13 → 14px**.
- `.settingsFormRow small, .settingsField small { font-size: 14px; }` (currently 13)
- Crosses the 14px legibility floor that baseline-ui + UIDB + Impeccable converge on.

6. **Switch hit-area shim**: 44×44 invisible hit target around the 26×46 visual.
- Wrap `<Switch>` in a `min-width:44px; min-height:44px;` flex container.

7. **One motion token**.
- `--motion-fast: 160ms` + `--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1)`.
- Reuse across nav / row / switch / input transitions.

8. **OKLCH brand tint on settings chrome**.
- `.settingsRows` border from `from var(--foreground) ... / 0.08` to `oklch(from var(--accent) l c h / 0.08)`.
- Subtle brand carry without changing perceived neutrality.

9. **Em-dash + AI-slop copy grep**.
- Audit `apps/desktop/src/renderer/settings/SettingsModal.tsx` for `—`, "Seamless", "Elevate", "Unleash".
- Quick mechanical cleanup.

10. **Better Icons MCP install (deferred ship)**.
- Add to `.mcp.json`. Don't migrate icons in this lane — let it learn preferred families per surface first. Lucide stays default for now.

## Defer / out-of-lane

- **Font swap** (Geist/Cabinet Grotesk/Satoshi instead of system-ui): meaningful but needs font files in the bundle, license check, and broad visual regression. Worth its own PR.
- **Nav consolidation to ≤7 in big group**: would re-split AI 与集成. Defer; WAWQAQ already approved 3 groups in round 7.
- **Card overuse / merge stacked cards**: contradicts WAWQAQ's grouped-card direction. Don't change.

## Round 15 (final) PR plan

Bundle action items 1, 2, 3, 4, 5, 7 (highest-impact, single-CSS-file). Skip 6 (component wrap), 8 (brand tint risk), 9 (audit), 10 (config) — those need their own PRs.

PR-SETTINGS-MOTION-TYPO-TOKENS-0:
- `:active` scale on rows/nav/back (item 1)
- accent bar on active nav (item 2)
- tabular-nums on row value (item 3)
- text-balance / text-pretty on header (item 4)
- hint 13→14 (item 5)
- shared `--motion-fast` token (item 7)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} 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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 65 additions & 18 deletions apps/desktop/src/renderer/styles.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -7068,13 +7068,15 @@ button:active {
.settingsNavItem[data-active="true"] {
/* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from
the muted `--settings-nav-row-selected-bg` token to a slightly
more visible 6.5% foreground overlay + 500 weight. The previous
fill was reading as "muted disabled" against the now-bigger
nav row typography. */
more visible 6.5% foreground overlay + 500 weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): add 3px inset
accent bar on the LEFT edge — Redesign-Skill recipe. Carries
brand into the most-used surface without recoloring the fill.
Inset shadow (not actual border) so the 38px row geometry stays. */
background: oklch(from var(--foreground) l c h / 0.065);
color: var(--foreground);
font-weight: 500;
box-shadow: none !important;
box-shadow: inset 3px 0 0 var(--accent) !important;
}

.settingsNavItem:focus-visible {
Expand DownExpand Up@@ -7342,30 +7344,31 @@ button:active {
}

.settingsPageHeader h2 {
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15, WAWQAQ msg
`f7e9d166`): tighten the h2 with negative tracking + slightly
softer weight. 28 / 700 was too loud; 26 / 650 reads as
authoritative without shouting. Add a touch of `-0.012em`
tracking like reference's display face. */
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2
with negative tracking + slightly softer weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap:
balance` so 1-2 word titles don't orphan on long pages and
2-word titles like 「记忆与回顾」don't break across an awkward
line. */
margin: 0;
color: var(--foreground);
font-size: 26px;
font-weight: 650;
letter-spacing: -0.012em;
line-height: 1.2;
text-wrap: balance;
}

/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15): one-line page description
below the h2 — matches reference's per-tab meta line.
PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): cap width so long
descriptions don't span the full 768px column — caps at 56ch which
keeps the meta-line readable. */
/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap +
round 15/15 `text-wrap: pretty` so the last line isn't a single
orphan word (per baseline-ui typography rule). */
.settingsPageHeaderDescription {
margin: 0;
max-width: 56ch;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
font-size: 14px;
line-height: 1.5;
text-wrap: pretty;
}

.settingsPageContent {
Expand DownExpand Up@@ -7397,6 +7400,19 @@ button:active {
padding: 40px 24px 64px;
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15, WAWQAQ msg
`f7e9d166` + UI-skill deep read 2026-06-23): shared motion tokens
for the settings surface so timing/easing stay consistent across
nav rows, form rows, switches, and inputs. `--motion-fast` is the
default for state changes; `--motion-ease-out` is the cubic-bezier
recommended by Taste-Skill + 12-principles. */
.settingsSurface,
.settingsMainPane,
.settingsSidebar {
--motion-fast: 160ms;
--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested
card-in-card was the previous problem — `.settingsStructuredPage`
was a card AND it contained `<SettingsRows>` cards AND orphan
Expand DownExpand Up@@ -7484,6 +7500,29 @@ button:active {
background: oklch(from var(--foreground) l c h / 0.025);
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press
feedback. 12-principles `physics-active-state` + Taste-Skill +
UIDB all converge on `:active { scale(0.98) }` as the cheapest way
to make UI feel handled vs simulated. Applied only when reduced-
motion is not preferred — the @media block above already strips
transition; here we keep `transform` declarations so the
`:active` *snap* still fires (it's instant, not animated). */
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: scale(0.985);
transition: transform 100ms var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}
@media (prefers-reduced-motion: reduce) {
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: none;
}
}

/* PR-SETTINGS-A11Y-POLISH-0 (round 11/15) — keyboard-only focus ring
on settings rows + inputs. Reference's settings cards use a 2px
ring on focus-visible; maka had no visible affordance. Use the
Expand DownExpand Up@@ -7566,8 +7605,11 @@ button:active {
display: block;
margin-top: 6px;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): 13 → 14 to clear
the 14px legibility floor cited by baseline-ui + UIDB + Impeccable
`/typeset`. Hint is the most-read body text on the page. */
font-size: 14px;
line-height: 1.5;
}

.settingsFieldWarning {
Expand DownExpand Up@@ -9907,9 +9949,14 @@ button:active {
}

.settingsRow > span {
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `tabular-nums` so
numeric values (version strings, model IDs, counts) align cleanly
when stacked vertically. baseline-ui + /typeset both require this
for any numeric data. */
min-width: 0;
color: var(--foreground-60);
font-size: 13px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
text-align: right;
}
Expand Down
106 changes: 106 additions & 0 deletions notes/ui-skills-deep-read-2026-06-23.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
# UI Skills Deep Read — 2026-06-23 (yuejing)

3 parallel Explore agents deep-read 5 design-skill collections per WAWQAQ
ask `f424c6b5`. Synthesis below — converged rules + maka delta + 1 final
ship list.

## Sources

| Source | Type | Repo |
|--------|------|------|
| Impeccable | 26 commands + 44-rule SLOP catalog | github.com/pbakaus/impeccable |
| UI Skills | 15-skill collection (baseline-ui, fixing-a11y, fixing-motion-performance, 12-principles-of-animation, fixing-metadata, etc.) | github.com/ibelick/ui-skills + github.com/raphaelsalaja/skill |
| Taste-Skill | taste / redesign / soft variants | github.com/Leonxlnx/taste-skill |
| UI Design Brain | 60+ component best practices | github.com/carmahhawwari/ui-design-brain |
| Better Icons | MCP + skill, 200k icons | github.com/better-auth/better-icons |

## Convergent rules across all 5 sources

These showed up in **3+ sources** independently. Highest signal.

| Rule | Sources | Maka delta |
|------|---------|-----------|
| Body text ≥ 14-16px, weights 400/500/600 with semantic contrast | Impeccable /typeset, baseline-ui, Taste-Skill, UIDB | hint 13px → 14, no display face |
| **Tactile :active = `scale(0.98)` or `translateY(1px)`** | Taste-Skill, UIDB, 12-principles | rows/nav/back have no `:active` |
| Compositor-only motion (`transform`/`opacity` only, ≤ 200ms) | baseline-ui, fixing-motion-perf, Impeccable /animate | Maka may transition `background-color` on hover (paint) — acceptable but verify nothing animates layout |
| Reduced-motion guards | All 5 | ✅ done round 11 |
| Single accent, saturation < 80%, OKLCH neutrals tinted toward brand | Taste-Skill, Impeccable /colorize | maka uses raw `%foreground` overlays, no brand tint |
| 8px grid; double whitespace as redesign default | Taste-Skill, UIDB, Impeccable /layout | row padding 20/24 off-grid (should be 16/24 or 24/24) |
| Toggle/touch target ≥ 44px hit area | Taste-Skill, UIDB | switch 26×46 visual, no hit padding |
| Sidebar primary nav 5-7 items, distinct active state | UIDB, Taste-Skill | maka has more than 7 in "AI 与集成" group — could collapse; active state is light-fill, no accent bar |
| One CSS variable for all motion timings (no scattered ms values) | 12-principles "timing-consistent" | Maka has scattered 150ms values, no `--motion-fast` token |
| `text-balance` on heading, `text-pretty` on body | baseline-ui | not used |
| `tabular-nums` on data/numeric labels | baseline-ui, Impeccable /typeset | not used; value cells `已启用 / zai-live` would benefit |
| No display tracking modification unless explicit | baseline-ui | h2 has `-0.012em` (intentional, OK) |
| Em-dash ban | Taste-Skill, redesign | grep needed |
| Inter/system as default font flagged as "AI tell" | Taste-Skill, redesign, soft | maka is system-ui default — flagged |
| Lucide-as-default flagged | Taste-Skill | maka is lucide-react — flagged, Better Icons proposed |
| Card OR border, not both | Impeccable rule 36, UIDB, Taste-Skill | mostly ✅ (.settingsRows is border-only) but `.settingsConnectionRow` still has border + shadow |
| Visible focus ring (`:focus-visible` 2px) | fixing-a11y, Impeccable /audit | ✅ done round 11 |
| Page header height 56-72px | UIDB | maka uses padding stack, not a true bar — partial |

## Anti-patterns triggered by maka today

- **Impeccable rule 11 (card overuse / nested cards):** every settings page renders multiple `.settingsRows` blocks stacked, each with own card chrome. Could be one card with section dividers (per /distill).
- **Impeccable rule 25 (raw neutrals not tinted toward brand):** `.settingsRows` border is `oklch(from var(--foreground) l c h / 0.08)`. Tinting toward `--accent` at 0.005-0.01 chroma would carry brand into chrome.
- **Taste-Skill banned: border-b on every row.** ❌ — wait, maka DOES use `border-bottom` hairlines between rows. WAWQAQ asked for this explicitly in PR-GROUPED-CARD-0 ("内容紧密、用分隔线划开"), so this disagreement stays unresolved between Taste-Skill and WAWQAQ. Defer to WAWQAQ.

## 10 highest-value action items for maka

Ranked by impact / effort:

1. **Tactile `:active` scale** on rows, nav items, back button.
- `.settingsFormRow:active, .settingsRow:active, .settingsNavItem:active, .settingsBackButton:active { transform: scale(0.985); transition: transform 100ms cubic-bezier(0.16, 1, 0.3, 1); }`
- Reduced-motion gate already in place — fires inside the `@media (no-preference)` branch.

2. **Sidebar active accent bar** (Redesign-Skill).
- `.settingsNavItem[data-active="true"] { box-shadow: inset 3px 0 0 var(--accent); }`
- Carries brand into the most-used surface.

3. **`tabular-nums` on value cells**.
- `.settingsRow > span { font-variant-numeric: tabular-nums; }`
- Numeric values like `zai-live`, version strings, counts align cleanly.

4. **`text-balance` / `text-pretty`** on page header.
- `.settingsPageHeader h2 { text-wrap: balance; }`
- `.settingsPageHeaderDescription { text-wrap: pretty; }`

5. **Hint floor 13 → 14px**.
- `.settingsFormRow small, .settingsField small { font-size: 14px; }` (currently 13)
- Crosses the 14px legibility floor that baseline-ui + UIDB + Impeccable converge on.

6. **Switch hit-area shim**: 44×44 invisible hit target around the 26×46 visual.
- Wrap `<Switch>` in a `min-width:44px; min-height:44px;` flex container.

7. **One motion token**.
- `--motion-fast: 160ms` + `--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1)`.
- Reuse across nav / row / switch / input transitions.

8. **OKLCH brand tint on settings chrome**.
- `.settingsRows` border from `from var(--foreground) ... / 0.08` to `oklch(from var(--accent) l c h / 0.08)`.
- Subtle brand carry without changing perceived neutrality.

9. **Em-dash + AI-slop copy grep**.
- Audit `apps/desktop/src/renderer/settings/SettingsModal.tsx` for `—`, "Seamless", "Elevate", "Unleash".
- Quick mechanical cleanup.

10. **Better Icons MCP install (deferred ship)**.
- Add to `.mcp.json`. Don't migrate icons in this lane — let it learn preferred families per surface first. Lucide stays default for now.

## Defer / out-of-lane

- **Font swap** (Geist/Cabinet Grotesk/Satoshi instead of system-ui): meaningful but needs font files in the bundle, license check, and broad visual regression. Worth its own PR.
- **Nav consolidation to ≤7 in big group**: would re-split AI 与集成. Defer; WAWQAQ already approved 3 groups in round 7.
- **Card overuse / merge stacked cards**: contradicts WAWQAQ's grouped-card direction. Don't change.

## Round 15 (final) PR plan

Bundle action items 1, 2, 3, 4, 5, 7 (highest-impact, single-CSS-file). Skip 6 (component wrap), 8 (brand tint risk), 9 (audit), 10 (config) — those need their own PRs.

PR-SETTINGS-MOTION-TYPO-TOKENS-0:
- `:active` scale on rows/nav/back (item 1)
- accent bar on active nav (item 2)
- tabular-nums on row value (item 3)
- text-balance / text-pretty on header (item 4)
- hint 13→14 (item 5)
- shared `--motion-fast` token (item 7)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 65 additions & 18 deletions apps/desktop/src/renderer/styles.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -7068,13 +7068,15 @@ button:active {
.settingsNavItem[data-active="true"] {
/* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from
the muted `--settings-nav-row-selected-bg` token to a slightly
more visible 6.5% foreground overlay + 500 weight. The previous
fill was reading as "muted disabled" against the now-bigger
nav row typography. */
more visible 6.5% foreground overlay + 500 weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): add 3px inset
accent bar on the LEFT edge — Redesign-Skill recipe. Carries
brand into the most-used surface without recoloring the fill.
Inset shadow (not actual border) so the 38px row geometry stays. */
background: oklch(from var(--foreground) l c h / 0.065);
color: var(--foreground);
font-weight: 500;
box-shadow: none !important;
box-shadow: inset 3px 0 0 var(--accent) !important;
}

.settingsNavItem:focus-visible {
Expand DownExpand Up@@ -7342,30 +7344,31 @@ button:active {
}

.settingsPageHeader h2 {
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15, WAWQAQ msg
`f7e9d166`): tighten the h2 with negative tracking + slightly
softer weight. 28 / 700 was too loud; 26 / 650 reads as
authoritative without shouting. Add a touch of `-0.012em`
tracking like reference's display face. */
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2
with negative tracking + slightly softer weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap:
balance` so 1-2 word titles don't orphan on long pages and
2-word titles like 「记忆与回顾」don't break across an awkward
line. */
margin: 0;
color: var(--foreground);
font-size: 26px;
font-weight: 650;
letter-spacing: -0.012em;
line-height: 1.2;
text-wrap: balance;
}

/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15): one-line page description
below the h2 — matches reference's per-tab meta line.
PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): cap width so long
descriptions don't span the full 768px column — caps at 56ch which
keeps the meta-line readable. */
/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap +
round 15/15 `text-wrap: pretty` so the last line isn't a single
orphan word (per baseline-ui typography rule). */
.settingsPageHeaderDescription {
margin: 0;
max-width: 56ch;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
font-size: 14px;
line-height: 1.5;
text-wrap: pretty;
}

.settingsPageContent {
Expand DownExpand Up@@ -7397,6 +7400,19 @@ button:active {
padding: 40px 24px 64px;
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15, WAWQAQ msg
`f7e9d166` + UI-skill deep read 2026-06-23): shared motion tokens
for the settings surface so timing/easing stay consistent across
nav rows, form rows, switches, and inputs. `--motion-fast` is the
default for state changes; `--motion-ease-out` is the cubic-bezier
recommended by Taste-Skill + 12-principles. */
.settingsSurface,
.settingsMainPane,
.settingsSidebar {
--motion-fast: 160ms;
--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested
card-in-card was the previous problem — `.settingsStructuredPage`
was a card AND it contained `<SettingsRows>` cards AND orphan
Expand DownExpand Up@@ -7484,6 +7500,29 @@ button:active {
background: oklch(from var(--foreground) l c h / 0.025);
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press
feedback. 12-principles `physics-active-state` + Taste-Skill +
UIDB all converge on `:active { scale(0.98) }` as the cheapest way
to make UI feel handled vs simulated. Applied only when reduced-
motion is not preferred — the @media block above already strips
transition; here we keep `transform` declarations so the
`:active` *snap* still fires (it's instant, not animated). */
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: scale(0.985);
transition: transform 100ms var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}
@media (prefers-reduced-motion: reduce) {
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: none;
}
}

/* PR-SETTINGS-A11Y-POLISH-0 (round 11/15) — keyboard-only focus ring
on settings rows + inputs. Reference's settings cards use a 2px
ring on focus-visible; maka had no visible affordance. Use the
Expand DownExpand Up@@ -7566,8 +7605,11 @@ button:active {
display: block;
margin-top: 6px;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): 13 → 14 to clear
the 14px legibility floor cited by baseline-ui + UIDB + Impeccable
`/typeset`. Hint is the most-read body text on the page. */
font-size: 14px;
line-height: 1.5;
}

.settingsFieldWarning {
Expand DownExpand Up@@ -9907,9 +9949,14 @@ button:active {
}

.settingsRow > span {
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `tabular-nums` so
numeric values (version strings, model IDs, counts) align cleanly
when stacked vertically. baseline-ui + /typeset both require this
for any numeric data. */
min-width: 0;
color: var(--foreground-60);
font-size: 13px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
text-align: right;
}
Expand Down
106 changes: 106 additions & 0 deletions notes/ui-skills-deep-read-2026-06-23.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
# UI Skills Deep Read — 2026-06-23 (yuejing)

3 parallel Explore agents deep-read 5 design-skill collections per WAWQAQ
ask `f424c6b5`. Synthesis below — converged rules + maka delta + 1 final
ship list.

## Sources

| Source | Type | Repo |
|--------|------|------|
| Impeccable | 26 commands + 44-rule SLOP catalog | github.com/pbakaus/impeccable |
| UI Skills | 15-skill collection (baseline-ui, fixing-a11y, fixing-motion-performance, 12-principles-of-animation, fixing-metadata, etc.) | github.com/ibelick/ui-skills + github.com/raphaelsalaja/skill |
| Taste-Skill | taste / redesign / soft variants | github.com/Leonxlnx/taste-skill |
| UI Design Brain | 60+ component best practices | github.com/carmahhawwari/ui-design-brain |
| Better Icons | MCP + skill, 200k icons | github.com/better-auth/better-icons |

## Convergent rules across all 5 sources

These showed up in **3+ sources** independently. Highest signal.

| Rule | Sources | Maka delta |
|------|---------|-----------|
| Body text ≥ 14-16px, weights 400/500/600 with semantic contrast | Impeccable /typeset, baseline-ui, Taste-Skill, UIDB | hint 13px → 14, no display face |
| **Tactile :active = `scale(0.98)` or `translateY(1px)`** | Taste-Skill, UIDB, 12-principles | rows/nav/back have no `:active` |
| Compositor-only motion (`transform`/`opacity` only, ≤ 200ms) | baseline-ui, fixing-motion-perf, Impeccable /animate | Maka may transition `background-color` on hover (paint) — acceptable but verify nothing animates layout |
| Reduced-motion guards | All 5 | ✅ done round 11 |
| Single accent, saturation < 80%, OKLCH neutrals tinted toward brand | Taste-Skill, Impeccable /colorize | maka uses raw `%foreground` overlays, no brand tint |
| 8px grid; double whitespace as redesign default | Taste-Skill, UIDB, Impeccable /layout | row padding 20/24 off-grid (should be 16/24 or 24/24) |
| Toggle/touch target ≥ 44px hit area | Taste-Skill, UIDB | switch 26×46 visual, no hit padding |
| Sidebar primary nav 5-7 items, distinct active state | UIDB, Taste-Skill | maka has more than 7 in "AI 与集成" group — could collapse; active state is light-fill, no accent bar |
| One CSS variable for all motion timings (no scattered ms values) | 12-principles "timing-consistent" | Maka has scattered 150ms values, no `--motion-fast` token |
| `text-balance` on heading, `text-pretty` on body | baseline-ui | not used |
| `tabular-nums` on data/numeric labels | baseline-ui, Impeccable /typeset | not used; value cells `已启用 / zai-live` would benefit |
| No display tracking modification unless explicit | baseline-ui | h2 has `-0.012em` (intentional, OK) |
| Em-dash ban | Taste-Skill, redesign | grep needed |
| Inter/system as default font flagged as "AI tell" | Taste-Skill, redesign, soft | maka is system-ui default — flagged |
| Lucide-as-default flagged | Taste-Skill | maka is lucide-react — flagged, Better Icons proposed |
| Card OR border, not both | Impeccable rule 36, UIDB, Taste-Skill | mostly ✅ (.settingsRows is border-only) but `.settingsConnectionRow` still has border + shadow |
| Visible focus ring (`:focus-visible` 2px) | fixing-a11y, Impeccable /audit | ✅ done round 11 |
| Page header height 56-72px | UIDB | maka uses padding stack, not a true bar — partial |

## Anti-patterns triggered by maka today

- **Impeccable rule 11 (card overuse / nested cards):** every settings page renders multiple `.settingsRows` blocks stacked, each with own card chrome. Could be one card with section dividers (per /distill).
- **Impeccable rule 25 (raw neutrals not tinted toward brand):** `.settingsRows` border is `oklch(from var(--foreground) l c h / 0.08)`. Tinting toward `--accent` at 0.005-0.01 chroma would carry brand into chrome.
- **Taste-Skill banned: border-b on every row.** ❌ — wait, maka DOES use `border-bottom` hairlines between rows. WAWQAQ asked for this explicitly in PR-GROUPED-CARD-0 ("内容紧密、用分隔线划开"), so this disagreement stays unresolved between Taste-Skill and WAWQAQ. Defer to WAWQAQ.

## 10 highest-value action items for maka

Ranked by impact / effort:

1. **Tactile `:active` scale** on rows, nav items, back button.
- `.settingsFormRow:active, .settingsRow:active, .settingsNavItem:active, .settingsBackButton:active { transform: scale(0.985); transition: transform 100ms cubic-bezier(0.16, 1, 0.3, 1); }`
- Reduced-motion gate already in place — fires inside the `@media (no-preference)` branch.

2. **Sidebar active accent bar** (Redesign-Skill).
- `.settingsNavItem[data-active="true"] { box-shadow: inset 3px 0 0 var(--accent); }`
- Carries brand into the most-used surface.

3. **`tabular-nums` on value cells**.
- `.settingsRow > span { font-variant-numeric: tabular-nums; }`
- Numeric values like `zai-live`, version strings, counts align cleanly.

4. **`text-balance` / `text-pretty`** on page header.
- `.settingsPageHeader h2 { text-wrap: balance; }`
- `.settingsPageHeaderDescription { text-wrap: pretty; }`

5. **Hint floor 13 → 14px**.
- `.settingsFormRow small, .settingsField small { font-size: 14px; }` (currently 13)
- Crosses the 14px legibility floor that baseline-ui + UIDB + Impeccable converge on.

6. **Switch hit-area shim**: 44×44 invisible hit target around the 26×46 visual.
- Wrap `<Switch>` in a `min-width:44px; min-height:44px;` flex container.

7. **One motion token**.
- `--motion-fast: 160ms` + `--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1)`.
- Reuse across nav / row / switch / input transitions.

8. **OKLCH brand tint on settings chrome**.
- `.settingsRows` border from `from var(--foreground) ... / 0.08` to `oklch(from var(--accent) l c h / 0.08)`.
- Subtle brand carry without changing perceived neutrality.

9. **Em-dash + AI-slop copy grep**.
- Audit `apps/desktop/src/renderer/settings/SettingsModal.tsx` for `—`, "Seamless", "Elevate", "Unleash".
- Quick mechanical cleanup.

10. **Better Icons MCP install (deferred ship)**.
- Add to `.mcp.json`. Don't migrate icons in this lane — let it learn preferred families per surface first. Lucide stays default for now.

## Defer / out-of-lane

- **Font swap** (Geist/Cabinet Grotesk/Satoshi instead of system-ui): meaningful but needs font files in the bundle, license check, and broad visual regression. Worth its own PR.
- **Nav consolidation to ≤7 in big group**: would re-split AI 与集成. Defer; WAWQAQ already approved 3 groups in round 7.
- **Card overuse / merge stacked cards**: contradicts WAWQAQ's grouped-card direction. Don't change.

## Round 15 (final) PR plan

Bundle action items 1, 2, 3, 4, 5, 7 (highest-impact, single-CSS-file). Skip 6 (component wrap), 8 (brand tint risk), 9 (audit), 10 (config) — those need their own PRs.

PR-SETTINGS-MOTION-TYPO-TOKENS-0:
- `:active` scale on rows/nav/back (item 1)
- accent bar on active nav (item 2)
- tabular-nums on row value (item 3)
- text-balance / text-pretty on header (item 4)
- hint 13→14 (item 5)
- shared `--motion-fast` token (item 7)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 65 additions & 18 deletions apps/desktop/src/renderer/styles.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -7068,13 +7068,15 @@ button:active {
.settingsNavItem[data-active="true"] {
/* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from
the muted `--settings-nav-row-selected-bg` token to a slightly
more visible 6.5% foreground overlay + 500 weight. The previous
fill was reading as "muted disabled" against the now-bigger
nav row typography. */
more visible 6.5% foreground overlay + 500 weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): add 3px inset
accent bar on the LEFT edge — Redesign-Skill recipe. Carries
brand into the most-used surface without recoloring the fill.
Inset shadow (not actual border) so the 38px row geometry stays. */
background: oklch(from var(--foreground) l c h / 0.065);
color: var(--foreground);
font-weight: 500;
box-shadow: none !important;
box-shadow: inset 3px 0 0 var(--accent) !important;
}

.settingsNavItem:focus-visible {
Expand DownExpand Up@@ -7342,30 +7344,31 @@ button:active {
}

.settingsPageHeader h2 {
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15, WAWQAQ msg
`f7e9d166`): tighten the h2 with negative tracking + slightly
softer weight. 28 / 700 was too loud; 26 / 650 reads as
authoritative without shouting. Add a touch of `-0.012em`
tracking like reference's display face. */
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2
with negative tracking + slightly softer weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap:
balance` so 1-2 word titles don't orphan on long pages and
2-word titles like 「记忆与回顾」don't break across an awkward
line. */
margin: 0;
color: var(--foreground);
font-size: 26px;
font-weight: 650;
letter-spacing: -0.012em;
line-height: 1.2;
text-wrap: balance;
}

/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15): one-line page description
below the h2 — matches reference's per-tab meta line.
PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): cap width so long
descriptions don't span the full 768px column — caps at 56ch which
keeps the meta-line readable. */
/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap +
round 15/15 `text-wrap: pretty` so the last line isn't a single
orphan word (per baseline-ui typography rule). */
.settingsPageHeaderDescription {
margin: 0;
max-width: 56ch;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
font-size: 14px;
line-height: 1.5;
text-wrap: pretty;
}

.settingsPageContent {
Expand DownExpand Up@@ -7397,6 +7400,19 @@ button:active {
padding: 40px 24px 64px;
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15, WAWQAQ msg
`f7e9d166` + UI-skill deep read 2026-06-23): shared motion tokens
for the settings surface so timing/easing stay consistent across
nav rows, form rows, switches, and inputs. `--motion-fast` is the
default for state changes; `--motion-ease-out` is the cubic-bezier
recommended by Taste-Skill + 12-principles. */
.settingsSurface,
.settingsMainPane,
.settingsSidebar {
--motion-fast: 160ms;
--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested
card-in-card was the previous problem — `.settingsStructuredPage`
was a card AND it contained `<SettingsRows>` cards AND orphan
Expand DownExpand Up@@ -7484,6 +7500,29 @@ button:active {
background: oklch(from var(--foreground) l c h / 0.025);
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press
feedback. 12-principles `physics-active-state` + Taste-Skill +
UIDB all converge on `:active { scale(0.98) }` as the cheapest way
to make UI feel handled vs simulated. Applied only when reduced-
motion is not preferred — the @media block above already strips
transition; here we keep `transform` declarations so the
`:active` *snap* still fires (it's instant, not animated). */
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: scale(0.985);
transition: transform 100ms var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}
@media (prefers-reduced-motion: reduce) {
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: none;
}
}

/* PR-SETTINGS-A11Y-POLISH-0 (round 11/15) — keyboard-only focus ring
on settings rows + inputs. Reference's settings cards use a 2px
ring on focus-visible; maka had no visible affordance. Use the
Expand DownExpand Up@@ -7566,8 +7605,11 @@ button:active {
display: block;
margin-top: 6px;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): 13 → 14 to clear
the 14px legibility floor cited by baseline-ui + UIDB + Impeccable
`/typeset`. Hint is the most-read body text on the page. */
font-size: 14px;
line-height: 1.5;
}

.settingsFieldWarning {
Expand DownExpand Up@@ -9907,9 +9949,14 @@ button:active {
}

.settingsRow > span {
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `tabular-nums` so
numeric values (version strings, model IDs, counts) align cleanly
when stacked vertically. baseline-ui + /typeset both require this
for any numeric data. */
min-width: 0;
color: var(--foreground-60);
font-size: 13px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
text-align: right;
}
Expand Down
106 changes: 106 additions & 0 deletions notes/ui-skills-deep-read-2026-06-23.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
# UI Skills Deep Read — 2026-06-23 (yuejing)

3 parallel Explore agents deep-read 5 design-skill collections per WAWQAQ
ask `f424c6b5`. Synthesis below — converged rules + maka delta + 1 final
ship list.

## Sources

| Source | Type | Repo |
|--------|------|------|
| Impeccable | 26 commands + 44-rule SLOP catalog | github.com/pbakaus/impeccable |
| UI Skills | 15-skill collection (baseline-ui, fixing-a11y, fixing-motion-performance, 12-principles-of-animation, fixing-metadata, etc.) | github.com/ibelick/ui-skills + github.com/raphaelsalaja/skill |
| Taste-Skill | taste / redesign / soft variants | github.com/Leonxlnx/taste-skill |
| UI Design Brain | 60+ component best practices | github.com/carmahhawwari/ui-design-brain |
| Better Icons | MCP + skill, 200k icons | github.com/better-auth/better-icons |

## Convergent rules across all 5 sources

These showed up in **3+ sources** independently. Highest signal.

| Rule | Sources | Maka delta |
|------|---------|-----------|
| Body text ≥ 14-16px, weights 400/500/600 with semantic contrast | Impeccable /typeset, baseline-ui, Taste-Skill, UIDB | hint 13px → 14, no display face |
| **Tactile :active = `scale(0.98)` or `translateY(1px)`** | Taste-Skill, UIDB, 12-principles | rows/nav/back have no `:active` |
| Compositor-only motion (`transform`/`opacity` only, ≤ 200ms) | baseline-ui, fixing-motion-perf, Impeccable /animate | Maka may transition `background-color` on hover (paint) — acceptable but verify nothing animates layout |
| Reduced-motion guards | All 5 | ✅ done round 11 |
| Single accent, saturation < 80%, OKLCH neutrals tinted toward brand | Taste-Skill, Impeccable /colorize | maka uses raw `%foreground` overlays, no brand tint |
| 8px grid; double whitespace as redesign default | Taste-Skill, UIDB, Impeccable /layout | row padding 20/24 off-grid (should be 16/24 or 24/24) |
| Toggle/touch target ≥ 44px hit area | Taste-Skill, UIDB | switch 26×46 visual, no hit padding |
| Sidebar primary nav 5-7 items, distinct active state | UIDB, Taste-Skill | maka has more than 7 in "AI 与集成" group — could collapse; active state is light-fill, no accent bar |
| One CSS variable for all motion timings (no scattered ms values) | 12-principles "timing-consistent" | Maka has scattered 150ms values, no `--motion-fast` token |
| `text-balance` on heading, `text-pretty` on body | baseline-ui | not used |
| `tabular-nums` on data/numeric labels | baseline-ui, Impeccable /typeset | not used; value cells `已启用 / zai-live` would benefit |
| No display tracking modification unless explicit | baseline-ui | h2 has `-0.012em` (intentional, OK) |
| Em-dash ban | Taste-Skill, redesign | grep needed |
| Inter/system as default font flagged as "AI tell" | Taste-Skill, redesign, soft | maka is system-ui default — flagged |
| Lucide-as-default flagged | Taste-Skill | maka is lucide-react — flagged, Better Icons proposed |
| Card OR border, not both | Impeccable rule 36, UIDB, Taste-Skill | mostly ✅ (.settingsRows is border-only) but `.settingsConnectionRow` still has border + shadow |
| Visible focus ring (`:focus-visible` 2px) | fixing-a11y, Impeccable /audit | ✅ done round 11 |
| Page header height 56-72px | UIDB | maka uses padding stack, not a true bar — partial |

## Anti-patterns triggered by maka today

- **Impeccable rule 11 (card overuse / nested cards):** every settings page renders multiple `.settingsRows` blocks stacked, each with own card chrome. Could be one card with section dividers (per /distill).
- **Impeccable rule 25 (raw neutrals not tinted toward brand):** `.settingsRows` border is `oklch(from var(--foreground) l c h / 0.08)`. Tinting toward `--accent` at 0.005-0.01 chroma would carry brand into chrome.
- **Taste-Skill banned: border-b on every row.** ❌ — wait, maka DOES use `border-bottom` hairlines between rows. WAWQAQ asked for this explicitly in PR-GROUPED-CARD-0 ("内容紧密、用分隔线划开"), so this disagreement stays unresolved between Taste-Skill and WAWQAQ. Defer to WAWQAQ.

## 10 highest-value action items for maka

Ranked by impact / effort:

1. **Tactile `:active` scale** on rows, nav items, back button.
- `.settingsFormRow:active, .settingsRow:active, .settingsNavItem:active, .settingsBackButton:active { transform: scale(0.985); transition: transform 100ms cubic-bezier(0.16, 1, 0.3, 1); }`
- Reduced-motion gate already in place — fires inside the `@media (no-preference)` branch.

2. **Sidebar active accent bar** (Redesign-Skill).
- `.settingsNavItem[data-active="true"] { box-shadow: inset 3px 0 0 var(--accent); }`
- Carries brand into the most-used surface.

3. **`tabular-nums` on value cells**.
- `.settingsRow > span { font-variant-numeric: tabular-nums; }`
- Numeric values like `zai-live`, version strings, counts align cleanly.

4. **`text-balance` / `text-pretty`** on page header.
- `.settingsPageHeader h2 { text-wrap: balance; }`
- `.settingsPageHeaderDescription { text-wrap: pretty; }`

5. **Hint floor 13 → 14px**.
- `.settingsFormRow small, .settingsField small { font-size: 14px; }` (currently 13)
- Crosses the 14px legibility floor that baseline-ui + UIDB + Impeccable converge on.

6. **Switch hit-area shim**: 44×44 invisible hit target around the 26×46 visual.
- Wrap `<Switch>` in a `min-width:44px; min-height:44px;` flex container.

7. **One motion token**.
- `--motion-fast: 160ms` + `--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1)`.
- Reuse across nav / row / switch / input transitions.

8. **OKLCH brand tint on settings chrome**.
- `.settingsRows` border from `from var(--foreground) ... / 0.08` to `oklch(from var(--accent) l c h / 0.08)`.
- Subtle brand carry without changing perceived neutrality.

9. **Em-dash + AI-slop copy grep**.
- Audit `apps/desktop/src/renderer/settings/SettingsModal.tsx` for `—`, "Seamless", "Elevate", "Unleash".
- Quick mechanical cleanup.

10. **Better Icons MCP install (deferred ship)**.
- Add to `.mcp.json`. Don't migrate icons in this lane — let it learn preferred families per surface first. Lucide stays default for now.

## Defer / out-of-lane

- **Font swap** (Geist/Cabinet Grotesk/Satoshi instead of system-ui): meaningful but needs font files in the bundle, license check, and broad visual regression. Worth its own PR.
- **Nav consolidation to ≤7 in big group**: would re-split AI 与集成. Defer; WAWQAQ already approved 3 groups in round 7.
- **Card overuse / merge stacked cards**: contradicts WAWQAQ's grouped-card direction. Don't change.

## Round 15 (final) PR plan

Bundle action items 1, 2, 3, 4, 5, 7 (highest-impact, single-CSS-file). Skip 6 (component wrap), 8 (brand tint risk), 9 (audit), 10 (config) — those need their own PRs.

PR-SETTINGS-MOTION-TYPO-TOKENS-0:
- `:active` scale on rows/nav/back (item 1)
- accent bar on active nav (item 2)
- tabular-nums on row value (item 3)
- text-balance / text-pretty on header (item 4)
- hint 13→14 (item 5)
- shared `--motion-fast` token (item 7)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 65 additions & 18 deletions apps/desktop/src/renderer/styles.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -7068,13 +7068,15 @@ button:active {
.settingsNavItem[data-active="true"] {
/* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from
the muted `--settings-nav-row-selected-bg` token to a slightly
more visible 6.5% foreground overlay + 500 weight. The previous
fill was reading as "muted disabled" against the now-bigger
nav row typography. */
more visible 6.5% foreground overlay + 500 weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): add 3px inset
accent bar on the LEFT edge — Redesign-Skill recipe. Carries
brand into the most-used surface without recoloring the fill.
Inset shadow (not actual border) so the 38px row geometry stays. */
background: oklch(from var(--foreground) l c h / 0.065);
color: var(--foreground);
font-weight: 500;
box-shadow: none !important;
box-shadow: inset 3px 0 0 var(--accent) !important;
}

.settingsNavItem:focus-visible {
Expand DownExpand Up@@ -7342,30 +7344,31 @@ button:active {
}

.settingsPageHeader h2 {
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15, WAWQAQ msg
`f7e9d166`): tighten the h2 with negative tracking + slightly
softer weight. 28 / 700 was too loud; 26 / 650 reads as
authoritative without shouting. Add a touch of `-0.012em`
tracking like reference's display face. */
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2
with negative tracking + slightly softer weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap:
balance` so 1-2 word titles don't orphan on long pages and
2-word titles like 「记忆与回顾」don't break across an awkward
line. */
margin: 0;
color: var(--foreground);
font-size: 26px;
font-weight: 650;
letter-spacing: -0.012em;
line-height: 1.2;
text-wrap: balance;
}

/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15): one-line page description
below the h2 — matches reference's per-tab meta line.
PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): cap width so long
descriptions don't span the full 768px column — caps at 56ch which
keeps the meta-line readable. */
/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap +
round 15/15 `text-wrap: pretty` so the last line isn't a single
orphan word (per baseline-ui typography rule). */
.settingsPageHeaderDescription {
margin: 0;
max-width: 56ch;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
font-size: 14px;
line-height: 1.5;
text-wrap: pretty;
}

.settingsPageContent {
Expand DownExpand Up@@ -7397,6 +7400,19 @@ button:active {
padding: 40px 24px 64px;
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15, WAWQAQ msg
`f7e9d166` + UI-skill deep read 2026-06-23): shared motion tokens
for the settings surface so timing/easing stay consistent across
nav rows, form rows, switches, and inputs. `--motion-fast` is the
default for state changes; `--motion-ease-out` is the cubic-bezier
recommended by Taste-Skill + 12-principles. */
.settingsSurface,
.settingsMainPane,
.settingsSidebar {
--motion-fast: 160ms;
--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested
card-in-card was the previous problem — `.settingsStructuredPage`
was a card AND it contained `<SettingsRows>` cards AND orphan
Expand DownExpand Up@@ -7484,6 +7500,29 @@ button:active {
background: oklch(from var(--foreground) l c h / 0.025);
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press
feedback. 12-principles `physics-active-state` + Taste-Skill +
UIDB all converge on `:active { scale(0.98) }` as the cheapest way
to make UI feel handled vs simulated. Applied only when reduced-
motion is not preferred — the @media block above already strips
transition; here we keep `transform` declarations so the
`:active` *snap* still fires (it's instant, not animated). */
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: scale(0.985);
transition: transform 100ms var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}
@media (prefers-reduced-motion: reduce) {
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: none;
}
}

/* PR-SETTINGS-A11Y-POLISH-0 (round 11/15) — keyboard-only focus ring
on settings rows + inputs. Reference's settings cards use a 2px
ring on focus-visible; maka had no visible affordance. Use the
Expand DownExpand Up@@ -7566,8 +7605,11 @@ button:active {
display: block;
margin-top: 6px;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): 13 → 14 to clear
the 14px legibility floor cited by baseline-ui + UIDB + Impeccable
`/typeset`. Hint is the most-read body text on the page. */
font-size: 14px;
line-height: 1.5;
}

.settingsFieldWarning {
Expand DownExpand Up@@ -9907,9 +9949,14 @@ button:active {
}

.settingsRow > span {
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `tabular-nums` so
numeric values (version strings, model IDs, counts) align cleanly
when stacked vertically. baseline-ui + /typeset both require this
for any numeric data. */
min-width: 0;
color: var(--foreground-60);
font-size: 13px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
text-align: right;
}
Expand Down
106 changes: 106 additions & 0 deletions notes/ui-skills-deep-read-2026-06-23.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
# UI Skills Deep Read — 2026-06-23 (yuejing)

3 parallel Explore agents deep-read 5 design-skill collections per WAWQAQ
ask `f424c6b5`. Synthesis below — converged rules + maka delta + 1 final
ship list.

## Sources

| Source | Type | Repo |
|--------|------|------|
| Impeccable | 26 commands + 44-rule SLOP catalog | github.com/pbakaus/impeccable |
| UI Skills | 15-skill collection (baseline-ui, fixing-a11y, fixing-motion-performance, 12-principles-of-animation, fixing-metadata, etc.) | github.com/ibelick/ui-skills + github.com/raphaelsalaja/skill |
| Taste-Skill | taste / redesign / soft variants | github.com/Leonxlnx/taste-skill |
| UI Design Brain | 60+ component best practices | github.com/carmahhawwari/ui-design-brain |
| Better Icons | MCP + skill, 200k icons | github.com/better-auth/better-icons |

## Convergent rules across all 5 sources

These showed up in **3+ sources** independently. Highest signal.

| Rule | Sources | Maka delta |
|------|---------|-----------|
| Body text ≥ 14-16px, weights 400/500/600 with semantic contrast | Impeccable /typeset, baseline-ui, Taste-Skill, UIDB | hint 13px → 14, no display face |
| **Tactile :active = `scale(0.98)` or `translateY(1px)`** | Taste-Skill, UIDB, 12-principles | rows/nav/back have no `:active` |
| Compositor-only motion (`transform`/`opacity` only, ≤ 200ms) | baseline-ui, fixing-motion-perf, Impeccable /animate | Maka may transition `background-color` on hover (paint) — acceptable but verify nothing animates layout |
| Reduced-motion guards | All 5 | ✅ done round 11 |
| Single accent, saturation < 80%, OKLCH neutrals tinted toward brand | Taste-Skill, Impeccable /colorize | maka uses raw `%foreground` overlays, no brand tint |
| 8px grid; double whitespace as redesign default | Taste-Skill, UIDB, Impeccable /layout | row padding 20/24 off-grid (should be 16/24 or 24/24) |
| Toggle/touch target ≥ 44px hit area | Taste-Skill, UIDB | switch 26×46 visual, no hit padding |
| Sidebar primary nav 5-7 items, distinct active state | UIDB, Taste-Skill | maka has more than 7 in "AI 与集成" group — could collapse; active state is light-fill, no accent bar |
| One CSS variable for all motion timings (no scattered ms values) | 12-principles "timing-consistent" | Maka has scattered 150ms values, no `--motion-fast` token |
| `text-balance` on heading, `text-pretty` on body | baseline-ui | not used |
| `tabular-nums` on data/numeric labels | baseline-ui, Impeccable /typeset | not used; value cells `已启用 / zai-live` would benefit |
| No display tracking modification unless explicit | baseline-ui | h2 has `-0.012em` (intentional, OK) |
| Em-dash ban | Taste-Skill, redesign | grep needed |
| Inter/system as default font flagged as "AI tell" | Taste-Skill, redesign, soft | maka is system-ui default — flagged |
| Lucide-as-default flagged | Taste-Skill | maka is lucide-react — flagged, Better Icons proposed |
| Card OR border, not both | Impeccable rule 36, UIDB, Taste-Skill | mostly ✅ (.settingsRows is border-only) but `.settingsConnectionRow` still has border + shadow |
| Visible focus ring (`:focus-visible` 2px) | fixing-a11y, Impeccable /audit | ✅ done round 11 |
| Page header height 56-72px | UIDB | maka uses padding stack, not a true bar — partial |

## Anti-patterns triggered by maka today

- **Impeccable rule 11 (card overuse / nested cards):** every settings page renders multiple `.settingsRows` blocks stacked, each with own card chrome. Could be one card with section dividers (per /distill).
- **Impeccable rule 25 (raw neutrals not tinted toward brand):** `.settingsRows` border is `oklch(from var(--foreground) l c h / 0.08)`. Tinting toward `--accent` at 0.005-0.01 chroma would carry brand into chrome.
- **Taste-Skill banned: border-b on every row.** ❌ — wait, maka DOES use `border-bottom` hairlines between rows. WAWQAQ asked for this explicitly in PR-GROUPED-CARD-0 ("内容紧密、用分隔线划开"), so this disagreement stays unresolved between Taste-Skill and WAWQAQ. Defer to WAWQAQ.

## 10 highest-value action items for maka

Ranked by impact / effort:

1. **Tactile `:active` scale** on rows, nav items, back button.
- `.settingsFormRow:active, .settingsRow:active, .settingsNavItem:active, .settingsBackButton:active { transform: scale(0.985); transition: transform 100ms cubic-bezier(0.16, 1, 0.3, 1); }`
- Reduced-motion gate already in place — fires inside the `@media (no-preference)` branch.

2. **Sidebar active accent bar** (Redesign-Skill).
- `.settingsNavItem[data-active="true"] { box-shadow: inset 3px 0 0 var(--accent); }`
- Carries brand into the most-used surface.

3. **`tabular-nums` on value cells**.
- `.settingsRow > span { font-variant-numeric: tabular-nums; }`
- Numeric values like `zai-live`, version strings, counts align cleanly.

4. **`text-balance` / `text-pretty`** on page header.
- `.settingsPageHeader h2 { text-wrap: balance; }`
- `.settingsPageHeaderDescription { text-wrap: pretty; }`

5. **Hint floor 13 → 14px**.
- `.settingsFormRow small, .settingsField small { font-size: 14px; }` (currently 13)
- Crosses the 14px legibility floor that baseline-ui + UIDB + Impeccable converge on.

6. **Switch hit-area shim**: 44×44 invisible hit target around the 26×46 visual.
- Wrap `<Switch>` in a `min-width:44px; min-height:44px;` flex container.

7. **One motion token**.
- `--motion-fast: 160ms` + `--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1)`.
- Reuse across nav / row / switch / input transitions.

8. **OKLCH brand tint on settings chrome**.
- `.settingsRows` border from `from var(--foreground) ... / 0.08` to `oklch(from var(--accent) l c h / 0.08)`.
- Subtle brand carry without changing perceived neutrality.

9. **Em-dash + AI-slop copy grep**.
- Audit `apps/desktop/src/renderer/settings/SettingsModal.tsx` for `—`, "Seamless", "Elevate", "Unleash".
- Quick mechanical cleanup.

10. **Better Icons MCP install (deferred ship)**.
- Add to `.mcp.json`. Don't migrate icons in this lane — let it learn preferred families per surface first. Lucide stays default for now.

## Defer / out-of-lane

- **Font swap** (Geist/Cabinet Grotesk/Satoshi instead of system-ui): meaningful but needs font files in the bundle, license check, and broad visual regression. Worth its own PR.
- **Nav consolidation to ≤7 in big group**: would re-split AI 与集成. Defer; WAWQAQ already approved 3 groups in round 7.
- **Card overuse / merge stacked cards**: contradicts WAWQAQ's grouped-card direction. Don't change.

## Round 15 (final) PR plan

Bundle action items 1, 2, 3, 4, 5, 7 (highest-impact, single-CSS-file). Skip 6 (component wrap), 8 (brand tint risk), 9 (audit), 10 (config) — those need their own PRs.

PR-SETTINGS-MOTION-TYPO-TOKENS-0:
- `:active` scale on rows/nav/back (item 1)
- accent bar on active nav (item 2)
- tabular-nums on row value (item 3)
- text-balance / text-pretty on header (item 4)
- hint 13→14 (item 5)
- shared `--motion-fast` token (item 7)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 65 additions & 18 deletions apps/desktop/src/renderer/styles.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -7068,13 +7068,15 @@ button:active {
.settingsNavItem[data-active="true"] {
/* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from
the muted `--settings-nav-row-selected-bg` token to a slightly
more visible 6.5% foreground overlay + 500 weight. The previous
fill was reading as "muted disabled" against the now-bigger
nav row typography. */
more visible 6.5% foreground overlay + 500 weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): add 3px inset
accent bar on the LEFT edge — Redesign-Skill recipe. Carries
brand into the most-used surface without recoloring the fill.
Inset shadow (not actual border) so the 38px row geometry stays. */
background: oklch(from var(--foreground) l c h / 0.065);
color: var(--foreground);
font-weight: 500;
box-shadow: none !important;
box-shadow: inset 3px 0 0 var(--accent) !important;
}

.settingsNavItem:focus-visible {
Expand DownExpand Up@@ -7342,30 +7344,31 @@ button:active {
}

.settingsPageHeader h2 {
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15, WAWQAQ msg
`f7e9d166`): tighten the h2 with negative tracking + slightly
softer weight. 28 / 700 was too loud; 26 / 650 reads as
authoritative without shouting. Add a touch of `-0.012em`
tracking like reference's display face. */
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2
with negative tracking + slightly softer weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap:
balance` so 1-2 word titles don't orphan on long pages and
2-word titles like 「记忆与回顾」don't break across an awkward
line. */
margin: 0;
color: var(--foreground);
font-size: 26px;
font-weight: 650;
letter-spacing: -0.012em;
line-height: 1.2;
text-wrap: balance;
}

/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15): one-line page description
below the h2 — matches reference's per-tab meta line.
PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): cap width so long
descriptions don't span the full 768px column — caps at 56ch which
keeps the meta-line readable. */
/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap +
round 15/15 `text-wrap: pretty` so the last line isn't a single
orphan word (per baseline-ui typography rule). */
.settingsPageHeaderDescription {
margin: 0;
max-width: 56ch;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
font-size: 14px;
line-height: 1.5;
text-wrap: pretty;
}

.settingsPageContent {
Expand DownExpand Up@@ -7397,6 +7400,19 @@ button:active {
padding: 40px 24px 64px;
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15, WAWQAQ msg
`f7e9d166` + UI-skill deep read 2026-06-23): shared motion tokens
for the settings surface so timing/easing stay consistent across
nav rows, form rows, switches, and inputs. `--motion-fast` is the
default for state changes; `--motion-ease-out` is the cubic-bezier
recommended by Taste-Skill + 12-principles. */
.settingsSurface,
.settingsMainPane,
.settingsSidebar {
--motion-fast: 160ms;
--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested
card-in-card was the previous problem — `.settingsStructuredPage`
was a card AND it contained `<SettingsRows>` cards AND orphan
Expand DownExpand Up@@ -7484,6 +7500,29 @@ button:active {
background: oklch(from var(--foreground) l c h / 0.025);
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press
feedback. 12-principles `physics-active-state` + Taste-Skill +
UIDB all converge on `:active { scale(0.98) }` as the cheapest way
to make UI feel handled vs simulated. Applied only when reduced-
motion is not preferred — the @media block above already strips
transition; here we keep `transform` declarations so the
`:active` *snap* still fires (it's instant, not animated). */
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: scale(0.985);
transition: transform 100ms var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}
@media (prefers-reduced-motion: reduce) {
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: none;
}
}

/* PR-SETTINGS-A11Y-POLISH-0 (round 11/15) — keyboard-only focus ring
on settings rows + inputs. Reference's settings cards use a 2px
ring on focus-visible; maka had no visible affordance. Use the
Expand DownExpand Up@@ -7566,8 +7605,11 @@ button:active {
display: block;
margin-top: 6px;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): 13 → 14 to clear
the 14px legibility floor cited by baseline-ui + UIDB + Impeccable
`/typeset`. Hint is the most-read body text on the page. */
font-size: 14px;
line-height: 1.5;
}

.settingsFieldWarning {
Expand DownExpand Up@@ -9907,9 +9949,14 @@ button:active {
}

.settingsRow > span {
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `tabular-nums` so
numeric values (version strings, model IDs, counts) align cleanly
when stacked vertically. baseline-ui + /typeset both require this
for any numeric data. */
min-width: 0;
color: var(--foreground-60);
font-size: 13px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
text-align: right;
}
Expand Down
106 changes: 106 additions & 0 deletions notes/ui-skills-deep-read-2026-06-23.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
# UI Skills Deep Read — 2026-06-23 (yuejing)

3 parallel Explore agents deep-read 5 design-skill collections per WAWQAQ
ask `f424c6b5`. Synthesis below — converged rules + maka delta + 1 final
ship list.

## Sources

| Source | Type | Repo |
|--------|------|------|
| Impeccable | 26 commands + 44-rule SLOP catalog | github.com/pbakaus/impeccable |
| UI Skills | 15-skill collection (baseline-ui, fixing-a11y, fixing-motion-performance, 12-principles-of-animation, fixing-metadata, etc.) | github.com/ibelick/ui-skills + github.com/raphaelsalaja/skill |
| Taste-Skill | taste / redesign / soft variants | github.com/Leonxlnx/taste-skill |
| UI Design Brain | 60+ component best practices | github.com/carmahhawwari/ui-design-brain |
| Better Icons | MCP + skill, 200k icons | github.com/better-auth/better-icons |

## Convergent rules across all 5 sources

These showed up in **3+ sources** independently. Highest signal.

| Rule | Sources | Maka delta |
|------|---------|-----------|
| Body text ≥ 14-16px, weights 400/500/600 with semantic contrast | Impeccable /typeset, baseline-ui, Taste-Skill, UIDB | hint 13px → 14, no display face |
| **Tactile :active = `scale(0.98)` or `translateY(1px)`** | Taste-Skill, UIDB, 12-principles | rows/nav/back have no `:active` |
| Compositor-only motion (`transform`/`opacity` only, ≤ 200ms) | baseline-ui, fixing-motion-perf, Impeccable /animate | Maka may transition `background-color` on hover (paint) — acceptable but verify nothing animates layout |
| Reduced-motion guards | All 5 | ✅ done round 11 |
| Single accent, saturation < 80%, OKLCH neutrals tinted toward brand | Taste-Skill, Impeccable /colorize | maka uses raw `%foreground` overlays, no brand tint |
| 8px grid; double whitespace as redesign default | Taste-Skill, UIDB, Impeccable /layout | row padding 20/24 off-grid (should be 16/24 or 24/24) |
| Toggle/touch target ≥ 44px hit area | Taste-Skill, UIDB | switch 26×46 visual, no hit padding |
| Sidebar primary nav 5-7 items, distinct active state | UIDB, Taste-Skill | maka has more than 7 in "AI 与集成" group — could collapse; active state is light-fill, no accent bar |
| One CSS variable for all motion timings (no scattered ms values) | 12-principles "timing-consistent" | Maka has scattered 150ms values, no `--motion-fast` token |
| `text-balance` on heading, `text-pretty` on body | baseline-ui | not used |
| `tabular-nums` on data/numeric labels | baseline-ui, Impeccable /typeset | not used; value cells `已启用 / zai-live` would benefit |
| No display tracking modification unless explicit | baseline-ui | h2 has `-0.012em` (intentional, OK) |
| Em-dash ban | Taste-Skill, redesign | grep needed |
| Inter/system as default font flagged as "AI tell" | Taste-Skill, redesign, soft | maka is system-ui default — flagged |
| Lucide-as-default flagged | Taste-Skill | maka is lucide-react — flagged, Better Icons proposed |
| Card OR border, not both | Impeccable rule 36, UIDB, Taste-Skill | mostly ✅ (.settingsRows is border-only) but `.settingsConnectionRow` still has border + shadow |
| Visible focus ring (`:focus-visible` 2px) | fixing-a11y, Impeccable /audit | ✅ done round 11 |
| Page header height 56-72px | UIDB | maka uses padding stack, not a true bar — partial |

## Anti-patterns triggered by maka today

- **Impeccable rule 11 (card overuse / nested cards):** every settings page renders multiple `.settingsRows` blocks stacked, each with own card chrome. Could be one card with section dividers (per /distill).
- **Impeccable rule 25 (raw neutrals not tinted toward brand):** `.settingsRows` border is `oklch(from var(--foreground) l c h / 0.08)`. Tinting toward `--accent` at 0.005-0.01 chroma would carry brand into chrome.
- **Taste-Skill banned: border-b on every row.** ❌ — wait, maka DOES use `border-bottom` hairlines between rows. WAWQAQ asked for this explicitly in PR-GROUPED-CARD-0 ("内容紧密、用分隔线划开"), so this disagreement stays unresolved between Taste-Skill and WAWQAQ. Defer to WAWQAQ.

## 10 highest-value action items for maka

Ranked by impact / effort:

1. **Tactile `:active` scale** on rows, nav items, back button.
- `.settingsFormRow:active, .settingsRow:active, .settingsNavItem:active, .settingsBackButton:active { transform: scale(0.985); transition: transform 100ms cubic-bezier(0.16, 1, 0.3, 1); }`
- Reduced-motion gate already in place — fires inside the `@media (no-preference)` branch.

2. **Sidebar active accent bar** (Redesign-Skill).
- `.settingsNavItem[data-active="true"] { box-shadow: inset 3px 0 0 var(--accent); }`
- Carries brand into the most-used surface.

3. **`tabular-nums` on value cells**.
- `.settingsRow > span { font-variant-numeric: tabular-nums; }`
- Numeric values like `zai-live`, version strings, counts align cleanly.

4. **`text-balance` / `text-pretty`** on page header.
- `.settingsPageHeader h2 { text-wrap: balance; }`
- `.settingsPageHeaderDescription { text-wrap: pretty; }`

5. **Hint floor 13 → 14px**.
- `.settingsFormRow small, .settingsField small { font-size: 14px; }` (currently 13)
- Crosses the 14px legibility floor that baseline-ui + UIDB + Impeccable converge on.

6. **Switch hit-area shim**: 44×44 invisible hit target around the 26×46 visual.
- Wrap `<Switch>` in a `min-width:44px; min-height:44px;` flex container.

7. **One motion token**.
- `--motion-fast: 160ms` + `--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1)`.
- Reuse across nav / row / switch / input transitions.

8. **OKLCH brand tint on settings chrome**.
- `.settingsRows` border from `from var(--foreground) ... / 0.08` to `oklch(from var(--accent) l c h / 0.08)`.
- Subtle brand carry without changing perceived neutrality.

9. **Em-dash + AI-slop copy grep**.
- Audit `apps/desktop/src/renderer/settings/SettingsModal.tsx` for `—`, "Seamless", "Elevate", "Unleash".
- Quick mechanical cleanup.

10. **Better Icons MCP install (deferred ship)**.
- Add to `.mcp.json`. Don't migrate icons in this lane — let it learn preferred families per surface first. Lucide stays default for now.

## Defer / out-of-lane

- **Font swap** (Geist/Cabinet Grotesk/Satoshi instead of system-ui): meaningful but needs font files in the bundle, license check, and broad visual regression. Worth its own PR.
- **Nav consolidation to ≤7 in big group**: would re-split AI 与集成. Defer; WAWQAQ already approved 3 groups in round 7.
- **Card overuse / merge stacked cards**: contradicts WAWQAQ's grouped-card direction. Don't change.

## Round 15 (final) PR plan

Bundle action items 1, 2, 3, 4, 5, 7 (highest-impact, single-CSS-file). Skip 6 (component wrap), 8 (brand tint risk), 9 (audit), 10 (config) — those need their own PRs.

PR-SETTINGS-MOTION-TYPO-TOKENS-0:
- `:active` scale on rows/nav/back (item 1)
- accent bar on active nav (item 2)
- tabular-nums on row value (item 3)
- text-balance / text-pretty on header (item 4)
- hint 13→14 (item 5)
- shared `--motion-fast` token (item 7)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 65 additions & 18 deletions apps/desktop/src/renderer/styles.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -7068,13 +7068,15 @@ button:active {
.settingsNavItem[data-active="true"] {
/* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from
the muted `--settings-nav-row-selected-bg` token to a slightly
more visible 6.5% foreground overlay + 500 weight. The previous
fill was reading as "muted disabled" against the now-bigger
nav row typography. */
more visible 6.5% foreground overlay + 500 weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): add 3px inset
accent bar on the LEFT edge — Redesign-Skill recipe. Carries
brand into the most-used surface without recoloring the fill.
Inset shadow (not actual border) so the 38px row geometry stays. */
background: oklch(from var(--foreground) l c h / 0.065);
color: var(--foreground);
font-weight: 500;
box-shadow: none !important;
box-shadow: inset 3px 0 0 var(--accent) !important;
}

.settingsNavItem:focus-visible {
Expand DownExpand Up@@ -7342,30 +7344,31 @@ button:active {
}

.settingsPageHeader h2 {
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15, WAWQAQ msg
`f7e9d166`): tighten the h2 with negative tracking + slightly
softer weight. 28 / 700 was too loud; 26 / 650 reads as
authoritative without shouting. Add a touch of `-0.012em`
tracking like reference's display face. */
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2
with negative tracking + slightly softer weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap:
balance` so 1-2 word titles don't orphan on long pages and
2-word titles like 「记忆与回顾」don't break across an awkward
line. */
margin: 0;
color: var(--foreground);
font-size: 26px;
font-weight: 650;
letter-spacing: -0.012em;
line-height: 1.2;
text-wrap: balance;
}

/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15): one-line page description
below the h2 — matches reference's per-tab meta line.
PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): cap width so long
descriptions don't span the full 768px column — caps at 56ch which
keeps the meta-line readable. */
/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap +
round 15/15 `text-wrap: pretty` so the last line isn't a single
orphan word (per baseline-ui typography rule). */
.settingsPageHeaderDescription {
margin: 0;
max-width: 56ch;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
font-size: 14px;
line-height: 1.5;
text-wrap: pretty;
}

.settingsPageContent {
Expand DownExpand Up@@ -7397,6 +7400,19 @@ button:active {
padding: 40px 24px 64px;
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15, WAWQAQ msg
`f7e9d166` + UI-skill deep read 2026-06-23): shared motion tokens
for the settings surface so timing/easing stay consistent across
nav rows, form rows, switches, and inputs. `--motion-fast` is the
default for state changes; `--motion-ease-out` is the cubic-bezier
recommended by Taste-Skill + 12-principles. */
.settingsSurface,
.settingsMainPane,
.settingsSidebar {
--motion-fast: 160ms;
--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested
card-in-card was the previous problem — `.settingsStructuredPage`
was a card AND it contained `<SettingsRows>` cards AND orphan
Expand DownExpand Up@@ -7484,6 +7500,29 @@ button:active {
background: oklch(from var(--foreground) l c h / 0.025);
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press
feedback. 12-principles `physics-active-state` + Taste-Skill +
UIDB all converge on `:active { scale(0.98) }` as the cheapest way
to make UI feel handled vs simulated. Applied only when reduced-
motion is not preferred — the @media block above already strips
transition; here we keep `transform` declarations so the
`:active` *snap* still fires (it's instant, not animated). */
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: scale(0.985);
transition: transform 100ms var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}
@media (prefers-reduced-motion: reduce) {
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: none;
}
}

/* PR-SETTINGS-A11Y-POLISH-0 (round 11/15) — keyboard-only focus ring
on settings rows + inputs. Reference's settings cards use a 2px
ring on focus-visible; maka had no visible affordance. Use the
Expand DownExpand Up@@ -7566,8 +7605,11 @@ button:active {
display: block;
margin-top: 6px;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): 13 → 14 to clear
the 14px legibility floor cited by baseline-ui + UIDB + Impeccable
`/typeset`. Hint is the most-read body text on the page. */
font-size: 14px;
line-height: 1.5;
}

.settingsFieldWarning {
Expand DownExpand Up@@ -9907,9 +9949,14 @@ button:active {
}

.settingsRow > span {
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `tabular-nums` so
numeric values (version strings, model IDs, counts) align cleanly
when stacked vertically. baseline-ui + /typeset both require this
for any numeric data. */
min-width: 0;
color: var(--foreground-60);
font-size: 13px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
text-align: right;
}
Expand Down
106 changes: 106 additions & 0 deletions notes/ui-skills-deep-read-2026-06-23.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
# UI Skills Deep Read — 2026-06-23 (yuejing)

3 parallel Explore agents deep-read 5 design-skill collections per WAWQAQ
ask `f424c6b5`. Synthesis below — converged rules + maka delta + 1 final
ship list.

## Sources

| Source | Type | Repo |
|--------|------|------|
| Impeccable | 26 commands + 44-rule SLOP catalog | github.com/pbakaus/impeccable |
| UI Skills | 15-skill collection (baseline-ui, fixing-a11y, fixing-motion-performance, 12-principles-of-animation, fixing-metadata, etc.) | github.com/ibelick/ui-skills + github.com/raphaelsalaja/skill |
| Taste-Skill | taste / redesign / soft variants | github.com/Leonxlnx/taste-skill |
| UI Design Brain | 60+ component best practices | github.com/carmahhawwari/ui-design-brain |
| Better Icons | MCP + skill, 200k icons | github.com/better-auth/better-icons |

## Convergent rules across all 5 sources

These showed up in **3+ sources** independently. Highest signal.

| Rule | Sources | Maka delta |
|------|---------|-----------|
| Body text ≥ 14-16px, weights 400/500/600 with semantic contrast | Impeccable /typeset, baseline-ui, Taste-Skill, UIDB | hint 13px → 14, no display face |
| **Tactile :active = `scale(0.98)` or `translateY(1px)`** | Taste-Skill, UIDB, 12-principles | rows/nav/back have no `:active` |
| Compositor-only motion (`transform`/`opacity` only, ≤ 200ms) | baseline-ui, fixing-motion-perf, Impeccable /animate | Maka may transition `background-color` on hover (paint) — acceptable but verify nothing animates layout |
| Reduced-motion guards | All 5 | ✅ done round 11 |
| Single accent, saturation < 80%, OKLCH neutrals tinted toward brand | Taste-Skill, Impeccable /colorize | maka uses raw `%foreground` overlays, no brand tint |
| 8px grid; double whitespace as redesign default | Taste-Skill, UIDB, Impeccable /layout | row padding 20/24 off-grid (should be 16/24 or 24/24) |
| Toggle/touch target ≥ 44px hit area | Taste-Skill, UIDB | switch 26×46 visual, no hit padding |
| Sidebar primary nav 5-7 items, distinct active state | UIDB, Taste-Skill | maka has more than 7 in "AI 与集成" group — could collapse; active state is light-fill, no accent bar |
| One CSS variable for all motion timings (no scattered ms values) | 12-principles "timing-consistent" | Maka has scattered 150ms values, no `--motion-fast` token |
| `text-balance` on heading, `text-pretty` on body | baseline-ui | not used |
| `tabular-nums` on data/numeric labels | baseline-ui, Impeccable /typeset | not used; value cells `已启用 / zai-live` would benefit |
| No display tracking modification unless explicit | baseline-ui | h2 has `-0.012em` (intentional, OK) |
| Em-dash ban | Taste-Skill, redesign | grep needed |
| Inter/system as default font flagged as "AI tell" | Taste-Skill, redesign, soft | maka is system-ui default — flagged |
| Lucide-as-default flagged | Taste-Skill | maka is lucide-react — flagged, Better Icons proposed |
| Card OR border, not both | Impeccable rule 36, UIDB, Taste-Skill | mostly ✅ (.settingsRows is border-only) but `.settingsConnectionRow` still has border + shadow |
| Visible focus ring (`:focus-visible` 2px) | fixing-a11y, Impeccable /audit | ✅ done round 11 |
| Page header height 56-72px | UIDB | maka uses padding stack, not a true bar — partial |

## Anti-patterns triggered by maka today

- **Impeccable rule 11 (card overuse / nested cards):** every settings page renders multiple `.settingsRows` blocks stacked, each with own card chrome. Could be one card with section dividers (per /distill).
- **Impeccable rule 25 (raw neutrals not tinted toward brand):** `.settingsRows` border is `oklch(from var(--foreground) l c h / 0.08)`. Tinting toward `--accent` at 0.005-0.01 chroma would carry brand into chrome.
- **Taste-Skill banned: border-b on every row.** ❌ — wait, maka DOES use `border-bottom` hairlines between rows. WAWQAQ asked for this explicitly in PR-GROUPED-CARD-0 ("内容紧密、用分隔线划开"), so this disagreement stays unresolved between Taste-Skill and WAWQAQ. Defer to WAWQAQ.

## 10 highest-value action items for maka

Ranked by impact / effort:

1. **Tactile `:active` scale** on rows, nav items, back button.
- `.settingsFormRow:active, .settingsRow:active, .settingsNavItem:active, .settingsBackButton:active { transform: scale(0.985); transition: transform 100ms cubic-bezier(0.16, 1, 0.3, 1); }`
- Reduced-motion gate already in place — fires inside the `@media (no-preference)` branch.

2. **Sidebar active accent bar** (Redesign-Skill).
- `.settingsNavItem[data-active="true"] { box-shadow: inset 3px 0 0 var(--accent); }`
- Carries brand into the most-used surface.

3. **`tabular-nums` on value cells**.
- `.settingsRow > span { font-variant-numeric: tabular-nums; }`
- Numeric values like `zai-live`, version strings, counts align cleanly.

4. **`text-balance` / `text-pretty`** on page header.
- `.settingsPageHeader h2 { text-wrap: balance; }`
- `.settingsPageHeaderDescription { text-wrap: pretty; }`

5. **Hint floor 13 → 14px**.
- `.settingsFormRow small, .settingsField small { font-size: 14px; }` (currently 13)
- Crosses the 14px legibility floor that baseline-ui + UIDB + Impeccable converge on.

6. **Switch hit-area shim**: 44×44 invisible hit target around the 26×46 visual.
- Wrap `<Switch>` in a `min-width:44px; min-height:44px;` flex container.

7. **One motion token**.
- `--motion-fast: 160ms` + `--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1)`.
- Reuse across nav / row / switch / input transitions.

8. **OKLCH brand tint on settings chrome**.
- `.settingsRows` border from `from var(--foreground) ... / 0.08` to `oklch(from var(--accent) l c h / 0.08)`.
- Subtle brand carry without changing perceived neutrality.

9. **Em-dash + AI-slop copy grep**.
- Audit `apps/desktop/src/renderer/settings/SettingsModal.tsx` for `—`, "Seamless", "Elevate", "Unleash".
- Quick mechanical cleanup.

10. **Better Icons MCP install (deferred ship)**.
- Add to `.mcp.json`. Don't migrate icons in this lane — let it learn preferred families per surface first. Lucide stays default for now.

## Defer / out-of-lane

- **Font swap** (Geist/Cabinet Grotesk/Satoshi instead of system-ui): meaningful but needs font files in the bundle, license check, and broad visual regression. Worth its own PR.
- **Nav consolidation to ≤7 in big group**: would re-split AI 与集成. Defer; WAWQAQ already approved 3 groups in round 7.
- **Card overuse / merge stacked cards**: contradicts WAWQAQ's grouped-card direction. Don't change.

## Round 15 (final) PR plan

Bundle action items 1, 2, 3, 4, 5, 7 (highest-impact, single-CSS-file). Skip 6 (component wrap), 8 (brand tint risk), 9 (audit), 10 (config) — those need their own PRs.

PR-SETTINGS-MOTION-TYPO-TOKENS-0:
- `:active` scale on rows/nav/back (item 1)
- accent bar on active nav (item 2)
- tabular-nums on row value (item 3)
- text-balance / text-pretty on header (item 4)
- hint 13→14 (item 5)
- shared `--motion-fast` token (item 7)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 65 additions & 18 deletions apps/desktop/src/renderer/styles.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -7068,13 +7068,15 @@ button:active {
.settingsNavItem[data-active="true"] {
/* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from
the muted `--settings-nav-row-selected-bg` token to a slightly
more visible 6.5% foreground overlay + 500 weight. The previous
fill was reading as "muted disabled" against the now-bigger
nav row typography. */
more visible 6.5% foreground overlay + 500 weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): add 3px inset
accent bar on the LEFT edge — Redesign-Skill recipe. Carries
brand into the most-used surface without recoloring the fill.
Inset shadow (not actual border) so the 38px row geometry stays. */
background: oklch(from var(--foreground) l c h / 0.065);
color: var(--foreground);
font-weight: 500;
box-shadow: none !important;
box-shadow: inset 3px 0 0 var(--accent) !important;
}

.settingsNavItem:focus-visible {
Expand DownExpand Up@@ -7342,30 +7344,31 @@ button:active {
}

.settingsPageHeader h2 {
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15, WAWQAQ msg
`f7e9d166`): tighten the h2 with negative tracking + slightly
softer weight. 28 / 700 was too loud; 26 / 650 reads as
authoritative without shouting. Add a touch of `-0.012em`
tracking like reference's display face. */
/* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2
with negative tracking + slightly softer weight.
PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap:
balance` so 1-2 word titles don't orphan on long pages and
2-word titles like 「记忆与回顾」don't break across an awkward
line. */
margin: 0;
color: var(--foreground);
font-size: 26px;
font-weight: 650;
letter-spacing: -0.012em;
line-height: 1.2;
text-wrap: balance;
}

/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15): one-line page description
below the h2 — matches reference's per-tab meta line.
PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): cap width so long
descriptions don't span the full 768px column — caps at 56ch which
keeps the meta-line readable. */
/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap +
round 15/15 `text-wrap: pretty` so the last line isn't a single
orphan word (per baseline-ui typography rule). */
.settingsPageHeaderDescription {
margin: 0;
max-width: 56ch;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
font-size: 14px;
line-height: 1.5;
text-wrap: pretty;
}

.settingsPageContent {
Expand DownExpand Up@@ -7397,6 +7400,19 @@ button:active {
padding: 40px 24px 64px;
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15, WAWQAQ msg
`f7e9d166` + UI-skill deep read 2026-06-23): shared motion tokens
for the settings surface so timing/easing stay consistent across
nav rows, form rows, switches, and inputs. `--motion-fast` is the
default for state changes; `--motion-ease-out` is the cubic-bezier
recommended by Taste-Skill + 12-principles. */
.settingsSurface,
.settingsMainPane,
.settingsSidebar {
--motion-fast: 160ms;
--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested
card-in-card was the previous problem — `.settingsStructuredPage`
was a card AND it contained `<SettingsRows>` cards AND orphan
Expand DownExpand Up@@ -7484,6 +7500,29 @@ button:active {
background: oklch(from var(--foreground) l c h / 0.025);
}

/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press
feedback. 12-principles `physics-active-state` + Taste-Skill +
UIDB all converge on `:active { scale(0.98) }` as the cheapest way
to make UI feel handled vs simulated. Applied only when reduced-
motion is not preferred — the @media block above already strips
transition; here we keep `transform` declarations so the
`:active` *snap* still fires (it's instant, not animated). */
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: scale(0.985);
transition: transform 100ms var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}
@media (prefers-reduced-motion: reduce) {
.settingsFormRow:active,
.settingsRow:active,
.settingsBackButton:active,
.settingsNavItem:active {
transform: none;
}
}

/* PR-SETTINGS-A11Y-POLISH-0 (round 11/15) — keyboard-only focus ring
on settings rows + inputs. Reference's settings cards use a 2px
ring on focus-visible; maka had no visible affordance. Use the
Expand DownExpand Up@@ -7566,8 +7605,11 @@ button:active {
display: block;
margin-top: 6px;
color: var(--foreground-55);
font-size: 13px;
line-height: 1.45;
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): 13 → 14 to clear
the 14px legibility floor cited by baseline-ui + UIDB + Impeccable
`/typeset`. Hint is the most-read body text on the page. */
font-size: 14px;
line-height: 1.5;
}

.settingsFieldWarning {
Expand DownExpand Up@@ -9907,9 +9949,14 @@ button:active {
}

.settingsRow > span {
/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `tabular-nums` so
numeric values (version strings, model IDs, counts) align cleanly
when stacked vertically. baseline-ui + /typeset both require this
for any numeric data. */
min-width: 0;
color: var(--foreground-60);
font-size: 13px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
text-align: right;
}
Expand Down
106 changes: 106 additions & 0 deletions notes/ui-skills-deep-read-2026-06-23.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
# UI Skills Deep Read — 2026-06-23 (yuejing)

3 parallel Explore agents deep-read 5 design-skill collections per WAWQAQ
ask `f424c6b5`. Synthesis below — converged rules + maka delta + 1 final
ship list.

## Sources

| Source | Type | Repo |
|--------|------|------|
| Impeccable | 26 commands + 44-rule SLOP catalog | github.com/pbakaus/impeccable |
| UI Skills | 15-skill collection (baseline-ui, fixing-a11y, fixing-motion-performance, 12-principles-of-animation, fixing-metadata, etc.) | github.com/ibelick/ui-skills + github.com/raphaelsalaja/skill |
| Taste-Skill | taste / redesign / soft variants | github.com/Leonxlnx/taste-skill |
| UI Design Brain | 60+ component best practices | github.com/carmahhawwari/ui-design-brain |
| Better Icons | MCP + skill, 200k icons | github.com/better-auth/better-icons |

## Convergent rules across all 5 sources

These showed up in **3+ sources** independently. Highest signal.

| Rule | Sources | Maka delta |
|------|---------|-----------|
| Body text ≥ 14-16px, weights 400/500/600 with semantic contrast | Impeccable /typeset, baseline-ui, Taste-Skill, UIDB | hint 13px → 14, no display face |
| **Tactile :active = `scale(0.98)` or `translateY(1px)`** | Taste-Skill, UIDB, 12-principles | rows/nav/back have no `:active` |
| Compositor-only motion (`transform`/`opacity` only, ≤ 200ms) | baseline-ui, fixing-motion-perf, Impeccable /animate | Maka may transition `background-color` on hover (paint) — acceptable but verify nothing animates layout |
| Reduced-motion guards | All 5 | ✅ done round 11 |
| Single accent, saturation < 80%, OKLCH neutrals tinted toward brand | Taste-Skill, Impeccable /colorize | maka uses raw `%foreground` overlays, no brand tint |
| 8px grid; double whitespace as redesign default | Taste-Skill, UIDB, Impeccable /layout | row padding 20/24 off-grid (should be 16/24 or 24/24) |
| Toggle/touch target ≥ 44px hit area | Taste-Skill, UIDB | switch 26×46 visual, no hit padding |
| Sidebar primary nav 5-7 items, distinct active state | UIDB, Taste-Skill | maka has more than 7 in "AI 与集成" group — could collapse; active state is light-fill, no accent bar |
| One CSS variable for all motion timings (no scattered ms values) | 12-principles "timing-consistent" | Maka has scattered 150ms values, no `--motion-fast` token |
| `text-balance` on heading, `text-pretty` on body | baseline-ui | not used |
| `tabular-nums` on data/numeric labels | baseline-ui, Impeccable /typeset | not used; value cells `已启用 / zai-live` would benefit |
| No display tracking modification unless explicit | baseline-ui | h2 has `-0.012em` (intentional, OK) |
| Em-dash ban | Taste-Skill, redesign | grep needed |
| Inter/system as default font flagged as "AI tell" | Taste-Skill, redesign, soft | maka is system-ui default — flagged |
| Lucide-as-default flagged | Taste-Skill | maka is lucide-react — flagged, Better Icons proposed |
| Card OR border, not both | Impeccable rule 36, UIDB, Taste-Skill | mostly ✅ (.settingsRows is border-only) but `.settingsConnectionRow` still has border + shadow |
| Visible focus ring (`:focus-visible` 2px) | fixing-a11y, Impeccable /audit | ✅ done round 11 |
| Page header height 56-72px | UIDB | maka uses padding stack, not a true bar — partial |

## Anti-patterns triggered by maka today

- **Impeccable rule 11 (card overuse / nested cards):** every settings page renders multiple `.settingsRows` blocks stacked, each with own card chrome. Could be one card with section dividers (per /distill).
- **Impeccable rule 25 (raw neutrals not tinted toward brand):** `.settingsRows` border is `oklch(from var(--foreground) l c h / 0.08)`. Tinting toward `--accent` at 0.005-0.01 chroma would carry brand into chrome.
- **Taste-Skill banned: border-b on every row.** ❌ — wait, maka DOES use `border-bottom` hairlines between rows. WAWQAQ asked for this explicitly in PR-GROUPED-CARD-0 ("内容紧密、用分隔线划开"), so this disagreement stays unresolved between Taste-Skill and WAWQAQ. Defer to WAWQAQ.

## 10 highest-value action items for maka

Ranked by impact / effort:

1. **Tactile `:active` scale** on rows, nav items, back button.
- `.settingsFormRow:active, .settingsRow:active, .settingsNavItem:active, .settingsBackButton:active { transform: scale(0.985); transition: transform 100ms cubic-bezier(0.16, 1, 0.3, 1); }`
- Reduced-motion gate already in place — fires inside the `@media (no-preference)` branch.

2. **Sidebar active accent bar** (Redesign-Skill).
- `.settingsNavItem[data-active="true"] { box-shadow: inset 3px 0 0 var(--accent); }`
- Carries brand into the most-used surface.

3. **`tabular-nums` on value cells**.
- `.settingsRow > span { font-variant-numeric: tabular-nums; }`
- Numeric values like `zai-live`, version strings, counts align cleanly.

4. **`text-balance` / `text-pretty`** on page header.
- `.settingsPageHeader h2 { text-wrap: balance; }`
- `.settingsPageHeaderDescription { text-wrap: pretty; }`

5. **Hint floor 13 → 14px**.
- `.settingsFormRow small, .settingsField small { font-size: 14px; }` (currently 13)
- Crosses the 14px legibility floor that baseline-ui + UIDB + Impeccable converge on.

6. **Switch hit-area shim**: 44×44 invisible hit target around the 26×46 visual.
- Wrap `<Switch>` in a `min-width:44px; min-height:44px;` flex container.

7. **One motion token**.
- `--motion-fast: 160ms` + `--motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1)`.
- Reuse across nav / row / switch / input transitions.

8. **OKLCH brand tint on settings chrome**.
- `.settingsRows` border from `from var(--foreground) ... / 0.08` to `oklch(from var(--accent) l c h / 0.08)`.
- Subtle brand carry without changing perceived neutrality.

9. **Em-dash + AI-slop copy grep**.
- Audit `apps/desktop/src/renderer/settings/SettingsModal.tsx` for `—`, "Seamless", "Elevate", "Unleash".
- Quick mechanical cleanup.

10. **Better Icons MCP install (deferred ship)**.
- Add to `.mcp.json`. Don't migrate icons in this lane — let it learn preferred families per surface first. Lucide stays default for now.

## Defer / out-of-lane

- **Font swap** (Geist/Cabinet Grotesk/Satoshi instead of system-ui): meaningful but needs font files in the bundle, license check, and broad visual regression. Worth its own PR.
- **Nav consolidation to ≤7 in big group**: would re-split AI 与集成. Defer; WAWQAQ already approved 3 groups in round 7.
- **Card overuse / merge stacked cards**: contradicts WAWQAQ's grouped-card direction. Don't change.

## Round 15 (final) PR plan

Bundle action items 1, 2, 3, 4, 5, 7 (highest-impact, single-CSS-file). Skip 6 (component wrap), 8 (brand tint risk), 9 (audit), 10 (config) — those need their own PRs.

PR-SETTINGS-MOTION-TYPO-TOKENS-0:
- `:active` scale on rows/nav/back (item 1)
- accent bar on active nav (item 2)
- tabular-nums on row value (item 3)
- text-balance / text-pretty on header (item 4)
- hint 13→14 (item 5)
- shared `--motion-fast` token (item 7)