Add branded display animation and custom display solutions to platform row

This commit is contained in:
Matt Batchelder
2026-02-21 13:33:53 -05:00
parent bb30f38090
commit 61a7070b0f
3 changed files with 385 additions and 1 deletions

View File

@@ -12,7 +12,7 @@
<!-- wp:oribi/platform-section {"label":"Our Devices","heading":"Commercial-Grade Hardware, Consumer-Level Simplicity","lead":"No IT degree required. Our players are designed to be set up in minutes and forgotten about for years."} -->
<!-- wp:oribi/platform-row {"heading":"Works With Your Existing Screens","description":"Our player devices connect to any screen with an HDMI port — no proprietary hardware required. Already have displays? Plug in and go. Need a full setup? We offer bundled player-and-display packages too.","btnText":"Get a Quote","btnUrl":"/contact","tvStick":true} /-->
<!-- wp:oribi/platform-row {"heading":"Never Goes Dark","description":"Every player caches content locally. If your internet connection drops, your displays continue running seamlessly with the latest synced content. When connectivity returns, new content pulls down automatically — no manual steps, no reboots.","btnText":"See Features","btnUrl":"/features","reversed":true,"neverGoesDark":true} /-->
<!-- wp:oribi/platform-row {"heading":"Locked Down by Default","description":"Secure boot, encrypted storage, and encrypted communications come standard on every device. Remote management lets you monitor, update, and troubleshoot from anywhere. Firmware updates roll out over the air with zero downtime.","btnText":"Learn More","btnUrl":"/about"} /-->
<!-- wp:oribi/platform-row {"heading":"Custom Display Solutions","description":"Create a polished, on-brand experience with our Custom Display Platform. Seamlessly integrated with your interactive signage, it ensures your logo and branding appear consistently across every screen — reinforcing recognition at every touchpoint. Ideal for businesses looking to elevate their presence and deliver a professional, cohesive visual identity.","btnText":"Get a Quote","btnUrl":"/contact","brandedAnim":true} /-->
<!-- /wp:oribi/platform-section -->
<!-- wp:oribi/feature-section {"variant":"alt","label":"Device Specifications","heading":"What\u0027s Inside Every Player","lead":"Purpose-built components selected for reliability, performance, and silent operation in any environment.","columns":3} -->

View File

@@ -5011,3 +5011,317 @@ p:last-child { margin-bottom: 0; }
.ngd-cloud__path { stroke: #4CAF50; opacity: .8; }
.ngd-signal__dots { opacity: 1; }
}
/* ═══════════════════════════════════════════════════════════
BRANDED DISPLAY ANIMATION (.platform-visual.has-branded)
Sequence (8 s loop per screen, staggered by 0.5 s):
0 25 % : Boot splash — logo fades in centred on dark screen
25 40 % : Transition — logo shrinks to header, brand bar grows
40 90 % : Content — UI blocks slide in beneath brand header
90 100% : Reset — fade out, loop
═══════════════════════════════════════════════════════════ */
/* ── Wrapper overrides ─────────────────────────────────────── */
.platform-visual.has-branded {
background: none !important;
border: none !important;
border-radius: 0;
aspect-ratio: unset;
padding: 0;
overflow: visible;
position: relative;
font-size: inherit;
}
/* ── Stage ─────────────────────────────────────────────────── */
.bd-stage {
position: relative;
width: 100%;
max-width: 420px;
aspect-ratio: 4/3;
margin: 0 auto;
display: flex;
align-items: flex-end;
justify-content: center;
gap: 18px;
}
/* ── Shared device styles ─────────────────────────────────── */
.bd-device {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
}
.bd-device__body {
background: #111;
border: 3px solid #111;
border-radius: 5px;
outline: 1px solid #000;
padding: 2px;
display: flex;
align-items: stretch;
position: relative;
box-shadow: 0 10px 32px rgba(0,0,0,.50);
}
.bd-device__screen {
width: 100%;
height: 100%;
border-radius: 2px;
position: relative;
overflow: hidden;
background:
repeating-linear-gradient(
180deg,
transparent, transparent 3px,
rgba(0,0,0,.08) 3px, rgba(0,0,0,.08) 4px
),
linear-gradient(135deg, #0c1016 0%, #151c28 60%, #0c1016 100%);
}
.bd-device__label {
font-size: 10px;
color: rgba(255,255,255,.45);
margin-top: 6px;
letter-spacing: .5px;
text-transform: uppercase;
}
/* ── Tablet (portrait kiosk) ──────────────────────────────── */
.bd-device--tablet .bd-device__body {
width: 80px;
height: 120px;
border-radius: 8px;
}
.bd-device--tablet .bd-device__screen { border-radius: 4px; }
.bd-device--tablet { animation-delay: 0s; }
/* ── Wall display (wide landscape) ────────────────────────── */
.bd-device--wall .bd-device__body {
width: 180px;
height: 108px;
}
.bd-mount {
width: 6px;
height: 18px;
background: #222;
margin-top: -1px;
border-radius: 0 0 2px 2px;
}
.bd-device--wall { animation-delay: 0.5s; }
/* ── Monitor on stand ─────────────────────────────────────── */
.bd-device--monitor .bd-device__body {
width: 120px;
height: 80px;
}
.bd-stand {
display: flex;
flex-direction: column;
align-items: center;
margin-top: -1px;
}
.bd-stand__stem {
width: 6px;
height: 14px;
background: #222;
}
.bd-stand__base {
width: 36px;
height: 5px;
background: #222;
border-radius: 0 0 4px 4px;
}
.bd-device--monitor { animation-delay: 1s; }
/* ── Boot splash overlay ──────────────────────────────────── */
.bd-splash {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
z-index: 2;
animation: bd-splash 8s ease-in-out infinite;
}
.bd-device--wall .bd-splash { animation-delay: 0.5s; }
.bd-device--monitor .bd-splash { animation-delay: 1s; }
.bd-splash__logo {
width: 28px;
height: 28px;
background: #4CAF50;
border-radius: 6px;
box-shadow: 0 0 20px rgba(76,175,80,.5), 0 0 50px rgba(76,175,80,.15);
animation: bd-logo-pulse 8s ease-in-out infinite;
}
.bd-device--wall .bd-splash__logo {
width: 32px;
height: 32px;
animation-delay: 0.5s;
}
.bd-device--monitor .bd-splash__logo {
animation-delay: 1s;
}
/* ── Branded UI chrome ────────────────────────────────────── */
.bd-ui {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
padding: 0;
opacity: 0;
z-index: 1;
animation: bd-ui-show 8s ease-in-out infinite;
}
.bd-device--wall .bd-ui { animation-delay: 0.5s; }
.bd-device--monitor .bd-ui { animation-delay: 1s; }
/* Brand header bar */
.bd-ui__header {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 5px;
background: rgba(76,175,80,.15);
border-bottom: 1px solid rgba(76,175,80,.25);
flex-shrink: 0;
}
.bd-ui__logo {
width: 10px;
height: 10px;
background: #4CAF50;
border-radius: 3px;
flex-shrink: 0;
}
.bd-ui__brand-bar {
flex: 1;
height: 4px;
background: rgba(76,175,80,.4);
border-radius: 2px;
max-width: 50px;
animation: bd-bar-grow 8s ease-in-out infinite;
}
.bd-device--wall .bd-ui__brand-bar { animation-delay: 0.5s; }
.bd-device--monitor .bd-ui__brand-bar { animation-delay: 1s; }
/* Content area */
.bd-ui__content {
flex: 1;
display: flex;
flex-direction: column;
gap: 4px;
padding: 6px 5px;
animation: bd-content-slide 8s ease-in-out infinite;
}
.bd-device--wall .bd-ui__content { animation-delay: 0.5s; }
.bd-device--monitor .bd-ui__content { animation-delay: 1s; }
.bd-ui__block {
border-radius: 2px;
}
.bd-ui__block--txt {
height: 4px;
background: rgba(255,255,255,.18);
}
.bd-ui__block--short {
width: 60%;
}
.bd-ui__block--img {
flex: 1;
min-height: 16px;
background: linear-gradient(
135deg,
rgba(76,175,80,.10) 0%,
rgba(76,175,80,.05) 100%
);
border: 1px solid rgba(76,175,80,.12);
}
/* ═══════════════════════════════════════════════════════════
KEYFRAMES (8 s cycle)
═══════════════════════════════════════════════════════════ */
/* Splash: visible 030%, fades out 3040%, hidden rest */
@keyframes bd-splash {
0% { opacity: 0; }
5% { opacity: 1; }
25% { opacity: 1; }
35% { opacity: 0; }
100% { opacity: 0; }
}
/* Logo pulse glow during splash */
@keyframes bd-logo-pulse {
0%, 25% { transform: scale(1); box-shadow: 0 0 20px rgba(76,175,80,.5), 0 0 50px rgba(76,175,80,.15); }
12% { transform: scale(1.08); box-shadow: 0 0 28px rgba(76,175,80,.7), 0 0 60px rgba(76,175,80,.25); }
35%, 100% { transform: scale(0.6); opacity: 0; }
}
/* UI chrome: hidden 028%, fades in 2838%, visible until 88%, fades out */
@keyframes bd-ui-show {
0%, 28% { opacity: 0; }
38% { opacity: 1; }
88% { opacity: 1; }
96%, 100% { opacity: 0; }
}
/* Brand bar grows in from 0 width */
@keyframes bd-bar-grow {
0%, 30% { transform: scaleX(0); transform-origin: left; }
42% { transform: scaleX(1); transform-origin: left; }
88% { transform: scaleX(1); }
96%, 100% { transform: scaleX(0); }
}
/* Content blocks slide up into view */
@keyframes bd-content-slide {
0%, 35% { opacity: 0; transform: translateY(10px); }
48% { opacity: 1; transform: translateY(0); }
88% { opacity: 1; transform: translateY(0); }
96%, 100% { opacity: 0; transform: translateY(4px); }
}
/* ── Scanline sweep (reuses da-scan) ───────────────────────── */
.bd-device__screen::after {
content: '';
position: absolute;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(76,175,80,.18), transparent);
animation: da-scan 4s linear infinite;
pointer-events: none;
z-index: 3;
}
/* ── Responsive ─────────────────────────────────────────────── */
@media (max-width: 900px) {
.bd-stage { max-width: 360px; gap: 12px; }
.bd-device--tablet .bd-device__body { width: 64px; height: 96px; }
.bd-device--wall .bd-device__body { width: 148px; height: 88px; }
.bd-device--monitor .bd-device__body { width: 96px; height: 64px; }
}
@media (max-width: 640px) {
.bd-stage { max-width: 300px; gap: 8px; }
.bd-device--tablet .bd-device__body { width: 52px; height: 78px; }
.bd-device--wall .bd-device__body { width: 120px; height: 72px; }
.bd-device--monitor .bd-device__body { width: 78px; height: 52px; }
.bd-device__label { font-size: 8px; }
.bd-stand__base { width: 28px; }
}
/* ── Reduced-motion overrides ───────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
.bd-splash,
.bd-splash__logo,
.bd-ui,
.bd-ui__brand-bar,
.bd-ui__content,
.bd-device__screen::after { animation: none !important; }
/* Static fallback: show branded UI */
.bd-splash { opacity: 0; }
.bd-ui { opacity: 1; }
.bd-ui__brand-bar { transform: scaleX(1); }
.bd-ui__content { opacity: 1; transform: translateY(0); }
}

View File

@@ -557,6 +557,7 @@ add_action( 'init', function () {
'tvStick' => [ 'type' => 'boolean', 'default' => false ],
'cameraAnim' => [ 'type' => 'boolean', 'default' => false ],
'neverGoesDark'=> [ 'type' => 'boolean', 'default' => false ],
'brandedAnim' => [ 'type' => 'boolean', 'default' => false ],
],
'supports' => $block_supports,
'render_callback' => 'oribi_render_platform_row',
@@ -1647,6 +1648,75 @@ function oribi_render_platform_row( $a ) {
$visual_html = $ngd;
$visual_cls = 'platform-visual has-ngd';
} elseif ( ! empty( $a['brandedAnim'] ) ) {
/* ── Custom Display Solutions: branded screens cascade animation ── */
$bd = '<div class="bd-stage" aria-hidden="true">';
/* ── Screen 1: Tablet (portrait kiosk) ── */
$bd .= '<div class="bd-device bd-device--tablet">';
$bd .= '<div class="bd-device__body">';
$bd .= '<div class="bd-device__screen">';
$bd .= '<div class="bd-splash">';
$bd .= '<div class="bd-splash__logo"></div>';
$bd .= '</div>';
$bd .= '<div class="bd-ui">';
$bd .= '<div class="bd-ui__header"><div class="bd-ui__logo"></div><div class="bd-ui__brand-bar"></div></div>';
$bd .= '<div class="bd-ui__content">';
$bd .= '<div class="bd-ui__block bd-ui__block--img"></div>';
$bd .= '<div class="bd-ui__block bd-ui__block--txt"></div>';
$bd .= '<div class="bd-ui__block bd-ui__block--txt bd-ui__block--short"></div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '<span class="bd-device__label">Kiosk</span>';
$bd .= '</div>';
/* ── Screen 2: Wide wall-mount (landscape) ── */
$bd .= '<div class="bd-device bd-device--wall">';
$bd .= '<div class="bd-device__body">';
$bd .= '<div class="bd-device__screen">';
$bd .= '<div class="bd-splash">';
$bd .= '<div class="bd-splash__logo"></div>';
$bd .= '</div>';
$bd .= '<div class="bd-ui">';
$bd .= '<div class="bd-ui__header"><div class="bd-ui__logo"></div><div class="bd-ui__brand-bar"></div></div>';
$bd .= '<div class="bd-ui__content">';
$bd .= '<div class="bd-ui__block bd-ui__block--txt"></div>';
$bd .= '<div class="bd-ui__block bd-ui__block--img"></div>';
$bd .= '<div class="bd-ui__block bd-ui__block--txt bd-ui__block--short"></div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '<div class="bd-mount"></div>';
$bd .= '<span class="bd-device__label">Wall Display</span>';
$bd .= '</div>';
/* ── Screen 3: Monitor on stand ── */
$bd .= '<div class="bd-device bd-device--monitor">';
$bd .= '<div class="bd-device__body">';
$bd .= '<div class="bd-device__screen">';
$bd .= '<div class="bd-splash">';
$bd .= '<div class="bd-splash__logo"></div>';
$bd .= '</div>';
$bd .= '<div class="bd-ui">';
$bd .= '<div class="bd-ui__header"><div class="bd-ui__logo"></div><div class="bd-ui__brand-bar"></div></div>';
$bd .= '<div class="bd-ui__content">';
$bd .= '<div class="bd-ui__block bd-ui__block--txt"></div>';
$bd .= '<div class="bd-ui__block bd-ui__block--txt bd-ui__block--short"></div>';
$bd .= '<div class="bd-ui__block bd-ui__block--img"></div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '</div>';
$bd .= '<div class="bd-stand"><div class="bd-stand__stem"></div><div class="bd-stand__base"></div></div>';
$bd .= '<span class="bd-device__label">Reception</span>';
$bd .= '</div>';
$bd .= '</div>'; /* bd-stage */
$visual_html = $bd;
$visual_cls = 'platform-visual has-branded';
} elseif ( ! empty( $a['cameraAnim'] ) ) {
$ca = '<div class="cam-stage" aria-hidden="true">';