You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit affe5de
Browse filesBrowse the repository at this point in the historyBrowse files
feat(web): let users add their own themes from ~/.thinkrail/themes (#937)
* feat(contracts): add the user theme files wire surface
* feat(server): serve and watch user theme files
* feat(web): install user theme files into the theme catalog
* feat(web): show the custom themes folder in Appearance settings
* test(e2e): cover user theme files from folder to picker
* fix(themes): bound the first-paint cache and harden user theme reading
* docs(specs): record user theme files as runtime data
* docs(specs): move user theme files to protocol v92
* feat(web): namespace user theme ids under user.
* fix(web): pick fallback and derived pair themes from bundled themes only
* fix(locales): word the theme fallback notice for deleted user themes
* docs(themes): record the manifest compatibility rule and the deferred theme work
* fix(web): report an over-long user theme id through a locale key
Copy file name to clipboardExpand all lines: apps/web/SPEC.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -170,7 +170,7 @@ change. `dist/` therefore has no profiler timers (`actualStartTime` is absent fr
170
170
the runtime graph is acyclic), `lib` (plain-HTTP-safe random page identity)
171
171
-`components` → `lib` (`ErrorBoundary`'s `shallowEqualArrays` for its reset keys) and `constants` (`RunningIcon` draws the shared brand monogram) — both leaves, so any region can still wrap in it; presentational controls consume `ui`
172
172
-`lib` → `themes` (the lazy highlighter uses the one generic CSS-variable Shiki registration), React (the phone-viewport hook only), and `contracts` (types only, e.g. the MCP state vocabulary's `McpServerState`)
173
-
-`themes` → `constants` (the branding storage prefix scopes the first-paint hint), `clientPreferences` (native-stable hint storage)
173
+
-`themes` → `constants` (the branding storage prefix scopes the first-paint hint and the user-theme cache), `clientPreferences` (native-stable hint storage); `transport` hydrates the store's user-theme snapshot and `shell`'s theme effect installs it
174
174
-`i18n` → `store`, `contracts` (types), `@thinkrail/locales`; `transport` hydrates the store's local-language snapshot, `main.tsx`'s `App` mounts `useLocaleSync` once and `panels` renders the Language page from its pure derivations
175
175
-**Any module may → `@thinkrail/locales/react`** (`useT`, `<T>`, `currentLocale`) for its UI text — the one cross-cutting edge besides `lib`; user-facing text is never a literal ([[architecture]] Decision 23)
0 commit comments