Skip to content

Commit cee8e30

Browse files
committed
feat: theme shared status icons
1 parent e17f3a9 commit cee8e30

5 files changed

Lines changed: 77 additions & 14 deletions

File tree

packages/web/src/components/ui/confirm-dialog/index.module.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
}
88

99
.titleDanger {
10-
color: var(--color-warning);
10+
color: var(--icon-warning);
1111
}
1212

1313
.iconDanger {
1414
flex: none;
15+
color: var(--icon-warning);
1516
}

packages/web/src/components/ui/toast/index.module.css

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,24 +64,35 @@
6464
}
6565

6666
.success .icon {
67-
color: var(--color-success);
67+
color: var(--icon-success);
68+
background: var(--icon-surface-success);
6869
}
6970

7071
.error .icon {
71-
color: var(--color-error);
72+
color: var(--icon-error);
73+
background: var(--icon-surface-error);
7274
}
7375

7476
.warning .icon {
75-
color: var(--color-warning);
77+
color: var(--icon-warning);
78+
background: var(--icon-surface-warning);
7679
}
7780

7881
.info .icon {
79-
color: var(--color-info);
82+
color: var(--icon-info);
83+
background: var(--icon-surface-info);
8084
}
8185

8286
.icon {
8387
margin-top: 1px;
88+
display: inline-flex;
89+
width: 20px;
90+
height: 20px;
8491
flex-shrink: 0;
92+
align-items: center;
93+
justify-content: center;
94+
border-radius: var(--radius-sm);
95+
background: var(--icon-surface-subtle);
8596
}
8697

8798
.content {

packages/web/src/features/settings/components/config-editor.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,9 @@ export function ConfigEditor({
246246
{saveStatus === "saving" ? (
247247
<Spinner label={config.text} size="sm" />
248248
) : (
249-
<config.icon size={14} />
249+
<span className="config-status__icon" aria-hidden="true">
250+
<config.icon size={14} />
251+
</span>
250252
)}
251253
<span>{config.text}</span>
252254
</div>

packages/web/src/styles/components.css

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7131,16 +7131,16 @@ textarea.input {
71317131
}
71327132

71337133
.toast--success .toast__icon {
7134-
color: var(--color-success);
7134+
color: var(--icon-success);
71357135
}
71367136
.toast--error .toast__icon {
7137-
color: var(--color-error);
7137+
color: var(--icon-error);
71387138
}
71397139
.toast--warning .toast__icon {
7140-
color: var(--color-warning);
7140+
color: var(--icon-warning);
71417141
}
71427142
.toast--info .toast__icon {
7143-
color: var(--color-info);
7143+
color: var(--icon-info);
71447144
}
71457145

71467146
.toast__icon {
@@ -7513,20 +7513,25 @@ textarea.input {
75137513
white-space: nowrap;
75147514
}
75157515

7516+
.config-status__icon {
7517+
display: inline-flex;
7518+
align-items: center;
7519+
}
7520+
75167521
.config-status--success {
7517-
color: var(--color-success);
7522+
color: var(--icon-success);
75187523
}
75197524

75207525
.config-status--warning {
7521-
color: var(--color-warning, #f59e0b);
7526+
color: var(--icon-warning);
75227527
}
75237528

75247529
.config-status--info {
7525-
color: var(--color-info, #3b82f6);
7530+
color: var(--icon-info);
75267531
}
75277532

75287533
.config-status--error {
7529-
color: var(--color-error);
7534+
color: var(--icon-error);
75307535
}
75317536

75327537
/* Body */

packages/web/src/styles/components.theme.test.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ const noticeStylesheet = readFileSync(
2020
`${process.cwd()}/src/components/ui/notice/index.module.css`,
2121
"utf8"
2222
);
23+
const toastStyles = readFileSync(
24+
`${process.cwd()}/src/components/ui/toast/index.module.css`,
25+
"utf8"
26+
);
27+
const confirmDialogStyles = readFileSync(
28+
`${process.cwd()}/src/components/ui/confirm-dialog/index.module.css`,
29+
"utf8"
30+
);
2331

2432
function getLastGroupedRuleBlockFrom(source: string, pattern: RegExp) {
2533
const matches = Array.from(source.matchAll(pattern));
@@ -103,6 +111,42 @@ describe("components.css theme-sensitive surfaces", () => {
103111
expect(getLastRuleBlock(".mobile-dock__icon")).toContain("color: currentColor");
104112
});
105113

114+
it("keeps toast icons on icon semantic tokens instead of raw status colors", () => {
115+
expect(getLastRuleBlock(".toast--success .toast__icon")).toContain("var(--icon-success)");
116+
expect(getLastRuleBlock(".toast--error .toast__icon")).toContain("var(--icon-error)");
117+
expect(getLastRuleBlock(".toast--warning .toast__icon")).toContain("var(--icon-warning)");
118+
expect(getLastRuleBlock(".toast--info .toast__icon")).toContain("var(--icon-info)");
119+
expect(getLastRuleBlockFrom(toastStyles, ".success .icon")).toContain(
120+
"background: var(--icon-surface-success)"
121+
);
122+
expect(getLastRuleBlockFrom(toastStyles, ".error .icon")).toContain(
123+
"background: var(--icon-surface-error)"
124+
);
125+
expect(getLastRuleBlockFrom(toastStyles, ".warning .icon")).toContain(
126+
"background: var(--icon-surface-warning)"
127+
);
128+
expect(getLastRuleBlockFrom(toastStyles, ".info .icon")).toContain(
129+
"background: var(--icon-surface-info)"
130+
);
131+
expect(getLastRuleBlockFrom(toastStyles, ".success .icon")).toContain("var(--icon-success)");
132+
});
133+
134+
it("keeps confirm dialog danger icons on icon tokens", () => {
135+
expect(getLastRuleBlockFrom(confirmDialogStyles, ".titleDanger")).toContain(
136+
"var(--icon-warning)"
137+
);
138+
expect(getLastRuleBlockFrom(confirmDialogStyles, ".iconDanger")).toContain(
139+
"color: var(--icon-warning)"
140+
);
141+
});
142+
143+
it("keeps config status colors on icon tokens", () => {
144+
expect(getLastRuleBlock(".config-status--success")).toContain("var(--icon-success)");
145+
expect(getLastRuleBlock(".config-status--warning")).toContain("var(--icon-warning)");
146+
expect(getLastRuleBlock(".config-status--info")).toContain("var(--icon-info)");
147+
expect(getLastRuleBlock(".config-status--error")).toContain("var(--icon-error)");
148+
});
149+
106150
it("exposes global mobile safe-area tokens so standalone mobile views keep their padding", () => {
107151
expect(tokensStylesheet).toContain("--mobile-safe-top: env(safe-area-inset-top, 0px);");
108152
expect(tokensStylesheet).toContain("--mobile-safe-right: env(safe-area-inset-right, 0px);");

0 commit comments

Comments
 (0)