mirror of
				https://github.com/khairul169/honey.git
				synced 2025-10-30 06:59:32 +07:00 
			
		
		
		
	Turn About page into a very fancy playground
This commit is contained in:
		
							parent
							
								
									d100e582b9
								
							
						
					
					
						commit
						326c8f3352
					
				
							
								
								
									
										19
									
								
								css/dark.css
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								css/dark.css
									
									
									
									
									
								
							| @ -23,6 +23,23 @@ a { | ||||
| 	background: #FFF1; | ||||
| } | ||||
| .box .icon { | ||||
| 	background: hsl(var(--color), 100%, 22%); | ||||
| 	background: hsl(var(--color), 100%, 18%); | ||||
| 	color: hsl(var(--color), 100%, 85%); | ||||
| } | ||||
| .selector { | ||||
| 	position: relative; | ||||
| 	background: #0008; | ||||
| } | ||||
| .selector .bg { | ||||
| 	background: #FFF1; | ||||
| } | ||||
| .setting { | ||||
| 	background: #1118; | ||||
| } | ||||
| .setting:hover { | ||||
| 	background: #2228; | ||||
| } | ||||
| .setting.checked { | ||||
| 	background: #36F; | ||||
| 	box-shadow: 2px 2px 8px #36F8; | ||||
| } | ||||
							
								
								
									
										116
									
								
								css/main.css
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								css/main.css
									
									
									
									
									
								
							| @ -21,10 +21,10 @@ body { | ||||
| a { | ||||
| 	color: #44F; | ||||
| } | ||||
| body.init * { | ||||
| .init * { | ||||
| 	transition: none !important; | ||||
| } | ||||
| body.init .page { | ||||
| .init .page { | ||||
| 	transition: opacity .3s, top .3s !important; | ||||
| } | ||||
| .icon { | ||||
| @ -116,6 +116,7 @@ body.init .page { | ||||
| 	text-align: center; | ||||
| 	overflow: hidden; | ||||
| 	min-width: 340px; | ||||
| 	transition: background .2s; | ||||
| } | ||||
| .home .wrapper { | ||||
| 	box-shadow: none; | ||||
| @ -169,6 +170,7 @@ body.init .page { | ||||
| 	background: #EEE8; | ||||
| 	margin: 20px; | ||||
| 	backdrop-filter: blur(16px); | ||||
| 	transition: background .2s; | ||||
| } | ||||
| 
 | ||||
| .back .icon { | ||||
| @ -196,7 +198,7 @@ body.init .page { | ||||
| 	flex-wrap: wrap; | ||||
| } | ||||
| .static { | ||||
| 	margin: 24px 6px 16px; | ||||
| 	margin: 16px 6px; | ||||
| } | ||||
| .static .box:hover { | ||||
| 	background: transparent; | ||||
| @ -252,4 +254,112 @@ a.box { | ||||
| } | ||||
| .header .text { | ||||
| 	font-size: 26px; | ||||
| } | ||||
| 
 | ||||
| .selector { | ||||
| 	position: relative; | ||||
| 	background: #FFF8; | ||||
| 	margin: 18px auto; | ||||
| 	border-radius: 16px; | ||||
| 	display: flex; | ||||
| 	align-items: center; | ||||
| 	overflow: hidden; | ||||
| 	width: calc(100% - 32px); | ||||
| 	max-width: 640px; | ||||
| 	transition: color .2s, background .2s; | ||||
| } | ||||
| .selector .bg { | ||||
| 	position: absolute; | ||||
| 	width: calc(100% / var(--screens) - 8px); | ||||
| 	height: calc(100% - 8px); | ||||
| 	background: #0001; | ||||
| 	top: 50%; | ||||
| 	left: 0; | ||||
| 	margin-left: 4px; | ||||
| 	border-radius: 12px; | ||||
| 	transform: translateY(-50%); | ||||
| 	transition: all .4s; | ||||
| } | ||||
| .selector .entry { | ||||
| 	margin: 0 auto; | ||||
| 	width: 100%; | ||||
| 	display: flex; | ||||
| 	align-items: center; | ||||
| 	padding: 14px; | ||||
| 	margin: 2px; | ||||
| 	z-index: 1; | ||||
| 	cursor: pointer; | ||||
| } | ||||
| .selector .entry > div { | ||||
| 	margin: 0 auto; | ||||
| } | ||||
| 
 | ||||
| .split { | ||||
| 	display: flex; | ||||
| 	align-items: center; | ||||
| 	justify-content: space-between; | ||||
| 	text-align: right; | ||||
| 	padding: 80px 24px; | ||||
| 	max-width: 480px; | ||||
| 	margin: 0 auto; | ||||
| } | ||||
| .split .fancy { | ||||
| 	font-size: 80px; | ||||
| } | ||||
| .split .pp > b { | ||||
| 	font-size: 48px; | ||||
| 	margin-right: 2px; | ||||
| } | ||||
| .split .text { | ||||
| 	max-width: 240px; | ||||
| 	margin-left: auto; | ||||
| 	opacity: .6; | ||||
| } | ||||
| .split .right { | ||||
| 	margin-right: 8px; | ||||
| } | ||||
| 
 | ||||
| .screens { | ||||
| 	display: flex; | ||||
| 	width: calc(100% * var(--screens)); | ||||
| 	align-items: flex-start; | ||||
| 	transition: all .4s; | ||||
| } | ||||
| .screen { | ||||
| 	width: 100%; | ||||
| 	height: auto; | ||||
| } | ||||
| .screen.hidden { | ||||
| 	height: 0; | ||||
| } | ||||
| 
 | ||||
| .settings { | ||||
| 	margin: 12px 16px 32px; | ||||
| } | ||||
| .setting { | ||||
| 	background: #FFF8; | ||||
| 	max-width: 640px; | ||||
| 	border-radius: 16px; | ||||
| 	margin: 8px auto; | ||||
| 	display: flex; | ||||
| 	align-items: center; | ||||
| 	padding: 12px; | ||||
| 	text-align: left; | ||||
| 	cursor: pointer; | ||||
| 	transition: background .2s, color .2s, box-shadow .2s; | ||||
| } | ||||
| .setting:hover { | ||||
| 	background: #DDD8; | ||||
| } | ||||
| .setting .icon { | ||||
| 	margin-right: 8px; | ||||
| 	padding: 12px; | ||||
| } | ||||
| .setting .desc { | ||||
| 	opacity: .6; | ||||
| } | ||||
| .setting.checked { | ||||
| 	color: #EEE; | ||||
| 	background: #56F; | ||||
| 	box-shadow: 2px 2px 8px #56F8; | ||||
| } | ||||
							
								
								
									
										147
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								index.html
									
									
									
									
									
								
							| @ -32,9 +32,9 @@ | ||||
| 						<div class="icon">apps</div> | ||||
| 						<div class="text">Services</div> | ||||
| 					</div> | ||||
| 					<div onclick="show('page-about')"> | ||||
| 						<div class="icon">info</div> | ||||
| 						<div class="text">About</div> | ||||
| 					<div onclick="show('page-more')"> | ||||
| 						<div class="icon">more</div> | ||||
| 						<div class="text">More</div> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| @ -49,44 +49,125 @@ | ||||
| 				<div class="boxes" id="applist"></div> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		<div class="page hidden" id="page-about"> | ||||
| 		<div class="page hidden" id="page-more" style="--screens: 3"> | ||||
| 			<div class="back"><div class="icon"></div></div> | ||||
| 			<div class="wrapper"> | ||||
| 				<div class="header"> | ||||
| 					<div class="icon">info</div> | ||||
| 					<div class="text">About</div> | ||||
| 				<div class="selector"> | ||||
| 					<div class="bg"></div> | ||||
| 					<div class="entry" onclick="open_screen(this)"> | ||||
| 						<div>Security</div> | ||||
| 					</div> | ||||
| 					<div class="entry" onclick="open_screen(this)"> | ||||
| 						<div>Settings</div> | ||||
| 					</div> | ||||
| 					<div class="entry" onclick="open_screen(this)"> | ||||
| 						<div>About</div> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 				<img src="img/appicon.png" class="appicon"> | ||||
| 				<div class="appname about">honey</div> | ||||
| 				<div class="appdesc">Nice and sweet place for all your self-hosted services.</div> | ||||
| 				<div class="appdesc">Source: <a href="https://gitlab.com/dani3l0/honey" target="_blank">gitlab.com/dani3l0/honey</a></div> | ||||
| 				<div class="boxes static"> | ||||
| 					<div class="box"> | ||||
| 						<div class="icon" style="--color: 0deg">code</div> | ||||
| 						<div> | ||||
| 							<div class="name">Open Source</div> | ||||
| 							<div class="desc">Code is publicly available. Download, modify, collaborate, whatever.</div> | ||||
| 				<div class="screens"> | ||||
| 					<div class="screen"> | ||||
| 						<div class="split"> | ||||
| 							<div class="icon fancy">shield</div> | ||||
| 							<div class="right"> | ||||
| 								<div class="pp"><b id="security-pp">85</b>%</div> | ||||
| 								<div class="text">6 out of 7 listed services use encrypted connections</div> | ||||
| 							</div> | ||||
| 						</div> | ||||
| 						<div class="boxes static"> | ||||
| 							<div class="box"> | ||||
| 								<div class="icon" style="--color: 0deg">code</div> | ||||
| 								<div> | ||||
| 									<div class="name">Open Source</div> | ||||
| 									<div class="desc">Code is publicly available. Download, modify, collaborate, whatever.</div> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 							<div class="box"> | ||||
| 								<div class="icon" style="--color: 144deg">mop</div> | ||||
| 								<div> | ||||
| 									<div class="name">Simple & Clean</div> | ||||
| 									<div class="desc">Interface is meant to be uncomplicated and pleasant in sight.</div> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 							<div class="box"> | ||||
| 								<div class="icon" style="--color: 240deg">language</div> | ||||
| 								<div> | ||||
| 									<div class="name">Static</div> | ||||
| 									<div class="desc">Requires no dynamic backend as it's built with plain HTML/CSS/JS.</div> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 							<div class="box"> | ||||
| 								<div class="icon" style="--color: 36deg">auto_awesome</div> | ||||
| 								<div> | ||||
| 									<div class="name">Responsive</div> | ||||
| 									<div class="desc">Layout is automatically adjusted depending on device you are using.</div> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div class="box"> | ||||
| 						<div class="icon" style="--color: 144deg">mop</div> | ||||
| 						<div> | ||||
| 							<div class="name">Simple & Clean</div> | ||||
| 							<div class="desc">Interface is meant to be uncomplicated and pleasant in sight.</div> | ||||
| 					<div class="screen hidden"> | ||||
| 						<div class="settings"> | ||||
| 							<div class="setting checked" onclick="switch_theme()" id="setting-theme"> | ||||
| 								<div class="icon">dark_mode</div> | ||||
| 								<div class="text"> | ||||
| 									<div class="name">Dark mode</div> | ||||
| 									<div class="desc">Whether to show dark background & wallpaper.</div> | ||||
| 								</div> | ||||
| 								<div class="value"></div> | ||||
| 							</div> | ||||
| 							<div class="setting"> | ||||
| 								<div class="icon">open_in_new</div> | ||||
| 								<div class="text"> | ||||
| 									<div class="name">Open in new tab</div> | ||||
| 									<div class="desc">Whether to open services in new tab by default.</div> | ||||
| 								</div> | ||||
| 								<div class="value"></div> | ||||
| 							</div> | ||||
| 							<div class="setting"> | ||||
| 								<div class="icon">restart_alt</div> | ||||
| 								<div class="text"> | ||||
| 									<div class="name">Reset settings</div> | ||||
| 									<div class="desc">This will reset all preferences to default.</div> | ||||
| 								</div> | ||||
| 								<div class="value"></div> | ||||
| 							</div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div class="box"> | ||||
| 						<div class="icon" style="--color: 240deg">language</div> | ||||
| 						<div> | ||||
| 							<div class="name">Static</div> | ||||
| 							<div class="desc">Requires no dynamic backend as it's built with plain HTML/CSS/JS.</div> | ||||
| 					<div class="screen hidden"> | ||||
| 						<div style="margin: 72px 0 56px"> | ||||
| 							<img src="img/appicon.png" class="appicon"> | ||||
| 							<div class="appname about">honey</div> | ||||
| 							<div class="appdesc">Nice and sweet place for all your self-hosted services.</div> | ||||
| 							<div class="appdesc">Source: <a href="https://gitlab.com/dani3l0/honey" target="_blank">gitlab.com/dani3l0/honey</a></div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div class="box"> | ||||
| 						<div class="icon" style="--color: 36deg">auto_awesome</div> | ||||
| 						<div> | ||||
| 							<div class="name">Responsive</div> | ||||
| 							<div class="desc">Layout is automatically adjusted depending on device you are using.</div> | ||||
| 						<div class="boxes static"> | ||||
| 							<div class="box"> | ||||
| 								<div class="icon" style="--color: 0deg">code</div> | ||||
| 								<div> | ||||
| 									<div class="name">Open Source</div> | ||||
| 									<div class="desc">Code is publicly available. Download, modify, collaborate, whatever.</div> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 							<div class="box"> | ||||
| 								<div class="icon" style="--color: 144deg">mop</div> | ||||
| 								<div> | ||||
| 									<div class="name">Simple & Clean</div> | ||||
| 									<div class="desc">Interface is meant to be uncomplicated and pleasant in sight.</div> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 							<div class="box"> | ||||
| 								<div class="icon" style="--color: 240deg">language</div> | ||||
| 								<div> | ||||
| 									<div class="name">Static</div> | ||||
| 									<div class="desc">Requires no dynamic backend as it's built with plain HTML/CSS/JS.</div> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 							<div class="box"> | ||||
| 								<div class="icon" style="--color: 36deg">auto_awesome</div> | ||||
| 								<div> | ||||
| 									<div class="name">Responsive</div> | ||||
| 									<div class="desc">Layout is automatically adjusted depending on device you are using.</div> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 				</div> | ||||
|  | ||||
| @ -1,8 +1,12 @@ | ||||
| function get(id) { | ||||
| 	return document.getElementById(id); | ||||
| } | ||||
| function for_all(class_name, func) { | ||||
| 	let a = document.getElementsByClassName(class_name); | ||||
| function get_class(class_name, parent) { | ||||
| 	if (!parent) parent = document; | ||||
| 	return parent.getElementsByClassName(class_name); | ||||
| } | ||||
| function for_all(class_name, func, parent) { | ||||
| 	let a = get_class(class_name, parent); | ||||
| 	for (let i = 0; i < a.length; i++) { | ||||
| 		func(a[i]); | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										35
									
								
								js/main.js
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								js/main.js
									
									
									
									
									
								
							| @ -70,7 +70,9 @@ function onload() { | ||||
| 	}, 50) | ||||
| } | ||||
| 
 | ||||
| let CURRENT_VIEW; | ||||
| function show(id) { | ||||
| 	CURRENT_VIEW = id; | ||||
| 	for_all("page", (page) => { | ||||
| 		page.classList.add("hidden"); | ||||
| 	}); | ||||
| @ -84,7 +86,6 @@ function back() { | ||||
| } | ||||
| 
 | ||||
| function switch_theme(value) { | ||||
| 	back(); | ||||
| 	let is_dark = config("dark_mode") == "true"; | ||||
| 	if (value === undefined) value = !is_dark;  | ||||
| 	is_dark = value; | ||||
| @ -92,11 +93,13 @@ function switch_theme(value) { | ||||
| 	get("css_dark").disabled = !is_dark; | ||||
| 	let bg_box = get("background").classList; | ||||
| 	if (is_dark) { | ||||
| 		get("setting-theme").classList.add("checked"); | ||||
| 		get("theme-indicator").innerText = "dark_mode"; | ||||
| 		bg_box.add("dark"); | ||||
| 		get_background().src = "img/background-dark.jpg"; | ||||
| 	} | ||||
| 	else { | ||||
| 		get("setting-theme").classList.remove("checked"); | ||||
| 		get("theme-indicator").innerText = "light_mode"; | ||||
| 		bg_box.remove("dark"); | ||||
| 		get_background().src = "img/background.jpg"; | ||||
| @ -110,4 +113,34 @@ function load_apps() { | ||||
| 		final += app; | ||||
| 	} | ||||
| 	get("applist").innerHTML = final; | ||||
| } | ||||
| 
 | ||||
| function open_screen(button) { | ||||
| 	let parent = button.parentNode; | ||||
| 	let cursor = parent.getElementsByClassName("bg")[0]; | ||||
| 	let items = parent.getElementsByClassName("entry"); | ||||
| 	let clicked_id = 0; | ||||
| 	for (let i = 0; i < items.length; i++) { | ||||
| 		if (items[i] === button) { | ||||
| 			clicked_id = i; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	cursor.style.left = `${100 * clicked_id / items.length}%`; | ||||
| 	let wrapper = parent.parentNode.parentNode; | ||||
| 	let screens = get_class("screens", wrapper)[0]; | ||||
| 	let from_height = screens.clientHeight; | ||||
| 	for_all("screen", (screen) => { | ||||
| 		screen.classList.add("hidden"); | ||||
| 	}, wrapper); | ||||
| 	screens.children[clicked_id].classList.remove("hidden"); | ||||
| 	let to_height = screens.children[clicked_id].clientHeight; | ||||
| 	screens.style.transform = `translateX(calc(-${clicked_id}% * (100 / var(--screens))))`; | ||||
| 	screens.style.height = `${from_height}px`; | ||||
| 	setTimeout(() => { | ||||
| 		screens.style.height = `${to_height}px`; | ||||
| 	}, 10); | ||||
| 	setTimeout(() => { | ||||
| 		screens.style.height = null; | ||||
| 	}, 420); | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Daniel
						Daniel