diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index 77718633a..945700f35 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -80,9 +80,8 @@ --dnd-bg-color: transparent; --dnd-border-color: transparent; - &.show-column-name-on-hover { + &.is-off-screen { &:after { - color: var(--card-color); content: attr(data-column-name); font-size: var(--text-x-small); font-weight: 500; @@ -92,7 +91,6 @@ text-transform: uppercase; top: 0; translate: -50%; - border-radius: 99rem; } &.is-collapsed { @@ -100,6 +98,13 @@ writing-mode: vertical-rl; } } + + &:not(.is-collapsed) { + &:after { + background-color: var(--column-color); + inline-size: calc(var(--column-width-expanded) - 4px); /* make room for the dnd border */ + } + } } } diff --git a/app/javascript/controllers/collapsible_columns_controller.js b/app/javascript/controllers/collapsible_columns_controller.js index 0a87e47d5..3d9c8f412 100644 --- a/app/javascript/controllers/collapsible_columns_controller.js +++ b/app/javascript/controllers/collapsible_columns_controller.js @@ -2,8 +2,8 @@ import { Controller } from "@hotwired/stimulus" import { nextFrame, debounce } from "helpers/timing_helpers"; export default class extends Controller { - static classes = [ "collapsed", "noTransitions" ] - static targets = [ "column", "button" ] + static classes = [ "collapsed", "noTransitions", "titleNotVisible" ] + static targets = [ "column", "button", "title" ] static values = { collection: String } @@ -14,6 +14,14 @@ export default class extends Controller { async connect() { await this.#restoreColumnsDisablingTransitions() + this.#setupIntersectionObserver() + } + + disconnect() { + if (this._intersectionObserver) { + this._intersectionObserver.disconnect() + this._intersectionObserver = null + } } toggle({ target }) { @@ -106,4 +114,23 @@ export default class extends Controller { #localStorageKeyFor(column) { return `expand-${this.collectionValue}-${column.getAttribute("id")}` } + + #setupIntersectionObserver() { + if (typeof IntersectionObserver === "undefined") return + if (this._intersectionObserver) this._intersectionObserver.disconnect() + + this._intersectionObserver = new IntersectionObserver(entries => { + entries.forEach(entry => { + const title = entry.target + const column = title.closest('[data-collapsible-columns-target="column"]') + + if (!column) return + + const offscreen = entry.intersectionRatio === 0 + column.classList.toggle(this.titleNotVisibleClass, offscreen) + }) + }, { threshold: [0] }) + + this.titleTargets.forEach(title => this._intersectionObserver.observe(title)) + } } diff --git a/app/views/collections/show/_columns.html.erb b/app/views/collections/show/_columns.html.erb index 27912c09d..a52a308dd 100644 --- a/app/views/collections/show/_columns.html.erb +++ b/app/views/collections/show/_columns.html.erb @@ -8,7 +8,13 @@ dragenter->drag-and-strum#dragEnter drop->drag-and-drop#drop dragend->drag-and-drop#dragEnd" } do %> -