From 6777037d3d07d5cfa3ab56d639412cd5861738dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20P=2E?= Date: Mon, 18 May 2026 10:08:07 +0200 Subject: [PATCH] Menu toggles styling and icons --- js/controllers/menu_controller.js | 50 ++++++++++++++++++++++++++----- scenes/ssgp/index.html | 2 +- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/js/controllers/menu_controller.js b/js/controllers/menu_controller.js index e51647d..d2f1237 100644 --- a/js/controllers/menu_controller.js +++ b/js/controllers/menu_controller.js @@ -35,6 +35,15 @@ export default class extends Controller { const id = event?.params.node; const status = event?.target?.checked; const node = AppState.normalizedNodes.find(n => n.id === id); + /** + * @type {HTMLElement|null} + */ + const eye = event.target.parentElement.querySelector('i'); + + if (eye) { + eye.classList.toggle('bi-eye'); + eye.classList.toggle('bi-eye-slash'); + } if (node.children.length > 0) { this.#toggleGroup(node, status); @@ -113,16 +122,22 @@ export default class extends Controller { } /** * @param {import("../state.js").NormalizedSceneNode} node + * @param {boolean} isGroup * @returns {HTMLDivElement} */ - #createLayerToggle(node) { + #createLayerToggle(node, isGroup = false) { + // This should be calculated somehow! + const labelIndent = node.depth < 3 ? '1.5rem' : '1rem'; + const labelText = isGroup ? '' : node.id; const toggle = html` `; @@ -135,8 +150,9 @@ export default class extends Controller { #createLayerGroup(node) { const { trigger, collapseDiv } = this.#createNodeCollapse(node); const wrapper = document.createElement('div'); + wrapper.classList.add('w-max-content', 'ps-1', 'mb-1'); - collapseDiv.appendChild(this.#createLayerToggle(node)); + collapseDiv.appendChild(this.#createLayerToggle(node, true)); for (const child of node.children) { collapseDiv.appendChild( @@ -148,11 +164,10 @@ export default class extends Controller { wrapper.appendChild(trigger); wrapper.appendChild(collapseDiv); - wrapper.classList.add('m-0', 'p-0'); + wrapper.classList.add('border-start', 'border-bottom', 'rounded', `ms-${node.depth}`); return wrapper; } - /** * * @param {import("../state.js").NormalizedSceneNode} node @@ -164,10 +179,18 @@ export default class extends Controller { trigger.className = 'btn btn-link p-0 fs-6 fw-bold text-decoration-none text-reset'; trigger.setAttribute('data-bs-toggle', 'collapse'); trigger.setAttribute('data-bs-target', `#group-${cleanId}`); - trigger.innerHTML = ` + trigger.setAttribute('data-action', 'menu#toggleChevron'); + trigger.innerHTML = html` ${node.id} -
`; + // Add color "swatch" only for first level groups + if (node.depth === 2) { + trigger.innerHTML += html` +
+
+ `; + } const collapseDiv = document.createElement('div'); collapseDiv.className = 'collapse'; @@ -175,6 +198,19 @@ export default class extends Controller { return {trigger, collapseDiv}; } + /** + * + * @param {Event} event + */ + toggleChevron(event) { + /** + * @type {HTMLButtonElement} collapse + */ + const collapse = event.target; + const icon = collapse.querySelector('i'); + icon.classList.toggle('bi-chevron-down'); + icon.classList.toggle('bi-chevron-up'); + } /** * Temporary implementation to show domains only * @todo Don't rebuild it every time, use caching, return a container diff --git a/scenes/ssgp/index.html b/scenes/ssgp/index.html index 31de2ef..42689a0 100644 --- a/scenes/ssgp/index.html +++ b/scenes/ssgp/index.html @@ -147,7 +147,7 @@
-
+