Release v2.16.6: fix slide animation controls
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m13s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 36s

This commit is contained in:
lzstealth committed 2026-10-22 16:47:58 +01:00
1 parent 5b5d5da511
commit 03a27c8e25
8 files changed
+30 -5

No files matched your search

+6
View File
@@ -2,6 +2,12 @@
All notable changes to this project will be documented in this file. 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 ## 2.16.5 - 2026-10-22
### Fixed ### Fixed
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "pulse-signage-player", "name": "pulse-signage-player",
"version": "2.16.5", "version": "2.16.6",
"private": false, "private": false,
"description": "Pulse Signage player application bundle", "description": "Pulse Signage player application bundle",
"engines": { "engines": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "pulse-signage-web", "name": "pulse-signage-web",
"version": "2.16.5", "version": "2.16.6",
"private": false, "private": false,
"description": "Pulse Signage web and bridge application bundle", "description": "Pulse Signage web and bridge application bundle",
"engines": { "engines": {
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "pulse-signage", "name": "pulse-signage",
"version": "2.16.5", "version": "2.16.6",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pulse-signage", "name": "pulse-signage",
"version": "2.16.5", "version": "2.16.6",
"dependencies": { "dependencies": {
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"bootstrap-icons": "1.13.1", "bootstrap-icons": "1.13.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "pulse-signage", "name": "pulse-signage",
"version": "2.16.5", "version": "2.16.6",
"private": false, "private": false,
"description": "Pulse Signage application with MySQL and media storage", "description": "Pulse Signage application with MySQL and media storage",
"engines": { "engines": {
+4
View File
@@ -3258,6 +3258,10 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr));
} }
.region-field-grid--animation [data-animation-preset][hidden] {
display: none !important;
}
.region-field-grid > label { .region-field-grid > label {
display: grid; display: grid;
gap: 0.35rem; gap: 0.35rem;
@@ -82,6 +82,10 @@
return lookup[raw.toLowerCase()] || 'none'; return lookup[raw.toLowerCase()] || 'none';
} }
var animateCssCategoryOverrides = {
hinge: 'outro'
};
function splitAnimateCssValues(values) { function splitAnimateCssValues(values) {
var groups = { var groups = {
intro: [], intro: [],
@@ -94,6 +98,12 @@
return; return;
} }
var categoryOverride = animateCssCategoryOverrides[value];
if (categoryOverride && groups[categoryOverride]) {
groups[categoryOverride].push(value);
return;
}
if (value.indexOf('In') !== -1) { if (value.indexOf('In') !== -1) {
groups.intro.push(value); groups.intro.push(value);
return; return;
+5
View File
@@ -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-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*\{[^}]*grid-template-columns:\s*minmax\(0,\s*1fr\)\s+21rem;/);
assert.match(css, /\.slide-animation-body\s*\{[^}]*gap:\s*1\.25rem;/); 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-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\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,/); 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 () { 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: {} }; const context = { window: {} };
for (const file of ['templates/animation-presets.js', 'templates/template-designer-utils.js', 'shared/region-animation-controls.js']) { 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); vm.runInNewContext(fs.readFileSync(require.resolve('../src/web/public/js/' + file), 'utf8'), context);