Skip to content

Commit ee998c4

Browse files
bsiaotickchongclaude
authored andcommitted
Retheme Ops app with origin/Nage design system (#23775)
## Summary - Migrate Ops from default Lightspark theme to the origin/Nage design system with SuisseIntl font family, updated color palette, and consistent styling - Add local ops-specific Select, TextInput, Dropdown, DataManagerTable, and OpsCommandCenter (⌘K) components with Nage-consistent styling - Make ops Select support caller-provided style overrides (merged on top of defaults) and use compact 12px/32px styling in the header to match the command center trigger button - Migrate all ~40 ops pages from `@lightsparkdev/ui` Select to the local ops Select ## Test Plan - [ ] Verify Ops app loads with new Nage theme (SuisseIntl fonts, updated colors) - [ ] Verify header CoreService select visually matches OpsCommandCenter trigger button height - [ ] Verify all ops pages render correctly with the local Select component - [ ] Verify OpsCommandCenter opens with ⌘K and functions correctly - [ ] Verify theme toggle (Light/Dark/Hardcore) still works - [ ] `yarn workspace @lightsparkdev/ops tsc --noEmit` passes <img width="1293" height="541" alt="Screenshot 2026-02-13 at 7 11 10 PM" src="https://github.com/user-attachments/assets/3ed30972-934e-40e3-a087-c36011d167d2" /> <img width="904" height="395" alt="Screenshot 2026-02-13 at 7 12 01 PM" src="https://github.com/user-attachments/assets/cfb514b6-dbb3-4dbc-8f0e-16fa5f701a57" /> <img width="1358" height="557" alt="Screenshot 2026-02-13 at 7 12 32 PM" src="https://github.com/user-attachments/assets/3d1ef6aa-ebc6-4c1d-a3e4-d123b52a87aa" /> <img width="1287" height="554" alt="Screenshot 2026-02-13 at 7 12 57 PM" src="https://github.com/user-attachments/assets/1231a16d-70ab-4972-b168-445a739a4259" /> <img width="513" height="433" alt="Screenshot 2026-02-13 at 6 32 10 PM" src="https://github.com/user-attachments/assets/9cef811b-34ca-4a00-a6da-1f0e8d14aa66" /> <img width="499" height="427" alt="Screenshot 2026-02-13 at 6 32 22 PM" src="https://github.com/user-attachments/assets/c8c2ddbb-e8a0-4ace-9f84-2ae497e46bd4" /> 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> GitOrigin-RevId: 54b3c84110731cc615218c1249da505abe077367
1 parent cb78970 commit ee998c4

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

packages/ui/src/styles/global.tsx

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,59 +43,71 @@ const getFontImport = (theme: Theme) => {
4343
return importStr;
4444
};
4545

46+
const getFontsBase = () => {
47+
try {
48+
return `${(
49+
import.meta as unknown as { env: Record<string, string> }
50+
).env.BASE_URL.replace(/\/$/, "")}/fonts`;
51+
} catch {
52+
return "/fonts";
53+
}
54+
};
55+
4656
const getFontFaces = (theme: Theme) => {
4757
let fontFacesStr = "";
4858
if (theme.typography.fontFamilies.main === "SuisseIntl") {
59+
const fontsBase = getFontsBase();
4960
fontFacesStr += `
5061
@font-face {
5162
font-family: "SuisseIntl";
52-
src: url("/fonts/SuisseIntl-Light.woff2") format("woff2");
63+
src: url("${fontsBase}/SuisseIntl-Light.woff2") format("woff2");
5364
font-weight: 300;
5465
font-style: normal;
5566
font-display: swap;
5667
}
5768
@font-face {
5869
font-family: "SuisseIntl";
59-
src: url("/fonts/SuisseIntl-Regular.woff2") format("woff2");
70+
src: url("${fontsBase}/SuisseIntl-Regular.woff2") format("woff2");
6071
font-weight: 400;
6172
font-style: normal;
6273
font-display: swap;
6374
}
6475
@font-face {
6576
font-family: "SuisseIntl";
66-
src: url("/fonts/SuisseIntl-Book.woff2") format("woff2");
77+
src: url("${fontsBase}/SuisseIntl-Book.woff2") format("woff2");
6778
font-weight: 450;
6879
font-style: normal;
6980
font-display: swap;
7081
}
7182
@font-face {
7283
font-family: "SuisseIntl";
73-
src: url("/fonts/SuisseIntl-Medium.woff2") format("woff2");
84+
src: url("${fontsBase}/SuisseIntl-Medium.woff2") format("woff2");
7485
font-weight: 500;
7586
font-style: normal;
7687
font-display: swap;
7788
}
7889
@font-face {
7990
font-family: "SuisseIntl";
80-
src: url("/fonts/SuisseIntl-Semibold.woff2") format("woff2");
91+
src: url("${fontsBase}/SuisseIntl-Semibold.woff2") format("woff2");
8192
font-weight: 600;
8293
font-style: normal;
8394
font-display: swap;
8495
}
8596
@font-face {
8697
font-family: "SuisseIntl";
87-
src: url("/fonts/SuisseIntl-Bold.woff2") format("woff2");
98+
src: url("${fontsBase}/SuisseIntl-Bold.woff2") format("woff2");
8899
font-weight: 700;
89100
font-style: normal;
90101
font-display: swap;
91102
}
92103
`;
93104
}
94105
if (theme.typography.fontFamilies.code === "SuisseIntl-Mono") {
106+
const fontsBase = getFontsBase();
95107
fontFacesStr += `
96108
@font-face {
97109
font-family: "SuisseIntl-Mono";
98-
src: url("/fonts/SuisseIntlMono-Regular.woff2") format("woff2");
110+
src: url("${fontsBase}/SuisseIntlMono-Regular.woff2") format("woff2");
99111
font-weight: 400;
100112
font-style: normal;
101113
font-display: swap;

packages/ui/src/styles/themes.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -735,15 +735,17 @@ const bridgeDarkTheme = extend(darkTheme, {
735735
type: Themes.BridgeDark,
736736
});
737737

738+
const nageTypography = getTypography(TypographyGroup.Nage, {
739+
main: "SuisseIntl",
740+
code: "SuisseIntl-Mono",
741+
});
742+
738743
const nageBaseSettings = {
739744
secondary: colors["gray-500"],
740745
tertiary: colors.gray6,
741746
mcNeutral: colors.grayBlue43,
742747
success: colors.green37,
743-
typography: getTypography(TypographyGroup.Nage, {
744-
main: "SuisseIntl",
745-
code: "SuisseIntl-Mono",
746-
}),
748+
typography: nageTypography,
747749
controls: extendBase(lightBaseTheme, {
748750
border: colors["black-10"],
749751
}),
@@ -863,11 +865,23 @@ const nageLightTheme = extend(lightTheme, {
863865
tertiary: colors.gray6,
864866
inputBackground: colors["gray-050"],
865867
danger: colors.red50,
868+
content: extendBase(lightBaseTheme, {
869+
bg: colors.white,
870+
smBg: colors.white,
871+
typography: nageTypography,
872+
buttons: nageBaseSettings.buttons,
873+
loading: nageBaseSettings.loading,
874+
}),
866875
});
867876

868877
const nageDarkTheme = extend(darkTheme, {
869878
...nageBaseSettings,
870879
type: Themes.NageDark,
880+
content: extendBase(darkBaseTheme, {
881+
typography: nageTypography,
882+
buttons: nageBaseSettings.buttons,
883+
loading: nageBaseSettings.loading,
884+
}),
871885
});
872886

873887
const hardcoreButtons = merge<typeof buttonsThemeBase>(buttonsThemeBase, {
@@ -920,7 +934,7 @@ const hardcoreButtons = merge<typeof buttonsThemeBase>(buttonsThemeBase, {
920934
});
921935

922936
const hardcoreBaseTheme: BaseTheme = {
923-
...darkBaseTheme,
937+
...nageDarkTheme,
924938
type: Themes.Hardcore,
925939
bg: colors.black,
926940
smBg: colors.black,

0 commit comments

Comments
 (0)