Release v2.17.0: add read-only user previews and access fallbacks
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m47s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 32s

This commit is contained in:
lzstealth committed 2026-10-23 01:55:33 +01:00
1 parent 11dd801f6d
commit 9c28eca3ef
52 files changed
+1624 -140

No files matched your search

+333 -52
View File
@@ -1,8 +1,12 @@
/* Error pages */
.error-page-content {
width: 100%;
max-width: 52rem;
}
/* Media picker and gallery */
.media-picker-item {
border: 1px solid var(--bs-border-color);
border-radius: .375rem;
@@ -59,10 +63,6 @@
min-width: 0;
}
.media-gallery-bulk-actions {
flex: 0 0 auto;
}
@media (min-width: 1200px) {
.media-gallery-controls {
flex: 1 1 auto;
@@ -236,17 +236,6 @@
font-size: .8rem;
}
.media-gallery-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: .75rem;
}
.media-gallery-footer .media-gallery-meta {
min-width: 0;
}
.media-gallery-empty {
padding: 3rem 1rem;
border: 1px dashed var(--bs-border-color);
@@ -259,10 +248,6 @@
width: 100%;
}
.media-gallery-bulk-actions {
width: 100%;
}
.media-gallery-search {
width: 100%;
}
@@ -287,6 +272,8 @@
max-height: min(72vh, 48rem);
object-fit: contain;
}
/* Connection status indicators */
.status-dot {
position: relative;
display: inline-flex;
@@ -349,6 +336,8 @@
}
}
/* Account menu */
.user-menu-avatar {
display: inline-flex;
align-items: center;
@@ -399,6 +388,8 @@
flex: 1 1 0;
}
/* Application shell and sidebar */
.app-header .navbar-nav {
--bs-navbar-nav-link-padding-x: 10px;
}
@@ -443,6 +434,8 @@
opacity: 0.8;
}
/* Application settings */
.settings-nav-card {
position: sticky;
top: 1rem;
@@ -474,6 +467,8 @@
}
}
/* Cards, authentication and email previews */
.card {
box-shadow: none;
}
@@ -579,6 +574,8 @@
padding: 0.65rem 1.1rem;
}
/* Shared card headers and search controls */
.card-header {
position: relative;
}
@@ -604,6 +601,8 @@
margin-left: auto;
}
/* Template animation preview controls */
.template-preview-card .card-body {
gap: 0.75rem 1rem;
}
@@ -637,6 +636,8 @@
gap: 0.5rem;
}
/* Audit log change comparisons */
.audit-change-list {
display: grid;
padding: 0.08rem 0.3rem;
@@ -663,6 +664,8 @@
.audit-change-to ins {
text-decoration-thickness: 2px;
}
/* Template preview states and permission tables */
.template-preview-card .btn-group .btn {
width: 100%;
}
@@ -712,6 +715,8 @@
cursor: not-allowed;
}
/* Announcement icon, type and screen pickers */
.announcement-icon-picker {
position: relative;
}
@@ -1088,6 +1093,8 @@
}
}
/* Background task controls */
.background-tasks-task-tools {
flex-wrap: nowrap;
}
@@ -1102,6 +1109,8 @@
overflow: hidden;
}
/* Paginated page layout */
.table-pagination-page .app-main {
padding-bottom: 0;
}
@@ -1122,6 +1131,8 @@
padding-bottom: 0;
}
/* Background task page layout */
.background-tasks-page .app-content .container-fluid {
display: flex;
flex-direction: column;
@@ -1141,6 +1152,8 @@
overflow: hidden;
}
/* Media library page layout */
.media-library-page {
overflow: hidden;
}
@@ -1179,6 +1192,8 @@
min-height: 0;
}
/* Shared table pagination and responsive search */
[data-table-pagination-card] {
display: flex;
flex: 0 1 auto;
@@ -1291,6 +1306,8 @@
}
}
/* Device onboarding, pairing PIN and QR scanner */
.onboarding-pairing-card > .card-header {
padding: 0.75rem 1rem;
}
@@ -1377,6 +1394,8 @@
background: #000;
}
/* Timetable entry tables */
.timetable-entries-table-shell {
overflow: hidden;
border-bottom-left-radius: calc(var(--bs-border-radius) - 1px);
@@ -1409,19 +1428,7 @@
border-bottom-width: 0;
}
.api-source-section-heading {
display: flex;
align-items: center;
gap: 0.5rem;
margin: 0 0 0.5rem;
padding-bottom: 0.35rem;
border-bottom: 1px solid var(--bs-border-color);
color: var(--bs-primary);
font-size: 0.78rem;
font-weight: 800;
letter-spacing: 0.08em;
text-transform: uppercase;
}
/* Dashboard and connected screen controls */
.dashboard-hero {
overflow: hidden;
@@ -2018,6 +2025,8 @@
padding: 0.25rem 0;
}
/* Shared page headers, tables and text utilities */
.page-header {
display: flex;
align-items: flex-end;
@@ -2041,6 +2050,248 @@
min-width: 0;
}
.no-access-page {
display: flex;
flex-direction: column;
min-height: max(28rem, calc(100dvh - 8rem));
}
.no-access-panel {
display: grid;
flex: 1;
place-items: center;
padding: 1.5rem 0 2.5rem;
}
.no-access-card {
width: min(100%, 36rem);
}
.view-as-banner {
position: sticky;
top: 0;
z-index: 1020;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.7rem 1.25rem;
border-bottom: 1px solid var(--bs-warning-border-subtle);
background: var(--bs-warning-bg-subtle);
color: var(--bs-warning-text-emphasis);
}
.view-as-banner-copy {
display: flex;
align-items: flex-start;
gap: 0.75rem;
min-width: 0;
}
.view-as-banner-copy > i {
margin-top: 0.15rem;
color: var(--bs-warning);
}
.view-as-banner-copy > div {
display: grid;
gap: 0.1rem;
}
.view-as-banner-copy span {
overflow-wrap: anywhere;
font-size: 0.875rem;
}
@media (max-width: 575.98px) {
.view-as-banner {
align-items: flex-start;
padding: 0.65rem 0.75rem;
}
.view-as-banner .btn {
white-space: nowrap;
}
}
.changelog-eyebrow {
margin-bottom: 0.35rem;
color: var(--bs-primary);
font-size: 0.72rem;
font-weight: 700;
text-transform: uppercase;
}
.changelog-feed {
max-width: 76rem;
margin: 1rem auto 0 0.35rem;
border-left: 1px solid var(--bs-border-color);
}
.changelog-release {
position: relative;
margin-left: 1rem;
border-bottom: 1px solid var(--bs-border-color);
}
.changelog-release-summary {
position: relative;
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto;
align-items: center;
gap: 1rem;
min-height: 4rem;
padding: 0.85rem 1rem;
cursor: pointer;
list-style: none;
}
.changelog-release-summary::-webkit-details-marker {
display: none;
}
.changelog-release-summary:hover {
background: var(--bs-tertiary-bg);
}
.changelog-release-summary:focus-visible {
outline: 2px solid var(--bs-primary);
outline-offset: -2px;
}
.changelog-release-indicator {
position: absolute;
top: 1.55rem;
left: -1.36rem;
width: 0.7rem;
aspect-ratio: 1;
border: 2px solid var(--bs-secondary-color);
border-radius: 50%;
background: var(--bs-body-bg);
}
.changelog-release[open] .changelog-release-indicator {
border-color: var(--bs-primary);
background: var(--bs-primary);
box-shadow: 0 0 0 3px var(--bs-body-bg), 0 0 0 4px var(--bs-primary);
}
.changelog-release-heading {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.65rem;
min-width: 0;
}
.changelog-version {
color: var(--bs-emphasis-color);
font-size: 1.1rem;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.changelog-latest {
color: var(--bs-primary);
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
}
.changelog-release-date {
color: var(--bs-secondary-color);
font-size: 0.875rem;
font-variant-numeric: tabular-nums;
}
.changelog-release-chevron {
color: var(--bs-secondary-color);
transition: transform 150ms ease;
}
.changelog-release[open] .changelog-release-chevron {
transform: rotate(180deg);
}
.changelog-release-content {
display: grid;
gap: 1rem;
padding: 0.25rem 1rem 1.35rem;
}
.changelog-category {
display: grid;
grid-template-columns: 7rem minmax(0, 1fr);
gap: 1rem;
}
.changelog-category-title {
margin: 0.1rem 0 0;
color: var(--bs-secondary-color);
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
}
.changelog-items {
display: grid;
gap: 0.55rem;
margin: 0;
padding: 0;
list-style: none;
}
.changelog-items li {
position: relative;
padding-left: 1rem;
line-height: 1.55;
}
.changelog-items li::before {
position: absolute;
top: 0.62em;
left: 0;
width: 0.35rem;
aspect-ratio: 1;
border-radius: 50%;
background: var(--bs-primary);
content: '';
}
@media (max-width: 575.98px) {
.changelog-feed {
margin-left: 0.1rem;
}
.changelog-release-summary {
grid-template-columns: minmax(0, 1fr) auto;
column-gap: 0.65rem;
row-gap: 0.15rem;
padding-right: 0.5rem;
padding-left: 0.75rem;
}
.changelog-release-date {
grid-column: 1;
grid-row: 2;
}
.changelog-release-chevron {
grid-column: 2;
grid-row: 1 / span 2;
}
.changelog-release-content {
padding-right: 0.5rem;
padding-left: 0.75rem;
}
.changelog-category {
grid-template-columns: 1fr;
gap: 0.35rem;
}
}
.card.card-outline > .card-header {
align-items: center;
min-height: 3.25rem;
@@ -2088,11 +2339,6 @@
white-space: nowrap;
}
.chip[data-time-date-placeholder-chip] {
cursor: pointer;
user-select: none;
}
.empty {
color: var(--bs-secondary-color);
font-style: italic;
@@ -2136,6 +2382,8 @@ td[data-label="Slides"] {
}
}
/* Slide editor layout */
.slide-editor-shell {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(18rem, 24rem);
@@ -2177,6 +2425,8 @@ td[data-label="Slides"] {
margin-top: 0.25rem;
}
/* TinyMCE integration, including library-generated markup */
.slide-form-stack .editor-holder,
.template-field-card .editor-holder {
position: relative;
@@ -2351,6 +2601,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
}
/* Slide preview and layout / animation dialogs */
.slide-preview-dimensions-chip {
display: inline-flex;
align-items: center;
@@ -2510,6 +2762,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
}
}
/* Template snapping and shared alignment guides */
.template-designer-main-header::after {
display: none;
}
@@ -2593,6 +2847,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
}
}
/* Slide preview canvas and popup */
.slide-preview-canvas {
position: absolute;
top: 0;
@@ -2707,6 +2963,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
box-sizing: border-box;
}
/* Image cropping, uploads and media picker dialogs */
.slide-image-cropper-frame {
position: relative;
width: 100%;
@@ -2995,6 +3253,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
font-size: 0.8rem;
}
/* Template designer canvas, selection and resize handles */
.template-designer-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 25rem;
@@ -3129,6 +3389,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
background: rgba(13, 110, 253, 0.08);
}
/* Template designer sidebar and region fields */
.template-designer-sidebar {
position: sticky;
top: 1rem;
@@ -3371,6 +3633,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
height: 100% !important;
}
/* Announcement color picker and list icons */
.announcement-color-picker {
display: grid;
gap: 0.75rem;
@@ -3448,6 +3712,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
font-size: 1.1rem;
}
/* API region placeholders and sample responses */
.api-region-placeholder-section {
display: grid;
gap: 0.5rem;
@@ -3518,13 +3784,7 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
line-height: 1.45;
}
.template-field-card.is-expanded .tox-edit-area__iframe {
min-height: 32rem;
}
.template-field-card.is-expanded .card-body {
min-height: 36rem;
}
/* Region field controls and responsive editor layout */
.template-field-card .slide-image-file,
.region-item .slide-image-file {
@@ -3590,6 +3850,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
}
/* Popup frames, toasts and visibility utilities */
.frame-popup-card-body {
margin: 0;
padding: 0;
@@ -3612,6 +3874,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
display: none !important;
}
/* Playlist slide picker */
.playlist-slide-picker-modal-body {
display: grid;
gap: 1rem;
@@ -3793,6 +4057,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
display: none !important;
}
/* Playlist scheduling controls and dialog */
.schedule-day-grid .schedule-day-button {
flex: 1 1 0;
}
@@ -3918,6 +4184,8 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
padding-top: 0.75rem;
}
/* Shared table actions */
.actions,
.playlist-item-actions,
.users-row-actions {
@@ -3950,6 +4218,8 @@ td[data-label="Actions"] > div {
flex: 0 0 auto;
}
/* Playlist duration and playback configuration */
.playlist-duration-input,
.playlist-group-block-quota {
width: 4rem !important;
@@ -4025,6 +4295,8 @@ table.table > :not(caption) > * > * {
vertical-align: middle;
}
/* Slide table content and thumbnails */
.playlist-slide-cell {
display: flex;
align-items: center;
@@ -4057,7 +4329,9 @@ table.table > :not(caption) > * > * {
}
.card .table td[data-label="Thumbnail"] {
padding-inline: 1.5rem;
width: 1%;
padding-inline: 0.5rem;
white-space: nowrap;
}
td[data-label="Thumbnail"] > .playlist-slide-thumb {
@@ -4087,6 +4361,8 @@ td[data-label="Thumbnail"] > .playlist-slide-thumb {
line-height: 1;
}
/* Playlist ordering and groups */
.playlist-order-cell {
width: 1%;
white-space: nowrap;
@@ -4129,13 +4405,6 @@ td[data-label="Thumbnail"] > .playlist-slide-thumb {
padding-left: 1.5rem !important;
}
.playlist-group-block-header {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0.5rem;
}
.playlist-group-block-slide {
display: flex;
align-items: center;
@@ -4192,6 +4461,8 @@ td[data-label="Thumbnail"] > .playlist-slide-thumb {
vertical-align: middle;
}
/* Playlist drag-and-drop states and previews */
.playlist-group-block-dragging > td {
opacity: 0.55;
}
@@ -4335,6 +4606,8 @@ td[data-label="Thumbnail"] > .playlist-slide-thumb {
will-change: transform;
}
/* Table sorting */
table.table thead th.sortable {
cursor: pointer;
white-space: nowrap;
@@ -4350,6 +4623,8 @@ table.table thead th.sort-desc .table-sort-indicator {
opacity: 1;
}
/* Account menu and responsive dashboard overrides */
.navbar-nav>.user-menu>.dropdown-menu>li.user-header {
min-height: 100px;
}
@@ -4379,6 +4654,8 @@ table.table thead th.sort-desc .table-sort-indicator {
}
}
/* Weather previews */
.weather-preview-card {
display: flex;
flex-direction: column;
@@ -4430,6 +4707,8 @@ table.table thead th.sort-desc .table-sort-indicator {
width: 7.5rem;
}
/* Gradient stop editor */
.gradient-stop-bar {
position: relative;
height: 2.25rem;
@@ -4469,6 +4748,8 @@ table.table thead th.sort-desc .table-sort-indicator {
cursor: grabbing;
}
/* Media selection states and large dialogs */
.media-picker-item-selected-card .media-picker-item {
border-color: var(--bs-success);
box-shadow: 0 0 0 .15rem rgba(var(--bs-success-rgb), .2);