diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e65d516 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# https://help.github.com/articles/dealing-with-line-endings/ +* text eol=lf diff --git a/README.md b/README.md index d986b9f..c23afe2 100644 --- a/README.md +++ b/README.md @@ -4,61 +4,94 @@ ## Controls - 1. Go to [https://axln.github.io/radial-menu-js/index.html](https://axln.github.io/radial-menu-js/index.html). - + 1. Go to [radial-menu-js/index.html](https://axln.github.io/radial-menu-js/index.html). 2. Click Open Menu button. - 3. You can use mouse, mouse wheel and keyboard for navigation: * Arrow keys and mouse wheel to select menu item. * Enter to choose the selected menu item. * Esc/Backspace to return to parent menu and close menu. - ## Usage Example +## Usage Example ```javascript -var svgMenu = new RadialMenu({ - parent : document.body, - size : 400, - closeOnClick: true, - menuItems : [ - { - id: 'item1', - title: 'Item 1' - }, - { - id: 'item2', - title: 'Item 2' - }, - { - id: 'more', - title: 'More...', - items: [ - { - id: 'subitem1', - title: 'Subitem 1' - }, - { - id: 'item2', - title: 'Subitem 2' - } - ] - } - ], - onClick: function (item) { - console.log('You have clicked:', item); - } +var svgMenu = new RadialMenu([ // menuItems + {id: 'item1', title: 'Item 1'}, + {id: 'item2', title: 'Item 2'}, + {id: 'more', title: 'More...', items: [ + {id: 'subitem1', title: 'Subitem 1'}, + {id: 'item2', title: 'Subitem 2'} + ]}], + 400, // size + { // params + onClick: function (item) { + console.log('You have clicked:', item); + } }); - - var openMenu = document.getElementById('menu'); - openMenu.onclick = function () { +var openMenu = document.getElementById('menu'); +openMenu.onclick = function () { svgMenu.open(); - }; +}; - var closeMenu = document.getElementById('close'); - closeMenu.onclick = function () { +var closeMenu = document.getElementById('close'); +closeMenu.onclick = function () { svgMenu.close(); - }; +}; +``` + +## Configuration + +```json5 +{ + closeOnClick: true, // boolean; will menu.close(), after item is selected. [default: true && menu.onClickFallback();] + closeOnClickOutside: true, // true or function(); it will menu.close(), when item is not selected and click is outside of menu. [default: true] + + ui: { // ui customization + fontSize: "38%", // text font-size of elements inside {menuContainer}, eg: text in {itemSector} [38%] + classes: { + menuContainer: "menuHolder", // whole radial-menu container, created dynamically! see: {params.parent} + menuCreate: "menu", + menuCreateParent: "inner", // main menu [{menuCreate} inner] + menuCreateNested: "outer", // nested menu [{menuCreate} outer] + menuOpen: "open", // menu is visible [open] + menuClose: "close", // menu is not-visible [close] + itemSectorActive: "sector", // item, which is active and can be selected [sector] + itemSectorNested: "more", // item, which has nested items... [more] + itemSectorDisabled: "dummy", // item, which is not-active/disabled [dummy] + itemSelected: "selected", // item, which is selected [selected] + closeBackButton: "center", // centered {close} or {back} button [centered] + iconsContainer: "icons", // item's icon container [icons] + }, + item: { // pre-defined items: {close} and {back} in similar way like: {menuItems} + close: {title: "Close", icon: "#close"}, + back: {title: "Back", icon: "#return"}, + // FYI: + // 1) if u want to change, eg: 'close' icon, just use item.close.icon = '#myIconId' + // 2) if u want to override default 'icon' generation, see: RadialMenu.defaultValues.ui.item.{close, back}.symbol + // 3) to change item's colors, etc use: CSS: + // svg.{menuCreate} > g.{itemSectorActive} > text, + // svg.{menuCreate} > g.{itemSectorActive} > use {...} + }, + nested: { // nested ~ inner-menu behavior + icon: "#return", // string(iconId:'#return') or true(for parentItem.icon) + title: true // show nested title? + }, + moveByWheel: true, // navigation by mouse-wheel. [default: true] + moveByKeys: { // navigation by keys. [default: true] + enabled: true, + back: ["escape", "backspace"], + select: ["enter"], + forward: ["arrowRight", "arrowUp"], + backward: ["arrowLeft", "arrowDown"] + } + } +} ``` ## License -MIT + +[MIT](LICENSE) + +## Contributors + +* [Alexey Nesterenko](https://github.com/axln) +* [Jan Smid](https://github.com/j3nda) diff --git a/css/RadialMenu.css b/css/RadialMenu.css index abd727e..26bfd98 100644 --- a/css/RadialMenu.css +++ b/css/RadialMenu.css @@ -4,7 +4,6 @@ div.menuHolder { position: relative; margin: 10px; } - svg.icons { display: none; } @@ -47,7 +46,6 @@ svg.menu > g.sector > use { svg.menu > g.sector:hover > path { fill: #F9A602D0; - } svg.menu > g.sector.selected > path { diff --git a/css/RadialMenuCustom.css b/css/RadialMenuCustom.css new file mode 100644 index 0000000..9aad1e5 --- /dev/null +++ b/css/RadialMenuCustom.css @@ -0,0 +1,115 @@ +@import url("https://fonts.googleapis.com/css?family=Bitter&subset=latin"); +div.menuHolder2 +{ /* menu-container */ + user-select: none; + -moz-user-select: none; + margin: 10px; + + position: fixed; + top: 0px; + left: 0px; + z-index: -1; + + font-family: Bitter; +} + +div.menuHolder2.open2 +{ /* menu-container:open => its visible */ + z-index: 11; +} + +div.menuHolder2.close2 +{ /* menu-container:close => its not visible */ + z-index: -1; + visibility: hidden; +} + +svg.icons +{ + display: none; +} + +svg.menu2 +{ + position: absolute; + overflow: visible; + transition: 0.2s; + transition-timing-function: ease-out; +} + +svg.menu2.open2 +{ /* menu-items:open => background, transition, gfx... */ + /* -- https://www.svgbackgrounds.com/*/ + background-color: #ffaa00; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1600 800'%3E%3Cg %3E%3Cpath fill='%23ffb100' d='M486 705.8c-109.3-21.8-223.4-32.2-335.3-19.4C99.5 692.1 49 703 0 719.8V800h843.8c-115.9-33.2-230.8-68.1-347.6-92.2C492.8 707.1 489.4 706.5 486 705.8z'/%3E%3Cpath fill='%23ffb800' d='M1600 0H0v719.8c49-16.8 99.5-27.8 150.7-33.5c111.9-12.7 226-2.4 335.3 19.4c3.4 0.7 6.8 1.4 10.2 2c116.8 24 231.7 59 347.6 92.2H1600V0z'/%3E%3Cpath fill='%23ffbe00' d='M478.4 581c3.2 0.8 6.4 1.7 9.5 2.5c196.2 52.5 388.7 133.5 593.5 176.6c174.2 36.6 349.5 29.2 518.6-10.2V0H0v574.9c52.3-17.6 106.5-27.7 161.1-30.9C268.4 537.4 375.7 554.2 478.4 581z'/%3E%3Cpath fill='%23ffc500' d='M0 0v429.4c55.6-18.4 113.5-27.3 171.4-27.7c102.8-0.8 203.2 22.7 299.3 54.5c3 1 5.9 2 8.9 3c183.6 62 365.7 146.1 562.4 192.1c186.7 43.7 376.3 34.4 557.9-12.6V0H0z'/%3E%3Cpath fill='%23ffcc00' d='M181.8 259.4c98.2 6 191.9 35.2 281.3 72.1c2.8 1.1 5.5 2.3 8.3 3.4c171 71.6 342.7 158.5 531.3 207.7c198.8 51.8 403.4 40.8 597.3-14.8V0H0v283.2C59 263.6 120.6 255.7 181.8 259.4z'/%3E%3Cpath fill='%23ffd914' d='M1600 0H0v136.3c62.3-20.9 127.7-27.5 192.2-19.2c93.6 12.1 180.5 47.7 263.3 89.6c2.6 1.3 5.1 2.6 7.7 3.9c158.4 81.1 319.7 170.9 500.3 223.2c210.5 61 430.8 49 636.6-16.6V0z'/%3E%3Cpath fill='%23ffe529' d='M454.9 86.3C600.7 177 751.6 269.3 924.1 325c208.6 67.4 431.3 60.8 637.9-5.3c12.8-4.1 25.4-8.4 38.1-12.9V0H288.1c56 21.3 108.7 50.6 159.7 82C450.2 83.4 452.5 84.9 454.9 86.3z'/%3E%3Cpath fill='%23ffef3d' d='M1600 0H498c118.1 85.8 243.5 164.5 386.8 216.2c191.8 69.2 400 74.7 595 21.1c40.8-11.2 81.1-25.2 120.3-41.7V0z'/%3E%3Cpath fill='%23fff852' d='M1397.5 154.8c47.2-10.6 93.6-25.3 138.6-43.8c21.7-8.9 43-18.8 63.9-29.5V0H643.4c62.9 41.7 129.7 78.2 202.1 107.4C1020.4 178.1 1214.2 196.1 1397.5 154.8z'/%3E%3Cpath fill='%23ffff66' d='M1315.3 72.4c75.3-12.6 148.9-37.1 216.8-72.4h-723C966.8 71 1144.7 101 1315.3 72.4z'/%3E%3C/g%3E%3C/svg%3E"); + background-attachment: fixed; + background-size: cover; + + box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75); + -webkit-box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75); + -moz-box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75); + border-radius: 50%; +} + +svg.menu2.inner2 +{ + transform: scale(0.66) rotate(-10deg); + opacity: 0; + visibility: hidden; +} + +svg.menu2.outer2 +{ + transform: scale(1.5) rotate(10deg); + opacity: 0; + visibility: hidden; +} + +svg.menu2 > g > path +{ + fill: #00000080; +} + +svg.menu2 > g.sector > path +{ + cursor: pointer; + /*transition: 0.1s;*/ +} + +svg.menu2 > g.sector > text, +svg.menu2 > g.sector > use +{ + cursor: pointer; + fill: white; + text-shadow: 1px 1px 0 #000000A0; +} + +svg.menu2 > g.sector:hover > path +{ + fill: #9B13CDD0; +} + +svg.menu2 > g.sector.selected > path +{ + /*fill: #F9A602D0;*/ + /*fill: #009900D0 !important;*/ + fill: #32CD32D0 !important; +} + +svg.menu2 > g.center:hover > circle +{ + fill: #E70777D0; +} + +svg.menu2 > g.center > circle +{ + cursor: pointer; + fill: #00000080; +} + +svg.menu2 > g.center > text, +svg.menu2 > g.center > use +{ + cursor: pointer; + fill: white; +} diff --git a/css/main.css b/css/main.css index 1fe91cd..f545dc0 100644 --- a/css/main.css +++ b/css/main.css @@ -1,7 +1,11 @@ body { font-family: Arial, sans-serif; font-size: 13px; - background: url("../img/background.jpg") no-repeat; + background: url("../img/background.jpg") no-repeat center center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; } h1 { diff --git a/index.html b/index.html index d40c029..8d16dd2 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,7 @@
+ + You can also try + "Context Menu" + → right-mouse-click(open) + → left-mouse-click(select or close). + +