@@ -10,6 +10,8 @@ import styled from "styled-components";
1010import get from "lodash/get" ;
1111import { SILO_COLORS , SiloBrand } from "../../common/SiloBrand" ;
1212import 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.
1517const 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
146130const 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