diff --git a/package-lock.json b/package-lock.json index 70a24d2..45013c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,39 @@ "tslib": "^1.9.3" } }, + "@material/button": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-2.3.0.tgz", + "integrity": "sha512-xFyZjm0pmisfSU6OHO3Wk2zZX51N9D0DohmaPoXnZt2unfD8bCwRmlmD7TTUQCLnuBoIaqrYShpcRTGp4K5dMw==", + "requires": { + "@material/elevation": "^1.1.0", + "@material/feature-targeting": "^0.44.1", + "@material/ripple": "^2.3.0", + "@material/rtl": "^0.42.0", + "@material/shape": "^1.1.1", + "@material/theme": "^1.1.0", + "@material/typography": "^2.3.0" + } + }, + "@material/dialog": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-2.3.0.tgz", + "integrity": "sha512-T0xEKUW4uY5ZK7S92bdCVjFo9naasTRFNTXccIk+lBkbUlTsCOJMtix+dSJcj8ba8NOZjjq7phfAQqnNKUOhvg==", + "requires": { + "@material/animation": "^1.0.0", + "@material/base": "^1.0.0", + "@material/dom": "^1.1.0", + "@material/elevation": "^1.1.0", + "@material/feature-targeting": "^0.44.1", + "@material/ripple": "^2.3.0", + "@material/rtl": "^0.42.0", + "@material/shape": "^1.1.1", + "@material/theme": "^1.1.0", + "@material/typography": "^2.3.0", + "focus-trap": "^5.0.0", + "tslib": "^1.9.3" + } + }, "@material/dom": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@material/dom/-/dom-1.1.0.tgz", @@ -89,6 +122,35 @@ "tslib": "^1.9.3" } }, + "@material/menu": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-2.3.0.tgz", + "integrity": "sha512-XPI6w4x5c9ACwKBdujcTskBlisWlEgrb09Sa+s0vjhqBJVZVAUJT1j0OpG8tArNUqQiFssXBa/JuJIe6sMAK1A==", + "requires": { + "@material/base": "^1.0.0", + "@material/feature-targeting": "^0.44.1", + "@material/list": "^2.3.0", + "@material/menu-surface": "^2.3.0", + "@material/ripple": "^2.3.0", + "@material/rtl": "^0.42.0", + "tslib": "^1.9.3" + } + }, + "@material/menu-surface": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-2.3.0.tgz", + "integrity": "sha512-jJ1MyeJnEJUO0Z7kNxvqN0xruWbTT2XKHCiApQcJHHkeibWfbWJdhXcx5aO4FMf/TVcy3ADSxDTdvc6AYrBX0g==", + "requires": { + "@material/animation": "^1.0.0", + "@material/base": "^1.0.0", + "@material/elevation": "^1.1.0", + "@material/feature-targeting": "^0.44.1", + "@material/rtl": "^0.42.0", + "@material/shape": "^1.1.1", + "@material/theme": "^1.1.0", + "tslib": "^1.9.3" + } + }, "@material/ripple": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-2.3.0.tgz", diff --git a/package.json b/package.json index f82981a..6ea686b 100644 --- a/package.json +++ b/package.json @@ -48,8 +48,12 @@ "dependencies": { "@eix/input": "git+https://github.com/eix-js/input.git", "@eix/utils": "git+https://github.com/eix-js/utils.git", + "@material/button": "^2.3.0", + "@material/dialog": "^2.3.0", "@material/drawer": "^2.3.0", "@material/list": "^2.3.0", + "@material/menu": "^2.3.0", + "@material/theme": "^1.1.0", "file-saver": "^2.0.2", "haunted": "^4.3.0", "lit-html": "^1.0.0", diff --git a/src/scss/base.scss b/src/scss/base.scss index 9acceac..235e6e9 100644 --- a/src/scss/base.scss +++ b/src/scss/base.scss @@ -1,7 +1,18 @@ @import "./toastr.scss"; @import "./modal.scss"; + +$mdc-theme-primary: black; +$mdc-theme-secondary: #feeae6; +$mdc-theme-on-primary: white; +$mdc-theme-surface: black; +$mdc-theme-on-secondary: #442b2d; + @import "@material/drawer/mdc-drawer.scss"; -@import "@material/list/mdc-list.scss"; +@import "@material/list/mdc-list"; +@import "@material/dialog/mdc-dialog"; +@import "@material/button/mdc-button"; +@import "@material/menu-surface/mdc-menu-surface"; +@import "@material/menu/mdc-menu"; html, body { padding: 0; diff --git a/src/ts/common/modals/modal.ts b/src/ts/common/modals/modal.ts index 236145a..9c42a97 100644 --- a/src/ts/common/modals/modal.ts +++ b/src/ts/common/modals/modal.ts @@ -1,7 +1,7 @@ import { render, html } from "lit-html" import { confirmModalOptions } from "./interfaces"; import { fromEvent } from "rxjs"; -import MicroModal from "micromodal" +import { MDCDialog } from '@material/dialog'; let lastId = 0 @@ -14,60 +14,65 @@ export const modal = (options: Partial<confirmModalOptions>) => new Promise((res } const parent = document.getElementsByClassName("ModalContainer")[0] - const finalOptions: confirmModalOptions = { ...defaultOptions, ...options } + const { title, content, yes, no }: confirmModalOptions = { ...defaultOptions, ...options } const id = lastId++ if (!parent) rej(false) const template = html` - <div class="modal micromodal-slide" id="modal-${id}" aria-hidden="true"> - <div class="modal__overlay" tabindex="-1" data-micromodal-close> - <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-1-title"> - <header class="modal__header"> - <h2 class="modal__title" id="modal-${id}-title"> - ${finalOptions.title} - </h2> - <button class="modal__close" aria-label="Close modal" data-micromodal-close></button> - </header> - <main class="modal__content" id="modal-${id}-content"> - ${finalOptions.content} - </main> - <footer class="modal__footer"> - <button class="modal__btn" id="yes-${id}">${finalOptions.yes}</button> - <button class="modal__btn modal__btn-primary" id="no-${id}" aria-label="Close this dialog window"> - ${finalOptions.no} + <div class="mdc-dialog" + id="modal-${id}" + role="alertdialog" + aria-modal="true" + aria-labelledby="${title}" + aria-describedby="my-dialog-content"> + <div class="mdc-dialog__container"> + <div class="mdc-dialog__surface"> + <h2 class="mdc-dialog__title" id="${title}"> + ${title} + </h2> + <div class="mdc-dialog__content" id="my-dialog-content"> + ${content} + </div> + <footer class="mdc-dialog__actions"> + <button type="button" class="mdc-button mdc-dialog__button" id="no-${id}"> + <span class="mdc-button__label">${no}</span> + </button> + <button type="button" class="mdc-button mdc-dialog__button" id="yes-${id}"> + <span class="mdc-button__label">${yes}</span> </button> </footer> </div> </div> - </div> - </div> + <div class="mdc-dialog__scrim"></div> + </div> ` render(template, parent) - const yes = document.getElementById(`yes-${id}`) - const no = document.getElementById(`no-${id}`) + const dialog = new MDCDialog(document.querySelector(`#modal-${id}`)) + dialog.open() + + const _yes = document.getElementById(`yes-${id}`) + const _no = document.getElementById(`no-${id}`) const clear = () => { // render(html``,parent) - MicroModal.close() + dialog.close() subscriptions.forEach(val => val.unsubscribe()) } const subscriptions = [ - fromEvent(yes, "click").subscribe(val => { + fromEvent(_yes, "click").subscribe(val => { clear() res(true) }), - fromEvent(no, "click").subscribe(val => { + fromEvent(_no, "click").subscribe(val => { clear() res(false) }) ] - - MicroModal.show(`modal-${id}`) }) diff --git a/src/ts/main.ts b/src/ts/main.ts index 6c728d9..69cd7fa 100644 --- a/src/ts/main.ts +++ b/src/ts/main.ts @@ -5,17 +5,18 @@ import { Component } from "./common/component"; import { FunctionStore } from "./common/activation/activationStore"; import { ComponentManager } from "./common/componentManager"; import { map } from "rxjs/operators"; +import { MDCMenu } from '@material/menu'; const screen = new Screen() const manager = new ComponentManager() -manager.components.push(new Component("and",[200,100],[100,100])) -manager.components.push(new Component("not",[200,500],[100,100])) -manager.components.push(new Component("true",[200,500],[100,100])) -manager.components.push(new Component("false",[200,500],[100,100])) +manager.components.push(new Component("and", [200, 100], [100, 100])) +manager.components.push(new Component("not", [200, 500], [100, 100])) +manager.components.push(new Component("true", [200, 500], [100, 100])) +manager.components.push(new Component("false", [200, 500], [100, 100])) manager.update() -const handleEvent = <T>(e:T,func:(e:T) => any) => { +const handleEvent = <T>(e: T, func: (e: T) => any) => { if (manager.barAlpha.value == "0") func(e) else if (manager.barAlpha.value == "1" @@ -25,23 +26,23 @@ const handleEvent = <T>(e:T,func:(e:T) => any) => { } render(html` - <div @mousemove=${(e:MouseEvent) => handleEvent(e,(e:MouseEvent) => { - manager.handleMouseMove(e) - screen.updateMouse(e) - })} - @mousedown=${(e:MouseEvent) => handleEvent(e,(e:MouseEvent) => - manager.handleMouseDown(e) - )} - @mouseup=${(e:MouseEvent) => handleEvent(e,(e:MouseEvent) => - manager.handleMouseUp(e) - )} - @wheel=${(e:MouseEvent) => handleEvent(e,(e:WheelEvent) => - screen.handleScroll(e) - )}> + <div @mousemove=${(e: MouseEvent) => handleEvent(e, (e: MouseEvent) => { + manager.handleMouseMove(e) + screen.updateMouse(e) +})} + @mousedown=${(e: MouseEvent) => handleEvent(e, (e: MouseEvent) => + manager.handleMouseDown(e) +)} + @mouseup=${(e: MouseEvent) => handleEvent(e, (e: MouseEvent) => + manager.handleMouseUp(e) +)} + @wheel=${(e: MouseEvent) => handleEvent(e, (e: WheelEvent) => + screen.handleScroll(e) +)}> <div id=${subscribe(manager.barAlpha.pipe(map(val => - (val == "1") ? "shown" : "" - )))} + (val == "1") ? "shown" : "" +)))} class=createBar> <div class="topContainer"> <div> @@ -51,10 +52,10 @@ render(html` </div> </div> </div> - <svg height=${ subscribe(screen.height) } - width=${ subscribe(screen.width) } + <svg height=${ subscribe(screen.height)} + width=${ subscribe(screen.width)} viewBox=${subscribe(screen.viewBox)}> - ${ subscribe(manager.svgs) } + ${ subscribe(manager.svgs)} </svg> </div> <div class="ModalContainer"></div> @@ -65,9 +66,12 @@ render(html` <i class="material-icons mdc-list-item__graphic" aria-hidden="true">inbox</i> <span class="mdc-list-item__text">Something</span> </a> - <a class="mdc-list-item" href="#"> + <a class="mdc-list-item" href="#" id="openSimulation" @click=${() => { + menu.open = true + // menu.setAbsolutePosition(screen.mousePosition[0], screen.mousePosition[1]) + }}> <i class="material-icons mdc-list-item__graphic" aria-hidden="true">send</i> - <span class="mdc-list-item__text">something else</span> + <span class="mdc-list-item__text">Open simulation</span> </a> <a class="mdc-list-item" href="#"> <i class="material-icons mdc-list-item__graphic" aria-hidden="true">drafts</i> @@ -76,6 +80,21 @@ render(html` </nav> </div> </aside> + + <div class="mdc-menu mdc-menu-surface mdc-theme--primary-bg mdc-theme--on-primary"> + <ul class="mdc-list" role="menu" aria-hidden="true" aria-orientation="vertical" tabindex="-1"> + <li class="mdc-list-item" role="menuitem"> + <span class="mdc-list-item__text">A Menu Item</span> + </li> + <li class="mdc-list-item" role="menuitem"> + <span class="mdc-list-item__text">Another Menu Item</span> + </li> + </ul> + </div> `, document.body) +const menu = new MDCMenu(document.querySelector('.mdc-menu')); +menu.hoistMenuToBody() +menu.setAnchorElement(document.querySelector(`#openSimulation`)) + manager.update() \ No newline at end of file