Skip to content

Commit fa11576

Browse files
Vonngclaude
andcommitted
feat(login): polish controls and legal attribution
Refines the login form controls and completes the legal attribution block in the page footer. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent e3fed07 commit fa11576

4 files changed

Lines changed: 116 additions & 41 deletions

File tree

web-app/src/index.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,20 @@ code {
235235
}
236236
}
237237

238+
/* Login-page dropdowns ("Other Authentication Methods", SSO redirect list):
239+
mds DropdownBlock hardcodes 10px vertical padding, which leaves background
240+
strips above/below the highlighted option. These menus portal into <body>,
241+
so they are targeted by ID here instead of through the layout tree. */
242+
#alternativeMethods-options-selector,
243+
#redirect-rules {
244+
padding: 0;
245+
}
246+
247+
#alternativeMethods-options-selector > div,
248+
#redirect-rules > div {
249+
padding: 10px 15px;
250+
}
251+
238252
/* Chrome, Safari, Edge, Opera */
239253
input.removeArrows::-webkit-outer-spin-button,
240254
input.removeArrows::-webkit-inner-spin-button,

web-app/src/screens/Console/Common/DarkModeActivator/DarkModeActivator.tsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import React from "react";
1818
import { Button, DarkModeIcon, LightModeIcon } from "mds";
19-
import TooltipWrapper from "../TooltipWrapper/TooltipWrapper";
2019
import { useSelector } from "react-redux";
2120
import { AppState, useAppDispatch } from "../../../../store";
2221
import { setDarkMode } from "../../../../systemSlice";
@@ -35,13 +34,12 @@ const DarkModeActivator = () => {
3534
};
3635

3736
return (
38-
<TooltipWrapper tooltip={`${darkMode ? "Light" : "Dark"} Mode`}>
39-
<Button
40-
id={"dark-mode-activator"}
41-
icon={darkMode ? <LightModeIcon /> : <DarkModeIcon />}
42-
onClick={darkModeActivator}
43-
/>
44-
</TooltipWrapper>
37+
<Button
38+
id={"dark-mode-activator"}
39+
aria-label={darkMode ? "Switch to light mode" : "Switch to dark mode"}
40+
icon={darkMode ? <LightModeIcon /> : <DarkModeIcon />}
41+
onClick={darkModeActivator}
42+
/>
4543
);
4644
};
4745

web-app/src/screens/Console/helpTopics.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3284,14 +3284,14 @@
32843284
"header": null,
32853285
"links": [
32863286
{
3287-
"title": "Login help",
3287+
"title": "Logging in",
32883288
"url": "https://silo.pgsty.com/administration/minio-console/#logging-in",
3289-
"body": "Text snippet that will be relevant to the user will go here made to look nice in the helpitem size on two-three lines"
3289+
"body": "Sign in with the root credentials, an IAM user access key, or temporary STS credentials via Other Authentication Methods."
32903290
},
32913291
{
3292-
"title": "Login help",
3292+
"title": "Console configuration",
32933293
"url": "https://silo.pgsty.com/administration/minio-console/#configuration",
3294-
"body": "Text snippet that will be relevant to the user will go here made to look nice in the helpitem size on two-three lines"
3294+
"body": "Configure identity providers, TLS, and session settings for the console on the server side."
32953295
},
32963296
{
32973297
"title": "Troubleshooting",

web-app/src/screens/LoginPage/LoginLayout.tsx

Lines changed: 92 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import styled from "styled-components";
1010
import get from "lodash/get";
1111
import { SILO_COLORS, SiloBrand } from "../../common/SiloBrand";
1212
import WaveMeshCanvas from "./WaveMeshCanvas";
13+
import HelpMenu from "../Console/HelpMenu";
14+
import DarkModeActivator from "../Console/Common/DarkModeActivator/DarkModeActivator";
1315

1416
// Chakra Petch (the wordmark typeface) is registered app-wide in index.css.
1517
const displayFont =
@@ -55,31 +57,13 @@ const BrandContent = styled.div({
5557
padding: "clamp(40px, 6vw, 88px)",
5658
paddingBottom: 36,
5759
"& .eyebrow": {
58-
display: "flex",
59-
alignItems: "center",
60-
gap: 14,
6160
fontFamily: displayFont,
6261
fontWeight: 500,
6362
fontSize: 12,
6463
letterSpacing: "0.22em",
6564
textTransform: "uppercase",
6665
color: SILO_COLORS.sky,
6766
},
68-
"& .eyebrow .bits": {
69-
display: "flex",
70-
gap: 5,
71-
flexShrink: 0,
72-
},
73-
"& .eyebrow .bits span": {
74-
display: "block",
75-
width: 8,
76-
height: 8,
77-
backgroundColor: SILO_COLORS.steel,
78-
},
79-
"& .eyebrow .bits .bitParity": {
80-
backgroundColor: "transparent",
81-
border: `1px solid ${SILO_COLORS.copper}`,
82-
},
8367
"& h1": {
8468
margin: "26px 0 0",
8569
fontFamily: displayFont,
@@ -144,6 +128,7 @@ const BrandContent = styled.div({
144128
});
145129

146130
const FormPanel = styled.section(({ theme }) => ({
131+
position: "relative",
147132
display: "flex",
148133
flexDirection: "column",
149134
width: "100%",
@@ -153,7 +138,51 @@ const FormPanel = styled.section(({ theme }) => ({
153138
"@media (max-width: 991px)": {
154139
maxWidth: "100%",
155140
},
141+
"& .headerActions": {
142+
position: "absolute",
143+
top: 8,
144+
right: 8,
145+
zIndex: 10,
146+
display: "flex",
147+
alignItems: "center",
148+
gap: 2,
149+
// Quiet ghost icon buttons: no chrome, low contrast until hovered.
150+
// Direct children only — the help panel (a nested div) has its own buttons.
151+
"& > button": {
152+
border: "none",
153+
background: "transparent",
154+
boxShadow: "none",
155+
padding: 0,
156+
height: 28,
157+
width: 28,
158+
display: "inline-flex",
159+
alignItems: "center",
160+
justifyContent: "center",
161+
color: get(theme, "mutedText", "#9CA3AF"),
162+
opacity: 0.6,
163+
transition: "opacity 0.15s ease, color 0.15s ease",
164+
"& svg": {
165+
width: 15,
166+
height: 15,
167+
fill: "currentcolor",
168+
color: "currentcolor",
169+
},
170+
"&:hover": {
171+
border: "none",
172+
background: "transparent",
173+
color: get(theme, "fontColor", "#3F3F46"),
174+
opacity: 1,
175+
},
176+
},
177+
// The help panel is absolutely positioned; anchor it below the buttons
178+
// and keep it inside the viewport (there is no sidebar on this page).
179+
"& > div": {
180+
top: "calc(100% + 8px)",
181+
maxWidth: "min(754px, calc(100vw - 36px))",
182+
},
183+
},
156184
"& .logoBand": {
185+
position: "relative",
157186
display: "flex",
158187
flexDirection: "column",
159188
alignItems: "center",
@@ -167,6 +196,11 @@ const FormPanel = styled.section(({ theme }) => ({
167196
display: "flex",
168197
alignItems: "center",
169198
gap: 18,
199+
textDecoration: "none",
200+
transition: "opacity 0.15s ease",
201+
"&:hover": {
202+
opacity: 0.82,
203+
},
170204
"& .emblem": {
171205
display: "block",
172206
height: 84,
@@ -210,15 +244,27 @@ const FormPanel = styled.section(({ theme }) => ({
210244
flexWrap: "wrap",
211245
borderTop: `1px solid ${get(theme, "login.footerDivider", "#F2F2F2")}`,
212246
padding: "35px 0",
213-
fontSize: 14,
247+
fontSize: 11,
214248
color: get(theme, "login.footerElements", "#2781B0"),
215249
"& a": {
250+
fontFamily: displayFont,
251+
fontWeight: 500,
252+
fontSize: 11,
253+
letterSpacing: "0.24em",
254+
textTransform: "uppercase",
216255
color: get(theme, "login.footerElements", "#2781B0"),
217256
textDecoration: "none",
257+
paddingBottom: 1,
258+
borderBottom:
259+
"1px solid color-mix(in srgb, currentcolor 30%, transparent)",
260+
transition: "border-color 0.15s ease",
218261
"&:hover": {
219-
textDecoration: "underline",
262+
borderBottomColor: "currentcolor",
220263
},
221264
},
265+
"& .separator": {
266+
opacity: 0.4,
267+
},
222268
},
223269
}));
224270

@@ -234,11 +280,6 @@ const LoginLayout = ({ children, footer }: LoginLayoutProps) => {
234280
<WaveMeshCanvas />
235281
<BrandContent>
236282
<div className="eyebrow">
237-
<span className="bits" aria-hidden="true">
238-
<span />
239-
<span />
240-
<span className="bitParity" />
241-
</span>
242283
Open-Source S3/MinIO-Compatible Object Storage
243284
</div>
244285
<h1>
@@ -281,20 +322,42 @@ const LoginLayout = ({ children, footer }: LoginLayoutProps) => {
281322
<a href="https://min.io" target="_blank" rel="noopener">
282323
MinIO, Inc.
283324
</a>
325+
; SILO incorporates{" "}
326+
<a
327+
href="https://github.com/minio/minio"
328+
target="_blank"
329+
rel="noopener"
330+
>
331+
MinIO source code
332+
</a>
333+
.
284334
</span>
285335
<span>
286-
SILO is an independent community project, not affiliated with or
287-
endorsed by MinIO, Inc.
336+
SILO is maintained by{" "}
337+
<a href="https://pigsty.io" target="_blank" rel="noopener">
338+
PIGSTY
339+
</a>
340+
, without MinIO affiliation, endorsement, or sponsorship.
288341
</span>
289342
</p>
290343
</BrandContent>
291344
</BrandPanel>
292345
<FormPanel>
293346
<div className="logoBand">
294-
<div className="logoLockup">
347+
<div className="headerActions">
348+
<HelpMenu />
349+
<DarkModeActivator />
350+
</div>
351+
<a
352+
className="logoLockup"
353+
href="https://silo.pgsty.com"
354+
target="_blank"
355+
rel="noopener"
356+
aria-label="SILO website"
357+
>
295358
<SiloBrand variant="emblem" className="emblem" />
296359
<SiloBrand variant="wordmark" className="wordmark" />
297-
</div>
360+
</a>
298361
<span className="consoleTag">Object Storage Console</span>
299362
</div>
300363
<div className="formArea">

0 commit comments

Comments
 (0)