aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/MenuItem.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'src/MenuItem.mjs')
-rw-r--r--src/MenuItem.mjs38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/MenuItem.mjs b/src/MenuItem.mjs
index a7724d3..d485032 100644
--- a/src/MenuItem.mjs
+++ b/src/MenuItem.mjs
@@ -1,12 +1,13 @@
1import { shiftByWindow } from './utils.mjs' 1import { shiftByWindow } from './utils.mjs'
2 2
3class Item extends window.HTMLDivElement { 3class Item extends window.HTMLDivElement {
4 constructor ({ text, innerHTML, onclick, style }) { 4 constructor ({ text, innerHTML, onclick, style, className, onmouseover }) {
5 super() 5 super()
6 this.innerHTML = innerHTML ?? text 6 this.innerHTML = innerHTML ?? text
7 this.onclick = onclick 7 this.onclick = onclick
8 this.classList.add('menu-item')
9 this.style.cssText = style 8 this.style.cssText = style
9 this.classList.add('menu-item')
10 className?.forEach(c => this.classList.add(c))
10 11
11 this.onmouseover = () => { 12 this.onmouseover = () => {
12 this.parentElement 13 this.parentElement
@@ -28,7 +29,7 @@ class Folder extends window.HTMLDivElement {
28 // Prepare submenu 29 // Prepare submenu
29 const submenu = document.createElement('div') 30 const submenu = document.createElement('div')
30 submenu.className = 'sub-menu' 31 submenu.className = 'sub-menu'
31 submenu.style.cssText = 'position: absolute; left: 105%; top: 0px;' 32 submenu.style.cssText = 'position: absolute; left: 105%; top: -20px;'
32 this.items.forEach(item => submenu.appendChild(item)) 33 this.items.forEach(item => submenu.appendChild(item))
33 submenu.onmouseleave = () => submenu.remove() 34 submenu.onmouseleave = () => submenu.remove()
34 35
@@ -62,19 +63,28 @@ export const pickBlockItem = ({ blocks, utils }) =>
62 new Folder({ 63 new Folder({
63 innerHTML: '<span>Blocks<span><span class="info">(n/p)</span>', 64 innerHTML: '<span>Blocks<span><span class="info">(n/p)</span>',
64 items: blocks.map( 65 items: blocks.map(
65 (block, index) => 66 (block, index) => {
66 new Item({ 67 const focus = block.classList.contains('focus')
67 text: 68 const preview = block.querySelector('p')
68 `<strong style="display: inline-block; width: 2.5em;">(${index})</strong>` + 69 ?.textContent.substring(0, 15)
69 block 70 ?.concat(' ', '... ') ?? ''
70 .querySelector('p') 71 const item = new Item({
71 ?.textContent.substring(0, 15) 72 className: ['keep-menu', focus ? 'checked' : 'unchecked'],
72 .concat(' ...'), 73 innerHTML:
73 onclick: () => { 74 `<strong>(${index})</strong><span style='display: inline-block; margin-inline: 1.2em;'>${preview}</span>`,
74 block.classList.add('focus') 75 onclick: (e) => {
75 utils.scrollToBlock(block) 76 block.classList.toggle('focus')
77
78 const focus = block.classList.contains('focus')
79 if (focus) utils.scrollToBlock(block)
80 const item = e.target.closest('.menu-item.keep-menu')
81 item.classList.add(focus ? 'checked' : 'unchecked')
82 item.classList.remove(focus ? 'unchecked' : 'checked')
76 } 83 }
77 }) 84 })
85
86 return item
87 }
78 ) 88 )
79 }) 89 })
80 90