Repository navigation
Fleet rollout: adopt @mind-studio/ui brand refresh (weave logo + per-app wordmark + typography + ./brand) across all consumersΒ #29
Description
π― Goal
Roll the @mind-studio/ui brand refresh β the interlocking-weave logo, the typography role redefinition (serif h1βh3, mono kbd), and the new React-free ./brand export β out to all 15 remaining consumer apps. Landing is already done (#26); this issue tracks the fleet.
β Added requirement (see π·οΈ Per-app wordmark): the in-app logo lockup must show the product name beside the mark (mark + "Drive"), not "Mind". This needs a small ui <Logo> enhancement and a new release on top of 0.6.0.
π¦ What 0.6.0 ships (the payload)
- Logo β the canonical interlocking-weave mark replaces every old per-app placeholder.
- Typography roles β base-layer rule sets
h1βh3 β var(--font-serif)(Fraunces),kbd β mono;h4βh6stay sans. ./brandsubpath β React-free export ofMIND_MARK_SVG,MIND_MARK_VIEWBOX,MIND_GREEN,monoMarkSvg,MIND_CONSTRUCTION_SVG. Safe to import from plain Node build scripts β favicons/app-icons/OG/manifests authored from one source of truth instead of vendoring a copy that drifts.
π·οΈ Per-app wordmark
Each app's in-app lockup keeps the shared weave mark but labels itself with its own product name, set in the same Fraunces serif, weight, and size as the wordmark:
- Brand / host (landing, shell) β mark + "Mind"
- Product app (drive) β mark + "Drive" Β· slides β "Slides" Β· chat β "Chat" Β· etc.
Today <Logo> hardcodes the wordmark to theme.label ("Mind"). The product name is an app-level fact, not a brand/theme fact, so it should be a prop β not a per-app theme fork.
ui enhancement (new release, e.g. 0.6.1):
- Add optional
label?: stringto<Logo>insrc/components/brand.tsx; default totheme.label(backward compatible). It overrides only the wordmark text, rendered with the existingfont-serif font-semibold text-2xl leading-none tracking-tight. The mark/symbol still comes from the active theme β unchanged. - Accessible name follows the label (e.g. "Drive"); symbol stays
aria-hidden.symbolOnlystill drops the word. - Test:
<Logo label="Drive" />renders "Drive" in the serif wordmark and still renders the theme symbol;<Logo />still renders "Mind". - Release β consumers adopting the lockup target this release.
Scope note:
labelaffects only the in-app<Logo>lockup. Favicons / app-icons / OG / manifest stay mark-only (no word), so the./brandgen-icons pass below is unaffected.
π How it propagates (this is why most of the work is small)
- Typography β automatic. Every consumer already
@imports@mind-studio/ui/dist/styles.cssinglobals.css. The serif rule resolves--font-serif β --mind-font-serif β var(--font-fraunces)inside the package, so headings flip to Fraunces on bump β provided the app exposes a--font-frauncesvariable (they all load Fraunces today; just confirm the variable name). - Component logos β automatic. Anywhere the app renders the ui
<Symbol>/<Logo>component, the weave arrives on bump (onlyprojectsdoes this today). The product wordmark needs the newlabelprop (above). - Static brand assets β manual. Favicons/app-icons/manifests/OG images are local files; they must be regenerated from
./brand. This is the only large per-app effort, and only for user-facing apps.
π Reference implementation: landing β scripts/gen-icons.mjs (imports @mind-studio/ui/brand) β src/app/{icon.svg, apple-icon.png, manifest.ts, opengraph-image.tsx}.
πΊοΈ Fleet state (survey, 2026-06-21)
All 15 are Next.js 16 app-router + Tailwind v4 (shell also Tauri), all already import the ui stylesheet. No conflicting h1βh3 CSS overrides found anywhere β clean adopters.
| App | ui now | Logo today | Action |
|---|---|---|---|
| builder | 0.4.0 | old amber diamond icon.svg |
bump + π·οΈ lockup label="Builder" + π¨ full asset pass |
| calendar | 0.4.0 | old teal calendar icon.svg |
bump + π·οΈ lockup label="Calendar" + π¨ full asset pass |
| chat | 0.4.0 | old cyan/magenta bubble icon.svg |
bump + π·οΈ lockup label="Chat" + π¨ full asset pass |
| drive | 0.5.0 | old cyan "M" icon.svg |
bump + π·οΈ lockup label="Drive" + π¨ full asset pass |
| slides | 0.4.0 | old teal "M" icon.svg |
bump + π·οΈ lockup label="Slides" + π¨ full asset pass |
| videos | 0.4.0 | play-button icon.svg |
bump + π·οΈ lockup label="Videos" + π¨ full asset pass |
| shell | 0.5.0 | old indigo/cyan arrow icon.svg + Tauri icons |
bump + π·οΈ lockup "Mind" (host) + π¨ full asset pass + π₯οΈ Tauri desktop icons |
| dock | 0.4.0 | custom β¦ in TopBar.tsx chrome |
bump + π swap β¦ β <Logo> (label per context) |
| projects | 0.3.0 | renders ui <Symbol> (auto) |
bump + π·οΈ adopt <Logo label="Projects"> where the wordmark shows |
| codespaces | 0.4.0 | text-only ("Mind Codespaces") | bump + π·οΈ <Logo label="Codespaces"> for the header |
| contacts | 0.4.0 | text-only ("Mind Contacts") | bump + π·οΈ <Logo label="Contacts"> for the header |
| product | 0.4.0 | none | bump only (typography) |
| notes | 0.4.0 | none | bump only |
| photos | 0.4.0 | none | bump only |
| whiteboard | 0.5.0 | none | bump only |
π¦ Rollout plan
Tier 0 β ui enabling release β prerequisite for the wordmark work
- Land the
<Logo label>enhancement above; cut a release (e.g. 0.6.1). This becomes the bump target for any app adopting the in-app lockup.
Tier 1 β Universal bump (all 15) β delivers typography + state tokens + auto logos
- Bump
@mind-studio/uiβ the new release, reinstall,pnpm build && pnpm typecheckgreen. (projects0.3.0 and the 0.4.0 cohort also pick up the 0.5.0 semantic-state tokens in the same jump.)
Tier 2 β Typography QA (all 15, cheap)
- Confirm each app exposes
--font-frauncessoh1βh3render Fraunces, not system serif; alias where the variable is named differently (dock/photos/product/codespaces use--mind-font-*bridges β verify the chain reaches--font-fraunces). - Visually confirm headings serif / body sans /
kbdmono; drop now-redundant manual.font-displayon headings.
Tier 3 β In-app lockup π·οΈ (mark + product name)
- Replace each app's text/placeholder logo in nav/header with
<Logo label="<Product>" />per the table; landing/shell stay<Logo />β "Mind". - dock β swap the
β¦BrandMarkinsrc/components/TopBar.tsxfor<Logo>.
Tier 4 β Static brand assets, user-facing apps π¨ (builder, calendar, chat, drive, slides, videos, shell)
Per app, port landing's pattern (mark-only, no wordmark):
- Add
scripts/gen-icons.mjsimporting@mind-studio/ui/brand; wire agen:iconsscript. - Replace the old placeholder
src/app/icon.svgwith the gradient weave (legible to 16px). - Add
apple-icon.png(180Γ180, white mono mark on brand-green, 22% radius). - Add
manifest.ts(theme-color: #16B88A, 192/512 maskable green icons). - Add
opengraph-image.tsxrendering the real mark. - shell only: regenerate the Tauri desktop bundle icons from the same source.
Tier 5 β Internal-tool assets (product, notes, photos, whiteboard) β optional / deferred
- No user-facing favicon/OG today. Bump (Tier 1) is enough; author brand assets only if/when they go user-facing.
π§° DS enhancement (recommended, avoids 7Γ copy-paste drift)
- Ship a reusable
gen-iconshelper fromui(e.g.@mind-studio/ui/scripts/gen-iconsor a documented snippet) so the asset-pass apps consume one script instead of vendoringgen-icons.mjsseven times β same anti-drift rationale as the./brandexport.
β Acceptance criteria
-
uiships<Logo label>; released; consumers on that version. - All 15 consumers build + typecheck green on the new release.
- Headings render Fraunces serif, body sans,
kbdmono across the fleet. - Every in-app lockup shows the weave mark + its product name in Fraunces serif (drive β "Drive", etc.); landing/shell show "Mind". No old placeholder marks remain;
dockchrome andprojectsshow the weave. - User-facing apps (builder, calendar, chat, drive, slides, videos, shell) ship favicon + apple-touch + manifest + OG authored from
./brand(mark-only); shell homescreen/desktop icon is the green app icon. - No vendored mark copies; static assets trace to
@mind-studio/ui/brand.
π Related
- Ship logo + typography to landing (release 0.6.0 β bump β icons)Β #26 β landing rollout (the reference implementation)
- Verify & close β design-system remediationΒ #21 β prior cross-repo design-system closeout (house style for fleet trackers)
Suggested execution: land Tier 0 (
<Logo label>+ release) β bump fleet (Tier 1) β lockup + asset passes per repo. File a per-repo sub-issue (ready-for-agent) from each table row. Conventional Commits, no JIRA id.
Activity
[-]Fleet rollout: adopt @mind-studio/ui@0.6.0 brand refresh (logo + typography + ./brand) across all consumers[/-][+]Fleet rollout: adopt @mind-studio/ui brand refresh (weave logo + per-app wordmark + typography + ./brand) across all consumers[/+]rep0x commentedon Jun 21, 2026
π§ Tier 0 in progress β
<Logo label>enhancement implemented in #30 (per-app wordmark: mark + product name in the brand serif; defaults to "Mind"; backward compatible). 228 tests + typecheck + build green.Next on the critical path: merge #30 β merge the release-please PR to cut the enabling release β then Tier 1 (fleet bump) can begin. This will be a
featminor (β 0.7.0), not 0.6.1, per the repo's Conventional-Commits release flow.rep0x commentedon Jun 21, 2026
β Wave 1 β Tier 1 (universal bump) + Tier 2 (typography QA) complete
All 15 consumers bumped to
@mind-studio/ui0.7.0 on isolated worktrees off each repo'sorigin/main(no in-flight branches/dirty trees touched). Every PR is typecheck + build green.π Cross-cutting findings
projectsdoes not load the Fraunces webfont (its theme defines only sans/mono; fonts are Geist/Space Grotesk). Headings fall back to Georgia/system serif. No misleading alias was added β needs the font actually loaded as a follow-up before Tier 2 is truly satisfied there.NODE_AUTH_TOKENwas unset locally β every install had to source it fromgh auth tokenfor the GitHub Packages registry. Confirm CI on these PRs has the token wired.package-lock.json); pnpm forproduct(andcalendar).chattracks no lockfile, so onlypackage.jsonwas committed there.--no-verify: the pre-push hook hit flaky tests (102/102 verified green 8Γ by hand); not bump-related.npm run wasm) for a clean local typecheck; pre-existing env quirk, not bump-related.βοΈ Next β Wave 2 (Tier 3 + Tier 4)
<Logo label="<Product>">): drive, slides, chat, calendar, builder, videos, codespaces, contacts, projects, dock (β¦β<Logo>). landing/shell stay "Mind"../brand): builder, calendar, chat, drive, slides, videos, shell (+ Tauri).projectsFraunces follow-up.