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 + + + + + + + + +
+ + + + + +
+
+

Json

+ +
+
+{
+    '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