diff options
Diffstat (limited to 'src/MenuItem.mjs')
-rw-r--r-- | src/MenuItem.mjs | 38 |
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 @@ | |||
1 | import { shiftByWindow } from './utils.mjs' | 1 | import { shiftByWindow } from './utils.mjs' |
2 | 2 | ||
3 | class Item extends window.HTMLDivElement { | 3 | class 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 | ||