diff --git a/Menus/.gitignore b/Context Menus/.gitignore
similarity index 100%
rename from Menus/.gitignore
rename to Context Menus/.gitignore
diff --git a/Menus/README.md b/Context Menus/README.md
similarity index 100%
rename from Menus/README.md
rename to Context Menus/README.md
diff --git a/Context Menus/css/style.sass b/Context Menus/css/style.sass
new file mode 100644
index 0000000..f2af94d
--- /dev/null
+++ b/Context Menus/css/style.sass
@@ -0,0 +1,376 @@
+$red: rgb(182, 100, 103)
+$orange: rgb(206, 170, 111)
+$yellow: rgb(217, 188, 140)
+$green: rgb(140, 151, 125)
+$blue: rgb(141, 163, 185)
+$purple: rgb(169, 136, 176)
+
+$fg100: rgb(248,248,250)
+$fg200: rgb(225,227,233)
+$fg300: rgb(203,205,216)
+$fg400: rgb(180,184,200)
+$fg500: rgb(146,150,169)
+$fg600: rgb(78,83,106)
+
+$bg100: rgb(61,66,83)
+$bg200: rgb(50,54,68)
+$bg300: rgb(42,45,57)
+$bg400: rgb(37,39,50)
+$bg500: rgb(32,35,44)
+$bg600: rgb(28,30,38)
+
+$primary: $blue
+$success: $green
+$warning: $orange
+$critical: $red
+
+*
+ box-sizing: border-box
+
+html
+ margin: 0
+ padding: 0.5rem
+
+ height: 100vh
+
+ font-size: 16px
+ font-family: 'Roboto', sans-serif
+ font-weight: 400
+
+ color: $fg100
+ background-color: $bg500
+
+body
+ margin: 0
+ padding: 0
+
+ width: 100%
+ height: 100%
+
+ display: grid
+ grid-template-columns: 20rem 1fr
+ grid-template-rows: 1fr
+ grid-template-areas: "sidebar content"
+
+ border: 1px solid $bg200
+ border-radius: 6px
+
+ overflow: hidden
+
+ > button
+ margin: 0
+ padding: 0.5rem 1rem
+
+ width: auto
+ height: 3rem
+
+ display: flex
+ justify-content: center
+ align-items: center
+
+ color: $fg100
+ background-color: $bg300
+ border: 1px solid $bg200
+ border-radius: 3px
+
+ cursor: pointer
+
+ transition: all 0.2s ease-in-out
+
+ &:hover
+ background-color: $bg200
+
+nav
+ margin: 0
+ padding: 0.5rem
+
+ width: 100%
+ height: 100%
+
+ grid-area: sidebar
+
+ display: flex
+ flex-direction: column
+ justify-content: flex-start
+ align-items: flex-start
+ gap: 0.5rem
+
+ border-right: 1px solid $bg200
+
+ > button
+ margin: 0
+ padding: 0.5rem
+
+ width: 100%
+ height: auto
+
+ display: flex
+ justify-content: flex-start
+ align-items: center
+
+ color: $fg400
+ background-color: transparent
+ border: none
+ border-radius: 3px
+
+ cursor: pointer
+
+ transition: all 0.2s ease-in-out
+
+ &:hover
+ background-color: $bg400
+
+ > hr
+ margin: 0 auto
+ padding: 0
+
+ width: 100%
+ height: 1px
+
+ border: none
+ background-color: $bg200
+
+main
+ margin: 0
+ padding: 0.5rem
+
+ width: 100%
+ height: 100%
+
+ grid-area: content
+
+ display: flex
+ flex-direction: column
+ justify-content: flex-start
+ align-items: flex-start
+ gap: 0.5rem
+
+ > button
+ margin: 0
+ padding: 0.5rem 1rem
+
+ width: auto
+ height: 3rem
+
+ display: flex
+ justify-content: center
+ align-items: center
+
+ color: $fg100
+ background-color: $bg300
+ border: 1px solid $bg200
+ border-radius: 3px
+
+ cursor: pointer
+
+ transition: all 0.2s ease-in-out
+
+ &:hover
+ background-color: $bg200
+
+.code-block
+ margin: 0
+ padding: 0
+
+ width: 100%
+ height: auto
+
+ border: 1px solid $bg200
+ border-radius: 6px
+
+ color: $fg100
+ background-color: $bg600
+
+ overflow: hidden
+
+ pre
+ margin: 0
+ padding: 0.5rem
+
+ white-space: pre-wrap
+
+ display: block
+
+ font-size: 0.8rem
+ font-weight: 400
+
+.code-header
+ margin: 0
+ padding: 0.3rem 0.3rem 0.3rem 0.8rem
+
+ width: 100%
+ height: auto
+
+ display: flex
+ flex-direction: row
+ justify-content: space-between
+ align-items: center
+
+ background-color: $bg500
+ border-bottom: 1px solid $bg200
+
+ p
+ margin: 0
+ padding: 0
+
+ width: auto
+ height: auto
+
+ font-size: 1rem
+ font-weight: 400
+ color: $fg400
+
+ button
+ margin: 0
+ padding: 0.25rem 0.5rem
+
+ display: flex
+ justify-content: center
+ align-items: center
+
+ color: $fg100
+ background-color: $bg500
+ border: none
+ border-radius: 3px
+
+ cursor: pointer
+
+ &:hover
+ background-color: $bg200
+
+.contextMenuClose
+ width: 100vw
+ height: 100vh
+
+ position: fixed
+ top: 0
+ left: 0
+
+ background-color: transparent
+ z-index: 99998
+
+.contextMenu
+ margin: 0
+ padding: 0.25rem
+
+ width: calc( 100vw - 10px )
+ height: auto
+ max-width: 300px
+
+ position: absolute
+
+ display: flex
+ flex-direction: column
+ justify-content: flex-start
+ align-items: flex-start
+ gap: 0.25rem
+
+ background-color: $bg300
+ border: 1px solid $bg200
+ border-radius: 6px
+
+ overflow: hidden
+
+ transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out
+ transform-origin: center center
+ opacity: 0.5
+ transform: scale(0, 0)
+ z-index: 99999
+
+.contextMenuTitle
+ margin: 0
+ padding: 0.25rem 0.5rem
+
+ width: 100%
+
+ text-align: center
+ font-size: 1.2rem
+ font-weight: 400
+ color: $fg300
+
+.contextMenuItem
+ margin: 0
+ padding: 0.5rem
+
+ width: 100%
+ height: auto
+
+ display: flex
+ flex-direction: row
+ justify-content: flex-start
+ align-items: center
+ gap: 0.5rem
+
+ background-color: $bg300
+ color: $fg300
+ border: none
+ border-radius: 3px
+
+ cursor: pointer
+.contextMenuItem:hover
+ background-color: $bg200
+.contextMenuItem__critical
+ color: $critical
+//.contextMenuItem__critical:hover
+// background-color: rgba($critical, 0.1)
+.contextMenuItem__warning
+ color: $warning
+//.contextMenuItem__warning:hover
+// background-color: rgba($warning, 0.1)
+.contextMenuItem__success
+ color: $success
+//.contextMenuItem__success:hover
+// background-color: rgba($success, 0.1)
+.contextMenuItem__info
+ color: $primary
+//.contextMenuItem__info:hover
+// background-color: rgba($primary, 0.1)
+
+.contextMenuText
+ margin: 0
+ padding: 0
+
+ font-size: 1rem
+ font-weight: 400
+
+.contextMenuIcon
+ margin: 0
+ padding: 0
+
+ width: 1.25rem
+ height: 1.25rem
+
+ display: flex
+ justify-content: center
+ align-items: center
+
+.contextMenuDivider
+ margin: 0 auto
+ padding: 0
+
+ width: 100%
+ height: 1px
+
+ border: none
+ background-color: $bg200
+
+.contextMenu__show
+ opacity: 1
+ transform: scale(1, 1)
+
+.contextMenu__show--mouse
+ opacity: 1
+ transform: scale(1, 1)
+ transform-origin: top left
+.contextMenu__show--button
+ opacity: 1
+ transform: scale(1, 1)
+ transform-origin: top center
+.contextMenu__show--center
+ opacity: 1
+ transform: scale(1, 1)
+ transform-origin: center center
+
+.contextMenu__hide
+ opacity: 0
+ transform: scale(0, 0)
\ No newline at end of file
diff --git a/Context Menus/index.html b/Context Menus/index.html
new file mode 100644
index 0000000..a614ba6
--- /dev/null
+++ b/Context Menus/index.html
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+ JS menus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{
+ 'value': 'Edit',
+ 'icon': edit,
+ 'function': dissmissContextMenu,
+ 'type': 'critical'
+},
+{
+ 'value': 'Copy',
+ 'icon': copy,
+ 'function': copyToClipboard,
+ 'type': 'normal'
+},
+
+
+
+
+
\ No newline at end of file
diff --git a/Menus/js/main.js b/Context Menus/js/contextMenu.js
similarity index 75%
rename from Menus/js/main.js
rename to Context Menus/js/contextMenu.js
index 22f3b7e..15b215f 100644
--- a/Menus/js/main.js
+++ b/Context Menus/js/contextMenu.js
@@ -9,7 +9,7 @@
type - Type of menu item (critical, warning, success, info)
*/
-function showContextMenu(obj, menu) {
+function showContextMenu(obj, menu, position='mouse') {
// If the context menu is already open, close it first
if (document.querySelector(".contextMenu")) {
dissmissContextMenu();
@@ -85,28 +85,43 @@ function showContextMenu(obj, menu) {
document.body.appendChild(contextMenu);
document.body.appendChild(closeSpan);
- // Get position of the item clicked or the mouse
- try {
+ if (position == 'mouse') {
+ var posX = event.clientX + 5;
+ var posY = event.clientY + 5;
+ } else if (position == 'button') {
+ var posX = obj.offsetLeft + (obj.offsetWidth / 2) - (contextMenu.offsetWidth / 2);
+ var posY = obj.offsetTop + obj.offsetHeight + 5;
+ } else if (position == 'center') {
+ var posX = (window.innerWidth / 2) - (contextMenu.offsetWidth / 2);
+ var posY = (window.innerHeight / 2) - (contextMenu.offsetHeight / 2);
+ } else {
var posX = event.clientX + 5;
var posY = event.clientY + 5;
- } catch (error) {
- var posX = obj.offsetLeft + (bj.offsetWidth * 0.6) + 2;
- var posY = obj.offsetTop + obj.offsetHeight + 2
}
-
+
// Move the context menu if it is off the screen
if (posX + contextMenu.offsetWidth > window.innerWidth) {
posX = window.innerWidth - (contextMenu.offsetWidth + 5);
+ } else if (posX < 0) {
+ posX = 5;
}
- if (posY + contextMenu.offsetHeight > window.innerHeight) {
- posY = window.innerHeight - (contextMenu.offsetHeight + 5);
+ if (posY < 0) {
+ posY = 5;
}
-
contextMenu.style.left = posX + "px";
contextMenu.style.top = posY + "px";
+ // Timeout otherwise animation doesn't work
setTimeout(function() {
- contextMenu.classList.add("contextMenu__show");
+ if (position == 'mouse') {
+ contextMenu.classList.add("contextMenu__show--mouse");
+ } else if (position == 'button') {
+ contextMenu.classList.add("contextMenu__show--button");
+ } else if (position == 'center') {
+ contextMenu.classList.add("contextMenu__show--center");
+ } else {
+ contextMenu.classList.add("contextMenu__show");
+ }
}, 1);
}
@@ -127,4 +142,11 @@ function dissmissContextMenu() {
menu.remove();
}, 500);
});
-}
\ No newline at end of file
+}
+
+window.addEventListener("resize", function() {
+ // If the context menu is already open, close it first
+ if (document.querySelector(".contextMenu")) {
+ dissmissContextMenu();
+ }
+});
\ No newline at end of file
diff --git a/Context Menus/js/examples.js b/Context Menus/js/examples.js
new file mode 100644
index 0000000..1693f68
--- /dev/null
+++ b/Context Menus/js/examples.js
@@ -0,0 +1,122 @@
+function contextAtMouse(obj) {
+ showContextMenu(obj, [
+ {
+ 'value': 'gwagwa',
+ 'function': dissmissContextMenu
+ },
+ {
+ 'value': 'gwagwa',
+ 'function': dissmissContextMenu
+ }
+ ])
+}
+function contextAtButton(obj) {
+ showContextMenu(obj, [
+ {
+ 'value': 'gwagwa',
+ 'function': dissmissContextMenu
+ },
+ {
+ 'value': 'gwagwa',
+ 'function': dissmissContextMenu
+ }
+ ], 'button')
+}
+function contextAtCenter(obj) {
+ showContextMenu(obj, [
+ {
+ 'value': 'gwagwa',
+ 'function': dissmissContextMenu
+ },
+ {
+ 'value': 'gwagwa',
+ 'function': dissmissContextMenu
+ }
+ ], 'center')
+}
+
+function contextImageAction(obj) {
+ showContextMenu(obj, [
+ {
+ 'value': 'title',
+ 'text': 'Image actions',
+ },
+ {
+ 'value': 'Copy Link',
+ 'icon': link,
+ 'function': dissmissContextMenu
+ },
+ {
+ 'value': 'Download',
+ 'icon': download,
+ 'function': dissmissContextMenu
+ },
+ {
+ 'value': 'divider',
+ },
+ {
+ 'value': 'Edit',
+ 'icon': edit,
+ 'function': dissmissContextMenu,
+ 'type': 'critical'
+ },
+ {
+ 'value': 'Delete',
+ 'icon': trash,
+ 'function': dissmissContextMenu,
+ 'type': 'critical'
+ },
+ {
+ 'value': 'divider',
+ },
+ {
+ 'value': 'Edit',
+ 'icon': edit,
+ 'function': dissmissContextMenu,
+ 'type': 'warning'
+ },
+ {
+ 'value': 'Delete',
+ 'icon': trash,
+ 'function': dissmissContextMenu,
+ 'type': 'warning'
+ },
+ {
+ 'value': 'divider',
+ },
+ {
+ 'value': 'Edit',
+ 'icon': edit,
+ 'function': dissmissContextMenu,
+ 'type': 'success'
+ },
+ {
+ 'value': 'Delete',
+ 'icon': trash,
+ 'function': dissmissContextMenu,
+ 'type': 'success'
+ },
+ {
+ 'value': 'divider',
+ },
+ {
+ 'value': 'Edit',
+ 'icon': edit,
+ 'function': dissmissContextMenu,
+ 'type': 'info'
+ },
+ {
+ 'value': 'Delete',
+ 'icon': trash,
+ 'function': dissmissContextMenu,
+ 'type': 'info'
+ },
+ {
+ 'value': 'divider',
+ },
+ {
+ 'value': 'gwagwa',
+ 'function': dissmissContextMenu
+ }
+ ])
+};
\ No newline at end of file
diff --git a/Context Menus/js/main.js b/Context Menus/js/main.js
new file mode 100644
index 0000000..50b60aa
--- /dev/null
+++ b/Context Menus/js/main.js
@@ -0,0 +1,14 @@
+// Icons
+var link = ''
+var download = '';
+var edit = '';
+var trash = '';
+
+
+document.addEventListener('DOMContentLoaded', function() {
+ document.querySelectorAll('pre').forEach((block) => {
+ var code = block.innerHTML;
+ code = code.substring(0, code.lastIndexOf('\n'));
+ block.innerHTML = code;
+ });
+});
\ No newline at end of file
diff --git a/Menus/css/style.sass b/Menus/css/style.sass
deleted file mode 100644
index b8e845f..0000000
--- a/Menus/css/style.sass
+++ /dev/null
@@ -1,182 +0,0 @@
-$primary: rgb(66, 130, 167)
-$success: rgb(95, 175, 99)
-$warning: rgb(236, 136, 77)
-$critical: rgb(247, 111, 111)
-
-$fg100: rgb(248,248,250)
-$fg200: rgb(225,227,233)
-$fg300: rgb(203,205,216)
-$fg400: rgb(180,184,200)
-$fg500: rgb(146,150,169)
-$fg600: rgb(78,83,106)
-
-$bg100: rgb(61,66,83)
-$bg200: rgb(50,54,68)
-$bg300: rgb(42,45,57)
-$bg400: rgb(37,39,50)
-$bg500: rgb(32,35,44)
-$bg600: rgb(28,30,38)
-
-*
- box-sizing: border-box
-
-html
- font-size: 16px
- font-family: 'Roboto', sans-serif
- font-weight: 400
- color: $fg100
- background-color: $bg500
-
-body
- display: flex
- flex-direction: row
- justify-content: center
- align-items: center
- gap: 1rem
-
- > button
- margin: 0
- padding: 0.5rem 1rem
-
- width: auto
- height: 3rem
-
- display: flex
- justify-content: center
- align-items: center
-
- color: $fg100
- background-color: $bg300
- border: 1px solid $bg200
- border-radius: 3px
-
- cursor: pointer
-
- transition: all 0.2s ease-in-out
-
- &:hover
- background-color: $bg200
-
-.contextMenuClose
- width: 100vw
- height: 100vh
-
- position: fixed
- top: 0
- left: 0
-
- background-color: transparent
- z-index: 99998
-
-.contextMenu
- margin: 0
- padding: 0.25rem
-
- width: calc( 100vw - 10px )
- height: auto
- max-width: 300px
-
- position: absolute
-
- display: flex
- flex-direction: column
- justify-content: flex-start
- align-items: flex-start
- gap: 0.25rem
-
- background-color: $bg300
- border: 1px solid $bg200
- border-radius: 6px
-
- overflow: hidden
-
- transition: all 0.2s ease-in-out
- transform-origin: top left
- opacity: 0
- transform: scale(0, 0)
- z-index: 99999
-
-.contextMenuTitle
- margin: 0
- padding: 0.25rem 0.5rem
-
- width: 100%
-
- text-align: center
- font-size: 1.2rem
- font-weight: 400
- color: $fg300
-
-.contextMenuItem
- margin: 0
- padding: 0.25rem
-
- width: 100%
- height: auto
-
- display: flex
- flex-direction: row
- justify-content: flex-start
- align-items: center
- gap: 0.5rem
-
- background-color: $bg300
- color: $fg300
- border: none
- border-radius: 3px
-
- cursor: pointer
-.contextMenuItem:hover
- background-color: $bg200
-.contextMenuItem__critical
- color: $critical
-//.contextMenuItem__critical:hover
-// background-color: rgba($critical, 0.1)
-.contextMenuItem__warning
- color: $warning
-//.contextMenuItem__warning:hover
-// background-color: rgba($warning, 0.1)
-.contextMenuItem__success
- color: $success
-//.contextMenuItem__success:hover
-// background-color: rgba($success, 0.1)
-.contextMenuItem__info
- color: $primary
-//.contextMenuItem__info:hover
-// background-color: rgba($primary, 0.1)
-
-.contextMenuText
- margin: 0
- padding: 0
-
- font-size: 1rem
- font-weight: 400
-
-.contextMenuIcon
- margin: 0
- padding: 0
-
- width: 1.25rem
- height: 1.25rem
-
- display: flex
- justify-content: center
- align-items: center
-
-.contextMenuDivider
- margin: 0 auto
- padding: 0
-
- width: 90%
- height: 1px
-
- border: none
- background-color: $bg200
-
-.contextMenu__show
- opacity: 1
- transform: scale(1, 1)
-
-.contextMenu__hide
- opacity: 0
- transform: scale(0, 0)
\ No newline at end of file
diff --git a/Menus/index.html b/Menus/index.html
deleted file mode 100644
index 7ac24b3..0000000
--- a/Menus/index.html
+++ /dev/null
@@ -1,110 +0,0 @@
-
-
-
-
-
-
- JS menus
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file