diff --git a/CHANGELOG.md b/CHANGELOG.md index 77ada71..185df77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. +## 2.16.6 - 2026-10-22 + +### Fixed + +- Slide animation presets classify `hinge` as an outro, and custom animation settings keep their controls aligned in the slide editor. + ## 2.16.5 - 2026-10-22 ### Fixed diff --git a/build/package.player.json b/build/package.player.json index d52498c..86e89ba 100644 --- a/build/package.player.json +++ b/build/package.player.json @@ -1,6 +1,6 @@ { "name": "pulse-signage-player", - "version": "2.16.5", + "version": "2.16.6", "private": false, "description": "Pulse Signage player application bundle", "engines": { diff --git a/build/package.web.json b/build/package.web.json index 18d3290..feb2673 100644 --- a/build/package.web.json +++ b/build/package.web.json @@ -1,6 +1,6 @@ { "name": "pulse-signage-web", - "version": "2.16.5", + "version": "2.16.6", "private": false, "description": "Pulse Signage web and bridge application bundle", "engines": { diff --git a/package-lock.json b/package-lock.json index 88b5ada..3150977 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pulse-signage", - "version": "2.16.5", + "version": "2.16.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pulse-signage", - "version": "2.16.5", + "version": "2.16.6", "dependencies": { "animate.css": "^4.1.1", "bootstrap-icons": "1.13.1", diff --git a/package.json b/package.json index 5169721..9ef35ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse-signage", - "version": "2.16.5", + "version": "2.16.6", "private": false, "description": "Pulse Signage application with MySQL and media storage", "engines": { diff --git a/src/web/public/css/theme-custom.css b/src/web/public/css/theme-custom.css index e4dd03b..bacb683 100644 --- a/src/web/public/css/theme-custom.css +++ b/src/web/public/css/theme-custom.css @@ -3258,6 +3258,10 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection { grid-template-columns: repeat(2, minmax(0, 1fr)); } +.region-field-grid--animation [data-animation-preset][hidden] { + display: none !important; +} + .region-field-grid > label { display: grid; gap: 0.35rem; diff --git a/src/web/public/js/templates/animation-presets.js b/src/web/public/js/templates/animation-presets.js index f686a78..4dad2a5 100644 --- a/src/web/public/js/templates/animation-presets.js +++ b/src/web/public/js/templates/animation-presets.js @@ -82,6 +82,10 @@ return lookup[raw.toLowerCase()] || 'none'; } + var animateCssCategoryOverrides = { + hinge: 'outro' + }; + function splitAnimateCssValues(values) { var groups = { intro: [], @@ -94,6 +98,12 @@ return; } + var categoryOverride = animateCssCategoryOverrides[value]; + if (categoryOverride && groups[categoryOverride]) { + groups[categoryOverride].push(value); + return; + } + if (value.indexOf('In') !== -1) { groups.intro.push(value); return; diff --git a/test/region-layout.test.js b/test/region-layout.test.js index dc4d8ac..d11ddaa 100644 --- a/test/region-layout.test.js +++ b/test/region-layout.test.js @@ -268,6 +268,7 @@ test('layout and animation modals use the same preview and properties column siz assert.match(css, /\.slide-layout-body\s*\{[^}]*grid-template-columns:\s*minmax\(0,\s*1fr\)\s+21rem;/); assert.match(css, /\.slide-animation-body\s*\{[^}]*grid-template-columns:\s*minmax\(0,\s*1fr\)\s+21rem;/); assert.match(css, /\.slide-animation-body\s*\{[^}]*gap:\s*1\.25rem;/); + assert.match(css, /\.region-field-grid--animation\s+\[data-animation-preset\]\[hidden\]\s*\{\s*display:\s*none\s*!important;/); assert.match(css, /\.slide-animation-preview-panel\s*\{[^}]*container-type:\s*size;[^}]*min-height:\s*0;/); assert.match(css, /#slide-animation-preview\s*\{[^}]*height:\s*100%;/); assert.match(css, /#slide-animation-preview \.slide-preview-stage\s*\{[^}]*width:\s*min\(100%,\s*calc\(100cqh\s*\*\s*var\(--slide-layout-ratio,/); @@ -281,6 +282,10 @@ test('advanced animation section uses compact heading and card spacing', functio }); test('shared animation controls round-trip advanced settings with template normalization', function () { + const animationPresets = require('../src/web/public/js/templates/animation-presets.js'); + assert.ok(animationPresets.advanced.outro.some((preset) => preset.value === 'hinge')); + assert.ok(!animationPresets.advanced.attentionSeekers.some((preset) => preset.value === 'hinge')); + const context = { window: {} }; for (const file of ['templates/animation-presets.js', 'templates/template-designer-utils.js', 'shared/region-animation-controls.js']) { vm.runInNewContext(fs.readFileSync(require.resolve('../src/web/public/js/' + file), 'utf8'), context);