docs(frontend): add architecture READMEs for ui, renderer, and desktop - #725

Merged
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes
Jul 11, 2026
Merged

docs(frontend): add architecture READMEs for ui, renderer, and desktop#725
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Add target-oriented architecture READMEs for the three frontend surfaces — packages/ui, the renderer, and the desktop app shell — to guide agents through the React + BaseUI + shadcn + Tailwind convergence.

Why

The convergence to React + BaseUI + shadcn + Tailwind is mostly in place, but the per-surface architecture lives nowhere locally. Agents entering packages/ui or the renderer have no map for the export layers, the app-shell split, the styles/tokens layout, or which transitional surfaces to retire. docs/ has the authoritative design-system contract (being refreshed by @jackwener) but nothing at the module level.

Direct docs request; no tracking issue.

Scope

Changed:

  • packages/ui/README.md — four export surfaces (primitives / ui.tsx / top-level features / components.tsx), the off-barrel convention, where new code goes, the ui.tsxprimitives convergence direction.
  • apps/desktop/src/renderer/README.md — the AppShell + app-shell-<scope>-<action> split, the styles/tokens layout (maka-tokens.css, reference-shell.css, styles/*.css), the primitive-first authoring rule, the transitional surfaces.
  • apps/desktop/README.md — the main/preload/renderer split, the main naming convention (*-ipc-main / *-main / *-guard), the IPC contract, the data flow.

Not included:

  • No code changes (pure docs).
  • No edits to docs/design-system.md or docs/frontend-css-governance.md (being refreshed by @jackwener; the READMEs only reference them).
  • No new docs/ files — the per-surface READMEs go in place, not in docs/.

Verification

  • Verified all 13 paths referenced in the READMEs exist.
  • Cross-checked facts against code: @maka/ui is consumed only by desktop; the main.tsxapp.tsxAppShell chain; the renderer only import types from @maka/runtime / @maka/storage (runtime access goes through the preload maka bridge); app-shell.tsx is 1810 lines; maka-tokens.css is 73KB; Badge moved to primitives/ via refactor(ui): converge unmanaged design specs (line-height, font-weight, letter-spacing, …) #520 PR9; buttonVariants lives in ui.tsx; the preload exposes the maka namespace with <domain>:<action> IPC channels.
  • No build/test run — pure docs PR, no code change.

User-facing impact

None. Docs only.

Reviewer notes

  • Three commits, one per README, per the "smallest independently-revertible intent" commit unit — each README is self-contained; reverting one leaves the other two usable.
  • Transitional surfaces are described with direction + end state only — no TODOs, no progress, no time-sensitive content (that stays in issues/PRs). The READMEs are meant not to rot.
  • design-system.md / frontend-css-governance.md references note they're being refreshed by @jackwener; code + contract tests are the source of truth until then.

Checklist

  • Scope matches the PR title and excludes unrelated changes
  • Verification lists commands/results, or explains why they were not run
  • User-facing impact, docs, changelog, migrations, and breaking changes are noted, or marked none
  • Risk, rollback, or review focus is called out for non-trivial changes
  • UI changes include screenshots/video, or explain why not applicable (N/A: docs only)

@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch 3 times, most recently from 0442812 to e014ee1CompareJuly 11, 2026 20:24
Target-oriented README for the shared UI package: four export surfaces
(primitives / ui.tsx / top-level features / components.tsx), the off-barrel
convention, the data-slot hook rule with its exceptions, where new code
goes, and the ui.tsx→primitives convergence direction. Transitional
surfaces are marked with direction + end state, not TODOs.
Target-oriented READMEs for the Electron app shell and its renderer:
the main/preload/renderer split, the main naming convention, the
three-pattern IPC contract and the registerIpc() registration step, the
actual main.ts startup order, the renderer AppShell + app-shell-<scope>-<action>
split, the styles/tokens layout (with the --foreground-N wash-vs-text split),
and the primitive-first authoring rule. Direction + end state only, no TODOs.
- ui: drop the broken @maka/ui/icons ProviderLogo example (it lives in
the renderer); note icons re-exports Lucide symbols; use markerVariants
as a real off-barrel example instead of the zero-consumer LiveIndicator;
clarify 'runtime consumer' (preload imports types).
- renderer: describe AppShell slices as app-shell-* one-concern modules
(not a strict two-segment rule several existing slices violate); make
the reference-shell.css breadcrumb point at the file's own header.
- desktop: fix startup order (window created early, background startup
concurrent, handlers before renderer entry that prefetches pre-mount);
route main→renderer push through safeSendToRenderer (raw webContents.send
throws on destroyed windows); add src/global.d.ts to the new-IPC steps.
- desktop: window is created hidden, revealed after first AppShell paint
(notifyRendererReady gate), not 'preload skeleton shows within ms';
drop the false 'background mutations always push via channels, UI
converges lazily' invariant (interrupted-session recovery doesn't emit).
- ui: scope the off-barrel 'don't re-export' rule to single in-package
consumers with no cross-package consumer (previewVariants is re-exported
for exactly that cross-package reason), resolving the contradiction with
the promotion rule.
- desktop/renderer: window reveal has a fallback timer, and main.tsx's
onboarding prefetch can time out to a fail-soft loading state — stop
claiming 'only after first paint' / 'never sees skeleton' / 'no loading
flash' as absolute paths.
- renderer: maka-tokens.css is the main token source, but a few @theme
Tailwind-bridge values (e.g. --shadow-maka-panel) live in styles.css and
are contract-pinned there — document the exception instead of claiming a
single source.
- ui: clarify 'model-provider brand logos' (renderer settings/provider-*);
bot-provider logos are in @maka/ui's bot-brand-logo.
- renderer: document the contract-pinned index.html inline .maka-preload
skeleton (hardcoded colors, no CSS vars — maka-tokens.css hasn't loaded
yet) as the narrow exception to 'styles.css is the only CSS entry'.
- ui: resolve the barrel-rule contradiction — new feature components
re-export from components.tsx, but only reach index.ts when they have a
second or cross-package consumer (primitives are always re-exported).
…components.tsx)
index.ts does 'export * from ./components.js', so re-exporting a feature
component from components.tsx already puts it on the package barrel —
there is no separate 'add to index.ts later' stage. Rule now: relative
import while single in-package consumer; re-export from components.tsx
(barrel follows automatically) once a second or cross-package consumer
appears.
The @theme Tailwind bridge is split: most aliases (color/typography/spacing/
radius) live in maka-tokens.css, a few values (e.g. --shadow-maka-panel) in
styles.css — both contract-pinned, so check which file owns a value before
moving it. /* local: ... */ is the rule for new component-local vars;
existing ones don't all carry it yet.
…split)
Both maka-tokens.css and styles.css carry an @theme inline block, and their
color aliases overlap (--color-background/accent/muted appear in both);
styles.css also carries the typography/line-height/font-weight/tracking/
spacing/radius/shadow bridges. Each value's home is contract-pinned
(spacing/letter-spacing/foreground-tier contracts), so stop describing it as
a clean split and point to the owning contract instead.
- ui: barrel promotion is cross-package consumer or explicit public-API
need, not 'second in-package consumer' (attachment-file-card has two
in-package consumers but stays off-barrel); remove the markerVariants
example that implied otherwise.
- renderer: maka-tokens.css tail is a large recipe section (base/utilities/
recipes/animations), not 'a few fallbacks'; the @theme bridge overlap is
concrete (--color-muted maps to --foreground-5 in styles.css but --muted
in maka-tokens.css); only some bridge values are contract-pinned
(spacing/letter-spacing/foreground-tier), overlapping color aliases are
not — don't claim 'each' is pinned.
- renderer: stop claiming overlapping color aliases have no contract pin —
some do (--color-control in styles.css via design-system-governance-406;
--color-muted-foreground in maka-tokens.css via foreground-tier); only
some (e.g. --color-background/accent/muted) are unpinned.
- desktop: narrow the safe-send claim — the contract test scans a fixed
file list for direct mainWindow.webContents.send forms; new *-ipc-main.ts
files aren't auto-covered, so route through the guard in every new file.
- ui: sync the index.ts and chat.tsx LiveIndicator comments to the README
barrel rule (cross-package consumer or explicit public-API need, not a
second in-package consumer; attachment-file-card precedent), so the
README is the single source of the promotion rule.
…irement)
The synced comments still described chat call sites and the tool stream as
consumers, but #712 retired streamVariants/LiveIndicator from the tool body —
they have no production consumer now (chat-stream-cascade-contract pins it).
State that in the comments, and drop the contradictory 'LiveIndicator exported
only on cross-package consumer' line so the promotion rule is stated once
(cross-package consumer or explicit public-API need) and points to README.
…owner
The barrel promotion rule is volatile when duplicated into inline source
comments (consumer lists drift as symbols retire — e.g. streamVariants/
LiveIndicator in #712). Reverting the index.ts/chat.tsx comment edits keeps
this PR docs-only and makes packages/ui/README.md the single source of truth
(the README now says so explicitly). Cleaning up the stale source comments /
dead symbols is a separate change.
Round 14 review: 'revert + README says comments may lag' still left the stale
'second consumer' / streamVariants/LiveIndicator consumer lists in the source
comments, so the conflict source survived. Real root correction: the
inline comments no longer re-derive the promotion rule or track consumers
(that list drifts as symbols retire, e.g. #712) — they keep their local
implementation intent and point at packages/ui/README.md for the rule.
README stays the single owner; dead-symbol cleanup stays a separate change.
Round 15 found the prior root correction only covered 2 of the consumer/
promotion comment blocks; markerVariants/TextShimmer/toolVariants/previewVariants
still re-derived the rule or tracked consumers, and streamVariants/LiveIndicator
still assumed a call site that #712 removed. Exhaustively replace every such
block: keep local implementation intent + a short pointer to the README, drop
all consumer counts and promotion derivations. Also drop the README's 'inline
comments may lag' line (no longer needed once the comments don't re-derive).
16 rounds of review showed cleaning inline source comments is a bottomless
local patch: chat.tsx has many historical consumer/call-site mentions (incl.
#712-retired streamVariants dead-code notes), and each fix surfaced an adjacent
one. Root correction per receiving-code-review: keep this PR docs-only (3 READMEs),
revert the index.ts/chat.tsx comment edits to main, and make packages/ui/README.md
the single owner of the barrel promotion rule. Source-comment cleanup and dead-
symbol removal are separate changes.
@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch from 113e3c7 to 66bcf23CompareJuly 11, 2026 20:59
@Astro-Han
Astro-Han merged commit 57b73ef into mainJul 11, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the docs/frontend-architecture-readmes branch July 11, 2026 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

docs(frontend): add architecture READMEs for ui, renderer, and desktop - #725

Merged
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes
Jul 11, 2026
Merged

docs(frontend): add architecture READMEs for ui, renderer, and desktop#725
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Add target-oriented architecture READMEs for the three frontend surfaces — packages/ui, the renderer, and the desktop app shell — to guide agents through the React + BaseUI + shadcn + Tailwind convergence.

Why

The convergence to React + BaseUI + shadcn + Tailwind is mostly in place, but the per-surface architecture lives nowhere locally. Agents entering packages/ui or the renderer have no map for the export layers, the app-shell split, the styles/tokens layout, or which transitional surfaces to retire. docs/ has the authoritative design-system contract (being refreshed by @jackwener) but nothing at the module level.

Direct docs request; no tracking issue.

Scope

Changed:

  • packages/ui/README.md — four export surfaces (primitives / ui.tsx / top-level features / components.tsx), the off-barrel convention, where new code goes, the ui.tsxprimitives convergence direction.
  • apps/desktop/src/renderer/README.md — the AppShell + app-shell-<scope>-<action> split, the styles/tokens layout (maka-tokens.css, reference-shell.css, styles/*.css), the primitive-first authoring rule, the transitional surfaces.
  • apps/desktop/README.md — the main/preload/renderer split, the main naming convention (*-ipc-main / *-main / *-guard), the IPC contract, the data flow.

Not included:

  • No code changes (pure docs).
  • No edits to docs/design-system.md or docs/frontend-css-governance.md (being refreshed by @jackwener; the READMEs only reference them).
  • No new docs/ files — the per-surface READMEs go in place, not in docs/.

Verification

  • Verified all 13 paths referenced in the READMEs exist.
  • Cross-checked facts against code: @maka/ui is consumed only by desktop; the main.tsxapp.tsxAppShell chain; the renderer only import types from @maka/runtime / @maka/storage (runtime access goes through the preload maka bridge); app-shell.tsx is 1810 lines; maka-tokens.css is 73KB; Badge moved to primitives/ via refactor(ui): converge unmanaged design specs (line-height, font-weight, letter-spacing, …) #520 PR9; buttonVariants lives in ui.tsx; the preload exposes the maka namespace with <domain>:<action> IPC channels.
  • No build/test run — pure docs PR, no code change.

User-facing impact

None. Docs only.

Reviewer notes

  • Three commits, one per README, per the "smallest independently-revertible intent" commit unit — each README is self-contained; reverting one leaves the other two usable.
  • Transitional surfaces are described with direction + end state only — no TODOs, no progress, no time-sensitive content (that stays in issues/PRs). The READMEs are meant not to rot.
  • design-system.md / frontend-css-governance.md references note they're being refreshed by @jackwener; code + contract tests are the source of truth until then.

Checklist

  • Scope matches the PR title and excludes unrelated changes
  • Verification lists commands/results, or explains why they were not run
  • User-facing impact, docs, changelog, migrations, and breaking changes are noted, or marked none
  • Risk, rollback, or review focus is called out for non-trivial changes
  • UI changes include screenshots/video, or explain why not applicable (N/A: docs only)

@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch 3 times, most recently from 0442812 to e014ee1CompareJuly 11, 2026 20:24
Target-oriented README for the shared UI package: four export surfaces
(primitives / ui.tsx / top-level features / components.tsx), the off-barrel
convention, the data-slot hook rule with its exceptions, where new code
goes, and the ui.tsx→primitives convergence direction. Transitional
surfaces are marked with direction + end state, not TODOs.
Target-oriented READMEs for the Electron app shell and its renderer:
the main/preload/renderer split, the main naming convention, the
three-pattern IPC contract and the registerIpc() registration step, the
actual main.ts startup order, the renderer AppShell + app-shell-<scope>-<action>
split, the styles/tokens layout (with the --foreground-N wash-vs-text split),
and the primitive-first authoring rule. Direction + end state only, no TODOs.
- ui: drop the broken @maka/ui/icons ProviderLogo example (it lives in
the renderer); note icons re-exports Lucide symbols; use markerVariants
as a real off-barrel example instead of the zero-consumer LiveIndicator;
clarify 'runtime consumer' (preload imports types).
- renderer: describe AppShell slices as app-shell-* one-concern modules
(not a strict two-segment rule several existing slices violate); make
the reference-shell.css breadcrumb point at the file's own header.
- desktop: fix startup order (window created early, background startup
concurrent, handlers before renderer entry that prefetches pre-mount);
route main→renderer push through safeSendToRenderer (raw webContents.send
throws on destroyed windows); add src/global.d.ts to the new-IPC steps.
- desktop: window is created hidden, revealed after first AppShell paint
(notifyRendererReady gate), not 'preload skeleton shows within ms';
drop the false 'background mutations always push via channels, UI
converges lazily' invariant (interrupted-session recovery doesn't emit).
- ui: scope the off-barrel 'don't re-export' rule to single in-package
consumers with no cross-package consumer (previewVariants is re-exported
for exactly that cross-package reason), resolving the contradiction with
the promotion rule.
- desktop/renderer: window reveal has a fallback timer, and main.tsx's
onboarding prefetch can time out to a fail-soft loading state — stop
claiming 'only after first paint' / 'never sees skeleton' / 'no loading
flash' as absolute paths.
- renderer: maka-tokens.css is the main token source, but a few @theme
Tailwind-bridge values (e.g. --shadow-maka-panel) live in styles.css and
are contract-pinned there — document the exception instead of claiming a
single source.
- ui: clarify 'model-provider brand logos' (renderer settings/provider-*);
bot-provider logos are in @maka/ui's bot-brand-logo.
- renderer: document the contract-pinned index.html inline .maka-preload
skeleton (hardcoded colors, no CSS vars — maka-tokens.css hasn't loaded
yet) as the narrow exception to 'styles.css is the only CSS entry'.
- ui: resolve the barrel-rule contradiction — new feature components
re-export from components.tsx, but only reach index.ts when they have a
second or cross-package consumer (primitives are always re-exported).
…components.tsx)
index.ts does 'export * from ./components.js', so re-exporting a feature
component from components.tsx already puts it on the package barrel —
there is no separate 'add to index.ts later' stage. Rule now: relative
import while single in-package consumer; re-export from components.tsx
(barrel follows automatically) once a second or cross-package consumer
appears.
The @theme Tailwind bridge is split: most aliases (color/typography/spacing/
radius) live in maka-tokens.css, a few values (e.g. --shadow-maka-panel) in
styles.css — both contract-pinned, so check which file owns a value before
moving it. /* local: ... */ is the rule for new component-local vars;
existing ones don't all carry it yet.
…split)
Both maka-tokens.css and styles.css carry an @theme inline block, and their
color aliases overlap (--color-background/accent/muted appear in both);
styles.css also carries the typography/line-height/font-weight/tracking/
spacing/radius/shadow bridges. Each value's home is contract-pinned
(spacing/letter-spacing/foreground-tier contracts), so stop describing it as
a clean split and point to the owning contract instead.
- ui: barrel promotion is cross-package consumer or explicit public-API
need, not 'second in-package consumer' (attachment-file-card has two
in-package consumers but stays off-barrel); remove the markerVariants
example that implied otherwise.
- renderer: maka-tokens.css tail is a large recipe section (base/utilities/
recipes/animations), not 'a few fallbacks'; the @theme bridge overlap is
concrete (--color-muted maps to --foreground-5 in styles.css but --muted
in maka-tokens.css); only some bridge values are contract-pinned
(spacing/letter-spacing/foreground-tier), overlapping color aliases are
not — don't claim 'each' is pinned.
- renderer: stop claiming overlapping color aliases have no contract pin —
some do (--color-control in styles.css via design-system-governance-406;
--color-muted-foreground in maka-tokens.css via foreground-tier); only
some (e.g. --color-background/accent/muted) are unpinned.
- desktop: narrow the safe-send claim — the contract test scans a fixed
file list for direct mainWindow.webContents.send forms; new *-ipc-main.ts
files aren't auto-covered, so route through the guard in every new file.
- ui: sync the index.ts and chat.tsx LiveIndicator comments to the README
barrel rule (cross-package consumer or explicit public-API need, not a
second in-package consumer; attachment-file-card precedent), so the
README is the single source of the promotion rule.
…irement)
The synced comments still described chat call sites and the tool stream as
consumers, but #712 retired streamVariants/LiveIndicator from the tool body —
they have no production consumer now (chat-stream-cascade-contract pins it).
State that in the comments, and drop the contradictory 'LiveIndicator exported
only on cross-package consumer' line so the promotion rule is stated once
(cross-package consumer or explicit public-API need) and points to README.
…owner
The barrel promotion rule is volatile when duplicated into inline source
comments (consumer lists drift as symbols retire — e.g. streamVariants/
LiveIndicator in #712). Reverting the index.ts/chat.tsx comment edits keeps
this PR docs-only and makes packages/ui/README.md the single source of truth
(the README now says so explicitly). Cleaning up the stale source comments /
dead symbols is a separate change.
Round 14 review: 'revert + README says comments may lag' still left the stale
'second consumer' / streamVariants/LiveIndicator consumer lists in the source
comments, so the conflict source survived. Real root correction: the
inline comments no longer re-derive the promotion rule or track consumers
(that list drifts as symbols retire, e.g. #712) — they keep their local
implementation intent and point at packages/ui/README.md for the rule.
README stays the single owner; dead-symbol cleanup stays a separate change.
Round 15 found the prior root correction only covered 2 of the consumer/
promotion comment blocks; markerVariants/TextShimmer/toolVariants/previewVariants
still re-derived the rule or tracked consumers, and streamVariants/LiveIndicator
still assumed a call site that #712 removed. Exhaustively replace every such
block: keep local implementation intent + a short pointer to the README, drop
all consumer counts and promotion derivations. Also drop the README's 'inline
comments may lag' line (no longer needed once the comments don't re-derive).
16 rounds of review showed cleaning inline source comments is a bottomless
local patch: chat.tsx has many historical consumer/call-site mentions (incl.
#712-retired streamVariants dead-code notes), and each fix surfaced an adjacent
one. Root correction per receiving-code-review: keep this PR docs-only (3 READMEs),
revert the index.ts/chat.tsx comment edits to main, and make packages/ui/README.md
the single owner of the barrel promotion rule. Source-comment cleanup and dead-
symbol removal are separate changes.
@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch from 113e3c7 to 66bcf23CompareJuly 11, 2026 20:59
@Astro-Han
Astro-Han merged commit 57b73ef into mainJul 11, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the docs/frontend-architecture-readmes branch July 11, 2026 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

docs(frontend): add architecture READMEs for ui, renderer, and desktop - #725

Merged
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes
Jul 11, 2026
Merged

docs(frontend): add architecture READMEs for ui, renderer, and desktop#725
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Add target-oriented architecture READMEs for the three frontend surfaces — packages/ui, the renderer, and the desktop app shell — to guide agents through the React + BaseUI + shadcn + Tailwind convergence.

Why

The convergence to React + BaseUI + shadcn + Tailwind is mostly in place, but the per-surface architecture lives nowhere locally. Agents entering packages/ui or the renderer have no map for the export layers, the app-shell split, the styles/tokens layout, or which transitional surfaces to retire. docs/ has the authoritative design-system contract (being refreshed by @jackwener) but nothing at the module level.

Direct docs request; no tracking issue.

Scope

Changed:

  • packages/ui/README.md — four export surfaces (primitives / ui.tsx / top-level features / components.tsx), the off-barrel convention, where new code goes, the ui.tsxprimitives convergence direction.
  • apps/desktop/src/renderer/README.md — the AppShell + app-shell-<scope>-<action> split, the styles/tokens layout (maka-tokens.css, reference-shell.css, styles/*.css), the primitive-first authoring rule, the transitional surfaces.
  • apps/desktop/README.md — the main/preload/renderer split, the main naming convention (*-ipc-main / *-main / *-guard), the IPC contract, the data flow.

Not included:

  • No code changes (pure docs).
  • No edits to docs/design-system.md or docs/frontend-css-governance.md (being refreshed by @jackwener; the READMEs only reference them).
  • No new docs/ files — the per-surface READMEs go in place, not in docs/.

Verification

  • Verified all 13 paths referenced in the READMEs exist.
  • Cross-checked facts against code: @maka/ui is consumed only by desktop; the main.tsxapp.tsxAppShell chain; the renderer only import types from @maka/runtime / @maka/storage (runtime access goes through the preload maka bridge); app-shell.tsx is 1810 lines; maka-tokens.css is 73KB; Badge moved to primitives/ via refactor(ui): converge unmanaged design specs (line-height, font-weight, letter-spacing, …) #520 PR9; buttonVariants lives in ui.tsx; the preload exposes the maka namespace with <domain>:<action> IPC channels.
  • No build/test run — pure docs PR, no code change.

User-facing impact

None. Docs only.

Reviewer notes

  • Three commits, one per README, per the "smallest independently-revertible intent" commit unit — each README is self-contained; reverting one leaves the other two usable.
  • Transitional surfaces are described with direction + end state only — no TODOs, no progress, no time-sensitive content (that stays in issues/PRs). The READMEs are meant not to rot.
  • design-system.md / frontend-css-governance.md references note they're being refreshed by @jackwener; code + contract tests are the source of truth until then.

Checklist

  • Scope matches the PR title and excludes unrelated changes
  • Verification lists commands/results, or explains why they were not run
  • User-facing impact, docs, changelog, migrations, and breaking changes are noted, or marked none
  • Risk, rollback, or review focus is called out for non-trivial changes
  • UI changes include screenshots/video, or explain why not applicable (N/A: docs only)

@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch 3 times, most recently from 0442812 to e014ee1CompareJuly 11, 2026 20:24
Target-oriented README for the shared UI package: four export surfaces
(primitives / ui.tsx / top-level features / components.tsx), the off-barrel
convention, the data-slot hook rule with its exceptions, where new code
goes, and the ui.tsx→primitives convergence direction. Transitional
surfaces are marked with direction + end state, not TODOs.
Target-oriented READMEs for the Electron app shell and its renderer:
the main/preload/renderer split, the main naming convention, the
three-pattern IPC contract and the registerIpc() registration step, the
actual main.ts startup order, the renderer AppShell + app-shell-<scope>-<action>
split, the styles/tokens layout (with the --foreground-N wash-vs-text split),
and the primitive-first authoring rule. Direction + end state only, no TODOs.
- ui: drop the broken @maka/ui/icons ProviderLogo example (it lives in
the renderer); note icons re-exports Lucide symbols; use markerVariants
as a real off-barrel example instead of the zero-consumer LiveIndicator;
clarify 'runtime consumer' (preload imports types).
- renderer: describe AppShell slices as app-shell-* one-concern modules
(not a strict two-segment rule several existing slices violate); make
the reference-shell.css breadcrumb point at the file's own header.
- desktop: fix startup order (window created early, background startup
concurrent, handlers before renderer entry that prefetches pre-mount);
route main→renderer push through safeSendToRenderer (raw webContents.send
throws on destroyed windows); add src/global.d.ts to the new-IPC steps.
- desktop: window is created hidden, revealed after first AppShell paint
(notifyRendererReady gate), not 'preload skeleton shows within ms';
drop the false 'background mutations always push via channels, UI
converges lazily' invariant (interrupted-session recovery doesn't emit).
- ui: scope the off-barrel 'don't re-export' rule to single in-package
consumers with no cross-package consumer (previewVariants is re-exported
for exactly that cross-package reason), resolving the contradiction with
the promotion rule.
- desktop/renderer: window reveal has a fallback timer, and main.tsx's
onboarding prefetch can time out to a fail-soft loading state — stop
claiming 'only after first paint' / 'never sees skeleton' / 'no loading
flash' as absolute paths.
- renderer: maka-tokens.css is the main token source, but a few @theme
Tailwind-bridge values (e.g. --shadow-maka-panel) live in styles.css and
are contract-pinned there — document the exception instead of claiming a
single source.
- ui: clarify 'model-provider brand logos' (renderer settings/provider-*);
bot-provider logos are in @maka/ui's bot-brand-logo.
- renderer: document the contract-pinned index.html inline .maka-preload
skeleton (hardcoded colors, no CSS vars — maka-tokens.css hasn't loaded
yet) as the narrow exception to 'styles.css is the only CSS entry'.
- ui: resolve the barrel-rule contradiction — new feature components
re-export from components.tsx, but only reach index.ts when they have a
second or cross-package consumer (primitives are always re-exported).
…components.tsx)
index.ts does 'export * from ./components.js', so re-exporting a feature
component from components.tsx already puts it on the package barrel —
there is no separate 'add to index.ts later' stage. Rule now: relative
import while single in-package consumer; re-export from components.tsx
(barrel follows automatically) once a second or cross-package consumer
appears.
The @theme Tailwind bridge is split: most aliases (color/typography/spacing/
radius) live in maka-tokens.css, a few values (e.g. --shadow-maka-panel) in
styles.css — both contract-pinned, so check which file owns a value before
moving it. /* local: ... */ is the rule for new component-local vars;
existing ones don't all carry it yet.
…split)
Both maka-tokens.css and styles.css carry an @theme inline block, and their
color aliases overlap (--color-background/accent/muted appear in both);
styles.css also carries the typography/line-height/font-weight/tracking/
spacing/radius/shadow bridges. Each value's home is contract-pinned
(spacing/letter-spacing/foreground-tier contracts), so stop describing it as
a clean split and point to the owning contract instead.
- ui: barrel promotion is cross-package consumer or explicit public-API
need, not 'second in-package consumer' (attachment-file-card has two
in-package consumers but stays off-barrel); remove the markerVariants
example that implied otherwise.
- renderer: maka-tokens.css tail is a large recipe section (base/utilities/
recipes/animations), not 'a few fallbacks'; the @theme bridge overlap is
concrete (--color-muted maps to --foreground-5 in styles.css but --muted
in maka-tokens.css); only some bridge values are contract-pinned
(spacing/letter-spacing/foreground-tier), overlapping color aliases are
not — don't claim 'each' is pinned.
- renderer: stop claiming overlapping color aliases have no contract pin —
some do (--color-control in styles.css via design-system-governance-406;
--color-muted-foreground in maka-tokens.css via foreground-tier); only
some (e.g. --color-background/accent/muted) are unpinned.
- desktop: narrow the safe-send claim — the contract test scans a fixed
file list for direct mainWindow.webContents.send forms; new *-ipc-main.ts
files aren't auto-covered, so route through the guard in every new file.
- ui: sync the index.ts and chat.tsx LiveIndicator comments to the README
barrel rule (cross-package consumer or explicit public-API need, not a
second in-package consumer; attachment-file-card precedent), so the
README is the single source of the promotion rule.
…irement)
The synced comments still described chat call sites and the tool stream as
consumers, but #712 retired streamVariants/LiveIndicator from the tool body —
they have no production consumer now (chat-stream-cascade-contract pins it).
State that in the comments, and drop the contradictory 'LiveIndicator exported
only on cross-package consumer' line so the promotion rule is stated once
(cross-package consumer or explicit public-API need) and points to README.
…owner
The barrel promotion rule is volatile when duplicated into inline source
comments (consumer lists drift as symbols retire — e.g. streamVariants/
LiveIndicator in #712). Reverting the index.ts/chat.tsx comment edits keeps
this PR docs-only and makes packages/ui/README.md the single source of truth
(the README now says so explicitly). Cleaning up the stale source comments /
dead symbols is a separate change.
Round 14 review: 'revert + README says comments may lag' still left the stale
'second consumer' / streamVariants/LiveIndicator consumer lists in the source
comments, so the conflict source survived. Real root correction: the
inline comments no longer re-derive the promotion rule or track consumers
(that list drifts as symbols retire, e.g. #712) — they keep their local
implementation intent and point at packages/ui/README.md for the rule.
README stays the single owner; dead-symbol cleanup stays a separate change.
Round 15 found the prior root correction only covered 2 of the consumer/
promotion comment blocks; markerVariants/TextShimmer/toolVariants/previewVariants
still re-derived the rule or tracked consumers, and streamVariants/LiveIndicator
still assumed a call site that #712 removed. Exhaustively replace every such
block: keep local implementation intent + a short pointer to the README, drop
all consumer counts and promotion derivations. Also drop the README's 'inline
comments may lag' line (no longer needed once the comments don't re-derive).
16 rounds of review showed cleaning inline source comments is a bottomless
local patch: chat.tsx has many historical consumer/call-site mentions (incl.
#712-retired streamVariants dead-code notes), and each fix surfaced an adjacent
one. Root correction per receiving-code-review: keep this PR docs-only (3 READMEs),
revert the index.ts/chat.tsx comment edits to main, and make packages/ui/README.md
the single owner of the barrel promotion rule. Source-comment cleanup and dead-
symbol removal are separate changes.
@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch from 113e3c7 to 66bcf23CompareJuly 11, 2026 20:59
@Astro-Han
Astro-Han merged commit 57b73ef into mainJul 11, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the docs/frontend-architecture-readmes branch July 11, 2026 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

docs(frontend): add architecture READMEs for ui, renderer, and desktop - #725

Merged
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes
Jul 11, 2026
Merged

docs(frontend): add architecture READMEs for ui, renderer, and desktop#725
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Add target-oriented architecture READMEs for the three frontend surfaces — packages/ui, the renderer, and the desktop app shell — to guide agents through the React + BaseUI + shadcn + Tailwind convergence.

Why

The convergence to React + BaseUI + shadcn + Tailwind is mostly in place, but the per-surface architecture lives nowhere locally. Agents entering packages/ui or the renderer have no map for the export layers, the app-shell split, the styles/tokens layout, or which transitional surfaces to retire. docs/ has the authoritative design-system contract (being refreshed by @jackwener) but nothing at the module level.

Direct docs request; no tracking issue.

Scope

Changed:

  • packages/ui/README.md — four export surfaces (primitives / ui.tsx / top-level features / components.tsx), the off-barrel convention, where new code goes, the ui.tsxprimitives convergence direction.
  • apps/desktop/src/renderer/README.md — the AppShell + app-shell-<scope>-<action> split, the styles/tokens layout (maka-tokens.css, reference-shell.css, styles/*.css), the primitive-first authoring rule, the transitional surfaces.
  • apps/desktop/README.md — the main/preload/renderer split, the main naming convention (*-ipc-main / *-main / *-guard), the IPC contract, the data flow.

Not included:

  • No code changes (pure docs).
  • No edits to docs/design-system.md or docs/frontend-css-governance.md (being refreshed by @jackwener; the READMEs only reference them).
  • No new docs/ files — the per-surface READMEs go in place, not in docs/.

Verification

  • Verified all 13 paths referenced in the READMEs exist.
  • Cross-checked facts against code: @maka/ui is consumed only by desktop; the main.tsxapp.tsxAppShell chain; the renderer only import types from @maka/runtime / @maka/storage (runtime access goes through the preload maka bridge); app-shell.tsx is 1810 lines; maka-tokens.css is 73KB; Badge moved to primitives/ via refactor(ui): converge unmanaged design specs (line-height, font-weight, letter-spacing, …) #520 PR9; buttonVariants lives in ui.tsx; the preload exposes the maka namespace with <domain>:<action> IPC channels.
  • No build/test run — pure docs PR, no code change.

User-facing impact

None. Docs only.

Reviewer notes

  • Three commits, one per README, per the "smallest independently-revertible intent" commit unit — each README is self-contained; reverting one leaves the other two usable.
  • Transitional surfaces are described with direction + end state only — no TODOs, no progress, no time-sensitive content (that stays in issues/PRs). The READMEs are meant not to rot.
  • design-system.md / frontend-css-governance.md references note they're being refreshed by @jackwener; code + contract tests are the source of truth until then.

Checklist

  • Scope matches the PR title and excludes unrelated changes
  • Verification lists commands/results, or explains why they were not run
  • User-facing impact, docs, changelog, migrations, and breaking changes are noted, or marked none
  • Risk, rollback, or review focus is called out for non-trivial changes
  • UI changes include screenshots/video, or explain why not applicable (N/A: docs only)

@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch 3 times, most recently from 0442812 to e014ee1CompareJuly 11, 2026 20:24
Target-oriented README for the shared UI package: four export surfaces
(primitives / ui.tsx / top-level features / components.tsx), the off-barrel
convention, the data-slot hook rule with its exceptions, where new code
goes, and the ui.tsx→primitives convergence direction. Transitional
surfaces are marked with direction + end state, not TODOs.
Target-oriented READMEs for the Electron app shell and its renderer:
the main/preload/renderer split, the main naming convention, the
three-pattern IPC contract and the registerIpc() registration step, the
actual main.ts startup order, the renderer AppShell + app-shell-<scope>-<action>
split, the styles/tokens layout (with the --foreground-N wash-vs-text split),
and the primitive-first authoring rule. Direction + end state only, no TODOs.
- ui: drop the broken @maka/ui/icons ProviderLogo example (it lives in
the renderer); note icons re-exports Lucide symbols; use markerVariants
as a real off-barrel example instead of the zero-consumer LiveIndicator;
clarify 'runtime consumer' (preload imports types).
- renderer: describe AppShell slices as app-shell-* one-concern modules
(not a strict two-segment rule several existing slices violate); make
the reference-shell.css breadcrumb point at the file's own header.
- desktop: fix startup order (window created early, background startup
concurrent, handlers before renderer entry that prefetches pre-mount);
route main→renderer push through safeSendToRenderer (raw webContents.send
throws on destroyed windows); add src/global.d.ts to the new-IPC steps.
- desktop: window is created hidden, revealed after first AppShell paint
(notifyRendererReady gate), not 'preload skeleton shows within ms';
drop the false 'background mutations always push via channels, UI
converges lazily' invariant (interrupted-session recovery doesn't emit).
- ui: scope the off-barrel 'don't re-export' rule to single in-package
consumers with no cross-package consumer (previewVariants is re-exported
for exactly that cross-package reason), resolving the contradiction with
the promotion rule.
- desktop/renderer: window reveal has a fallback timer, and main.tsx's
onboarding prefetch can time out to a fail-soft loading state — stop
claiming 'only after first paint' / 'never sees skeleton' / 'no loading
flash' as absolute paths.
- renderer: maka-tokens.css is the main token source, but a few @theme
Tailwind-bridge values (e.g. --shadow-maka-panel) live in styles.css and
are contract-pinned there — document the exception instead of claiming a
single source.
- ui: clarify 'model-provider brand logos' (renderer settings/provider-*);
bot-provider logos are in @maka/ui's bot-brand-logo.
- renderer: document the contract-pinned index.html inline .maka-preload
skeleton (hardcoded colors, no CSS vars — maka-tokens.css hasn't loaded
yet) as the narrow exception to 'styles.css is the only CSS entry'.
- ui: resolve the barrel-rule contradiction — new feature components
re-export from components.tsx, but only reach index.ts when they have a
second or cross-package consumer (primitives are always re-exported).
…components.tsx)
index.ts does 'export * from ./components.js', so re-exporting a feature
component from components.tsx already puts it on the package barrel —
there is no separate 'add to index.ts later' stage. Rule now: relative
import while single in-package consumer; re-export from components.tsx
(barrel follows automatically) once a second or cross-package consumer
appears.
The @theme Tailwind bridge is split: most aliases (color/typography/spacing/
radius) live in maka-tokens.css, a few values (e.g. --shadow-maka-panel) in
styles.css — both contract-pinned, so check which file owns a value before
moving it. /* local: ... */ is the rule for new component-local vars;
existing ones don't all carry it yet.
…split)
Both maka-tokens.css and styles.css carry an @theme inline block, and their
color aliases overlap (--color-background/accent/muted appear in both);
styles.css also carries the typography/line-height/font-weight/tracking/
spacing/radius/shadow bridges. Each value's home is contract-pinned
(spacing/letter-spacing/foreground-tier contracts), so stop describing it as
a clean split and point to the owning contract instead.
- ui: barrel promotion is cross-package consumer or explicit public-API
need, not 'second in-package consumer' (attachment-file-card has two
in-package consumers but stays off-barrel); remove the markerVariants
example that implied otherwise.
- renderer: maka-tokens.css tail is a large recipe section (base/utilities/
recipes/animations), not 'a few fallbacks'; the @theme bridge overlap is
concrete (--color-muted maps to --foreground-5 in styles.css but --muted
in maka-tokens.css); only some bridge values are contract-pinned
(spacing/letter-spacing/foreground-tier), overlapping color aliases are
not — don't claim 'each' is pinned.
- renderer: stop claiming overlapping color aliases have no contract pin —
some do (--color-control in styles.css via design-system-governance-406;
--color-muted-foreground in maka-tokens.css via foreground-tier); only
some (e.g. --color-background/accent/muted) are unpinned.
- desktop: narrow the safe-send claim — the contract test scans a fixed
file list for direct mainWindow.webContents.send forms; new *-ipc-main.ts
files aren't auto-covered, so route through the guard in every new file.
- ui: sync the index.ts and chat.tsx LiveIndicator comments to the README
barrel rule (cross-package consumer or explicit public-API need, not a
second in-package consumer; attachment-file-card precedent), so the
README is the single source of the promotion rule.
…irement)
The synced comments still described chat call sites and the tool stream as
consumers, but #712 retired streamVariants/LiveIndicator from the tool body —
they have no production consumer now (chat-stream-cascade-contract pins it).
State that in the comments, and drop the contradictory 'LiveIndicator exported
only on cross-package consumer' line so the promotion rule is stated once
(cross-package consumer or explicit public-API need) and points to README.
…owner
The barrel promotion rule is volatile when duplicated into inline source
comments (consumer lists drift as symbols retire — e.g. streamVariants/
LiveIndicator in #712). Reverting the index.ts/chat.tsx comment edits keeps
this PR docs-only and makes packages/ui/README.md the single source of truth
(the README now says so explicitly). Cleaning up the stale source comments /
dead symbols is a separate change.
Round 14 review: 'revert + README says comments may lag' still left the stale
'second consumer' / streamVariants/LiveIndicator consumer lists in the source
comments, so the conflict source survived. Real root correction: the
inline comments no longer re-derive the promotion rule or track consumers
(that list drifts as symbols retire, e.g. #712) — they keep their local
implementation intent and point at packages/ui/README.md for the rule.
README stays the single owner; dead-symbol cleanup stays a separate change.
Round 15 found the prior root correction only covered 2 of the consumer/
promotion comment blocks; markerVariants/TextShimmer/toolVariants/previewVariants
still re-derived the rule or tracked consumers, and streamVariants/LiveIndicator
still assumed a call site that #712 removed. Exhaustively replace every such
block: keep local implementation intent + a short pointer to the README, drop
all consumer counts and promotion derivations. Also drop the README's 'inline
comments may lag' line (no longer needed once the comments don't re-derive).
16 rounds of review showed cleaning inline source comments is a bottomless
local patch: chat.tsx has many historical consumer/call-site mentions (incl.
#712-retired streamVariants dead-code notes), and each fix surfaced an adjacent
one. Root correction per receiving-code-review: keep this PR docs-only (3 READMEs),
revert the index.ts/chat.tsx comment edits to main, and make packages/ui/README.md
the single owner of the barrel promotion rule. Source-comment cleanup and dead-
symbol removal are separate changes.
@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch from 113e3c7 to 66bcf23CompareJuly 11, 2026 20:59
@Astro-Han
Astro-Han merged commit 57b73ef into mainJul 11, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the docs/frontend-architecture-readmes branch July 11, 2026 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

docs(frontend): add architecture READMEs for ui, renderer, and desktop - #725

Merged
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes
Jul 11, 2026
Merged

docs(frontend): add architecture READMEs for ui, renderer, and desktop#725
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Add target-oriented architecture READMEs for the three frontend surfaces — packages/ui, the renderer, and the desktop app shell — to guide agents through the React + BaseUI + shadcn + Tailwind convergence.

Why

The convergence to React + BaseUI + shadcn + Tailwind is mostly in place, but the per-surface architecture lives nowhere locally. Agents entering packages/ui or the renderer have no map for the export layers, the app-shell split, the styles/tokens layout, or which transitional surfaces to retire. docs/ has the authoritative design-system contract (being refreshed by @jackwener) but nothing at the module level.

Direct docs request; no tracking issue.

Scope

Changed:

  • packages/ui/README.md — four export surfaces (primitives / ui.tsx / top-level features / components.tsx), the off-barrel convention, where new code goes, the ui.tsxprimitives convergence direction.
  • apps/desktop/src/renderer/README.md — the AppShell + app-shell-<scope>-<action> split, the styles/tokens layout (maka-tokens.css, reference-shell.css, styles/*.css), the primitive-first authoring rule, the transitional surfaces.
  • apps/desktop/README.md — the main/preload/renderer split, the main naming convention (*-ipc-main / *-main / *-guard), the IPC contract, the data flow.

Not included:

  • No code changes (pure docs).
  • No edits to docs/design-system.md or docs/frontend-css-governance.md (being refreshed by @jackwener; the READMEs only reference them).
  • No new docs/ files — the per-surface READMEs go in place, not in docs/.

Verification

  • Verified all 13 paths referenced in the READMEs exist.
  • Cross-checked facts against code: @maka/ui is consumed only by desktop; the main.tsxapp.tsxAppShell chain; the renderer only import types from @maka/runtime / @maka/storage (runtime access goes through the preload maka bridge); app-shell.tsx is 1810 lines; maka-tokens.css is 73KB; Badge moved to primitives/ via refactor(ui): converge unmanaged design specs (line-height, font-weight, letter-spacing, …) #520 PR9; buttonVariants lives in ui.tsx; the preload exposes the maka namespace with <domain>:<action> IPC channels.
  • No build/test run — pure docs PR, no code change.

User-facing impact

None. Docs only.

Reviewer notes

  • Three commits, one per README, per the "smallest independently-revertible intent" commit unit — each README is self-contained; reverting one leaves the other two usable.
  • Transitional surfaces are described with direction + end state only — no TODOs, no progress, no time-sensitive content (that stays in issues/PRs). The READMEs are meant not to rot.
  • design-system.md / frontend-css-governance.md references note they're being refreshed by @jackwener; code + contract tests are the source of truth until then.

Checklist

  • Scope matches the PR title and excludes unrelated changes
  • Verification lists commands/results, or explains why they were not run
  • User-facing impact, docs, changelog, migrations, and breaking changes are noted, or marked none
  • Risk, rollback, or review focus is called out for non-trivial changes
  • UI changes include screenshots/video, or explain why not applicable (N/A: docs only)

@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch 3 times, most recently from 0442812 to e014ee1CompareJuly 11, 2026 20:24
Target-oriented README for the shared UI package: four export surfaces
(primitives / ui.tsx / top-level features / components.tsx), the off-barrel
convention, the data-slot hook rule with its exceptions, where new code
goes, and the ui.tsx→primitives convergence direction. Transitional
surfaces are marked with direction + end state, not TODOs.
Target-oriented READMEs for the Electron app shell and its renderer:
the main/preload/renderer split, the main naming convention, the
three-pattern IPC contract and the registerIpc() registration step, the
actual main.ts startup order, the renderer AppShell + app-shell-<scope>-<action>
split, the styles/tokens layout (with the --foreground-N wash-vs-text split),
and the primitive-first authoring rule. Direction + end state only, no TODOs.
- ui: drop the broken @maka/ui/icons ProviderLogo example (it lives in
the renderer); note icons re-exports Lucide symbols; use markerVariants
as a real off-barrel example instead of the zero-consumer LiveIndicator;
clarify 'runtime consumer' (preload imports types).
- renderer: describe AppShell slices as app-shell-* one-concern modules
(not a strict two-segment rule several existing slices violate); make
the reference-shell.css breadcrumb point at the file's own header.
- desktop: fix startup order (window created early, background startup
concurrent, handlers before renderer entry that prefetches pre-mount);
route main→renderer push through safeSendToRenderer (raw webContents.send
throws on destroyed windows); add src/global.d.ts to the new-IPC steps.
- desktop: window is created hidden, revealed after first AppShell paint
(notifyRendererReady gate), not 'preload skeleton shows within ms';
drop the false 'background mutations always push via channels, UI
converges lazily' invariant (interrupted-session recovery doesn't emit).
- ui: scope the off-barrel 'don't re-export' rule to single in-package
consumers with no cross-package consumer (previewVariants is re-exported
for exactly that cross-package reason), resolving the contradiction with
the promotion rule.
- desktop/renderer: window reveal has a fallback timer, and main.tsx's
onboarding prefetch can time out to a fail-soft loading state — stop
claiming 'only after first paint' / 'never sees skeleton' / 'no loading
flash' as absolute paths.
- renderer: maka-tokens.css is the main token source, but a few @theme
Tailwind-bridge values (e.g. --shadow-maka-panel) live in styles.css and
are contract-pinned there — document the exception instead of claiming a
single source.
- ui: clarify 'model-provider brand logos' (renderer settings/provider-*);
bot-provider logos are in @maka/ui's bot-brand-logo.
- renderer: document the contract-pinned index.html inline .maka-preload
skeleton (hardcoded colors, no CSS vars — maka-tokens.css hasn't loaded
yet) as the narrow exception to 'styles.css is the only CSS entry'.
- ui: resolve the barrel-rule contradiction — new feature components
re-export from components.tsx, but only reach index.ts when they have a
second or cross-package consumer (primitives are always re-exported).
…components.tsx)
index.ts does 'export * from ./components.js', so re-exporting a feature
component from components.tsx already puts it on the package barrel —
there is no separate 'add to index.ts later' stage. Rule now: relative
import while single in-package consumer; re-export from components.tsx
(barrel follows automatically) once a second or cross-package consumer
appears.
The @theme Tailwind bridge is split: most aliases (color/typography/spacing/
radius) live in maka-tokens.css, a few values (e.g. --shadow-maka-panel) in
styles.css — both contract-pinned, so check which file owns a value before
moving it. /* local: ... */ is the rule for new component-local vars;
existing ones don't all carry it yet.
…split)
Both maka-tokens.css and styles.css carry an @theme inline block, and their
color aliases overlap (--color-background/accent/muted appear in both);
styles.css also carries the typography/line-height/font-weight/tracking/
spacing/radius/shadow bridges. Each value's home is contract-pinned
(spacing/letter-spacing/foreground-tier contracts), so stop describing it as
a clean split and point to the owning contract instead.
- ui: barrel promotion is cross-package consumer or explicit public-API
need, not 'second in-package consumer' (attachment-file-card has two
in-package consumers but stays off-barrel); remove the markerVariants
example that implied otherwise.
- renderer: maka-tokens.css tail is a large recipe section (base/utilities/
recipes/animations), not 'a few fallbacks'; the @theme bridge overlap is
concrete (--color-muted maps to --foreground-5 in styles.css but --muted
in maka-tokens.css); only some bridge values are contract-pinned
(spacing/letter-spacing/foreground-tier), overlapping color aliases are
not — don't claim 'each' is pinned.
- renderer: stop claiming overlapping color aliases have no contract pin —
some do (--color-control in styles.css via design-system-governance-406;
--color-muted-foreground in maka-tokens.css via foreground-tier); only
some (e.g. --color-background/accent/muted) are unpinned.
- desktop: narrow the safe-send claim — the contract test scans a fixed
file list for direct mainWindow.webContents.send forms; new *-ipc-main.ts
files aren't auto-covered, so route through the guard in every new file.
- ui: sync the index.ts and chat.tsx LiveIndicator comments to the README
barrel rule (cross-package consumer or explicit public-API need, not a
second in-package consumer; attachment-file-card precedent), so the
README is the single source of the promotion rule.
…irement)
The synced comments still described chat call sites and the tool stream as
consumers, but #712 retired streamVariants/LiveIndicator from the tool body —
they have no production consumer now (chat-stream-cascade-contract pins it).
State that in the comments, and drop the contradictory 'LiveIndicator exported
only on cross-package consumer' line so the promotion rule is stated once
(cross-package consumer or explicit public-API need) and points to README.
…owner
The barrel promotion rule is volatile when duplicated into inline source
comments (consumer lists drift as symbols retire — e.g. streamVariants/
LiveIndicator in #712). Reverting the index.ts/chat.tsx comment edits keeps
this PR docs-only and makes packages/ui/README.md the single source of truth
(the README now says so explicitly). Cleaning up the stale source comments /
dead symbols is a separate change.
Round 14 review: 'revert + README says comments may lag' still left the stale
'second consumer' / streamVariants/LiveIndicator consumer lists in the source
comments, so the conflict source survived. Real root correction: the
inline comments no longer re-derive the promotion rule or track consumers
(that list drifts as symbols retire, e.g. #712) — they keep their local
implementation intent and point at packages/ui/README.md for the rule.
README stays the single owner; dead-symbol cleanup stays a separate change.
Round 15 found the prior root correction only covered 2 of the consumer/
promotion comment blocks; markerVariants/TextShimmer/toolVariants/previewVariants
still re-derived the rule or tracked consumers, and streamVariants/LiveIndicator
still assumed a call site that #712 removed. Exhaustively replace every such
block: keep local implementation intent + a short pointer to the README, drop
all consumer counts and promotion derivations. Also drop the README's 'inline
comments may lag' line (no longer needed once the comments don't re-derive).
16 rounds of review showed cleaning inline source comments is a bottomless
local patch: chat.tsx has many historical consumer/call-site mentions (incl.
#712-retired streamVariants dead-code notes), and each fix surfaced an adjacent
one. Root correction per receiving-code-review: keep this PR docs-only (3 READMEs),
revert the index.ts/chat.tsx comment edits to main, and make packages/ui/README.md
the single owner of the barrel promotion rule. Source-comment cleanup and dead-
symbol removal are separate changes.
@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch from 113e3c7 to 66bcf23CompareJuly 11, 2026 20:59
@Astro-Han
Astro-Han merged commit 57b73ef into mainJul 11, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the docs/frontend-architecture-readmes branch July 11, 2026 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

docs(frontend): add architecture READMEs for ui, renderer, and desktop - #725

Merged
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes
Jul 11, 2026
Merged

docs(frontend): add architecture READMEs for ui, renderer, and desktop#725
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Add target-oriented architecture READMEs for the three frontend surfaces — packages/ui, the renderer, and the desktop app shell — to guide agents through the React + BaseUI + shadcn + Tailwind convergence.

Why

The convergence to React + BaseUI + shadcn + Tailwind is mostly in place, but the per-surface architecture lives nowhere locally. Agents entering packages/ui or the renderer have no map for the export layers, the app-shell split, the styles/tokens layout, or which transitional surfaces to retire. docs/ has the authoritative design-system contract (being refreshed by @jackwener) but nothing at the module level.

Direct docs request; no tracking issue.

Scope

Changed:

  • packages/ui/README.md — four export surfaces (primitives / ui.tsx / top-level features / components.tsx), the off-barrel convention, where new code goes, the ui.tsxprimitives convergence direction.
  • apps/desktop/src/renderer/README.md — the AppShell + app-shell-<scope>-<action> split, the styles/tokens layout (maka-tokens.css, reference-shell.css, styles/*.css), the primitive-first authoring rule, the transitional surfaces.
  • apps/desktop/README.md — the main/preload/renderer split, the main naming convention (*-ipc-main / *-main / *-guard), the IPC contract, the data flow.

Not included:

  • No code changes (pure docs).
  • No edits to docs/design-system.md or docs/frontend-css-governance.md (being refreshed by @jackwener; the READMEs only reference them).
  • No new docs/ files — the per-surface READMEs go in place, not in docs/.

Verification

  • Verified all 13 paths referenced in the READMEs exist.
  • Cross-checked facts against code: @maka/ui is consumed only by desktop; the main.tsxapp.tsxAppShell chain; the renderer only import types from @maka/runtime / @maka/storage (runtime access goes through the preload maka bridge); app-shell.tsx is 1810 lines; maka-tokens.css is 73KB; Badge moved to primitives/ via refactor(ui): converge unmanaged design specs (line-height, font-weight, letter-spacing, …) #520 PR9; buttonVariants lives in ui.tsx; the preload exposes the maka namespace with <domain>:<action> IPC channels.
  • No build/test run — pure docs PR, no code change.

User-facing impact

None. Docs only.

Reviewer notes

  • Three commits, one per README, per the "smallest independently-revertible intent" commit unit — each README is self-contained; reverting one leaves the other two usable.
  • Transitional surfaces are described with direction + end state only — no TODOs, no progress, no time-sensitive content (that stays in issues/PRs). The READMEs are meant not to rot.
  • design-system.md / frontend-css-governance.md references note they're being refreshed by @jackwener; code + contract tests are the source of truth until then.

Checklist

  • Scope matches the PR title and excludes unrelated changes
  • Verification lists commands/results, or explains why they were not run
  • User-facing impact, docs, changelog, migrations, and breaking changes are noted, or marked none
  • Risk, rollback, or review focus is called out for non-trivial changes
  • UI changes include screenshots/video, or explain why not applicable (N/A: docs only)

@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch 3 times, most recently from 0442812 to e014ee1CompareJuly 11, 2026 20:24
Target-oriented README for the shared UI package: four export surfaces
(primitives / ui.tsx / top-level features / components.tsx), the off-barrel
convention, the data-slot hook rule with its exceptions, where new code
goes, and the ui.tsx→primitives convergence direction. Transitional
surfaces are marked with direction + end state, not TODOs.
Target-oriented READMEs for the Electron app shell and its renderer:
the main/preload/renderer split, the main naming convention, the
three-pattern IPC contract and the registerIpc() registration step, the
actual main.ts startup order, the renderer AppShell + app-shell-<scope>-<action>
split, the styles/tokens layout (with the --foreground-N wash-vs-text split),
and the primitive-first authoring rule. Direction + end state only, no TODOs.
- ui: drop the broken @maka/ui/icons ProviderLogo example (it lives in
the renderer); note icons re-exports Lucide symbols; use markerVariants
as a real off-barrel example instead of the zero-consumer LiveIndicator;
clarify 'runtime consumer' (preload imports types).
- renderer: describe AppShell slices as app-shell-* one-concern modules
(not a strict two-segment rule several existing slices violate); make
the reference-shell.css breadcrumb point at the file's own header.
- desktop: fix startup order (window created early, background startup
concurrent, handlers before renderer entry that prefetches pre-mount);
route main→renderer push through safeSendToRenderer (raw webContents.send
throws on destroyed windows); add src/global.d.ts to the new-IPC steps.
- desktop: window is created hidden, revealed after first AppShell paint
(notifyRendererReady gate), not 'preload skeleton shows within ms';
drop the false 'background mutations always push via channels, UI
converges lazily' invariant (interrupted-session recovery doesn't emit).
- ui: scope the off-barrel 'don't re-export' rule to single in-package
consumers with no cross-package consumer (previewVariants is re-exported
for exactly that cross-package reason), resolving the contradiction with
the promotion rule.
- desktop/renderer: window reveal has a fallback timer, and main.tsx's
onboarding prefetch can time out to a fail-soft loading state — stop
claiming 'only after first paint' / 'never sees skeleton' / 'no loading
flash' as absolute paths.
- renderer: maka-tokens.css is the main token source, but a few @theme
Tailwind-bridge values (e.g. --shadow-maka-panel) live in styles.css and
are contract-pinned there — document the exception instead of claiming a
single source.
- ui: clarify 'model-provider brand logos' (renderer settings/provider-*);
bot-provider logos are in @maka/ui's bot-brand-logo.
- renderer: document the contract-pinned index.html inline .maka-preload
skeleton (hardcoded colors, no CSS vars — maka-tokens.css hasn't loaded
yet) as the narrow exception to 'styles.css is the only CSS entry'.
- ui: resolve the barrel-rule contradiction — new feature components
re-export from components.tsx, but only reach index.ts when they have a
second or cross-package consumer (primitives are always re-exported).
…components.tsx)
index.ts does 'export * from ./components.js', so re-exporting a feature
component from components.tsx already puts it on the package barrel —
there is no separate 'add to index.ts later' stage. Rule now: relative
import while single in-package consumer; re-export from components.tsx
(barrel follows automatically) once a second or cross-package consumer
appears.
The @theme Tailwind bridge is split: most aliases (color/typography/spacing/
radius) live in maka-tokens.css, a few values (e.g. --shadow-maka-panel) in
styles.css — both contract-pinned, so check which file owns a value before
moving it. /* local: ... */ is the rule for new component-local vars;
existing ones don't all carry it yet.
…split)
Both maka-tokens.css and styles.css carry an @theme inline block, and their
color aliases overlap (--color-background/accent/muted appear in both);
styles.css also carries the typography/line-height/font-weight/tracking/
spacing/radius/shadow bridges. Each value's home is contract-pinned
(spacing/letter-spacing/foreground-tier contracts), so stop describing it as
a clean split and point to the owning contract instead.
- ui: barrel promotion is cross-package consumer or explicit public-API
need, not 'second in-package consumer' (attachment-file-card has two
in-package consumers but stays off-barrel); remove the markerVariants
example that implied otherwise.
- renderer: maka-tokens.css tail is a large recipe section (base/utilities/
recipes/animations), not 'a few fallbacks'; the @theme bridge overlap is
concrete (--color-muted maps to --foreground-5 in styles.css but --muted
in maka-tokens.css); only some bridge values are contract-pinned
(spacing/letter-spacing/foreground-tier), overlapping color aliases are
not — don't claim 'each' is pinned.
- renderer: stop claiming overlapping color aliases have no contract pin —
some do (--color-control in styles.css via design-system-governance-406;
--color-muted-foreground in maka-tokens.css via foreground-tier); only
some (e.g. --color-background/accent/muted) are unpinned.
- desktop: narrow the safe-send claim — the contract test scans a fixed
file list for direct mainWindow.webContents.send forms; new *-ipc-main.ts
files aren't auto-covered, so route through the guard in every new file.
- ui: sync the index.ts and chat.tsx LiveIndicator comments to the README
barrel rule (cross-package consumer or explicit public-API need, not a
second in-package consumer; attachment-file-card precedent), so the
README is the single source of the promotion rule.
…irement)
The synced comments still described chat call sites and the tool stream as
consumers, but #712 retired streamVariants/LiveIndicator from the tool body —
they have no production consumer now (chat-stream-cascade-contract pins it).
State that in the comments, and drop the contradictory 'LiveIndicator exported
only on cross-package consumer' line so the promotion rule is stated once
(cross-package consumer or explicit public-API need) and points to README.
…owner
The barrel promotion rule is volatile when duplicated into inline source
comments (consumer lists drift as symbols retire — e.g. streamVariants/
LiveIndicator in #712). Reverting the index.ts/chat.tsx comment edits keeps
this PR docs-only and makes packages/ui/README.md the single source of truth
(the README now says so explicitly). Cleaning up the stale source comments /
dead symbols is a separate change.
Round 14 review: 'revert + README says comments may lag' still left the stale
'second consumer' / streamVariants/LiveIndicator consumer lists in the source
comments, so the conflict source survived. Real root correction: the
inline comments no longer re-derive the promotion rule or track consumers
(that list drifts as symbols retire, e.g. #712) — they keep their local
implementation intent and point at packages/ui/README.md for the rule.
README stays the single owner; dead-symbol cleanup stays a separate change.
Round 15 found the prior root correction only covered 2 of the consumer/
promotion comment blocks; markerVariants/TextShimmer/toolVariants/previewVariants
still re-derived the rule or tracked consumers, and streamVariants/LiveIndicator
still assumed a call site that #712 removed. Exhaustively replace every such
block: keep local implementation intent + a short pointer to the README, drop
all consumer counts and promotion derivations. Also drop the README's 'inline
comments may lag' line (no longer needed once the comments don't re-derive).
16 rounds of review showed cleaning inline source comments is a bottomless
local patch: chat.tsx has many historical consumer/call-site mentions (incl.
#712-retired streamVariants dead-code notes), and each fix surfaced an adjacent
one. Root correction per receiving-code-review: keep this PR docs-only (3 READMEs),
revert the index.ts/chat.tsx comment edits to main, and make packages/ui/README.md
the single owner of the barrel promotion rule. Source-comment cleanup and dead-
symbol removal are separate changes.
@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch from 113e3c7 to 66bcf23CompareJuly 11, 2026 20:59
@Astro-Han
Astro-Han merged commit 57b73ef into mainJul 11, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the docs/frontend-architecture-readmes branch July 11, 2026 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

docs(frontend): add architecture READMEs for ui, renderer, and desktop - #725

Merged
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes
Jul 11, 2026
Merged

docs(frontend): add architecture READMEs for ui, renderer, and desktop#725
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Add target-oriented architecture READMEs for the three frontend surfaces — packages/ui, the renderer, and the desktop app shell — to guide agents through the React + BaseUI + shadcn + Tailwind convergence.

Why

The convergence to React + BaseUI + shadcn + Tailwind is mostly in place, but the per-surface architecture lives nowhere locally. Agents entering packages/ui or the renderer have no map for the export layers, the app-shell split, the styles/tokens layout, or which transitional surfaces to retire. docs/ has the authoritative design-system contract (being refreshed by @jackwener) but nothing at the module level.

Direct docs request; no tracking issue.

Scope

Changed:

  • packages/ui/README.md — four export surfaces (primitives / ui.tsx / top-level features / components.tsx), the off-barrel convention, where new code goes, the ui.tsxprimitives convergence direction.
  • apps/desktop/src/renderer/README.md — the AppShell + app-shell-<scope>-<action> split, the styles/tokens layout (maka-tokens.css, reference-shell.css, styles/*.css), the primitive-first authoring rule, the transitional surfaces.
  • apps/desktop/README.md — the main/preload/renderer split, the main naming convention (*-ipc-main / *-main / *-guard), the IPC contract, the data flow.

Not included:

  • No code changes (pure docs).
  • No edits to docs/design-system.md or docs/frontend-css-governance.md (being refreshed by @jackwener; the READMEs only reference them).
  • No new docs/ files — the per-surface READMEs go in place, not in docs/.

Verification

  • Verified all 13 paths referenced in the READMEs exist.
  • Cross-checked facts against code: @maka/ui is consumed only by desktop; the main.tsxapp.tsxAppShell chain; the renderer only import types from @maka/runtime / @maka/storage (runtime access goes through the preload maka bridge); app-shell.tsx is 1810 lines; maka-tokens.css is 73KB; Badge moved to primitives/ via refactor(ui): converge unmanaged design specs (line-height, font-weight, letter-spacing, …) #520 PR9; buttonVariants lives in ui.tsx; the preload exposes the maka namespace with <domain>:<action> IPC channels.
  • No build/test run — pure docs PR, no code change.

User-facing impact

None. Docs only.

Reviewer notes

  • Three commits, one per README, per the "smallest independently-revertible intent" commit unit — each README is self-contained; reverting one leaves the other two usable.
  • Transitional surfaces are described with direction + end state only — no TODOs, no progress, no time-sensitive content (that stays in issues/PRs). The READMEs are meant not to rot.
  • design-system.md / frontend-css-governance.md references note they're being refreshed by @jackwener; code + contract tests are the source of truth until then.

Checklist

  • Scope matches the PR title and excludes unrelated changes
  • Verification lists commands/results, or explains why they were not run
  • User-facing impact, docs, changelog, migrations, and breaking changes are noted, or marked none
  • Risk, rollback, or review focus is called out for non-trivial changes
  • UI changes include screenshots/video, or explain why not applicable (N/A: docs only)

@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch 3 times, most recently from 0442812 to e014ee1CompareJuly 11, 2026 20:24
Target-oriented README for the shared UI package: four export surfaces
(primitives / ui.tsx / top-level features / components.tsx), the off-barrel
convention, the data-slot hook rule with its exceptions, where new code
goes, and the ui.tsx→primitives convergence direction. Transitional
surfaces are marked with direction + end state, not TODOs.
Target-oriented READMEs for the Electron app shell and its renderer:
the main/preload/renderer split, the main naming convention, the
three-pattern IPC contract and the registerIpc() registration step, the
actual main.ts startup order, the renderer AppShell + app-shell-<scope>-<action>
split, the styles/tokens layout (with the --foreground-N wash-vs-text split),
and the primitive-first authoring rule. Direction + end state only, no TODOs.
- ui: drop the broken @maka/ui/icons ProviderLogo example (it lives in
the renderer); note icons re-exports Lucide symbols; use markerVariants
as a real off-barrel example instead of the zero-consumer LiveIndicator;
clarify 'runtime consumer' (preload imports types).
- renderer: describe AppShell slices as app-shell-* one-concern modules
(not a strict two-segment rule several existing slices violate); make
the reference-shell.css breadcrumb point at the file's own header.
- desktop: fix startup order (window created early, background startup
concurrent, handlers before renderer entry that prefetches pre-mount);
route main→renderer push through safeSendToRenderer (raw webContents.send
throws on destroyed windows); add src/global.d.ts to the new-IPC steps.
- desktop: window is created hidden, revealed after first AppShell paint
(notifyRendererReady gate), not 'preload skeleton shows within ms';
drop the false 'background mutations always push via channels, UI
converges lazily' invariant (interrupted-session recovery doesn't emit).
- ui: scope the off-barrel 'don't re-export' rule to single in-package
consumers with no cross-package consumer (previewVariants is re-exported
for exactly that cross-package reason), resolving the contradiction with
the promotion rule.
- desktop/renderer: window reveal has a fallback timer, and main.tsx's
onboarding prefetch can time out to a fail-soft loading state — stop
claiming 'only after first paint' / 'never sees skeleton' / 'no loading
flash' as absolute paths.
- renderer: maka-tokens.css is the main token source, but a few @theme
Tailwind-bridge values (e.g. --shadow-maka-panel) live in styles.css and
are contract-pinned there — document the exception instead of claiming a
single source.
- ui: clarify 'model-provider brand logos' (renderer settings/provider-*);
bot-provider logos are in @maka/ui's bot-brand-logo.
- renderer: document the contract-pinned index.html inline .maka-preload
skeleton (hardcoded colors, no CSS vars — maka-tokens.css hasn't loaded
yet) as the narrow exception to 'styles.css is the only CSS entry'.
- ui: resolve the barrel-rule contradiction — new feature components
re-export from components.tsx, but only reach index.ts when they have a
second or cross-package consumer (primitives are always re-exported).
…components.tsx)
index.ts does 'export * from ./components.js', so re-exporting a feature
component from components.tsx already puts it on the package barrel —
there is no separate 'add to index.ts later' stage. Rule now: relative
import while single in-package consumer; re-export from components.tsx
(barrel follows automatically) once a second or cross-package consumer
appears.
The @theme Tailwind bridge is split: most aliases (color/typography/spacing/
radius) live in maka-tokens.css, a few values (e.g. --shadow-maka-panel) in
styles.css — both contract-pinned, so check which file owns a value before
moving it. /* local: ... */ is the rule for new component-local vars;
existing ones don't all carry it yet.
…split)
Both maka-tokens.css and styles.css carry an @theme inline block, and their
color aliases overlap (--color-background/accent/muted appear in both);
styles.css also carries the typography/line-height/font-weight/tracking/
spacing/radius/shadow bridges. Each value's home is contract-pinned
(spacing/letter-spacing/foreground-tier contracts), so stop describing it as
a clean split and point to the owning contract instead.
- ui: barrel promotion is cross-package consumer or explicit public-API
need, not 'second in-package consumer' (attachment-file-card has two
in-package consumers but stays off-barrel); remove the markerVariants
example that implied otherwise.
- renderer: maka-tokens.css tail is a large recipe section (base/utilities/
recipes/animations), not 'a few fallbacks'; the @theme bridge overlap is
concrete (--color-muted maps to --foreground-5 in styles.css but --muted
in maka-tokens.css); only some bridge values are contract-pinned
(spacing/letter-spacing/foreground-tier), overlapping color aliases are
not — don't claim 'each' is pinned.
- renderer: stop claiming overlapping color aliases have no contract pin —
some do (--color-control in styles.css via design-system-governance-406;
--color-muted-foreground in maka-tokens.css via foreground-tier); only
some (e.g. --color-background/accent/muted) are unpinned.
- desktop: narrow the safe-send claim — the contract test scans a fixed
file list for direct mainWindow.webContents.send forms; new *-ipc-main.ts
files aren't auto-covered, so route through the guard in every new file.
- ui: sync the index.ts and chat.tsx LiveIndicator comments to the README
barrel rule (cross-package consumer or explicit public-API need, not a
second in-package consumer; attachment-file-card precedent), so the
README is the single source of the promotion rule.
…irement)
The synced comments still described chat call sites and the tool stream as
consumers, but #712 retired streamVariants/LiveIndicator from the tool body —
they have no production consumer now (chat-stream-cascade-contract pins it).
State that in the comments, and drop the contradictory 'LiveIndicator exported
only on cross-package consumer' line so the promotion rule is stated once
(cross-package consumer or explicit public-API need) and points to README.
…owner
The barrel promotion rule is volatile when duplicated into inline source
comments (consumer lists drift as symbols retire — e.g. streamVariants/
LiveIndicator in #712). Reverting the index.ts/chat.tsx comment edits keeps
this PR docs-only and makes packages/ui/README.md the single source of truth
(the README now says so explicitly). Cleaning up the stale source comments /
dead symbols is a separate change.
Round 14 review: 'revert + README says comments may lag' still left the stale
'second consumer' / streamVariants/LiveIndicator consumer lists in the source
comments, so the conflict source survived. Real root correction: the
inline comments no longer re-derive the promotion rule or track consumers
(that list drifts as symbols retire, e.g. #712) — they keep their local
implementation intent and point at packages/ui/README.md for the rule.
README stays the single owner; dead-symbol cleanup stays a separate change.
Round 15 found the prior root correction only covered 2 of the consumer/
promotion comment blocks; markerVariants/TextShimmer/toolVariants/previewVariants
still re-derived the rule or tracked consumers, and streamVariants/LiveIndicator
still assumed a call site that #712 removed. Exhaustively replace every such
block: keep local implementation intent + a short pointer to the README, drop
all consumer counts and promotion derivations. Also drop the README's 'inline
comments may lag' line (no longer needed once the comments don't re-derive).
16 rounds of review showed cleaning inline source comments is a bottomless
local patch: chat.tsx has many historical consumer/call-site mentions (incl.
#712-retired streamVariants dead-code notes), and each fix surfaced an adjacent
one. Root correction per receiving-code-review: keep this PR docs-only (3 READMEs),
revert the index.ts/chat.tsx comment edits to main, and make packages/ui/README.md
the single owner of the barrel promotion rule. Source-comment cleanup and dead-
symbol removal are separate changes.
@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch from 113e3c7 to 66bcf23CompareJuly 11, 2026 20:59
@Astro-Han
Astro-Han merged commit 57b73ef into mainJul 11, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the docs/frontend-architecture-readmes branch July 11, 2026 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

docs(frontend): add architecture READMEs for ui, renderer, and desktop - #725

Merged
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes
Jul 11, 2026
Merged

docs(frontend): add architecture READMEs for ui, renderer, and desktop#725
Astro-Han merged 18 commits into
mainfrom
docs/frontend-architecture-readmes

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

Summary

Add target-oriented architecture READMEs for the three frontend surfaces — packages/ui, the renderer, and the desktop app shell — to guide agents through the React + BaseUI + shadcn + Tailwind convergence.

Why

The convergence to React + BaseUI + shadcn + Tailwind is mostly in place, but the per-surface architecture lives nowhere locally. Agents entering packages/ui or the renderer have no map for the export layers, the app-shell split, the styles/tokens layout, or which transitional surfaces to retire. docs/ has the authoritative design-system contract (being refreshed by @jackwener) but nothing at the module level.

Direct docs request; no tracking issue.

Scope

Changed:

  • packages/ui/README.md — four export surfaces (primitives / ui.tsx / top-level features / components.tsx), the off-barrel convention, where new code goes, the ui.tsxprimitives convergence direction.
  • apps/desktop/src/renderer/README.md — the AppShell + app-shell-<scope>-<action> split, the styles/tokens layout (maka-tokens.css, reference-shell.css, styles/*.css), the primitive-first authoring rule, the transitional surfaces.
  • apps/desktop/README.md — the main/preload/renderer split, the main naming convention (*-ipc-main / *-main / *-guard), the IPC contract, the data flow.

Not included:

  • No code changes (pure docs).
  • No edits to docs/design-system.md or docs/frontend-css-governance.md (being refreshed by @jackwener; the READMEs only reference them).
  • No new docs/ files — the per-surface READMEs go in place, not in docs/.

Verification

  • Verified all 13 paths referenced in the READMEs exist.
  • Cross-checked facts against code: @maka/ui is consumed only by desktop; the main.tsxapp.tsxAppShell chain; the renderer only import types from @maka/runtime / @maka/storage (runtime access goes through the preload maka bridge); app-shell.tsx is 1810 lines; maka-tokens.css is 73KB; Badge moved to primitives/ via refactor(ui): converge unmanaged design specs (line-height, font-weight, letter-spacing, …) #520 PR9; buttonVariants lives in ui.tsx; the preload exposes the maka namespace with <domain>:<action> IPC channels.
  • No build/test run — pure docs PR, no code change.

User-facing impact

None. Docs only.

Reviewer notes

  • Three commits, one per README, per the "smallest independently-revertible intent" commit unit — each README is self-contained; reverting one leaves the other two usable.
  • Transitional surfaces are described with direction + end state only — no TODOs, no progress, no time-sensitive content (that stays in issues/PRs). The READMEs are meant not to rot.
  • design-system.md / frontend-css-governance.md references note they're being refreshed by @jackwener; code + contract tests are the source of truth until then.

Checklist

  • Scope matches the PR title and excludes unrelated changes
  • Verification lists commands/results, or explains why they were not run
  • User-facing impact, docs, changelog, migrations, and breaking changes are noted, or marked none
  • Risk, rollback, or review focus is called out for non-trivial changes
  • UI changes include screenshots/video, or explain why not applicable (N/A: docs only)

@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch 3 times, most recently from 0442812 to e014ee1CompareJuly 11, 2026 20:24
Target-oriented README for the shared UI package: four export surfaces
(primitives / ui.tsx / top-level features / components.tsx), the off-barrel
convention, the data-slot hook rule with its exceptions, where new code
goes, and the ui.tsx→primitives convergence direction. Transitional
surfaces are marked with direction + end state, not TODOs.
Target-oriented READMEs for the Electron app shell and its renderer:
the main/preload/renderer split, the main naming convention, the
three-pattern IPC contract and the registerIpc() registration step, the
actual main.ts startup order, the renderer AppShell + app-shell-<scope>-<action>
split, the styles/tokens layout (with the --foreground-N wash-vs-text split),
and the primitive-first authoring rule. Direction + end state only, no TODOs.
- ui: drop the broken @maka/ui/icons ProviderLogo example (it lives in
the renderer); note icons re-exports Lucide symbols; use markerVariants
as a real off-barrel example instead of the zero-consumer LiveIndicator;
clarify 'runtime consumer' (preload imports types).
- renderer: describe AppShell slices as app-shell-* one-concern modules
(not a strict two-segment rule several existing slices violate); make
the reference-shell.css breadcrumb point at the file's own header.
- desktop: fix startup order (window created early, background startup
concurrent, handlers before renderer entry that prefetches pre-mount);
route main→renderer push through safeSendToRenderer (raw webContents.send
throws on destroyed windows); add src/global.d.ts to the new-IPC steps.
- desktop: window is created hidden, revealed after first AppShell paint
(notifyRendererReady gate), not 'preload skeleton shows within ms';
drop the false 'background mutations always push via channels, UI
converges lazily' invariant (interrupted-session recovery doesn't emit).
- ui: scope the off-barrel 'don't re-export' rule to single in-package
consumers with no cross-package consumer (previewVariants is re-exported
for exactly that cross-package reason), resolving the contradiction with
the promotion rule.
- desktop/renderer: window reveal has a fallback timer, and main.tsx's
onboarding prefetch can time out to a fail-soft loading state — stop
claiming 'only after first paint' / 'never sees skeleton' / 'no loading
flash' as absolute paths.
- renderer: maka-tokens.css is the main token source, but a few @theme
Tailwind-bridge values (e.g. --shadow-maka-panel) live in styles.css and
are contract-pinned there — document the exception instead of claiming a
single source.
- ui: clarify 'model-provider brand logos' (renderer settings/provider-*);
bot-provider logos are in @maka/ui's bot-brand-logo.
- renderer: document the contract-pinned index.html inline .maka-preload
skeleton (hardcoded colors, no CSS vars — maka-tokens.css hasn't loaded
yet) as the narrow exception to 'styles.css is the only CSS entry'.
- ui: resolve the barrel-rule contradiction — new feature components
re-export from components.tsx, but only reach index.ts when they have a
second or cross-package consumer (primitives are always re-exported).
…components.tsx)
index.ts does 'export * from ./components.js', so re-exporting a feature
component from components.tsx already puts it on the package barrel —
there is no separate 'add to index.ts later' stage. Rule now: relative
import while single in-package consumer; re-export from components.tsx
(barrel follows automatically) once a second or cross-package consumer
appears.
The @theme Tailwind bridge is split: most aliases (color/typography/spacing/
radius) live in maka-tokens.css, a few values (e.g. --shadow-maka-panel) in
styles.css — both contract-pinned, so check which file owns a value before
moving it. /* local: ... */ is the rule for new component-local vars;
existing ones don't all carry it yet.
…split)
Both maka-tokens.css and styles.css carry an @theme inline block, and their
color aliases overlap (--color-background/accent/muted appear in both);
styles.css also carries the typography/line-height/font-weight/tracking/
spacing/radius/shadow bridges. Each value's home is contract-pinned
(spacing/letter-spacing/foreground-tier contracts), so stop describing it as
a clean split and point to the owning contract instead.
- ui: barrel promotion is cross-package consumer or explicit public-API
need, not 'second in-package consumer' (attachment-file-card has two
in-package consumers but stays off-barrel); remove the markerVariants
example that implied otherwise.
- renderer: maka-tokens.css tail is a large recipe section (base/utilities/
recipes/animations), not 'a few fallbacks'; the @theme bridge overlap is
concrete (--color-muted maps to --foreground-5 in styles.css but --muted
in maka-tokens.css); only some bridge values are contract-pinned
(spacing/letter-spacing/foreground-tier), overlapping color aliases are
not — don't claim 'each' is pinned.
- renderer: stop claiming overlapping color aliases have no contract pin —
some do (--color-control in styles.css via design-system-governance-406;
--color-muted-foreground in maka-tokens.css via foreground-tier); only
some (e.g. --color-background/accent/muted) are unpinned.
- desktop: narrow the safe-send claim — the contract test scans a fixed
file list for direct mainWindow.webContents.send forms; new *-ipc-main.ts
files aren't auto-covered, so route through the guard in every new file.
- ui: sync the index.ts and chat.tsx LiveIndicator comments to the README
barrel rule (cross-package consumer or explicit public-API need, not a
second in-package consumer; attachment-file-card precedent), so the
README is the single source of the promotion rule.
…irement)
The synced comments still described chat call sites and the tool stream as
consumers, but #712 retired streamVariants/LiveIndicator from the tool body —
they have no production consumer now (chat-stream-cascade-contract pins it).
State that in the comments, and drop the contradictory 'LiveIndicator exported
only on cross-package consumer' line so the promotion rule is stated once
(cross-package consumer or explicit public-API need) and points to README.
…owner
The barrel promotion rule is volatile when duplicated into inline source
comments (consumer lists drift as symbols retire — e.g. streamVariants/
LiveIndicator in #712). Reverting the index.ts/chat.tsx comment edits keeps
this PR docs-only and makes packages/ui/README.md the single source of truth
(the README now says so explicitly). Cleaning up the stale source comments /
dead symbols is a separate change.
Round 14 review: 'revert + README says comments may lag' still left the stale
'second consumer' / streamVariants/LiveIndicator consumer lists in the source
comments, so the conflict source survived. Real root correction: the
inline comments no longer re-derive the promotion rule or track consumers
(that list drifts as symbols retire, e.g. #712) — they keep their local
implementation intent and point at packages/ui/README.md for the rule.
README stays the single owner; dead-symbol cleanup stays a separate change.
Round 15 found the prior root correction only covered 2 of the consumer/
promotion comment blocks; markerVariants/TextShimmer/toolVariants/previewVariants
still re-derived the rule or tracked consumers, and streamVariants/LiveIndicator
still assumed a call site that #712 removed. Exhaustively replace every such
block: keep local implementation intent + a short pointer to the README, drop
all consumer counts and promotion derivations. Also drop the README's 'inline
comments may lag' line (no longer needed once the comments don't re-derive).
16 rounds of review showed cleaning inline source comments is a bottomless
local patch: chat.tsx has many historical consumer/call-site mentions (incl.
#712-retired streamVariants dead-code notes), and each fix surfaced an adjacent
one. Root correction per receiving-code-review: keep this PR docs-only (3 READMEs),
revert the index.ts/chat.tsx comment edits to main, and make packages/ui/README.md
the single owner of the barrel promotion rule. Source-comment cleanup and dead-
symbol removal are separate changes.
@Astro-Han
Astro-Hanforce-pushed the docs/frontend-architecture-readmes branch from 113e3c7 to 66bcf23CompareJuly 11, 2026 20:59
@Astro-Han
Astro-Han merged commit 57b73ef into mainJul 11, 2026
3 checks passed
@Astro-Han
Astro-Han deleted the docs/frontend-architecture-readmes branch July 11, 2026 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Astro-Han