Initial commit, completed project
This commit is contained in:
commit
d837f77431
|
@ -0,0 +1,30 @@
|
|||
# odin-simple-dropdown
|
||||
|
||||
Simple dropdown menu - click on button makes the menu appear :)
|
||||
|
||||
My first npm package with the-odin-project :D
|
||||
|
||||
## usage
|
||||
|
||||
install: `npm i odin-simple-dropdown`
|
||||
|
||||
import in your project:
|
||||
|
||||
`import dropdownMenu from "odin-simple-dropdown"`
|
||||
|
||||
the default style is at `./node_modules/odin-simple-dropdown/style.css` and is imported at `index.js` in the same location
|
||||
|
||||
### syntax
|
||||
|
||||
`dropdownMenu(btnTitle, ...elements)`
|
||||
|
||||
### example
|
||||
|
||||
`dropdownMenu("Dropdown!", "Home", "About", "Contact")`
|
||||
|
||||
it returns a dom node that you can append using append/appendChild
|
||||
|
||||
## license
|
||||
|
||||
ISC
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
import "./style.css"
|
||||
|
||||
export default function dropdownMenu(btnTitle, ...elements) {
|
||||
const dropdownMenuHTML = document.createElement("div");
|
||||
dropdownMenuHTML.classList.add('menu');
|
||||
|
||||
const btn = document.createElement("button");
|
||||
btn.setAttribute("type", "button");
|
||||
btn.classList.add("btn-dropdown");
|
||||
btn.textContent = btnTitle;
|
||||
dropdownMenuHTML.append(btn);
|
||||
|
||||
const menuDropdownElement = document.createElement("div");
|
||||
menuDropdownElement.classList.add("menu-dropdown", "hidden")
|
||||
|
||||
const ul = document.createElement("ul");
|
||||
elements.forEach(element => {
|
||||
let li = document.createElement("li");
|
||||
li.textContent = element;
|
||||
ul.append(li);
|
||||
});
|
||||
menuDropdownElement.append(ul);
|
||||
|
||||
dropdownMenuHTML.append(menuDropdownElement);
|
||||
btn.addEventListener("click", () => menuDropdownElement.classList.toggle('hidden'))
|
||||
|
||||
return dropdownMenuHTML;
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"name": "odin-simple-dropdown",
|
||||
"version": "1.0.1",
|
||||
"description": "Simple dropdown menu",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [
|
||||
"dropdown",
|
||||
"menu",
|
||||
"simple",
|
||||
"js",
|
||||
"html",
|
||||
"css",
|
||||
"theodinproject"
|
||||
],
|
||||
"author": "NetMan",
|
||||
"license": "ISC"
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
.menu {
|
||||
position: relative;
|
||||
width: max-content;
|
||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||
}
|
||||
|
||||
.btn-dropdown {
|
||||
background-color: #6b6;
|
||||
color: #fff;
|
||||
font-size: 1.4rem;
|
||||
padding: 12px;
|
||||
border-radius: 10px;
|
||||
cursor: pointer;
|
||||
border: 1px solid #595;
|
||||
outline: none;
|
||||
transition: 0.08s background-color ease-in-out;
|
||||
}
|
||||
|
||||
.btn-dropdown:hover {
|
||||
background-color: #7c7;
|
||||
}
|
||||
|
||||
.btn-dropdown:active {
|
||||
background-color: #7b7;
|
||||
}
|
||||
|
||||
.menu-dropdown {
|
||||
position: absolute;
|
||||
border: 1px solid #ccc;
|
||||
color: #666;
|
||||
left: 0;
|
||||
font-size: 1.2rem;
|
||||
min-width: 90%;
|
||||
text-align: left;
|
||||
top: 100%;
|
||||
box-sizing: border-box;
|
||||
padding: 4px;
|
||||
border-radius: 10px;
|
||||
transition: opacity 0.2s ease-in-out;
|
||||
z-index: 10;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.menu-dropdown ul {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.menu-dropdown li {
|
||||
cursor: pointer;
|
||||
transition: 0.1s color ease-in-out;
|
||||
}
|
||||
|
||||
.menu-dropdown li:hover {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
transition: all 0.2s ease-in-out;
|
||||
opacity: 0;
|
||||
z-index: -10;
|
||||
}
|
Loading…
Reference in New Issue