JSFiddle - React, Tailwind, and code Playground
by velo_ninja
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Menu with Submenus</title>
<!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">-->
<!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">-->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css">
<style>
</style>
<script>
const menuData = [
{ id: 'item1', title: 'Project-1', submenu: [
{ id: 'subitem1', title: 'Sub-Project', submenu: [
{ id: 'subsubitem1', title: 'File-1' },
{ id: 'subsubitem2', title: 'File-2' },
{ id: 'subsubitem3', title: 'File-3' },
{ id: 'subsubitem4', title: 'File-4' },
{ id: 'subsubitem5', title: 'File-5' },
] },
{ id: 'subitem2', title: 'Sub-Project2', submenu: [
{ id: 'subsubitem6', title: 'File-6' },
{ id: 'subsubitem7', title: 'File-7' },
{ id: 'subsubitem8', title: 'File-8' },
{ id: 'subsubitem9', title: 'File-9' },
{ id: 'subsubitem10', title: 'File-XXX' , submenu: [
{ id: 'subsubitem6', title: 'File-6' },
{ id: 'subsubitem7', title: 'File-7' , submenu: [
{ id: 'subsubitem11', title: 'File-a' },
{ id: 'subsubitem12', title: 'File-b' },
{ id: 'subsubitem13', title: 'File-c' },
{ id: 'subsubitem11', title: 'File-d' },
{ id: 'subsubitem12', title: 'File-e' },
{ id: 'subsubitem13', title: 'File-f' },
]},
{...
CSS
body {
margin: 0;
padding: 0;
font-family: Arial, sans-serif;
background-color: white;
}
.circle-menu {background-color: rgb(83, 82, 80);}
.menu-item {
position: relative;
padding: 15px;
margin: 5px;
border-radius: 50%;
cursor: pointer;
color: #ffffff;
text-align: center;
font-size: 14px;
background-color: rgb(41, 40, 40);
transition: background-color 0.3s ease, transform 0.3s ease;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.menu-item:hover {background-color: black;}
.submenu-container li {
margin: 5px 0;
padding: 10px;
background-color: #858484;
color: #ffffff;
border-radius: 15%;
cursor: pointer;
transition: background-color 0.3s ease;
}
.submenu-container {
position: absolute;
background-color: transparent;
padding: 3px;
border-radius: 25px;
min-width: 150px;
min-width: 175px;
margin-left: 10px;
z-index: 1000;
white-space: nowrap;
}
.submenu-container li:hover {background-color: black;}
.icon-and-text {
display: flex;
align-items: center;
gap: 5px; /* Space between icon and text */
}
.degree-mark {
position: absolute;
width: 1px;
height: 1px;
background-color: white;
}
.degree-label {
position: absolute;
font-size: 10px;
color: white;
text-align: center;
}
JavaScript
function scanDirectory(userInputPath) {
if (userInputPath.trim()) {
const apiUrl = `http://localhost:5000/scan?path=${encodeURIComponent(userInputPath.trim())}`;
fetch(apiUrl)
.then(response => {
if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}
return response.json();
})
.then(data => {console.log("Directory Contents:"); console.log(data); menuData=data;})
.catch(error => console.error(`Error: ${error.message}`));
} else {alert('Please enter a directory path.');}
}
function handleScan() {
const userInputPath = document.getElementById('pathInput').value;
scanDirectory(userInputPath);
}