/* ============================================================= OTS Theme - Main Stylesheet ============================================================= */ /* ── 1. CSS Variables ───────────────────────────────────────── */ :root, [data-theme="light"] { /* ── Light palette - Orange Primary + Green Accent ── */ --color-primary: var(--wp--preset--color--primary, #D83302); --color-primary-dk: var(--wp--preset--color--primary-dk, #A22702); --color-primary-lt: var(--wp--preset--color--primary-lt, #FFF0EB); --color-primary-rgb: 216,51,2; --color-accent: var(--wp--preset--color--accent, #4CAF50); --color-accent-dk: var(--wp--preset--color--accent-dk, #388E3C); --color-accent-lt: var(--wp--preset--color--accent-lt, #E8F5E9); --color-accent-rgb: 76,175,80; --color-dark: var(--wp--preset--color--dark, #111111); --color-dark-2: var(--wp--preset--color--dark-2, #1A1A1A); --color-text: var(--wp--preset--color--text, #333333); --color-text-muted: var(--wp--preset--color--text-muted, #666666); --color-border: var(--wp--preset--color--border, #E0E0E0); --color-bg: var(--wp--preset--color--bg, #ffffff); --color-bg-alt: var(--wp--preset--color--bg-alt, #F5F5F5); --color-bg-dark: var(--wp--preset--color--dark, #111111); --color-heading: var(--wp--preset--color--dark, #111111); --header-scrolled-bg: rgba(255,255,255,.97); --header-scrolled-text: var(--wp--preset--color--text, #333333); --card-bg: var(--wp--preset--color--bg, #ffffff); --form-bg: var(--wp--preset--color--bg-alt, #F5F5F5); --form-bg-focus: var(--wp--preset--color--bg, #ffffff); /* ── Typography ── */ --font-sans: var(--wp--preset--font-family--sans, 'Inter', system-ui, -apple-system, sans-serif); --font-heading: var(--wp--preset--font-family--heading, var(--font-sans)); /* ── Border radii ── */ --radius-sm: var(--wp--custom--radius--sm, 6px); --radius-md: var(--wp--custom--radius--md, 10px); --radius-lg: var(--wp--custom--radius--lg, 16px); --radius-xl: var(--wp--custom--radius--xl, 24px); --shadow-sm: none; --shadow-md: 0 2px 8px rgba(0,0,0,.06); --shadow-lg: 0 4px 16px rgba(0,0,0,.08); --transition: 0.2s ease; /* ── Layout ── */ --container-max: var(--wp--custom--container--max, 1200px); --container-pad: var(--wp--custom--container--pad, clamp(1rem, 5vw, 2rem)); } /* ── Dark Mode ────────────────────────────────────────────── */ [data-theme="dark"] { --color-primary: var(--wp--custom--dark--primary, #FF6B3D); --color-primary-dk: var(--wp--custom--dark--primary-dk, #D83302); --color-primary-lt: var(--wp--custom--dark--primary-lt, rgba(216,51,2,.15)); --color-primary-rgb: 255,107,61; --color-accent: var(--wp--custom--dark--accent, #66BB6A); --color-accent-dk: var(--wp--custom--dark--accent-dk, #388E3C); --color-accent-lt: var(--wp--custom--dark--accent-lt, rgba(76,175,80,.12)); --color-accent-rgb: 102,187,106; --color-dark: var(--wp--custom--dark--dark, #E0E0E0); --color-dark-2: var(--wp--custom--dark--dark-2, #BDBDBD); --color-text: var(--wp--custom--dark--text, #E0E0E0); --color-text-muted: var(--wp--custom--dark--text-muted, #9E9E9E); --color-border: var(--wp--custom--dark--border, #333333); --color-bg: var(--wp--custom--dark--bg, #1A1A1A); --color-bg-alt: var(--wp--custom--dark--bg-alt, #222222); --color-bg-dark: var(--wp--custom--dark--bg-dark, #111111); --color-heading: var(--wp--custom--dark--heading, #F5F5F5); --header-scrolled-bg: rgba(26,26,26,.97); --header-scrolled-text: var(--wp--custom--dark--text, #E0E0E0); --card-bg: var(--wp--custom--dark--card-bg, #222222); --form-bg: var(--wp--custom--dark--card-bg, #222222); --form-bg-focus: #2A2A2A; --shadow-sm: none; --shadow-md: 0 2px 8px rgba(0,0,0,.3); --shadow-lg: 0 4px 16px rgba(0,0,0,.4); } /* ── 2. Reset / Base ────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { scroll-behavior: smooth; font-size: 16px; } body { font-family: var(--font-sans); color: var(--color-text); background: var(--color-bg); line-height: 1.65; -webkit-font-smoothing: antialiased; } img, video { max-width: 100%; display: block; } a { color: inherit; text-decoration: none; transition: color var(--transition); } a:hover { color: var(--color-primary); } /* ── Scroll-reveal animation classes ───────────────────────── */ .scroll-hidden { opacity: 0 !important; transform: translateY(24px) !important; /* Prevent transition: all on card elements from animating the hide, which would cause a visible fade-out flicker and race conditions with IntersectionObserver — especially after Gutenberg re-saves inject inline styles onto the block element. */ transition: none !important; } .scroll-visible { opacity: 1; transform: translateY(0); /* !important ensures this wins over transition: all on .oribi-card (same selector specificity, but .oribi-card appears later in the stylesheet and would otherwise override this). var(--scroll-delay) is set per-card by demo-animator.js to produce a staggered entrance when multiple cards reveal at once. */ transition: opacity .5s ease var(--scroll-delay, 0s), transform .5s ease var(--scroll-delay, 0s) !important; } /* Icon pop-in animation — triggered by demo-animator.js when a feature-section card enters the viewport. */ @keyframes icon-pop { 0% { transform: scale(0.5); opacity: 0; } 60% { transform: scale(1.2); opacity: 1; } 100% { transform: scale(1); } } .feature-icon.icon-pop { animation: icon-pop 0.4s ease-out backwards; } /* ── Ambient feature-icon animations ────────────────────────── Continuous "alive" motion inside feature cards, inspired by the design page platform-row visual animations. Combines a gentle float with a sonar-pulse ring on the icon. */ @keyframes icon-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-5px); } } @keyframes icon-ring { 0% { box-shadow: 0 0 0 0 rgba(var(--color-primary-rgb), 0.35); } 60% { box-shadow: 0 0 0 10px rgba(var(--color-primary-rgb), 0); } 100% { box-shadow: 0 0 0 0 rgba(var(--color-primary-rgb), 0); } } @keyframes icon-cog-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* Float + ring on all feature icons (but only once the card has scroll-revealed — the .is-animated class is set by demo-animator.js). */ .oribi-card.is-animated .feature-icon { animation: icon-float 3.6s ease-in-out infinite, icon-ring 3.6s ease-out infinite; } /* Pause ambient animation during hover so the scale transform from .oribi-card:hover .feature-icon takes over cleanly. */ .oribi-card:hover .feature-icon { animation: none; } /* Cog icons spin slowly — contextually appropriate regardless of card. */ .feature-icon .fa-cog, .feature-icon .fa-users-cog { animation: icon-cog-spin 8s linear infinite; } /* Respect reduced-motion preference. */ @media (prefers-reduced-motion: reduce) { .oribi-card.is-animated .feature-icon { animation: none; } .feature-icon .fa-cog, .feature-icon .fa-users-cog { animation: none; } } /* Smooth theme transition */ body, .site-header, .feature-card, .pricing-card, .contact-form-wrap, .platform-visual, .platform-text h3, .platform-text p, .form-group input, .form-group textarea, .form-group select, .comparison-table-wrap, .comparison-table thead th, .comparison-table tbody td, .comparison-group-row td { transition: background var(--transition), color var(--transition), border-color var(--transition), box-shadow var(--transition); } ul { list-style: none; } button { font-family: inherit; cursor: pointer; border: none; background: none; } /* ── 3. Layout Utilities ───────────────────────────────────── */ .container { width: 100%; max-width: var(--container-max); margin-inline: auto; padding-inline: var(--container-pad); } .section { padding-block: clamp(4rem, 8vw, 7rem); } .section-alt { background: var(--color-bg-alt); } .section-dark { background: #111111; color: #fff; } .section-header { text-align: center; max-width: 680px; margin-inline: auto; margin-bottom: 3.5rem; } .section-header .section-label { display: inline-block; font-size: .75rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--color-primary); margin-bottom: .75rem; } .section-dark .section-header .section-label { color: var(--color-primary-lt); } .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 2rem; } .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2rem; } .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1.5rem; } @media (max-width: 960px) { .grid-3 { grid-template-columns: repeat(2, 1fr); } .grid-4 { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 640px) { .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; gap: 1.25rem; } } /* ── 4. Typography ─────────────────────────────────────────── */ h1, h2, h3, h4, h5, h6 { font-family: var(--font-heading, var(--font-sans)); font-weight: 700; line-height: 1.2; color: var(--color-heading); } .section-dark h1, .section-dark h2, .section-dark h3 { color: #fff; } h1 { font-size: clamp(2rem, 5vw, 3.5rem); } h2 { font-size: clamp(1.6rem, 3.5vw, 2.4rem); } h3 { font-size: clamp(1.1rem, 2vw, 1.35rem); } h4 { font-size: 1rem; } p { margin-bottom: 1rem; } p:last-child { margin-bottom: 0; } .lead { font-size: clamp(1rem, 2vw, 1.2rem); color: var(--color-text-muted); line-height: 1.75; } .section-dark .lead { color: rgba(255,255,255,.75); } /* ── 5. Buttons ────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; gap: .5rem; padding: .8rem 1.75rem; border-radius: var(--radius-sm); font-size: .95rem; font-weight: 600; transition: all var(--transition); white-space: nowrap; cursor: pointer; } .btn-primary { background: var(--color-primary); color: #fff; } .btn-primary:hover { background: var(--color-primary-dk); color: #fff; transform: translateY(-1px); box-shadow: 0 6px 20px rgba(var(--color-primary-rgb),.3); } .btn-outline { border: 2px solid var(--color-primary); color: var(--color-primary); background: transparent; } .btn-outline:hover { background: var(--color-primary); color: #fff; transform: translateY(-1px); } .btn-ghost { border: 2px solid rgba(255,255,255,.35); color: #fff; background: transparent; } .btn-ghost:hover { background: rgba(255,255,255,.1); border-color: rgba(255,255,255,.6); color: #fff; } .btn-sm { padding: .55rem 1.2rem; font-size: .875rem; } .btn-lg { padding: 1rem 2.25rem; font-size: 1.05rem; } .btn-group { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; } /* ── 6. Header ─────────────────────────────────────────────── */ .site-header { position: fixed; top: 0; left: 0; right: 0; z-index: 100; padding-block: 1rem; background: transparent; transition: background var(--transition), box-shadow var(--transition), padding var(--transition); } .site-header.scrolled { background: var(--header-scrolled-bg); box-shadow: var(--shadow-sm); padding-block: .65rem; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); } .header-inner { display: flex; align-items: center; gap: 2rem; height: 70px; } /* Logo */ .site-logo { display: flex; align-items: center; flex-shrink: 0; max-height: 80px; overflow: hidden; gap: 1.25rem; } .site-logo a { display: flex; align-items: center; } .custom-logo-link { display: flex; align-items: center; } .site-logo img, .custom-logo-link img, .custom-logo, .header-inner img { max-height: 80px !important; width: auto !important; height: auto !important; max-width: 260px !important; display: block !important; object-fit: contain; } .logo-text { font-size: 1.35rem; font-weight: 300; color: #fff; letter-spacing: -.01em; transition: color var(--transition); } .logo-text strong { font-weight: 800; color: var(--color-primary); margin-right: .25em; } /* When header is over a light hero (set by JS) — unscrolled only */ .site-header.over-light-hero:not(.scrolled) .nav-menu a { color: var(--color-text); } .site-header.over-light-hero:not(.scrolled) .nav-menu a:hover, .site-header.over-light-hero:not(.scrolled) .nav-menu .current-menu-item > a { color: var(--color-primary); } .site-header.over-light-hero:not(.scrolled) .logo-text { color: var(--color-heading); } .site-header.over-light-hero:not(.scrolled) .nav-toggle span { background: var(--color-heading); } /* Nav */ .site-nav { margin-left: auto; } .nav-menu { display: flex; align-items: center; gap: 2rem; } .nav-menu a { font-size: .9rem; font-weight: 500; color: rgba(255,255,255,.85); position: relative; padding-bottom: 2px; } /* Scrolled: switch to theme-appropriate text on solid bg */ .site-header.scrolled .nav-menu a { color: var(--header-scrolled-text); } .site-header.scrolled .nav-menu a:hover, .site-header.scrolled .nav-menu .current-menu-item > a { color: var(--color-primary); } .site-header.scrolled .logo-text { color: var(--color-heading); } .site-header.scrolled .nav-toggle span { background: var(--color-heading); } .nav-menu a::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 0; height: 2px; background: var(--color-primary); transition: width var(--transition); } .nav-menu a:hover, .nav-menu .current-menu-item > a { color: #fff; } .nav-menu a:hover::after, .nav-menu .current-menu-item > a::after { width: 100%; } /* Contact button in nav */ .nav-contact a.btn { display: flex !important; align-items: center !important; justify-content: center !important; text-align: center; padding: .6rem 1.8rem !important; padding-bottom: .6rem !important; font-size: .85rem; border-radius: 50px; color: #fff !important; line-height: 1; } .nav-contact a.btn::after { display: none !important; } /* Remove underline animation from button */ .site-header.scrolled .nav-contact a.btn, .site-header.over-light-hero:not(.scrolled) .nav-contact a.btn, .site-header.scrolled .nav-menu .nav-contact > a.btn { color: #fff !important; } /* ── Dropdown sub-menu ─────────────────────────────────────── */ .nav-menu > li { position: relative; } /* Invisible bridge fills the gap between the link and the dropdown panel, so moving the cursor downward never breaks the :hover state. */ .nav-menu > li.menu-item-has-children::after { content: ''; position: absolute; top: 100%; left: -1rem; right: -1rem; height: .85rem; /* must be >= the gap set on .sub-menu (top: calc(100% + .75rem)) */ } /* Caret indicator on parent items */ .nav-menu > li.menu-item-has-children > a { padding-right: 1.2em; } .nav-menu > li.menu-item-has-children > a::before { content: ''; position: absolute; right: 0; top: 50%; transform: translateY(-55%) rotate(45deg); width: 5px; height: 5px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transition: transform var(--transition); } .nav-menu > li.menu-item-has-children:hover > a::before { transform: translateY(-30%) rotate(225deg); } /* Dropdown panel */ .nav-menu .sub-menu { position: absolute; top: calc(100% + .75rem); left: 50%; transform: translateX(-50%); min-width: 200px; background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--radius-md); box-shadow: var(--shadow-md); padding: .5rem 0; list-style: none; margin: 0; z-index: 200; /* Hidden by default */ opacity: 0; pointer-events: none; visibility: hidden; transform: translateX(-50%) translateY(-6px); transition: opacity var(--transition), transform var(--transition), visibility var(--transition); } /* Arrow notch above the dropdown */ .nav-menu .sub-menu::before { content: ''; position: absolute; top: -6px; left: 50%; transform: translateX(-50%) rotate(45deg); width: 10px; height: 10px; background: var(--color-bg); border-top: 1px solid var(--color-border); border-left: 1px solid var(--color-border); } /* Show on hover */ .nav-menu > li.menu-item-has-children:hover > .sub-menu, .nav-menu > li.menu-item-has-children:focus-within > .sub-menu { opacity: 1; pointer-events: auto; visibility: visible; transform: translateX(-50%) translateY(0); } /* Sub-menu links */ .nav-menu .sub-menu a { display: block; padding: .55rem 1.25rem; font-size: .875rem; font-weight: 500; color: var(--color-text); white-space: nowrap; } .nav-menu .sub-menu a::after { display: none; } .nav-menu .sub-menu a:hover, .nav-menu .sub-menu .current-menu-item > a { color: var(--color-primary); background: var(--color-primary-lt); } /* Dark mode overrides */ [data-theme="dark"] .nav-menu .sub-menu { background: var(--card-bg); border-color: var(--color-border); } [data-theme="dark"] .nav-menu .sub-menu::before { background: var(--card-bg); } [data-theme="dark"] .nav-menu .sub-menu a:hover, [data-theme="dark"] .nav-menu .sub-menu .current-menu-item > a { background: var(--color-primary-lt); } .header-cta { margin-left: 1rem; } /* Mobile toggle */ .nav-toggle { display: none; flex-direction: column; gap: 5px; margin-left: auto; padding: 4px; position: relative; z-index: 101; } .nav-toggle span { display: block; width: 24px; height: 2px; background: #fff; border-radius: 2px; transition: all var(--transition); } .nav-toggle.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); } .nav-toggle.open span:nth-child(2) { opacity: 0; } .nav-toggle.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); } @media (max-width: 768px) { .nav-toggle { display: flex; } .site-nav, .header-cta { display: none; } .site-nav.open { display: block; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: var(--color-bg); z-index: 99; overflow: hidden; } .site-nav.open .nav-menu { padding: 5rem 2rem 2rem; height: 100vh; overflow-y: auto; -webkit-overflow-scrolling: touch; } body.menu-open { overflow: hidden; } body.menu-open .site-header.scrolled { -webkit-backdrop-filter: none; backdrop-filter: none; } .site-nav.open .nav-menu { flex-direction: column; align-items: flex-start; gap: 1.5rem; } .site-nav.open .nav-menu > li { width: 100%; } .nav-toggle.open span { background: var(--color-heading); } .site-nav.open .nav-menu a { color: var(--color-heading); font-size: 1.25rem; text-decoration: none; } .site-nav.open .nav-menu a::after { display: none; } .site-nav.open .nav-menu a:hover, .site-nav.open .nav-menu .current-menu-item > a { color: var(--color-primary); } /* Mobile sub-menu */ .site-nav.open .nav-menu > li.menu-item-has-children > a { padding-right: 2rem; } .site-nav.open .nav-menu > li.menu-item-has-children > a::before { right: .25rem; border-color: var(--color-text-muted); } .site-nav.open .nav-menu > li.menu-item-has-children.submenu-open > a::before { transform: translateY(-30%) rotate(225deg); } .site-nav.open .nav-menu .sub-menu { position: static; transform: none; opacity: 1; visibility: visible; pointer-events: auto; background: var(--color-bg-alt); border: none; border-radius: var(--radius-sm); box-shadow: none; padding: .5rem 0 .5rem .75rem; margin-top: .5rem; display: none; min-width: 0; width: 100%; left: auto; } .site-nav.open .nav-menu .sub-menu::before { display: none; } .site-nav.open .nav-menu > li.menu-item-has-children.submenu-open > .sub-menu { display: block; } .site-nav.open .nav-menu > li.menu-item-has-children:hover > .sub-menu, .site-nav.open .nav-menu > li.menu-item-has-children:focus-within > .sub-menu { transform: none; } .site-nav.open .nav-menu .sub-menu a { font-size: 1rem; padding: .4rem .75rem; color: var(--color-text); white-space: normal; display: block; } .site-nav.open .nav-menu .sub-menu a:hover { color: var(--color-primary); background: transparent; } } /* ── 7. Hero ───────────────────────────────────────────────── */ /* Datacenter canvas background (used by page-hero) */ @keyframes dc-breathe { 0%, 100% { filter: blur(1.5px) brightness(0.82) saturate(1.1); } 50% { filter: blur(2.5px) brightness(0.76) saturate(1.2); } } .dc-canvas { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0; filter: blur(2px) brightness(0.80) saturate(1.15); animation: dc-breathe 8s ease-in-out infinite; pointer-events: none; display: block; will-change: filter; } .hero-overlay { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: rgba(17, 17, 17, 0.85); } .hero { position: relative; min-height: 100vh; display: flex; align-items: center; background: #111111; color: #fff; } .hero-inner { position: relative; z-index: 2; display: grid; grid-template-columns: 1fr 1fr; gap: 3rem; align-items: center; padding-block: 8rem 5rem; } .hero-label { display: inline-flex; align-items: center; gap: .5rem; background: rgba(var(--color-primary-rgb),.12); border: 1px solid rgba(var(--color-primary-rgb),.25); color: var(--color-primary); font-size: .75rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; padding: .4rem 1rem; border-radius: 100px; margin-bottom: 1.5rem; } .hero-title { font-size: clamp(2.2rem, 5vw, 3.8rem); font-weight: 900; line-height: 1.1; color: #fff; margin-bottom: 1.5rem; } .hero-title .highlight { color: var(--color-primary); } .hero-description { font-size: 1.1rem; color: rgba(255,255,255,.7); max-width: 520px; margin-bottom: 2.5rem; line-height: 1.8; } .hero-stats { display: flex; gap: 2.5rem; margin-top: 3rem; padding-top: 2rem; border-top: 1px solid rgba(255,255,255,.1); } .hero-stat-value { font-size: 1.75rem; font-weight: 800; color: #fff; } .hero-stat-label { font-size: .8rem; color: rgba(255,255,255,.5); margin-top: .2rem; } /* Hero visual - device illustration */ .hero-visual { display: flex; justify-content: center; align-items: flex-end; min-height: 0; align-self: center; } /* ── Device grid ───────────────────────────────────────────── */ .hero-devices { display: flex; align-items: flex-end; gap: 1.75rem; padding-bottom: 1rem; } /* ── Individual device wrapper ─────────────────────────────── */ .hero-device { display: flex; flex-direction: column-reverse; align-items: center; gap: .75rem; opacity: 0; animation: hero-device-in 1.4s ease-out forwards; } .hero-device--laptop { animation-delay: .3s; } .hero-device--cloud { animation-delay: .6s; } .hero-device--desktop { animation-delay: .9s; } .hero-device--phone { animation-delay: 1.2s; } @keyframes hero-device-in { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: translateY(0); } } /* ── Device frame ──────────────────────────────────────────── */ .hero-device__frame { display: flex; flex-direction: column; align-items: center; } /* ── Screen (shared) ───────────────────────────────────────── */ .hero-device__screen { background: var(--hero-screen-bg, #0f1623); border: 1.5px solid var(--hero-screen-border, rgba(255,255,255,.15)); border-radius: 8px 8px 0 0; overflow: hidden; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 20px rgba(0,0,0,.3), 0 0 0 1px rgba(255,255,255,.05); } .hero-device__screen-content { padding: .75rem; width: 100%; display: flex; flex-direction: column; align-items: center; gap: .4rem; } /* ── Laptop specifics ──────────────────────────────────────── */ .hero-device--laptop .hero-device__screen { width: 140px; height: 95px; } .hero-device__base { width: 160px; height: 6px; background: var(--hero-frame-bg, #1a2236); border-radius: 0 0 4px 4px; border: 1.5px solid var(--hero-screen-border, rgba(255,255,255,.15)); border-top: none; } /* -- Laptop app bars -- */ .hero-device__app-bars { display: flex; flex-direction: column; gap: 4px; width: 80%; } .hero-device__app-bars div { height: 5px; border-radius: 2px; background: var(--hero-bar-bg, rgba(255,255,255,.12)); } .hero-device__app-bars div:nth-child(1) { width: 100%; } .hero-device__app-bars div:nth-child(2) { width: 75%; } .hero-device__app-bars div:nth-child(3) { width: 55%; } .hero-device__app-bars div:nth-child(4) { width: 40%; } /* ── Cloud (365Care) specifics ─────────────────────────────── */ .hero-device--cloud .hero-device__frame { align-items: center; } .hero-device__cloud-icon { position: relative; width: 80px; height: 60px; display: flex; align-items: center; justify-content: center; filter: drop-shadow(0 2px 12px rgba(var(--color-primary-rgb),.2)); } .hero-device__cloud-icon svg { width: 100%; height: 100%; } .hero-device__cloud-icon svg path { stroke-width: 2.5; } .hero-device__cloud-label { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-family: var(--font-sans); font-size: 1.1rem; font-weight: 900; color: var(--color-primary); letter-spacing: -.02em; padding-top: 6px; } /* ── Desktop specifics ─────────────────────────────────────── */ .hero-device--desktop .hero-device__screen { width: 170px; height: 115px; border: 1.5px solid var(--color-primary); box-shadow: 0 4px 24px rgba(var(--color-primary-rgb),.15), 0 0 0 1px rgba(var(--color-primary-rgb),.08); } .hero-device__stand { width: 10px; height: 18px; background: var(--hero-frame-bg, #1a2236); border-left: 1px solid var(--hero-screen-border, rgba(255,255,255,.1)); border-right: 1px solid var(--hero-screen-border, rgba(255,255,255,.1)); } .hero-device__stand-base { width: 50px; height: 5px; background: var(--hero-frame-bg, #1a2236); border-radius: 0 0 3px 3px; border: 1px solid var(--hero-screen-border, rgba(255,255,255,.1)); border-top: none; } /* Dashboard contents */ .hero-device__dash-row { display: flex; gap: 6px; width: 100%; } .hero-device__dash-card { flex: 1; height: 28px; border-radius: 4px; background: var(--hero-bar-bg, rgba(255,255,255,.08)); border: 1px solid var(--hero-card-inner-border, rgba(255,255,255,.04)); } .hero-device__dash-bar { width: 100%; height: 6px; border-radius: 3px; background: var(--color-primary); opacity: .65; } .hero-device__dash-bar--short { width: 60%; background: var(--color-primary); opacity: .5; } /* ── Phone specifics ───────────────────────────────────────── */ .hero-device--phone .hero-device__screen { width: 72px; height: 120px; border-radius: 12px; border: 1.5px solid var(--hero-screen-border, rgba(255,255,255,.2)); box-shadow: 0 4px 20px rgba(0,0,0,.3); } .hero-device__notif { display: flex; flex-direction: column; align-items: center; gap: .25rem; } .hero-device__notif-icon { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 50%; background: rgba(34,197,94,.2); color: #22c55e; font-size: .9rem; font-weight: 700; box-shadow: 0 0 12px rgba(34,197,94,.25); } .hero-device__notif-text { font-size: .6rem; font-weight: 600; color: var(--hero-text-secondary, rgba(255,255,255,.5)); text-transform: uppercase; letter-spacing: .08em; } /* ── Service list (stacks from bottom) ─────────────────────── */ .hero-device__services { list-style: none; display: flex; flex-direction: column-reverse; gap: .35rem; width: 100%; } .svc { display: flex; align-items: center; gap: .4rem; font-size: .65rem; font-weight: 600; color: var(--hero-text-secondary, rgba(255,255,255,.6)); background: var(--hero-svc-bg, rgba(255,255,255,.04)); border: 1px solid var(--hero-svc-border, rgba(255,255,255,.06)); border-radius: 6px; padding: .3rem .5rem; white-space: nowrap; opacity: 0; animation: svc-stack-in .8s ease-out forwards; } .svc__dot { width: 5px; height: 5px; border-radius: 50%; background: #22c55e; flex-shrink: 0; } /* Stagger service items - stack upward from device */ .hero-device--laptop .svc--1 { animation-delay: 1.2s; } .hero-device--laptop .svc--2 { animation-delay: 1.5s; } .hero-device--laptop .svc--3 { animation-delay: 1.8s; } .hero-device--cloud .svc--1 { animation-delay: 1.5s; } .hero-device--cloud .svc--2 { animation-delay: 1.8s; } .hero-device--cloud .svc--3 { animation-delay: 2.1s; } .hero-device--desktop .svc--1 { animation-delay: 1.8s; } .hero-device--desktop .svc--2 { animation-delay: 2.1s; } .hero-device--desktop .svc--3 { animation-delay: 2.4s; } .hero-device--phone .svc--1 { animation-delay: 2.1s; } .hero-device--phone .svc--2 { animation-delay: 2.4s; } @keyframes svc-stack-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } /* ── Light / Dark theme vars for hero ──────────────────────── */ :root, [data-theme="light"] { --hero-screen-bg: #f7fafc; --hero-screen-border: #e2e8f0; --hero-frame-bg: #edf2f7; --hero-bar-bg: #e2e8f0; --hero-card-inner-border: #cbd5e0; --hero-text-secondary: rgba(45,55,72,.6); --hero-svc-bg: rgba(0,0,0,.03); --hero-svc-border: #e2e8f0; } [data-theme="dark"] { --hero-screen-bg: #0f1623; --hero-screen-border: rgba(255,255,255,.1); --hero-frame-bg: #1a2236; --hero-bar-bg: rgba(255,255,255,.08); --hero-card-inner-border: rgba(255,255,255,.04); --hero-text-secondary: rgba(255,255,255,.55); --hero-svc-bg: rgba(255,255,255,.04); --hero-svc-border: rgba(255,255,255,.06); } /* Light-mode hero overrides */ [data-theme="light"] .hero { background: var(--color-bg); color: var(--color-text); } [data-theme="light"] .hero-title { color: var(--color-heading); } [data-theme="light"] .hero-description { color: var(--color-text-muted); } [data-theme="light"] .hero-stats { border-top-color: var(--color-border); } [data-theme="light"] .hero-stat-value { color: var(--color-heading); } [data-theme="light"] .hero-stat-label { color: var(--color-text-muted); } [data-theme="light"] .hero-label { background: rgba(var(--color-primary-rgb),.08); border-color: rgba(var(--color-primary-rgb),.2); } [data-theme="light"] .hero-device__app-bars div { background: #cbd5e0; } [data-theme="light"] .hero-device__screen { box-shadow: 0 4px 20px rgba(0,0,0,.08), 0 0 0 1px rgba(0,0,0,.05); } [data-theme="light"] .hero-device--desktop .hero-device__screen { box-shadow: 0 4px 24px rgba(var(--color-primary-rgb),.08), 0 0 0 1px rgba(var(--color-primary-rgb),.05); } [data-theme="light"] .hero-device--phone .hero-device__screen { box-shadow: 0 4px 20px rgba(0,0,0,.08); } [data-theme="light"] .hero-device__cloud-icon { filter: drop-shadow(0 2px 12px rgba(var(--color-primary-rgb),.15)); } [data-theme="light"] .hero-device__cloud-icon svg path { stroke: var(--color-primary); } [data-theme="light"] .hero-device__notif-icon { background: rgba(22,163,74,.12); color: #16a34a; box-shadow: 0 0 10px rgba(22,163,74,.15); } [data-theme="light"] .hero-device__dash-bar { opacity: .5; } [data-theme="light"] .hero-device__dash-bar--short { opacity: .35; } [data-theme="light"] .svc__dot { background: #16a34a; } /* Reduced motion */ @media (prefers-reduced-motion: reduce) { .hero-device, .svc { animation: none; opacity: 1; } } @media (max-width: 900px) { .hero-inner { grid-template-columns: 1fr; text-align: center; } .hero-description { margin-inline: auto; } .btn-group { justify-content: center; } .hero-stats { justify-content: center; } .hero-visual { margin-top: 2rem; } .hero-devices { gap: 1rem; justify-content: center; } .hero-device--laptop .hero-device__screen { width: 110px; height: 75px; } .hero-device__base { width: 126px; } .hero-device__cloud-icon { width: 64px; height: 48px; } .hero-device__cloud-label { font-size: .9rem; } .hero-device--desktop .hero-device__screen { width: 130px; height: 88px; } .hero-device--phone .hero-device__screen { width: 58px; height: 96px; } .svc { font-size: .58rem; padding: .25rem .4rem; } } @media (max-width: 480px) { .hero-devices { flex-wrap: wrap; gap: 1.5rem; } .hero-device--desktop { order: -1; } } /* ── 8. Shared Card Base ───────────────────────────────────── */ .oribi-card { background: var(--card-bg); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 2rem; transition: box-shadow var(--transition), border-color var(--transition), background var(--transition); position: relative; } .oribi-card:hover { box-shadow: var(--shadow-lg); border-color: var(--color-primary); } .oribi-card h3 { margin-bottom: .5rem; font-size: 1.1rem; } .oribi-card p { color: var(--color-text-muted); font-size: .95rem; } /* ── Card Image System ─────────────────────────────────────── */ .oribi-card-img { display: block; max-width: 100%; border-radius: var(--radius-sm); } .oribi-card-img--contain { object-fit: contain; } .oribi-card-img--cover { object-fit: cover; } .oribi-card-img-wrap { line-height: 0; overflow: hidden; } /* Image position: top */ .oribi-card.img-top .oribi-card-img-wrap { margin-bottom: 1.25rem; } /* Image position: left - side-by-side */ .oribi-card.img-left { display: flex; flex-direction: row; align-items: flex-start; gap: 1.25rem; } .oribi-card.img-left .oribi-card-img-wrap { flex-shrink: 0; } .oribi-card.img-left .oribi-card-body { flex: 1; min-width: 0; } @media (max-width: 480px) { .oribi-card.img-left { flex-direction: column; } } /* Image position: replace-icon - image takes icon slot */ .oribi-card.img-replace-icon .oribi-card-img-wrap { margin-bottom: 1.25rem; } /* Image position: background */ .oribi-card.img-bg { overflow: hidden; color: #fff; } .oribi-card.img-bg .oribi-card-img-wrap { position: absolute; inset: 0; z-index: 0; } .oribi-card.img-bg .oribi-card-img-wrap .oribi-card-img { width: 100%; height: 100%; object-fit: cover; border-radius: 0; } .oribi-card.img-bg::after { content: ''; position: absolute; inset: 0; background: rgba(17, 17, 17, 0.75); z-index: 1; pointer-events: none; } .oribi-card.img-bg .oribi-card-body { position: relative; z-index: 2; } .oribi-card.img-bg h3 { color: #fff; } .oribi-card.img-bg p { color: rgba(255,255,255,.8); } /* ── 8a. Feature Card ──────────────────────────────────────── */ .feature-card-link { display: block; text-decoration: none; color: inherit; } .feature-card-link:hover { color: inherit; } .feature-icon { width: 52px; height: 52px; background: var(--color-primary-lt); color: var(--color-primary); border-radius: 14px; display: flex; align-items: center; justify-content: center; margin-bottom: 1.25rem; font-size: 1.4rem; transition: transform var(--transition), background var(--transition), color var(--transition); } /* Font Awesome inside icon containers - normalise line-height and prevent the icon from inheriting an unexpected font-size from its wrapper. */ .feature-icon i, .value-icon i { line-height: 1; font-size: inherit; } .oribi-card:hover .feature-icon { transform: scale(1.1); background: var(--color-primary); color: #fff; } /* ═══════════════════════════════════════════════════════════════ 8a-i. Card Scene Mini Animations (.card-scene) Replaces .feature-icon on feature-cards with scene="" set. Dark #0d1117 screen aesthetic, pure CSS animations, matching the design page platform-row visual language. ═══════════════════════════════════════════════════════════════ */ /* ── Shared scaffold ─────────────────────────────────────────── */ .card-scene { width: 100%; height: 140px; margin-bottom: 1.25rem; border-radius: var(--radius-md); overflow: hidden; flex-shrink: 0; text-align: left; } .cs-screen { width: 100%; height: 100%; background: #0d1117; border: 1px solid rgba(255,255,255,0.08); border-radius: var(--radius-md); overflow: hidden; display: flex; flex-direction: column; padding: 10px; gap: 6px; box-sizing: border-box; } .cs-topbar { display: flex; align-items: center; gap: 6px; padding-bottom: 6px; border-bottom: 1px solid rgba(255,255,255,0.06); flex-shrink: 0; } .cs-dots { display: flex; gap: 3px; } .cs-dots span { width: 6px; height: 6px; border-radius: 50%; } .cs-dots span:nth-child(1) { background: #ff5f56; } .cs-dots span:nth-child(2) { background: #ffbd2e; } .cs-dots span:nth-child(3) { background: #27c93f; } .cs-title { font-size: 9px; font-weight: 600; letter-spacing: 0.5px; color: rgba(255,255,255,0.35); text-transform: uppercase; flex: 1; text-align: center; } .cs-live-dot { width: 6px; height: 6px; border-radius: 50%; background: #ef4444; flex-shrink: 0; animation: cs-live-pulse 1.4s ease-in-out infinite; } @keyframes cs-live-pulse { 0%,100% { opacity: 1; box-shadow: 0 0 0 0 rgba(239,68,68,0.5); } 50% { opacity: 0.7; box-shadow: 0 0 0 4px rgba(239,68,68,0); } } /* ── Scene 1: Content Management ─────────────────────────────── */ .cs-cms .cs-files { display: flex; flex-direction: column; gap: 6px; flex: 1; justify-content: center; } .cs-file { display: flex; align-items: center; gap: 6px; opacity: 0; transform: translateY(6px); animation: cs-file-in 4.5s ease-in-out infinite; } .cs-file--1 { animation-delay: 0.1s; } .cs-file--2 { animation-delay: 0.5s; } .cs-file--3 { animation-delay: 0.9s; } @keyframes cs-file-in { 0%,8% { opacity: 0; transform: translateY(6px); } 18%,72% { opacity: 1; transform: translateY(0); } 82%,100% { opacity: 0; transform: translateY(-4px); } } .cs-ftype { font-size: 7px; font-weight: 700; padding: 2px 5px; border-radius: 3px; min-width: 28px; text-align: center; letter-spacing: 0.3px; flex-shrink: 0; } .cs-ftype-img { background: rgba(59,130,246,0.2); color: #60a5fa; } .cs-ftype-vid { background: rgba(168,85,247,0.2); color: #c084fc; } .cs-ftype-html { background: rgba(var(--color-primary-rgb),0.2); color: var(--color-primary); } .cs-fbar { flex: 1; height: 4px; background: rgba(255,255,255,0.06); border-radius: 2px; overflow: hidden; position: relative; } .cs-fbar::after { content: ''; position: absolute; top:0; left:0; bottom:0; border-radius: 2px; background: rgba(255,255,255,0.2); } .cs-file--1 .cs-fbar::after { width: 78%; } .cs-file--2 .cs-fbar::after { width: 52%; } .cs-file--3 .cs-fbar::after { width: 34%; } .cs-fsize { font-size: 7px; color: rgba(255,255,255,0.2); min-width: 26px; text-align: right; flex-shrink: 0; } .cs-upload { font-size: 8px; font-weight: 600; text-align: center; color: var(--color-primary); border: 1px solid rgba(var(--color-primary-rgb),0.35); border-radius: 4px; padding: 3px 0; flex-shrink: 0; animation: cs-upload-glow 2.5s ease-in-out infinite; } @keyframes cs-upload-glow { 0%,100% { border-color: rgba(var(--color-primary-rgb),0.3); box-shadow: none; } 50% { border-color: rgba(var(--color-primary-rgb),0.8); box-shadow: 0 0 8px rgba(var(--color-primary-rgb),0.25); } } /* ── Scene 2: Smart Scheduling ────────────────────────────────── */ .cs-week { display: flex; gap: 4px; flex: 1; align-items: flex-end; } .cs-cal-day { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 4px; } .cs-cal-day > span { font-size: 7px; font-weight: 600; color: rgba(255,255,255,0.3); } .cs-cal-bar { width: 100%; border-radius: 3px; background: rgba(var(--color-primary-rgb),0.65); animation: cs-bar-glow 3.5s ease-in-out infinite; } .cs-cal-day:nth-child(1) .cs-cal-bar { height: 36px; animation-delay: 0.0s; } .cs-cal-day:nth-child(2) .cs-cal-bar { height: 52px; animation-delay: 0.2s; } .cs-cal-day:nth-child(3) .cs-cal-bar { height: 28px; animation-delay: 0.4s; } .cs-cal-day:nth-child(4) .cs-cal-bar { height: 44px; animation-delay: 0.6s; } .cs-cal-day:nth-child(5) .cs-cal-bar { height: 60px; animation-delay: 0.8s; } .cs-cal-day:nth-child(6) .cs-cal-bar { height: 18px; animation-delay: 1.0s; opacity: 0.35; } .cs-cal-day:nth-child(7) .cs-cal-bar { height: 12px; animation-delay: 1.2s; opacity: 0.35; } @keyframes cs-bar-glow { 0%,100% { opacity: 0.45; } 50% { opacity: 1; box-shadow: 0 0 8px rgba(var(--color-primary-rgb),0.55); } } /* ── Scene 3: Live Data Feeds ──────────────────────────────────── */ .cs-feed-rows { display: flex; flex-direction: column; gap: 9px; flex: 1; justify-content: center; } .cs-feed-row { display: flex; align-items: center; justify-content: space-between; } .cs-feed-label { font-size: 8px; font-weight: 700; color: rgba(255,255,255,0.3); letter-spacing: 0.8px; text-transform: uppercase; } .cs-feed-val { position: relative; height: 13px; min-width: 52px; } .cs-feed-val span { position: absolute; right: 0; top: 0; font-size: 9px; font-weight: 600; font-variant-numeric: tabular-nums; opacity: 0; animation: cs-val-show 6s linear infinite; } .cs-fv1-a,.cs-fv1-b,.cs-fv1-c { color: #4ade80; } .cs-fv2-a,.cs-fv2-b,.cs-fv2-c { color: rgba(255,255,255,0.8); } .cs-fv3-a,.cs-fv3-b,.cs-fv3-c { color: var(--color-primary); } .cs-fv1-a,.cs-fv2-a,.cs-fv3-a { animation-delay: 0s; } .cs-fv1-b,.cs-fv2-b,.cs-fv3-b { animation-delay: 2s; } .cs-fv1-c,.cs-fv2-c,.cs-fv3-c { animation-delay: 4s; } @keyframes cs-val-show { 0%,29% { opacity: 1; } 33%,100%{ opacity: 0; } } /* ── Scene 4: Template Library ─────────────────────────────────── */ .cs-tmpl-grid { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; gap: 5px; flex: 1; } .cs-tmpl { background: rgba(255,255,255,0.04); border-radius: 4px; border: 1px solid rgba(255,255,255,0.08); padding: 5px; display: flex; flex-direction: column; gap: 3px; animation: cs-tmpl-sel 8s ease-in-out infinite; } .cs-tmpl--1 { animation-delay: 0s; } .cs-tmpl--2 { animation-delay: 2s; } .cs-tmpl--3 { animation-delay: 4s; } .cs-tmpl--4 { animation-delay: 6s; } @keyframes cs-tmpl-sel { 0%,1% { border-color: rgba(var(--color-primary-rgb),0.8); box-shadow: 0 0 0 1px rgba(var(--color-primary-rgb),0.25); } 22%,23% { border-color: rgba(var(--color-primary-rgb),0.8); box-shadow: 0 0 0 1px rgba(var(--color-primary-rgb),0.25); } 25%,100% { border-color: rgba(255,255,255,0.08); box-shadow: none; } } .cs-tmpl-thumb { flex: 1; min-height: 12px; border-radius: 3px; background: rgba(255,255,255,0.07); } .cs-tmpl-thumb--full { min-height: 20px; } .cs-tmpl-line { height: 3px; border-radius: 2px; background: rgba(255,255,255,0.14); } .cs-tmpl-line--short { width: 60%; } .cs-tmpl-line--med { width: 85%; } /* ── Scene 5: Team & Permissions ───────────────────────────────── */ .cs-team-avatars { display: flex; justify-content: space-around; align-items: center; flex: 1; padding: 2px 0; } .cs-avatar { display: flex; flex-direction: column; align-items: center; gap: 5px; } .cs-av-circle { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 700; color: #fff; animation: cs-av-pulse 4s ease-in-out infinite; } .cs-avatar--1 .cs-av-circle { background: rgba(var(--color-primary-rgb),0.8); animation-delay: 0s; } .cs-avatar--2 .cs-av-circle { background: rgba(99,102,241,0.8); animation-delay: 0.8s; } .cs-avatar--3 .cs-av-circle { background: rgba(107,114,128,0.7); animation-delay: 1.6s; } @keyframes cs-av-pulse { 0%,100% { transform: scale(1); opacity: 0.8; } 50% { transform: scale(1.1); opacity: 1; box-shadow: 0 0 10px rgba(255,255,255,0.15); } } .cs-av-role { font-size: 7px; font-weight: 700; padding: 2px 5px; border-radius: 3px; letter-spacing: 0.3px; text-transform: uppercase; } .cs-role-admin { background: rgba(var(--color-primary-rgb),0.2); color: var(--color-primary); } .cs-role-editor { background: rgba(99,102,241,0.2); color: #818cf8; } .cs-role-viewer { background: rgba(107,114,128,0.15); color: rgba(255,255,255,0.35); } .cs-perm-strip { display: flex; gap: 4px; justify-content: center; flex-shrink: 0; } .cs-perm-dot { height: 4px; border-radius: 2px; background: rgba(255,255,255,0.1); } .cs-perm-dot--1 { width: 32px; background: rgba(var(--color-primary-rgb),0.55); } .cs-perm-dot--2 { width: 24px; background: rgba(99,102,241,0.55); } .cs-perm-dot--3 { width: 16px; } /* ── Scene 6: Playback Analytics ───────────────────────────────── */ .cs-analytics-body { display: flex; align-items: center; gap: 14px; flex: 1; padding: 2px 4px; } .cs-ring-wrap { position: relative; width: 52px; height: 52px; flex-shrink: 0; } .cs-ring { width: 52px; height: 52px; border-radius: 50%; border: 5px solid var(--color-primary); border-left-color: rgba(255,255,255,0.07); animation: cs-ring-spin 3.5s ease-in-out infinite; } @keyframes cs-ring-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .cs-ring-val { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 9px; font-weight: 700; color: rgba(255,255,255,0.7); } .cs-bars { display: flex; align-items: flex-end; gap: 4px; flex: 1; height: 100%; padding-bottom: 2px; } .cs-sbar { flex: 1; border-radius: 2px 2px 0 0; background: rgba(var(--color-primary-rgb),0.55); animation: cs-sbar-pulse 2.4s ease-in-out infinite; } .cs-sbar--1 { height: 40%; animation-delay: 0.0s; } .cs-sbar--2 { height: 65%; animation-delay: 0.2s; } .cs-sbar--3 { height: 80%; animation-delay: 0.4s; } .cs-sbar--4 { height: 55%; animation-delay: 0.6s; } .cs-sbar--5 { height: 90%; animation-delay: 0.8s; } .cs-sbar--6 { height: 70%; animation-delay: 1.0s; } @keyframes cs-sbar-pulse { 0%,100% { opacity: 0.5; } 50% { opacity: 1; box-shadow: 0 0 6px rgba(var(--color-primary-rgb),0.5); } } /* ── Reduced motion ─────────────────────────────────────────────── */ @media (prefers-reduced-motion: reduce) { .cs-file { animation: none; opacity: 1; transform: none; } .cs-cal-bar { animation: none; opacity: 0.7; } .cs-feed-val span { animation: none; } .cs-fv1-a,.cs-fv2-a,.cs-fv3-a { opacity: 1; } .cs-upload { animation: none; } .cs-live-dot { animation: none; } .cs-tmpl { animation: none; } .cs-av-circle { animation: none; opacity: 1; transform: none; } .cs-ring { animation: none; } .cs-sbar { animation: none; opacity: 0.7; } } /* ── 8b. Value Card ────────────────────────────────────────── */ .value-card { text-align: center; border-top: 3px solid var(--color-primary); border-radius: var(--radius-sm) var(--radius-sm) var(--radius-md) var(--radius-md); } .value-card:hover { border-top-color: var(--color-primary-dk); } .value-icon { width: 64px; height: 64px; background: var(--color-primary-lt); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-inline: auto; margin-bottom: 1.25rem; font-size: 1.75rem; color: var(--color-primary); transition: transform var(--transition); } .value-card:hover .value-icon { transform: scale(1.05); } /* ── 8c. Addon Card ────────────────────────────────────────── */ .oribi-card.addon-card { border-style: dashed; border-left: 3px solid var(--color-primary); border-left-style: solid; background: var(--card-bg); } .oribi-card.addon-card:hover { border-style: solid; border-color: var(--color-primary); } .addon-tag { display: inline-block; font-size: var(--wp--preset--font-size--xs, .75rem); background: var(--color-primary-lt); color: var(--color-primary); padding: .25rem .75rem; border-radius: 999px; margin-bottom: .75rem; font-weight: 600; } .addon-card h3 { color: var(--color-heading); } .addon-card p { font-size: .9rem; } /* ── 8d. Image Card ────────────────────────────────────────── */ .image-card { padding: 0; overflow: hidden; border-radius: var(--radius-lg); border: none; box-shadow: var(--shadow-sm); } .image-card:hover { box-shadow: var(--shadow-lg); border: none; } .image-card .oribi-card-body { padding: 1.5rem 2rem; } .image-card.img-left .oribi-card-body { padding: 1.5rem 1.5rem 1.5rem 0; } .image-card .oribi-card-img { transition: transform .4s ease; } .image-card:hover .oribi-card-img { transform: scale(1.05); } /* ── 8e. Stat Card ─────────────────────────────────────────── */ .stat-card { text-align: center; position: relative; overflow: hidden; } .stat-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--color-primary); } .stat-value { font-size: var(--wp--preset--font-size--4-xl, 2.5rem); font-weight: 800; color: var(--color-primary); line-height: 1; margin-bottom: .25rem; letter-spacing: -0.02em; } .stat-card:hover .stat-value { color: var(--color-primary-dk); } .stat-label { font-size: var(--wp--preset--font-size--md, 1rem); font-weight: 600; color: var(--color-heading); text-transform: uppercase; letter-spacing: .05em; font-size: .85rem; } .stat-card p { margin-top: .75rem; padding-top: .75rem; border-top: 1px solid var(--color-border); } /* ── 8f. Link Card ─────────────────────────────────────────── */ .link-card { display: flex; flex-direction: column; border-left: 4px solid var(--color-dark-2); border-radius: var(--radius-sm) var(--radius-md) var(--radius-md) var(--radius-sm); background: var(--color-bg-alt); } .link-card:hover { border-left-width: 5px; border-left-color: var(--color-primary); background: var(--color-primary-lt); } .link-card .feature-icon { background: transparent; padding: 0; font-size: 1.6rem; width: auto; height: auto; margin-bottom: 1rem; } .link-card:hover .feature-icon { background: transparent; transform: none; } .link-card-cta { color: var(--color-primary); font-weight: 600; font-size: var(--wp--preset--font-size--sm, .875rem); text-decoration: none; display: inline-flex; align-items: center; gap: .35rem; margin-top: auto; padding-top: .75rem; } .link-card-cta::after { content: '\2192'; transition: transform var(--transition); } .link-card:hover .link-card-cta::after { transform: translateX(4px); } .link-card-cta:hover { text-decoration: underline; } /* ── 8g. Card Mobile Responsive ────────────────────────────── */ /* Tablet - tighten padding & typography */ @media (max-width: 960px) { .oribi-card { padding: 1.5rem; } .stat-value { font-size: var(--wp--preset--font-size--3-xl, 2rem); } .image-card .oribi-card-body { padding: 1.25rem 1.5rem; } } /* Small screens - single-column adjustments */ @media (max-width: 640px) { .oribi-card { padding: 1.25rem; } .oribi-card h3 { font-size: 1rem; } .oribi-card p { font-size: .9rem; } /* Feature card: smaller icon */ .feature-icon { width: 44px; height: 44px; font-size: 1.2rem; margin-bottom: 1rem; } /* Value card: downsize icon, keep centered */ .value-icon { width: 52px; height: 52px; font-size: 1.5rem; margin-bottom: 1rem; } /* Addon card: softer gradient, thinner accent */ .oribi-card.addon-card { border-left-width: 2px; } /* Image card: reduce body padding */ .image-card .oribi-card-body { padding: 1rem 1.25rem; } .image-card.img-left .oribi-card-body { padding: 1rem 1.25rem; } .image-card { border-radius: var(--radius-md); } /* Stat card: scale down the value */ .stat-value { font-size: var(--wp--preset--font-size--2-xl, 1.75rem); } .stat-label { font-size: .8rem; } .stat-card p { font-size: .85rem; } /* Link card: full-width friendly */ .link-card { border-left-width: 2px; } .link-card:hover { border-left-width: 3px; } .link-card .feature-icon { font-size: 1.4rem; margin-bottom: .75rem; } /* Image-left layout stacks at this breakpoint */ .oribi-card.img-left { flex-direction: column; } .image-card.img-left { flex-direction: column; } .image-card.img-left .oribi-card-img-wrap { width: 100%; } } /* Extra-small - compact for narrow phones */ @media (max-width: 400px) { .oribi-card { padding: 1rem; } .feature-icon { width: 40px; height: 40px; font-size: 1.1rem; } .value-icon { width: 46px; height: 46px; font-size: 1.3rem; } .stat-value { font-size: var(--wp--preset--font-size--xl, 1.5rem); } .image-card .oribi-card-body { padding: .875rem 1rem; } } /* Touch devices - no hover state changes */ @media (hover: none) { .oribi-card:hover { box-shadow: none; border-color: var(--color-border); } .value-card:hover { border-top-color: var(--color-primary); } .oribi-card.addon-card:hover { border-style: dashed; border-left-style: solid; border-color: var(--color-border); border-left-color: var(--color-primary); } .link-card:hover { border-left-width: 4px; border-left-color: var(--color-dark-2); background: var(--color-bg-alt); } .image-card:hover { box-shadow: var(--shadow-sm); } .image-card:hover .oribi-card-img { transform: none; } .oribi-card:hover .feature-icon { transform: none; background: var(--color-primary-lt); color: var(--color-primary); } .value-card:hover .value-icon { transform: none; box-shadow: none; } .stat-card:hover .stat-value { color: var(--color-primary); } .link-card:hover .link-card-cta::after { transform: none; } } /* Legacy compat aliases (deprecated) */ /* ── 8h. New Card Variants ─────────────────────────────────── */ /* Bold Statement Card - large text, green left border */ .oribi-card.bold-statement { border-left: 5px solid var(--color-primary); border-radius: 0 var(--radius-md) var(--radius-md) 0; padding: 2.5rem; } .oribi-card.bold-statement h3 { font-size: clamp(1.3rem, 2.5vw, 1.75rem); font-weight: 800; margin-bottom: .75rem; } .oribi-card.bold-statement p { font-size: 1rem; line-height: 1.7; } /* Minimal Feature Card - clean icon + title + description */ .oribi-card.minimal-feature { border: none; border-bottom: 2px solid var(--color-border); border-radius: 0; padding: 1.75rem 0; background: transparent; } .oribi-card.minimal-feature:hover { border-bottom-color: var(--color-primary); transform: none; box-shadow: none; } .oribi-card.minimal-feature .feature-icon { width: 44px; height: 44px; border-radius: 50%; font-size: 1.1rem; } .oribi-card.minimal-feature h3 { font-size: 1rem; font-weight: 700; } .oribi-card.minimal-feature p { font-size: .9rem; margin: 0; } /* Prominent Stat Card - oversized number */ .oribi-card.prominent-stat { text-align: center; border: 1px solid var(--color-border); padding: 2.5rem 2rem; } .oribi-card.prominent-stat:hover { background: var(--color-primary-lt); border-color: var(--color-primary); transform: none; box-shadow: none; } .oribi-card.prominent-stat .stat-value { font-size: clamp(2.5rem, 5vw, 3.5rem); font-weight: 900; color: var(--color-primary); line-height: 1; margin-bottom: .5rem; } .oribi-card.prominent-stat .stat-label { font-size: .85rem; font-weight: 600; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: .08em; } .oribi-card.prominent-stat::before { display: none; } /* Testimonial Card - quote with author */ .oribi-card.testimonial { border: none; border-left: 4px solid var(--color-primary); border-radius: 0 var(--radius-md) var(--radius-md) 0; background: var(--color-bg-alt); padding: 2rem 2.5rem; } .oribi-card.testimonial:hover { transform: none; box-shadow: none; background: var(--color-primary-lt); } .oribi-card.testimonial blockquote, .oribi-card.testimonial .testimonial-quote { font-size: 1.05rem; line-height: 1.8; color: var(--color-text); margin-bottom: 1.25rem; font-style: normal; } .oribi-card.testimonial .testimonial-author { font-weight: 700; color: var(--color-primary); font-size: .95rem; } .oribi-card.testimonial .testimonial-role { font-size: .85rem; color: var(--color-text-muted); } /* Action Card - icon, title, arrow CTA */ .oribi-card.action { display: flex; flex-direction: column; border: 1px solid var(--color-border); padding: 2rem; cursor: pointer; } .oribi-card.action:hover { background: var(--color-primary); border-color: var(--color-primary); color: #fff; transform: none; box-shadow: none; } .oribi-card.action:hover h3, .oribi-card.action:hover p, .oribi-card.action:hover .feature-icon { color: #fff; } .oribi-card.action:hover .feature-icon { background: rgba(255,255,255,.15); } .oribi-card.action .action-arrow { margin-top: auto; padding-top: 1rem; font-size: 1.2rem; color: var(--color-primary); transition: transform var(--transition), color var(--transition); } .oribi-card.action:hover .action-arrow { color: #fff; transform: translateX(4px); } /* Comparison Row Card - checkmark + label */ .oribi-card.comparison-row { display: flex; align-items: center; gap: 1rem; border: none; border-bottom: 1px solid var(--color-border); border-radius: 0; padding: 1.25rem 0; background: transparent; } .oribi-card.comparison-row:hover { background: var(--color-primary-lt); transform: none; box-shadow: none; padding-inline: 1rem; border-radius: var(--radius-sm); } @media (prefers-color-scheme: dark) { .oribi-card.comparison-row:hover { background: rgba(var(--color-primary-rgb), .1); } } .oribi-card.comparison-row .comparison-check { width: 32px; height: 32px; background: var(--color-accent); color: var(--color-bg); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: .9rem; font-weight: 800; flex-shrink: 0; box-shadow: 0 2px 8px rgba(76, 175, 80, 0.2); } @media (prefers-color-scheme: dark) { .oribi-card.comparison-row .comparison-check { background: var(--color-accent-dk); color: var(--color-accent-lt); box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3); } } .oribi-card.comparison-row h3 { font-size: 1rem; font-weight: 600; margin: 0; } .oribi-card.comparison-row p { font-size: .9rem; margin: 0; flex: 1; } /* Image Info Card - image top + metadata */ .oribi-card.image-info { padding: 0; overflow: hidden; border: 1px solid var(--color-border); } .oribi-card.image-info:hover { border-color: var(--color-primary); transform: none; box-shadow: none; } .oribi-card.image-info .oribi-card-img-wrap { overflow: hidden; line-height: 0; } .oribi-card.image-info .oribi-card-img { transition: transform .3s ease; width: 100%; height: auto; } .oribi-card.image-info:hover .oribi-card-img { transform: scale(1.03); } .oribi-card.image-info .oribi-card-body { padding: 1.5rem; } .oribi-card.image-info .image-info-tag { display: inline-block; font-size: .72rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--color-primary); margin-bottom: .5rem; } .oribi-card.image-info h3 { font-size: 1.1rem; margin-bottom: .5rem; } .oribi-card.image-info p { font-size: .9rem; line-height: 1.6; } /* Addon Bundle Card - icon grid + features */ .oribi-card.addon-bundle { border: 1px solid var(--color-border); padding: 2rem; } .oribi-card.addon-bundle:hover { border-color: var(--color-primary); transform: none; box-shadow: none; } .oribi-card.addon-bundle .bundle-icons { display: flex; gap: .75rem; margin-bottom: 1.25rem; flex-wrap: wrap; } .oribi-card.addon-bundle .bundle-icon { width: 40px; height: 40px; background: var(--color-primary-lt); color: var(--color-primary); border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; font-size: 1rem; } .oribi-card.addon-bundle .bundle-features { list-style: none; margin-top: 1rem; } .oribi-card.addon-bundle .bundle-features li { display: flex; align-items: center; gap: .5rem; font-size: .9rem; padding: .35rem 0; color: var(--color-text-muted); } .oribi-card.addon-bundle .bundle-features li::before { content: '\2713'; color: var(--color-primary); font-weight: 700; font-size: .8rem; } /* Status Badge Card - circle badge + label */ .oribi-card.status-badge { text-align: center; border: 1px solid var(--color-border); padding: 2.5rem 1.5rem; } .oribi-card.status-badge:hover { border-color: var(--color-primary); transform: none; box-shadow: none; } .oribi-card.status-badge .badge-circle { width: 80px; height: 80px; border-radius: 50%; background: var(--color-primary); color: #fff; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem; font-size: 1.5rem; font-weight: 800; } .oribi-card.status-badge .badge-label { font-size: .9rem; font-weight: 600; color: var(--color-heading); text-transform: uppercase; letter-spacing: .05em; } /* Content Block Card - title + description + optional icon */ .oribi-card.content-block { display: flex; gap: 1.5rem; align-items: flex-start; border: 1px solid var(--color-border); padding: 2rem; } .oribi-card.content-block:hover { border-color: var(--color-primary); transform: none; box-shadow: none; } .oribi-card.content-block .content-block-icon { width: 56px; height: 56px; flex-shrink: 0; background: var(--color-primary-lt); color: var(--color-primary); border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; font-size: 1.4rem; } .oribi-card.content-block .content-block-body { flex: 1; min-width: 0; } .oribi-card.content-block h3 { font-size: 1.1rem; margin-bottom: .5rem; } .oribi-card.content-block p { font-size: .9rem; line-height: 1.65; } /* ── New card variants: responsive overrides ───────────────── */ @media (max-width: 640px) { .oribi-card.bold-statement { padding: 1.5rem; border-left-width: 4px; } .oribi-card.prominent-stat { padding: 1.5rem; } .oribi-card.prominent-stat .stat-value { font-size: 2rem; } .oribi-card.testimonial { padding: 1.5rem; } .oribi-card.content-block { flex-direction: column; gap: 1rem; } .oribi-card.image-info .oribi-card-body { padding: 1rem; } .oribi-card.addon-bundle { padding: 1.5rem; } .oribi-card.status-badge .badge-circle { width: 64px; height: 64px; font-size: 1.2rem; } } /* Legacy compat aliases (deprecated) */ .feature-card { background: var(--card-bg); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 2rem; transition: box-shadow var(--transition), border-color var(--transition), background var(--transition); } .feature-card:hover { box-shadow: var(--shadow-lg); border-color: var(--color-primary); } .card-image { display: block; height: auto; max-width: 100%; object-fit: contain; border-radius: var(--radius-sm); } .card-image-wrap { line-height: 0; } .card-img-left { display: flex; flex-direction: row; align-items: flex-start; gap: 1.25rem; } .card-img-left .card-image-wrap { flex-shrink: 0; } .card-img-left-body { flex: 1; min-width: 0; } .card-img-left h3 { margin-bottom: .5rem; font-size: 1.1rem; } .card-img-left p { color: var(--color-text-muted); font-size: .95rem; margin: 0; } @media (max-width: 480px) { .card-img-left { flex-direction: column; } } /* ── 9. Pricing ────────────────────────────────────────────── */ .pricing-track-layout { display: grid; grid-template-columns: 300px 1fr; gap: 4rem; align-items: start; } .pricing-track-header { position: sticky; top: 2rem; padding-top: 1.25rem; border-top: 3px solid var(--color-primary); } .pricing-track-header .section-label { display: block; font-size: .8rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--color-primary); margin-bottom: .75rem; } .pricing-track-header h2 { font-size: clamp(1.35rem, 2.2vw, 1.75rem); color: var(--color-heading); margin-bottom: .75rem; line-height: 1.25; } .pricing-track-header .lead { font-size: .9rem; line-height: 1.65; color: var(--color-text-muted); } .pricing-track-layout .pricing-grid { max-width: none; margin-inline: 0; } @media (max-width: 900px) { .pricing-track-layout { grid-template-columns: 1fr; gap: 2rem; } .pricing-track-header { position: static; } } .pricing-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 2rem; max-width: 800px; margin-inline: auto; } .pricing-grid-3 { grid-template-columns: repeat(3, 1fr); max-width: 1100px; } .pricing-card { background: var(--card-bg); border: 2px solid var(--color-border); border-radius: var(--radius-lg); padding: 2.5rem; position: relative; transition: box-shadow var(--transition), border-color var(--transition), background var(--transition); } .pricing-card:hover { box-shadow: var(--shadow-lg); border-color: var(--color-primary); } .pricing-card.featured { } .pricing-badge { position: absolute; top: -14px; left: 50%; transform: translateX(-50%); background: var(--color-primary); color: #fff; font-size: .72rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; padding: .35rem 1rem; border-radius: 100px; } .pricing-name { font-size: 1.25rem; font-weight: 700; margin-bottom: .5rem; } .pricing-tagline { font-size: .9rem; color: var(--color-text-muted); margin-bottom: 1.5rem; } .pricing-price { margin-bottom: 1.5rem; } .pricing-amount { font-size: 2.5rem; font-weight: 900; color: var(--color-heading); line-height: 1; } .pricing-amount sup { font-size: 1.25rem; vertical-align: super; } .pricing-amount .pricing-unit { font-size: 1rem; font-weight: 500; color: var(--color-text-muted); margin-left: .2em; } .pricing-per { font-size: .85rem; color: var(--color-text-muted); margin-top: .35rem; } .pricing-features { list-style: none; margin-bottom: 2rem; } .pricing-features li { display: flex; align-items: flex-start; gap: .6rem; font-size: .9rem; padding: .5rem 0; border-bottom: 1px solid var(--color-border); color: var(--color-text); } .pricing-features li:last-child { border-bottom: none; } .pricing-check { color: var(--color-primary); font-size: 1rem; flex-shrink: 0; margin-top: 1px; } @media (max-width: 900px) { .pricing-grid-3 { grid-template-columns: 1fr; max-width: 400px; } } @media (max-width: 640px) { .pricing-grid { grid-template-columns: 1fr; } } /* ── 10. Platform Feature Rows ─────────────────────────────── */ .platform-row { display: grid; grid-template-columns: 1fr 1fr; gap: 4rem; align-items: center; padding-block: 2rem; } .platform-row + .platform-row { border-top: 1px solid var(--color-border); margin-top: 2rem; } .platform-row.reverse .platform-text { order: 2; } .platform-row.reverse .platform-visual { order: 1; } .platform-text h3 { font-size: 1.5rem; margin-bottom: 1rem; color: var(--color-heading); } .platform-text p { color: var(--color-text-muted); } .platform-visual { background: var(--color-bg-alt); border-radius: var(--radius-md); aspect-ratio: 4/3; display: flex; align-items: center; justify-content: center; font-size: 4rem; border: 1px solid var(--color-border); } /* When an image is set, remove the framed background styling */ .platform-visual.has-img { background: none; border: none; aspect-ratio: unset; font-size: inherit; } @media (max-width: 768px) { .platform-row { grid-template-columns: 1fr; } .platform-row.reverse .platform-text, .platform-row.reverse .platform-visual { order: unset; } } /* Dashboard visual - remove framed background */ .platform-visual.has-dashboard { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; display: flex; align-items: center; justify-content: center; } /* ── Dashboard TV frame ────────────────────────── */ .dashboard-tv { display: flex; flex-direction: column; align-items: center; width: 100%; margin: 0 auto; } .dashboard-tv__body { width: 100%; max-width: 520px; background: #111; border: 4px solid #111; border-radius: 6px 6px 4px 4px; outline: 1px solid #000; padding: 3px; position: relative; box-shadow: 0 8px 28px rgba(0,0,0,0.35); } .dashboard-tv__body::after { content: '\25B6'; position: absolute; bottom: -13px; left: 50%; transform: translateX(-50%); font-size: 8px; color: rgba(74,222,128,0.7); } .dashboard-tv__screen { width: 100%; aspect-ratio: 16/9; background: var(--color-bg); border-radius: 2px; overflow: hidden; display: flex; align-items: center; justify-content: center; } .dashboard-tv__screen .dashboard-chart { width: 100%; height: 100%; display: block; } .dashboard-tv__feet { display: flex; justify-content: space-between; width: 60%; max-width: 300px; } .dashboard-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } /* ── 10b. Device Animator ───────────────────────────────────── */ .platform-visual.has-anim { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; min-height: 300px; padding: 0; overflow: visible; position: relative; font-size: inherit; } .da-stage { position: absolute; inset: 0; } /* Each device panel – hidden by default, centred in stage */ .da-device { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.88); opacity: 0; display: flex; flex-direction: column; align-items: center; transition: opacity 0.55s cubic-bezier(0.4,0,0.2,1), transform 0.55s cubic-bezier(0.4,0,0.2,1); will-change: opacity, transform; } .da-device.is-active { opacity: 1; transform: translate(-50%, -50%) scale(1); } .da-device.is-leaving { opacity: 0; transform: translate(-50%, -50%) scale(1.07); } /* Screen surface */ .da-screen { width: 100%; height: 100%; border-radius: 2px; position: relative; overflow: hidden; background: repeating-linear-gradient( 180deg, transparent, transparent 3px, rgba(0,0,0,0.10) 3px, rgba(0,0,0,0.10) 4px ), linear-gradient(135deg, #0c1016 0%, #151c28 60%, #0c1016 100%); } .da-screen::before { content: ''; position: absolute; top: -20%; left: -10%; width: 60%; height: 60%; background: radial-gradient(ellipse, rgba(74,222,128,0.12) 0%, transparent 70%); pointer-events: none; } @keyframes da-scan { 0% { top: -6%; opacity: 0; } 5% { opacity: 1; } 95% { opacity: 1; } 100% { top: 106%; opacity: 0; } } .da-screen::after { content: ''; position: absolute; left: 0; width: 100%; height: 3px; background: linear-gradient(90deg, transparent, rgba(74,222,128,0.28), transparent); animation: da-scan 3s linear infinite; pointer-events: none; } .da-promo { position: absolute; inset: 0; z-index: 1; padding: 6% 7%; display: flex; flex-direction: column; gap: 6%; } .da-promo__top { display: flex; align-items: center; gap: 6px; } .da-promo__dot { width: 7px; height: 7px; border-radius: 50%; background: #f97316; box-shadow: 0 0 6px rgba(249,115,22,.55); animation: da-dot-pulse 2.8s ease-in-out infinite; } .da-promo__brand { width: 40%; height: 5px; border-radius: 999px; background: linear-gradient(90deg, rgba(249,115,22,.95), rgba(251,191,36,.75)); } .da-promo__hero { height: 30%; border-radius: 4px; background: linear-gradient(160deg, rgba(2,132,199,.38), rgba(15,23,42,.08) 58%), linear-gradient(115deg, rgba(249,115,22,.42), rgba(249,115,22,.08) 62%); } .da-promo__row { display: flex; align-items: center; gap: 6px; } .da-promo__line { display: block; height: 4px; border-radius: 999px; background: rgba(241,245,249,.70); } .da-promo__line--lg { width: 56%; } .da-promo__line--md { width: 46%; } .da-promo__line--sm { width: 24%; background: rgba(74,222,128,.72); } .da-promo__line--xs { width: 19%; background: rgba(249,115,22,.72); } .da-promo__ticker { margin-top: auto; display: flex; align-items: center; gap: 5px; animation: da-ticker 6.5s linear infinite; } .da-promo__chip { width: 34%; height: 8px; border-radius: 999px; background: linear-gradient(90deg, rgba(74,222,128,.72), rgba(56,189,248,.72)); flex: 0 0 auto; } @keyframes da-dot-pulse { 0%, 100% { transform: scale(1); opacity: .92; } 50% { transform: scale(1.22); opacity: 1; } } @keyframes da-ticker { 0% { transform: translateX(0); } 50% { transform: translateX(-8%); } 100% { transform: translateX(0); } } /* Device label */ .da-label { display: block; margin-top: 11px; font-size: 0.68rem; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; color: var(--color-text-muted); text-align: center; } /* ── Tablet ────────────────────────────────────── */ .da-tablet .da-body { width: 128px; height: 194px; background: #111; border: 2px solid #000; border-radius: 14px; padding: 10px 8px 14px; display: flex; align-items: stretch; position: relative; box-shadow: 0 8px 28px rgba(0,0,0,0.30); } .da-tablet .da-body::before { content: ''; position: absolute; top: 5px; left: 50%; transform: translateX(-50%); width: 6px; height: 6px; background: #333; border-radius: 50%; } .da-tablet .da-body::after { content: ''; position: absolute; bottom: 5px; left: 50%; transform: translateX(-50%); width: 36px; height: 3px; background: #333; border-radius: 2px; } /* ── Small Monitor ─────────────────────────────── */ .da-monitor-sm .da-body { width: 236px; height: 146px; background: #111; border: 5px solid #111; border-radius: 6px; outline: 1px solid #000; padding: 3px; display: flex; align-items: stretch; position: relative; box-shadow: 0 6px 20px rgba(0,0,0,0.30); } .da-monitor-sm .da-body::after { content: ''; position: absolute; bottom: -9px; right: 8px; width: 5px; height: 5px; background: var(--color-primary); border-radius: 50%; box-shadow: 0 0 5px var(--color-primary); } .da-monitor-sm .da-stand, .da-monitor-lg .da-stand { display: flex; flex-direction: column; align-items: center; } .da-monitor-sm .da-stem { width: 14px; height: 20px; background: #111; border-left: 1px solid #000; border-right: 1px solid #000; } .da-monitor-sm .da-base { width: 68px; height: 5px; background: #111; border: 1px solid #000; border-radius: 3px; } /* ── Large Monitor ─────────────────────────────── */ .da-monitor-lg .da-body { width: 298px; height: 177px; background: #111; border: 4px solid #111; border-radius: 6px; outline: 1px solid #000; padding: 3px; display: flex; align-items: stretch; position: relative; box-shadow: 0 6px 20px rgba(0,0,0,0.30); } .da-monitor-lg .da-stem { width: 16px; height: 26px; background: #111; border-left: 1px solid #000; border-right: 1px solid #000; } .da-monitor-lg .da-base { width: 88px; height: 5px; background: #111; border: 1px solid #000; border-radius: 3px; } /* ── TV ────────────────────────────────────────── */ .da-tv .da-body { width: 320px; height: 188px; background: #111; border: 4px solid #111; border-radius: 6px 6px 4px 4px; outline: 1px solid #000; padding: 3px; display: flex; align-items: stretch; position: relative; box-shadow: 0 8px 28px rgba(0,0,0,0.35); } .da-tv .da-body::after { content: '\25B6'; position: absolute; bottom: -13px; left: 50%; transform: translateX(-50%); font-size: 8px; color: rgba(74,222,128,0.7); } .da-tv .da-feet { display: flex; justify-content: space-between; width: 180px; } .da-tv .da-foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } /* ── Projector ─────────────────────────────────── */ .da-projector .da-proj-layout { display: flex; flex-direction: column; align-items: center; } .da-projector .da-proj-body { width: 156px; height: 62px; background: #111; border: 1px solid #000; border-radius: 10px 10px 8px 8px; display: flex; align-items: center; padding: 0 14px; gap: 10px; box-shadow: 0 6px 20px rgba(0,0,0,0.45); position: relative; } .da-projector .da-proj-body::after { content: ''; position: absolute; top: 8px; right: 10px; width: 7px; height: 7px; background: var(--color-primary); border-radius: 50%; box-shadow: 0 0 6px var(--color-primary); } .da-projector .da-proj-body::before { content: ''; position: absolute; right: 10px; bottom: 8px; width: 28px; height: 8px; background: repeating-linear-gradient( 90deg, #333 0px, #333 2px, transparent 2px, transparent 5px ); border-radius: 1px; } .da-projector .da-lens { width: 38px; height: 38px; background: #080c12; border: 2px solid #000; border-radius: 50%; flex-shrink: 0; position: relative; box-shadow: inset 0 0 8px rgba(0,0,0,0.8); } .da-projector .da-lens::after { content: ''; position: absolute; inset: 5px; background: radial-gradient(circle at 35% 35%, rgba(74,222,128,0.30) 0%, #080c12 65%); border-radius: 50%; } .da-projector .da-beam { width: 240px; height: 50px; clip-path: polygon(31% 0%, 69% 0%, 100% 100%, 0% 100%); background: linear-gradient( 180deg, rgba(74,222,128,0.07) 0%, rgba(74,222,128,0.02) 100% ); } .da-projector .da-proj-screen { width: 240px; height: 72px; background: #111; border: 1px solid #000; border-radius: 3px; overflow: hidden; padding: 3px; box-shadow: 0 4px 14px rgba(0,0,0,0.40); } /* ── Video Wall (2×2) ──────────────────────────── */ .da-vwall .da-vwall-grid { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; gap: 5px; background: #0a0d12; padding: 5px; border: 1px solid #000; border-radius: 4px; box-shadow: 0 14px 48px rgba(0,0,0,0.60); } .da-vwall .da-panel { width: 148px; height: 90px; background: #111; border: 2px solid #111; padding: 2px; display: flex; align-items: stretch; overflow: hidden; } .da-vwall .da-panel:nth-child(2) .da-screen::after { animation-delay: -0.75s; } .da-vwall .da-panel:nth-child(3) .da-screen::after { animation-delay: -1.5s; } .da-vwall .da-panel:nth-child(4) .da-screen::after { animation-delay: -2.25s; } .da-vwall .da-panel:nth-child(2) .da-promo { filter: hue-rotate(32deg); } .da-vwall .da-panel:nth-child(3) .da-promo { filter: hue-rotate(-18deg); } .da-vwall .da-panel:nth-child(4) .da-promo { filter: hue-rotate(58deg); } /* ── Responsive scale-down ─────────────────────── */ @media (max-width: 900px) { .da-device { transform: translate(-50%,-50%) scale(0.76); } .da-device.is-active { transform: translate(-50%,-50%) scale(0.84); } .da-device.is-leaving { transform: translate(-50%,-50%) scale(0.91); } } @media (max-width: 640px) { .da-device { transform: translate(-50%,-50%) scale(0.56); } .da-device.is-active { transform: translate(-50%,-50%) scale(0.64); } .da-device.is-leaving { transform: translate(-50%,-50%) scale(0.70); } } @media (prefers-reduced-motion: reduce) { .da-device { transition: none; } .da-screen::after { animation: none; } .da-promo__dot, .da-promo__ticker { animation: none; } } /* ── 10c. TV Stick Plug Animation ──────────────────────────── */ .platform-visual.has-tv-stick { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; position: relative; font-size: inherit; display: flex; align-items: center; justify-content: center; align-self: center; } .ts-stage { position: relative; width: 100%; aspect-ratio: 4/3; display: flex; align-items: center; justify-content: center; /* Offset center leftward to account for the stick protruding on the right, so the TV+stick combo appears visually centered in the column */ padding-right: 90px; } /* ── TV ── */ .ts-tv { display: flex; flex-direction: column; align-items: center; position: relative; } .ts-tv__body { width: 400px; height: 235px; background: #111; border: 4px solid #111; border-radius: 6px 6px 4px 4px; outline: 1px solid #000; padding: 3px; display: flex; align-items: stretch; position: relative; box-shadow: 0 8px 28px rgba(0,0,0,0.35); } .ts-tv__screen { width: 100%; height: 100%; border-radius: 2px; position: relative; overflow: hidden; background: repeating-linear-gradient( 180deg, transparent, transparent 3px, rgba(0,0,0,0.10) 3px, rgba(0,0,0,0.10) 4px ), linear-gradient(135deg, #0c1016 0%, #151c28 60%, #0c1016 100%); } /* Subtle green ambient glow on screen */ .ts-tv__screen::before { content: ''; position: absolute; top: -20%; left: -10%; width: 60%; height: 60%; background: radial-gradient(ellipse, rgba(74,222,128,0.12) 0%, transparent 70%); pointer-events: none; } /* Scan line on screen */ .ts-tv__screen::after { content: ''; position: absolute; left: 0; width: 100%; height: 3px; background: linear-gradient(90deg, transparent, rgba(74,222,128,0.28), transparent); animation: da-scan 3s linear infinite; pointer-events: none; } /* Screen glow when stick plugs in */ .ts-stage.is-plugged .ts-tv__screen { animation: ts-screen-glow 0.8s ease 0.1s both; } @keyframes ts-screen-glow { 0% { filter: brightness(1); } 40% { filter: brightness(1.25); } 100% { filter: brightness(1); } } /* ── Promotional slides inside screen ── */ .ts-slides { position: absolute; inset: 0; opacity: 0; transition: opacity 0.6s ease; z-index: 1; } .ts-stage.is-playing .ts-slides { opacity: 1; } .ts-slide { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 12%; opacity: 0; transition: opacity 0.7s ease; } .ts-slide.is-active { opacity: 1; } /* ═══════════════════════════════════════════════════════════ Slide 1 — Menu Board ═══════════════════════════════════════════════════════════ */ .ts-slide--menu { background: linear-gradient(170deg, #1a1206 0%, #0d0a04 100%); padding: 8%; } .ts-menu { width: 100%; height: 100%; display: flex; flex-direction: column; } .ts-menu__header { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; padding-bottom: 4px; border-bottom: 1px solid rgba(255,200,100,0.25); } .ts-menu__logo { width: 10px; height: 10px; border-radius: 50%; background: #e6a730; flex-shrink: 0; } .ts-menu__title { width: 50%; height: 5px; background: rgba(255,220,150,0.8); border-radius: 1px; } .ts-menu__cols { display: flex; gap: 10px; flex: 1; } .ts-menu__col { flex: 1; display: flex; flex-direction: column; gap: 4px; } .ts-menu__cat { width: 55%; height: 4px; background: #e6a730; border-radius: 1px; margin-bottom: 1px; } .ts-menu__item { display: flex; align-items: center; gap: 2px; } .ts-menu__name { width: 40%; height: 3px; background: rgba(255,255,255,0.6); border-radius: 1px; flex-shrink: 0; } .ts-menu__dots { flex: 1; height: 0; border-bottom: 1px dotted rgba(255,255,255,0.18); } .ts-menu__price { width: 14%; height: 3px; background: rgba(255,220,150,0.7); border-radius: 1px; flex-shrink: 0; } /* ═══════════════════════════════════════════════════════════ Slide 2 — Wayfinding Sign ═══════════════════════════════════════════════════════════ */ .ts-slide--wayfind { background: linear-gradient(170deg, #0c1a2e 0%, #081220 100%); padding: 8%; } .ts-wf { width: 100%; height: 100%; display: flex; flex-direction: column; } .ts-wf__header { display: flex; align-items: center; justify-content: center; margin-bottom: 8px; padding-bottom: 5px; border-bottom: 1px solid rgba(74,222,128,0.2); } .ts-wf__building { width: 60%; height: 5px; background: rgba(255,255,255,0.7); border-radius: 1px; } .ts-wf__rows { display: flex; flex-direction: column; gap: 5px; flex: 1; justify-content: center; } .ts-wf__row { display: flex; align-items: center; gap: 5px; padding: 3px 4px; background: rgba(255,255,255,0.04); border-radius: 2px; } .ts-wf__arrow { width: 0; height: 0; flex-shrink: 0; } .ts-wf__arrow--left { border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-right: 5px solid #4ade80; } .ts-wf__arrow--right { border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 5px solid #4ade80; } .ts-wf__arrow--up { border-left: 3px solid transparent; border-right: 3px solid transparent; border-bottom: 5px solid #4ade80; } .ts-wf__label { height: 3px; background: rgba(255,255,255,0.55); border-radius: 1px; flex: 1; } .ts-wf__label--w1 { max-width: 60%; } .ts-wf__label--w2 { max-width: 45%; } .ts-wf__label--w3 { max-width: 70%; } .ts-wf__label--w4 { max-width: 50%; } .ts-wf__floor { width: 14px; height: 8px; background: rgba(74,222,128,0.15); border: 1px solid rgba(74,222,128,0.3); border-radius: 2px; flex-shrink: 0; margin-left: auto; } /* ═══════════════════════════════════════════════════════════ Slide 3 — Schedule / Timetable ═══════════════════════════════════════════════════════════ */ .ts-slide--sched { background: linear-gradient(170deg, #111827 0%, #0a0f1a 100%); padding: 8%; } .ts-sched { width: 100%; height: 100%; display: flex; flex-direction: column; } .ts-sched__header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; padding-bottom: 4px; border-bottom: 1px solid rgba(74,222,128,0.2); } .ts-sched__title { width: 35%; height: 5px; background: rgba(255,255,255,0.75); border-radius: 1px; } .ts-sched__date { width: 20%; height: 4px; background: rgba(255,255,255,0.3); border-radius: 1px; } .ts-sched__table { display: flex; flex-direction: column; gap: 3px; flex: 1; } .ts-sched__hrow, .ts-sched__row { display: flex; gap: 3px; } .ts-sched__hrow { margin-bottom: 2px; } .ts-sched__hcell { flex: 1; height: 3px; background: rgba(255,255,255,0.25); border-radius: 1px; } .ts-sched__hcell:first-child { flex: 0.5; } .ts-sched__row { align-items: stretch; } .ts-sched__time { flex: 0.5; height: 10px; display: flex; align-items: center; } .ts-sched__time::before { content: ''; width: 80%; height: 3px; background: rgba(255,255,255,0.3); border-radius: 1px; } .ts-sched__cell { flex: 1; height: 10px; background: rgba(255,255,255,0.04); border-radius: 2px; border: 1px solid rgba(255,255,255,0.06); } .ts-sched__event { flex: 1; height: 10px; border-radius: 2px; } .ts-sched__event--a { background: rgba(74,222,128,0.25); border: 1px solid rgba(74,222,128,0.4); } .ts-sched__event--b { background: rgba(96,165,250,0.25); border: 1px solid rgba(96,165,250,0.4); } .ts-sched__event--c { background: rgba(251,191,36,0.25); border: 1px solid rgba(251,191,36,0.4); } /* HDMI port on back-right of TV */ .ts-tv__port { position: absolute; right: -6px; top: 50%; transform: translateY(-50%); width: 6px; height: 14px; background: #1a1a1a; border: 1px solid #000; border-left: none; border-radius: 0 2px 2px 0; z-index: 1; } .ts-tv__port::before { content: ''; position: absolute; left: 0; top: 2px; width: 3px; height: 8px; background: #333; border-radius: 0 1px 1px 0; } /* Feet */ .ts-tv__feet { display: flex; justify-content: space-between; width: 224px; } .ts-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } /* ── Stick device ── */ .ts-stick { position: absolute; right: -20px; top: 50%; transform: translateY(-50%) translateX(80px) scaleX(-1); display: flex; align-items: center; opacity: 0; z-index: 2; } .ts-stick__body { width: 84px; height: 32px; background: linear-gradient(180deg, #f5f5f5, #e0e0e0); border: 1px solid #ccc; border-radius: 5px; position: relative; box-shadow: 0 2px 8px rgba(0,0,0,0.25), inset 0 1px 0 rgba(255,255,255,0.6); } /* Brand logo area subtle inset */ .ts-stick__body::before { content: ''; position: absolute; top: 6px; left: 10px; width: 28px; height: 12px; background: rgba(0,0,0,0.04); border-radius: 2px; } /* LED indicator */ .ts-stick__led { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); width: 4px; height: 4px; background: #999; border-radius: 50%; transition: background 0.4s ease, box-shadow 0.4s ease; } .ts-stage.is-plugged .ts-stick__led { background: #4CAF50; box-shadow: 0 0 6px rgba(76,175,80,0.8); } /* HDMI connector */ .ts-stick__connector { width: 18px; height: 14px; background: linear-gradient(180deg, #888, #666); border-radius: 0 2px 2px 0; margin-left: -1px; position: relative; box-shadow: 0 1px 3px rgba(0,0,0,0.3); } .ts-stick__connector::before { content: ''; position: absolute; left: 2px; top: 2px; width: 8px; height: 8px; background: #555; border-radius: 1px; } /* ── Plug-in animation ── */ .ts-stage.is-animating .ts-stick { animation: ts-slide-in 1.4s cubic-bezier(0.22, 0.61, 0.36, 1) forwards; } @keyframes ts-slide-in { 0% { opacity: 0; transform: translateY(-50%) translateX(80px) scaleX(-1); } 20% { opacity: 1; transform: translateY(-50%) translateX(60px) scaleX(-1); } 70% { transform: translateY(-50%) translateX(8px) scaleX(-1); } 85% { transform: translateY(-50%) translateX(12px) scaleX(-1); } 100% { opacity: 1; transform: translateY(-50%) translateX(6px) scaleX(-1); } } /* Responsive scale-down */ @media (max-width: 900px) { .ts-tv__body { width: 320px; height: 188px; } .ts-tv__feet { width: 178px; } .ts-stick__body { width: 68px; height: 26px; } .ts-stage { padding-right: 72px; } } @media (max-width: 640px) { .ts-tv__body { width: 240px; height: 142px; } .ts-tv__feet { width: 134px; } .ts-stick__body { width: 52px; height: 20px; } .ts-stick__connector { width: 12px; height: 10px; } .ts-stick__body::before { top: 4px; left: 6px; width: 22px; height: 10px; } .ts-stick__led { width: 3px; height: 3px; right: 5px; } .ts-stage { padding-right: 56px; } } @media (prefers-reduced-motion: reduce) { .ts-stage .ts-stick { opacity: 1; transform: translateY(-50%) translateX(6px) scaleX(-1); } .ts-stage.is-animating .ts-stick { animation: none; } .ts-stage.is-plugged .ts-tv__screen { animation: none; } .ts-stage.is-plugged .ts-stick__led { background: #4CAF50; box-shadow: 0 0 6px rgba(76,175,80,0.8); } } /* ── 11. Page Hero (inner pages) ───────────────────────────── */ .page-hero { background: #111111; color: #fff; padding: 8rem 0 5rem; text-align: center; position: relative; overflow: hidden; } .page-hero .hero-overlay { background: rgba(17, 17, 17, 0.80); } .page-hero .container { position: relative; z-index: 2; } .page-hero h1 { color: #fff; margin-bottom: 1rem; } .page-hero .lead { color: rgba(255,255,255,.7); } .page-hero .hero-label { margin-bottom: 1.5rem; } /* ── 11b. Animated Hero (OTS Signs) ────────────────────────── */ /* Particle keyframes */ @keyframes particle-float { 0% { transform: translateY(0) translateX(0) scale(1); opacity: 0; } 10% { opacity: var(--p-opacity, 0.4); } 90% { opacity: var(--p-opacity, 0.4); } 100% { transform: translateY(var(--p-ty, -100vh)) translateX(var(--p-tx, 40px)) scale(var(--p-scale-end, 0.3)); opacity: 0; } } @keyframes glow-appear { from { opacity: 0; filter: blur(80px); transform: translate(-50%, -50%) scale(0.2); } to { opacity: 0.65; filter: blur(22px); transform: translate(-50%, -50%) scale(0.85); } } @keyframes glow-drift { 0% { transform: translate(-50%, -50%) scale(0.85); opacity: 0.6; } 15% { transform: translate(-20%, -30%) scale(1.35); opacity: 0.75; } 30% { transform: translate(-65%, -70%) scale(0.65); opacity: 0.5; } 45% { transform: translate(-80%, -40%) scale(1.45); opacity: 0.8; } 60% { transform: translate(-30%, -75%) scale(0.7); opacity: 0.55; } 75% { transform: translate(-70%, -25%) scale(1.5); opacity: 0.75; } 90% { transform: translate(-40%, -60%) scale(0.8); opacity: 0.65; } 100% { transform: translate(-50%, -50%) scale(0.85); opacity: 0.6; } } /* Particle container */ .hero-particles { position: absolute; inset: 0; overflow: hidden; z-index: 1; pointer-events: none; } /* Individual particles - circles with staggered float animation */ .hero-particle { position: absolute; border-radius: 50%; background: rgba(255, 255, 255, 0.12); animation: particle-float var(--p-dur, 18s) var(--p-delay, 0s) linear infinite; will-change: transform, opacity; } /* 12 particles with unique positions, sizes, speeds, and trajectories */ .hero-particle--1 { --p-dur: 22s; --p-delay: 0s; --p-tx: 60px; --p-ty: -110vh; --p-opacity: 0.35; --p-scale-end: 0.2; width: 8px; height: 8px; bottom: -10px; left: 8%; } .hero-particle--2 { --p-dur: 28s; --p-delay: 3s; --p-tx: -40px; --p-ty: -105vh; --p-opacity: 0.25; --p-scale-end: 0.4; width: 14px; height: 14px; bottom: -20px; left: 20%; } .hero-particle--3 { --p-dur: 20s; --p-delay: 1s; --p-tx: 80px; --p-ty: -115vh; --p-opacity: 0.3; --p-scale-end: 0.3; width: 6px; height: 6px; bottom: -8px; left: 35%; } .hero-particle--4 { --p-dur: 26s; --p-delay: 5s; --p-tx: -60px; --p-ty: -100vh; --p-opacity: 0.4; --p-scale-end: 0.2; width: 10px; height: 10px; bottom: -12px; left: 50%; } .hero-particle--5 { --p-dur: 24s; --p-delay: 2s; --p-tx: 30px; --p-ty: -108vh; --p-opacity: 0.2; --p-scale-end: 0.5; width: 20px; height: 20px; bottom: -25px; left: 65%; background: rgba(var(--color-primary-rgb),0.12); } .hero-particle--6 { --p-dur: 30s; --p-delay: 7s; --p-tx: -20px; --p-ty: -112vh; --p-opacity: 0.35; --p-scale-end: 0.3; width: 12px; height: 12px; bottom: -15px; left: 78%; } .hero-particle--7 { --p-dur: 19s; --p-delay: 4s; --p-tx: 50px; --p-ty: -106vh; --p-opacity: 0.2; --p-scale-end: 0.4; width: 16px; height: 16px; bottom: -20px; left: 90%; background: rgba(var(--color-primary-rgb),0.08); } .hero-particle--8 { --p-dur: 25s; --p-delay: 6s; --p-tx: -70px; --p-ty: -102vh; --p-opacity: 0.3; --p-scale-end: 0.2; width: 7px; height: 7px; bottom: -10px; left: 15%; } .hero-particle--9 { --p-dur: 32s; --p-delay: 8s; --p-tx: 45px; --p-ty: -110vh; --p-opacity: 0.15; --p-scale-end: 0.6; width: 24px; height: 24px; bottom: -30px; left: 42%; background: rgba(var(--color-primary-rgb),0.08); } .hero-particle--10 { --p-dur: 21s; --p-delay: 10s; --p-tx: -35px; --p-ty: -108vh; --p-opacity: 0.3; --p-scale-end: 0.3; width: 9px; height: 9px; bottom: -12px; left: 58%; } .hero-particle--11 { --p-dur: 27s; --p-delay: 12s; --p-tx: 25px; --p-ty: -104vh; --p-opacity: 0.2; --p-scale-end: 0.4; width: 18px; height: 18px; bottom: -22px; left: 72%; background: rgba(var(--color-primary-rgb),0.06); } .hero-particle--12 { --p-dur: 23s; --p-delay: 9s; --p-tx: -55px; --p-ty: -106vh; --p-opacity: 0.25; --p-scale-end: 0.3; width: 11px; height: 11px; bottom: -14px; left: 5%; } /* Ambient glow effect behind content */ .hero-animated__glow { position: absolute; top: 50%; left: 50%; width: 520px; height: 520px; border-radius: 50%; background: radial-gradient(circle, rgba(var(--color-primary-rgb), 0.32) 0%, rgba(var(--color-primary-rgb), 0.14) 45%, rgba(var(--color-primary-rgb), 0.04) 70%, transparent 90%); z-index: 1; pointer-events: none; filter: blur(22px); animation: glow-appear 0.45s cubic-bezier(0.16, 1, 0.3, 1) forwards, glow-drift 20s 0.45s ease-in-out infinite; } /* Animated hero layout - centered single-column content */ .hero-animated__inner { position: relative; z-index: 2; display: flex; align-items: center; justify-content: center; text-align: center; padding-block: 10rem 6rem; } .hero-animated__content { max-width: 720px; } .hero-animated__content .hero-title { font-size: clamp(2.4rem, 5vw, 4rem); } .hero-animated__content .hero-description { max-width: 600px; margin-left: auto; margin-right: auto; } .hero-animated__content .btn-group { justify-content: center; } /* Keep secondary CTA visible on light homepage hero */ .hero-animated .btn-ghost { border-color: rgba(var(--color-primary-rgb), .35); color: var(--color-text); background: rgba(255,255,255,.55); } .hero-animated .btn-ghost:hover { border-color: rgba(var(--color-primary-rgb), .6); background: rgba(var(--color-primary-rgb), .08); color: var(--color-text); } .hero-animated__content .hero-stats { justify-content: center; } /* Homepage flow: avoid oversized gap before use-cases section */ .hero-animated { min-height: auto; } .hero-animated + .use-cases-section { padding-top: clamp(2rem, 4vw, 3.5rem); } .hero-stats--three { display: flex; gap: 3rem; margin-top: 2.5rem; } /* Page hero animated - inherits base page-hero + adds particles */ .page-hero-animated { position: relative; } .page-hero-animated .hero-particles { z-index: 0; } .page-hero-animated .hero-animated__glow { z-index: 0; } .page-hero-animated .hero-overlay { z-index: 1; } .page-hero-animated .container { position: relative; z-index: 2; } /* Reduce motion for accessibility */ @media (prefers-reduced-motion: reduce) { .hero-particle, .hero-animated__glow { animation: none; opacity: 0.6; transform: translate(-50%, -50%) scale(0.85); filter: blur(22px); } } @media (max-width: 768px) { .hero-animated__glow { width: 340px; height: 340px; } .hero-animated__inner { padding-block: 7rem 4rem; } .hero-stats--three { gap: 1.5rem; flex-wrap: wrap; justify-content: center; } } /* ── 12. About page ────────────────────────────────────────── */ .about-intro { display: grid; grid-template-columns: 1fr 1fr; gap: 4rem; align-items: center; } .about-intro-visual { background: var(--color-primary); border-radius: var(--radius-xl); aspect-ratio: 1; max-width: 420px; display: flex; align-items: center; justify-content: center; font-size: 6rem; color: #fff; } /* When an image is set, remove the gradient box styling */ .about-intro-visual.has-img, .about-intro-visual.has-cloud-anim { background: none; box-shadow: none; aspect-ratio: unset; font-size: inherit; color: inherit; } @media (max-width: 768px) { .about-intro { grid-template-columns: 1fr; } .about-intro-visual { max-width: 280px; margin-inline: auto; } } /* ── Digital Signage Animation ────────────────────────────── */ .ds-anim-container { display: flex; align-items: center; justify-content: space-between; width: 100%; max-width: 400px; margin: 0 auto; padding: 2rem 0; position: relative; color: var(--color-primary); } [data-theme="dark"] .ds-anim-container { color: #fff; } .ds-tv, .ds-cloud { position: relative; z-index: 2; display: flex; align-items: center; justify-content: center; } .ds-tv { font-size: 5rem; position: relative; } .ds-tv-screen { position: absolute; top: 15%; left: 10%; width: 80%; height: 60%; background: rgba(var(--color-primary-rgb), 0.2); border-radius: 4px; animation: ds-screen-pulse 3s infinite alternate; } [data-theme="dark"] .ds-tv-screen { background: rgba(255, 255, 255, 0.15); } @keyframes ds-screen-pulse { 0% { opacity: 0.4; } 100% { opacity: 1; } } .ds-cloud { font-size: 4.5rem; animation: ds-float 4s ease-in-out infinite; } @keyframes ds-float { 0% { transform: translateY(0); } 50% { transform: translateY(-8px); } 100% { transform: translateY(0); } } .ds-line { flex-grow: 1; height: 2px; background: rgba(var(--color-primary-rgb), 0.2); margin: 0 1.5rem; position: relative; display: flex; align-items: center; overflow: hidden; border-radius: 2px; } [data-theme="dark"] .ds-line { background: rgba(255, 255, 255, 0.1); } .ds-packet { width: 12px; height: 4px; background: var(--color-primary); border-radius: 4px; position: absolute; left: -20px; box-shadow: 0 0 8px var(--color-primary); } [data-theme="dark"] .ds-packet { background: #fff; box-shadow: 0 0 8px rgba(255, 255, 255, 0.8); } .ds-packet-1 { animation: ds-travel 2s linear infinite; } .ds-packet-2 { animation: ds-travel 2s linear infinite 0.6s; } .ds-packet-3 { animation: ds-travel 2s linear infinite 1.2s; } @keyframes ds-travel { 0% { left: -20px; opacity: 0; } 10% { opacity: 1; } 90% { opacity: 1; } 100% { left: 100%; opacity: 0; } } @media (prefers-reduced-motion: reduce) { .ds-tv-screen, .ds-cloud, .ds-packet { animation: none; } .ds-packet-1 { left: 20%; opacity: 1; } .ds-packet-2 { left: 50%; opacity: 1; } .ds-packet-3 { left: 80%; opacity: 1; } } /* ── 13. Contact ────────────────────────────────────────────── */ .contact-layout { display: grid; grid-template-columns: 1fr 1.6fr; gap: 4rem; align-items: start; } @media (max-width: 768px) { .contact-layout { grid-template-columns: 1fr; } } .contact-info h2 { margin-bottom: 1rem; } .contact-info .lead { margin-bottom: 2rem; } .contact-method { display: flex; align-items: flex-start; gap: 1rem; margin-bottom: 1.5rem; } .contact-method-icon { width: 44px; height: 44px; background: var(--color-primary-lt); border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; font-size: 1.1rem; flex-shrink: 0; } .contact-method-label { font-size: .8rem; color: var(--color-text-muted); } .contact-method-value { font-weight: 600; color: var(--color-heading); font-size: .95rem; } .contact-form-wrap { background: var(--card-bg); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 2.5rem; box-shadow: var(--shadow-sm); } .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } @media (max-width: 560px) { .form-row { grid-template-columns: 1fr; } } .form-group { margin-bottom: 1.25rem; } .form-group label { display: block; font-size: .85rem; font-weight: 600; color: var(--color-text); margin-bottom: .4rem; } .form-group label .req { color: #D32F2F; } .form-group input, .form-group textarea, .form-group select { width: 100%; padding: .75rem 1rem; font-family: var(--font-sans); font-size: .95rem; color: var(--color-text); background: var(--form-bg); border: 1.5px solid var(--color-border); border-radius: var(--radius-sm); transition: border-color var(--transition), box-shadow var(--transition); outline: none; resize: vertical; } .form-group input:focus, .form-group textarea:focus, .form-group select:focus { border-color: var(--color-primary); box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb),.12); background: var(--form-bg-focus); } .form-group textarea { min-height: 140px; } .form-notice { margin-top: 1rem; font-size: .85rem; padding: .75rem 1rem; border-radius: var(--radius-sm); display: none; } .form-notice.success { background: #f0fdf4; color: #16a34a; border: 1px solid #bbf7d0; display: block; } .form-notice.error { background: #fef2f2; color: #dc2626; border: 1px solid #fecaca; display: block; } /* ── 14. CTA Banner ─────────────────────────────────────────── */ @keyframes cta-shimmer { 0% { opacity: 1; } 100% { opacity: 1; } } /* ── Dashboard Chart ───────────────────────────────────── */ .dashboard-chart { width: 100%; height: auto; display: block; user-select: none; overflow: visible; } /* Reduced-motion: JS already checks the media query, belt-and-suspenders */ @media (prefers-reduced-motion: reduce) { .dashboard-chart .bar, .dashboard-chart .pie-segment { transition: none !important; } } @media (max-width: 768px) { .dashboard-chart-container { padding: 1rem; border-radius: var(--radius-md, 12px); } } .cta-banner { position: relative; overflow: hidden; background: var(--color-primary); color: #fff; padding-block: 5rem; text-align: center; } .cta-banner::before { content: none; } .cta-banner::after { content: none; } .cta-banner .container { position: relative; z-index: 1; } .cta-banner h2 { color: #fff; margin-bottom: 1rem; } .cta-banner p { color: rgba(255,255,255,.85); margin-bottom: 2rem; font-size: 1.1rem; } .devices-split-card { display: grid; grid-template-columns: 1fr 1fr; border-radius: var(--radius-xl); overflow: hidden; border: 1px solid var(--color-border); background: var(--card-bg); } .devices-split-card__panel { padding: clamp(1.5rem, 3vw, 2.5rem); } .devices-split-card__panel h3 { margin-bottom: .85rem; } .devices-split-card__panel p { color: var(--color-text-muted); line-height: 1.75; } .devices-split-card__panel--brand { background: var(--color-primary); color: var(--color-bg); } .devices-split-card__panel--brand h3, .devices-split-card__panel--brand p { color: inherit; } @media (max-width: 768px) { .devices-split-card { grid-template-columns: 1fr; } } /* ── 15. Footer ────────────────────────────────────────────── */ .site-footer { background: #111111; color: rgba(255,255,255,.7); padding-top: 4rem; } .footer-inner { display: grid; grid-template-columns: 1.5fr 1fr 1fr 1fr; gap: 2rem; padding-bottom: 3rem; border-bottom: 1px solid rgba(255,255,255,.08); } @media (max-width: 900px) { .footer-inner { grid-template-columns: 1fr 1fr; } .footer-brand { grid-column: 1 / -1; } } @media (max-width: 480px) { .footer-inner { grid-template-columns: 1fr; } } .footer-brand .logo-text { font-size: 1.5rem; color: #fff; } .footer-logo-section { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1rem; } .footer-logo-section .custom-logo-link img, .footer-logo-section .custom-logo { max-height: 60px !important; width: auto !important; } .footer-company-name { display: flex; align-items: center; } .footer-tagline { font-size: .9rem; color: rgba(255,255,255,.5); margin-top: .75rem; margin-bottom: .5rem; } .footer-location { font-size: .8rem; color: rgba(255,255,255,.8); } .footer-location a { color: var(--color-primary); font-weight: 600; } .footer-location a:hover { color: var(--color-primary-lt); } .footer-links { display: contents; } .footer-col h4 { font-size: .8rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: rgba(255,255,255,.4); margin-bottom: 1rem; } .footer-col ul { display: flex; flex-direction: column; gap: .6rem; } .footer-col a { font-size: .875rem; color: rgba(255,255,255,.6); transition: color var(--transition); } .footer-col a:hover { color: #fff; } .footer-bottom { padding-block: 1.5rem; display: flex; align-items: center; gap: 1rem; } .footer-bottom p { font-size: .8rem; color: rgba(255,255,255,.3); margin: 0; flex: 0 1 auto; } .footer-bottom .theme-toggle { margin-left: auto; } /* ── 15a. FAQ Accordion ─────────────────────────────────────── */ .faq-list { max-width: 800px; margin-inline: auto; } .faq-item { border: 1px solid var(--color-border); border-radius: var(--radius-md); margin-bottom: 1rem; background: var(--card-bg); transition: box-shadow var(--transition), border-color var(--transition); } .faq-item[open] { border-color: var(--color-primary); box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb),.08); } .faq-question { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 1.25rem 1.5rem; font-weight: 600; font-size: 1rem; color: var(--color-heading); cursor: pointer; list-style: none; user-select: none; } .faq-question::-webkit-details-marker { display: none; } .faq-question::marker { content: ''; } .faq-toggle { flex-shrink: 0; width: 24px; height: 24px; position: relative; transition: transform var(--transition); } .faq-toggle::before, .faq-toggle::after { content: ''; position: absolute; background: var(--color-text-muted); border-radius: 2px; transition: transform var(--transition); } .faq-toggle::before { width: 14px; height: 2px; top: 50%; left: 50%; transform: translate(-50%, -50%); } .faq-toggle::after { width: 2px; height: 14px; top: 50%; left: 50%; transform: translate(-50%, -50%); } .faq-item[open] .faq-toggle::after { transform: translate(-50%, -50%) rotate(90deg); opacity: 0; } .faq-answer { padding: 0 1.5rem 1.25rem; color: var(--color-text-muted); font-size: .95rem; line-height: 1.7; } .faq-answer p { margin-bottom: .5rem; } .faq-answer p:last-child { margin-bottom: 0; } /* ── 15b. Comparison Table ──────────────────────────────────── */ .comparison-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--card-bg); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); } @media (prefers-color-scheme: dark) { .comparison-table-wrap { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); } } .comparison-table { width: 100%; border-collapse: collapse; font-size: .92rem; min-width: 600px; } .comparison-table thead th { background: var(--color-bg-alt); font-weight: 700; font-size: .85rem; text-transform: uppercase; letter-spacing: .05em; color: var(--color-heading); padding: 1rem 1.25rem; text-align: center; border-bottom: 2px solid var(--color-border); position: sticky; top: 0; z-index: 1; } @media (prefers-color-scheme: dark) { .comparison-table thead th { background: var(--color-bg-alt); border-bottom-color: var(--color-border); } } .comparison-table thead th:first-child { text-align: left; min-width: 220px; } .comparison-table tbody td { padding: .85rem 1.25rem; border-bottom: 1px solid var(--color-border); text-align: center; color: var(--color-text); vertical-align: middle; } .comparison-table tbody tr:last-child td { border-bottom: none; } .comparison-table tbody td:first-child { text-align: left; font-weight: 500; } .comparison-feature-col { min-width: 220px; } .comparison-feature-name { color: var(--color-text); } .comparison-group-row td { background: var(--color-primary); font-weight: 700; font-size: .82rem; text-transform: uppercase; letter-spacing: .08em; color: var(--color-bg); text-align: left !important; padding: .85rem 1.25rem; border-bottom-color: var(--color-primary) !important; } .comparison-group-row td:first-child { border-left: 4px solid var(--color-accent); } @media (prefers-color-scheme: dark) { .comparison-group-row td { background: var(--color-primary-dk); border-bottom-color: var(--color-primary-dk) !important; } } .comparison-yes { color: var(--color-accent); font-size: 1.1rem; font-weight: 700; } .comparison-no { color: var(--color-text-muted); font-size: 1rem; } .comparison-table tbody tr:hover td { background: rgba(var(--color-primary-rgb), .03); } @media (prefers-color-scheme: dark) { .comparison-table tbody tr:hover td { background: rgba(var(--color-primary-rgb), .08); } } @media (max-width: 640px) { .comparison-table-wrap { margin-inline: calc(var(--container-pad) * -1); border-radius: 0; border-left: none; border-right: none; } } /* ── 16. Misc ───────────────────────────────────────────────── */ .text-center { text-align: center; } .text-primary { color: var(--color-primary); } .text-accent { color: var(--color-accent); } .mt-1 { margin-top: .5rem; } .mt-2 { margin-top: 1rem; } .mt-3 { margin-top: 1.5rem; } .mt-4 { margin-top: 2rem; } .mb-4 { margin-bottom: 2rem; } /* Divider */ .divider { border: none; border-top: 1px solid var(--color-border); margin-block: 3rem; } /* Screen reader only */ .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; } /* Scroll to top */ .scroll-top { position: fixed; bottom: 2rem; right: 2rem; width: 44px; height: 44px; background: var(--color-primary); color: #fff; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.2rem; box-shadow: var(--shadow-md); opacity: 0; transform: translateY(10px); transition: all var(--transition); z-index: 50; cursor: pointer; } .scroll-top.visible { opacity: 1; transform: translateY(0); } /* ── 17. Theme Toggle ──────────────────────────────────────── */ .theme-toggle { position: relative; width: 48px; height: 26px; background: var(--color-border); border-radius: 100px; border: none; cursor: pointer; margin-left: .75rem; flex-shrink: 0; transition: background var(--transition); } .theme-toggle:hover { background: var(--color-text-muted); } .theme-toggle::before { content: ''; position: absolute; top: 3px; left: 3px; width: 20px; height: 20px; background: #fff; border-radius: 50%; transition: transform var(--transition); box-shadow: 0 1px 3px rgba(0,0,0,.2); } [data-theme="dark"] .theme-toggle { background: var(--color-primary); } [data-theme="dark"] .theme-toggle::before { transform: translateX(22px); } .theme-toggle-icon { position: absolute; top: 50%; transform: translateY(-50%); width: 14px; height: 14px; pointer-events: none; } .theme-toggle .sun-icon { left: 5px; color: #f59e0b; } .theme-toggle .moon-icon { right: 5px; color: #fff; opacity: .7; } /* ── Dark mode overrides ───────────────────────────────────── */ [data-theme="dark"] .section-dark { background: #111111; } [data-theme="dark"] .section-alt { background: var(--color-bg-alt); } [data-theme="dark"] .hero { background: #111111; } [data-theme="dark"] .page-hero { background: #111111; } [data-theme="dark"] .hero-animated { background: #0D0D0D; } [data-theme="dark"] .page-hero-animated { background: #0D0D0D; } [data-theme="dark"] .hero-animated__glow { background: radial-gradient(circle, rgba(var(--color-primary-rgb), 0.40) 0%, rgba(var(--color-primary-rgb), 0.18) 45%, rgba(var(--color-primary-rgb), 0.06) 70%, transparent 90%); } [data-theme="dark"] .site-footer { background: #0D0D0D; } [data-theme="dark"] .logo-text { color: #F5F5F5; } [data-theme="dark"] .logo-text strong { color: var(--color-primary); } [data-theme="dark"] .nav-menu a { color: rgba(255,255,255,.8); } [data-theme="dark"] .nav-menu a:hover, [data-theme="dark"] .nav-menu .current-menu-item > a { color: var(--color-primary); } [data-theme="dark"] .nav-toggle span { background: #F5F5F5; } [data-theme="dark"] .cta-banner { background: var(--color-primary-dk); } [data-theme="dark"] .btn-ghost { border-color: rgba(255,255,255,.25); } [data-theme="dark"] .hero-animated .btn-ghost { color: #fff; background: transparent; } [data-theme="dark"] .hero-animated .btn-ghost:hover { background: rgba(255,255,255,.1); color: #fff; } [data-theme="dark"] .platform-visual:not(.has-img):not(.has-dashboard) { background: var(--color-bg-alt); border-color: var(--color-border); } [data-theme="dark"] .platform-visual.has-img { background: none; border: none; } [data-theme="dark"] .form-notice.success { background: rgba(22,163,74,.1); color: #4ade80; border-color: rgba(22,163,74,.3); } [data-theme="dark"] .form-notice.error { background: rgba(220,38,38,.1); color: #f87171; border-color: rgba(220,38,38,.3); } [data-theme="dark"] .faq-item { background: var(--card-bg); border-color: var(--color-border); } [data-theme="dark"] .faq-item[open] { border-color: var(--color-primary); } [data-theme="dark"] .faq-question { color: var(--color-heading); } [data-theme="dark"] .faq-toggle::before, [data-theme="dark"] .faq-toggle::after { background: var(--color-text-muted); } [data-theme="dark"] .comparison-table-wrap { background: var(--card-bg); border-color: var(--color-border); } [data-theme="dark"] .comparison-table thead th { background: var(--color-bg-alt); color: var(--color-heading); border-color: var(--color-border); } [data-theme="dark"] .comparison-table tbody td { border-color: var(--color-border); color: var(--color-text); } [data-theme="dark"] .comparison-group-row td { background: var(--color-bg-alt); color: var(--color-primary); } [data-theme="dark"] .comparison-table tbody tr:hover td { background: rgba(var(--color-primary-rgb), .06); } @media (max-width: 768px) { .theme-toggle { margin-left: 0; margin-right: .5rem; } } /* ============================================================= Block Editor Overrides (loaded into the editor canvas via add_editor_style) ============================================================= */ /* Remove Gutenberg's default group-block padding so our section classes control all spacing */ .wp-block-group { padding: 0 !important; margin: 0 !important; } /* The editor root container should not add extra padding */ .is-root-container { padding: 0 !important; } /* Make the editor canvas full-width so sections render at their natural width instead of being constrained to post-content width */ .editor-styles-wrapper .is-root-container > .wp-block { max-width: 100% !important; margin-left: 0 !important; margin-right: 0 !important; } .editor-styles-wrapper .wp-block.wp-block-group { max-width: 100% !important; } /* Headings inside the editor should use our theme styles */ .editor-styles-wrapper h1, .editor-styles-wrapper h2, .editor-styles-wrapper h3 { font-family: var(--font-sans); } /* Prevent Gutenberg from adding default margin on headings/paragraphs since our sections control spacing */ .editor-styles-wrapper .wp-block-heading, .editor-styles-wrapper .wp-block-paragraph { margin: 0; } /* ══════════════════════════════════════════════════════════════════════════════ CAMERA ANIMATOR (.platform-visual.has-camera) Photo camera (left) + product scene (centre) + VHS camcorder on tripod (right) ══════════════════════════════════════════════════════════════════════════════ */ .platform-visual.has-camera { --cam-cycle: 9s; --cam-rec-cycle: 1.4s; --cam-lens-cycle: 4s; background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; display: flex; align-items: center; justify-content: center; font-size: inherit; min-height: 220px; } .cam-stage { display: flex; flex-direction: row; align-items: center; justify-content: center; gap: 6px; padding-bottom: 4px; } /* ── Product scene (between the two cameras) ── */ .cam-scene { width: 140px; height: 130px; background: var(--color-bg-alt); border: 1px solid var(--color-border); border-radius: 4px; position: relative; overflow: hidden; flex-shrink: 0; background-image: linear-gradient(rgba(255,255,255,.04) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.04) 1px, transparent 1px); background-size: 18px 18px; } /* ── Rotating product items: shoe, food, laptop ── */ .cam-subject { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; opacity: 0; } .cam-subject::before, .cam-subject::after { content: ''; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } .cam-subject--shoe { animation: cam-subject-1 var(--cam-cycle) ease-in-out infinite; } .cam-subject--shoe::before { width: 76px; height: 28px; border-radius: 16px 20px 10px 14px; background: linear-gradient(145deg, #312e81 0%, #4f46e5 45%, #818cf8 100%); box-shadow: 0 0 14px rgba(129,140,248,.25), inset 0 -2px 0 rgba(0,0,0,.22), inset 0 2px 0 rgba(255,255,255,.18); } .cam-subject--shoe::after { width: 80px; height: 8px; border-radius: 999px; background: #e5e7eb; transform: translate(-50%, calc(-50% + 13px)); box-shadow: inset 0 -1px 0 rgba(0,0,0,.2); } .cam-subject--food { animation: cam-subject-2 var(--cam-cycle) ease-in-out infinite; } .cam-subject--food::before { width: 68px; height: 46px; border-radius: 22px 22px 14px 14px; background: linear-gradient(to bottom, #fbbf24 0 34%, #65a30d 34% 43%, #7c2d12 43% 60%, #f59e0b 60% 100%); box-shadow: 0 0 14px rgba(251,191,36,.28), inset 0 1px 0 rgba(255,255,255,.35); } .cam-subject--food::after { width: 16px; height: 16px; border-radius: 50%; background: rgba(255,255,255,.26); transform: translate(calc(-50% - 14px), calc(-50% - 10px)); } .cam-subject--laptop { animation: cam-subject-3 var(--cam-cycle) ease-in-out infinite; } .cam-subject--laptop::before { width: 74px; height: 44px; border-radius: 6px; background: linear-gradient(165deg, #0f172a 0%, #1e293b 100%); border: 2px solid #94a3b8; box-shadow: 0 0 16px rgba(148,163,184,.25), inset 0 0 0 2px rgba(15,23,42,.7); } .cam-subject--laptop::after { width: 90px; height: 10px; border-radius: 4px; background: linear-gradient(180deg, #d1d5db, #9ca3af); transform: translate(-50%, calc(-50% + 28px)); box-shadow: inset 0 1px 0 rgba(255,255,255,.5); } /* Flash overlay */ .cam-flash-overlay { position: absolute; inset: 0; background: #fff; opacity: 0; pointer-events: none; animation: cam-flash-pulse var(--cam-cycle) linear infinite; } /* CRT scanlines from the video cam */ .cam-vid-overlay { position: absolute; inset: 0; background: repeating-linear-gradient( to bottom, transparent 0px, transparent 3px, rgba(0,0,0,.08) 3px, rgba(0,0,0,.08) 4px ); pointer-events: none; } /* ══════════════════════════════════════════ PHOTO CAMERA (compact point-and-shoot) ══════════════════════════════════════════ */ .pc-wrap { display: flex; flex-direction: column; align-items: flex-start; flex-shrink: 0; transform: translateY(-12px); } .pc-body { width: 90px; display: flex; flex-direction: column; position: relative; filter: drop-shadow(0 6px 18px rgba(0,0,0,.8)); } /* Hot-shoe flash on top */ .pc-flash-unit { width: 30px; height: 10px; background: var(--color-bg-alt); border: 1px solid var(--color-border); border-bottom: none; border-radius: 3px 3px 0 0; margin-left: 10px; position: relative; box-shadow: inset 0 1px 0 rgba(255,255,255,.06); } .pc-flash-unit::after { content: ''; position: absolute; top: 2px; left: 4px; right: 4px; bottom: 2px; background: #c8c870; border-radius: 1px; animation: pc-flash-glow var(--cam-cycle) linear infinite; } /* Top strip */ .pc-top { width: 100%; height: 18px; background: var(--color-bg-alt); border: 1px solid var(--color-border); border-bottom: none; border-radius: 3px 3px 0 0; display: flex; align-items: center; padding: 0 8px; position: relative; box-shadow: inset 0 1px 0 rgba(255,255,255,.06); } .pc-shutter-btn { position: absolute; top: -8px; right: 10px; width: 14px; height: 14px; background: var(--color-border); border-radius: 50%; border: 2px solid var(--color-border); box-shadow: 0 0 0 1px rgba(255,255,255,.15), inset 0 1px 0 rgba(255,255,255,.1); animation: pc-shutter var(--cam-cycle) linear infinite; transform-origin: center; } .pc-viewfinder { width: 11px; height: 7px; background: rgba(0,0,0,.6); border: 1px solid rgba(255,255,255,.18); border-radius: 1px; margin-left: auto; } /* Front face */ .pc-front { width: 100%; height: 52px; background: var(--color-bg-alt); border: 1px solid var(--color-border); border-top: 1px solid rgba(255,255,255,.1); border-radius: 0 0 4px 4px; display: flex; align-items: center; padding: 0 8px; gap: 8px; box-shadow: inset 0 -1px 0 rgba(0,0,0,.3); } /* Lens */ .pc-lens-ring { width: 38px; height: 38px; border-radius: 50%; background: #0a0a0a; border: 3px solid var(--color-border); box-shadow: 0 0 0 1px rgba(255,255,255,.1), inset 0 0 8px rgba(0,0,0,1); display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .pc-lens-glass { width: 26px; height: 26px; border-radius: 50%; background: radial-gradient(circle at 30% 30%, #1a6ad6 0%, #0a1844 50%, #000b1a 100%); position: relative; overflow: hidden; } .pc-lens-reflex { position: absolute; top: 3px; left: 3px; width: 8px; height: 5px; background: rgba(255,255,255,.25); border-radius: 50%; transform: rotate(-20deg); } /* Grip ridges */ .pc-grip { flex: 1; display: flex; flex-direction: column; gap: 5px; align-items: stretch; } .pc-grip::before, .pc-grip::after { content: ''; display: block; height: 4px; background: rgba(255,255,255,.06); border: 1px solid var(--color-border); border-radius: 1px; } /* Polaroid prints */ .pc-prints { position: relative; width: 90px; height: 52px; flex-shrink: 0; } .pc-print { position: absolute; width: 54px; height: 60px; background: #f0e8d0; border-radius: 2px; box-shadow: 0 4px 14px rgba(0,0,0,.7); opacity: 0; } .pc-print__img { position: absolute; top: 6px; left: 6px; right: 6px; height: 38px; border-radius: 1px; } .pc-print--1 { left: 0; top: 0; transform-origin: bottom center; animation: pc-print-1 var(--cam-cycle) linear infinite; } .pc-print--2 { left: 18px; top: 0; transform-origin: bottom center; animation: pc-print-2 var(--cam-cycle) linear infinite; } .pc-print--3 { left: 36px; top: 0; transform-origin: bottom center; animation: pc-print-3 var(--cam-cycle) linear infinite; } .pc-print--1 .pc-print__img { background: linear-gradient(135deg, #064e3b, #4ade80); } .pc-print--2 .pc-print__img { background: linear-gradient(160deg, #78350f, #fbbf24); } .pc-print--3 .pc-print__img { background: linear-gradient(135deg, #1e1b4b, #818cf8); } /* ══════════════════════════════════════════ VIDEO CAMERA ON TRIPOD (retro VHS-era) Lens barrel faces LEFT toward the scene ══════════════════════════════════════════ */ .vc-wrap { display: flex; flex-direction: column; align-items: center; flex-shrink: 0; transform: translateY(12px); } .vc-camera { display: flex; flex-direction: column; align-items: center; filter: drop-shadow(0 6px 18px rgba(0,0,0,.8)); } /* Top carry handle */ .vc-handle { width: 58px; height: 13px; background: var(--color-bg-alt); border: 1px solid var(--color-border); border-radius: 8px 8px 0 0; position: relative; overflow: hidden; box-shadow: inset 0 1px 0 rgba(255,255,255,.07); } .vc-handle::after { content: ''; position: absolute; left: 8px; top: 3px; right: 8px; bottom: 3px; background: repeating-linear-gradient(90deg, rgba(255,255,255,.04) 0, rgba(255,255,255,.04) 3px, transparent 3px, transparent 6px); border-radius: 2px; } /* Main body */ .vc-body { width: 98px; height: 54px; background: var(--color-bg-alt); border: 1px solid var(--color-border); border-top: 1px solid rgba(255,255,255,.12); border-radius: 4px 0 0 4px; position: relative; display: flex; align-items: center; overflow: visible; box-shadow: inset 0 -1px 0 rgba(0,0,0,.3); } /* Lens barrel — extends RIGHT */ .vc-lens-barrel { position: absolute; right: -34px; top: calc(50% - 1px); transform: translateY(-50%); width: 38px; height: 38px; border-radius: 50%; background: #0c0c0c; border: 2px solid var(--color-border); box-shadow: 0 0 0 1px rgba(255,255,255,.1), inset 0 0 8px rgba(0,0,0,1); display: flex; align-items: center; justify-content: center; animation: vc-lens-zoom var(--cam-lens-cycle) ease-in-out infinite; } .vc-lens-tip { width: 26px; height: 26px; border-radius: 50%; background: #0a0a18; border: 1px solid rgba(100,140,255,.3); display: flex; align-items: center; justify-content: center; } .vc-lens-glass { width: 17px; height: 17px; border-radius: 50%; background: radial-gradient(circle at 30% 30%, #1a6ad6 0%, #0a0f2e 55%, #000510 100%); position: relative; overflow: hidden; } .vc-lens-reflex { position: absolute; top: 2px; left: 2px; width: 6px; height: 4px; background: rgba(255,255,255,.25); border-radius: 50%; transform: rotate(-20deg); } /* Top rail */ .vc-top-rail { position: absolute; top: 0; left: 6px; right: 6px; height: 4px; background: rgba(255,255,255,.04); border: 1px solid var(--color-border); border-top: none; border-radius: 0 0 2px 2px; } /* REC indicator */ .vc-rec-light { position: absolute; top: 8px; right: 16px; width: 7px; height: 7px; border-radius: 50%; background: #ef4444; box-shadow: 0 0 8px #ef4444, 0 0 16px rgba(239,68,68,.4); animation: vc-rec-blink var(--cam-rec-cycle) ease-in-out infinite; } /* Eyepiece — extends LEFT */ .vc-eyepiece { position: absolute; left: -14px; top: 50%; transform: translateY(-50%); width: 14px; height: 18px; background: var(--color-bg-alt); border: 1px solid var(--color-border); border-right: none; border-radius: 4px 0 0 4px; display: flex; align-items: center; justify-content: center; } .vc-eyepiece::after { content: ''; width: 8px; height: 8px; background: rgba(0,0,0,.8); border-radius: 50%; border: 1px solid rgba(255,255,255,.15); } /* Cassette door */ .vc-body::after { content: ''; position: absolute; left: 6px; top: 7px; width: 28px; height: 34px; background: rgba(0,0,0,.2); border: 1px solid var(--color-border); border-radius: 2px; } /* ── Tripod ── */ .vc-tripod { display: flex; flex-direction: column; align-items: center; width: 98px; filter: drop-shadow(0 4px 10px rgba(0,0,0,.6)); } .vc-stem { width: 5px; height: 40px; background: linear-gradient(to right, var(--color-bg-alt), var(--color-border), var(--color-bg-alt)); border-radius: 2px; margin-bottom: -2px; } .vc-legs { display: flex; justify-content: space-between; align-items: flex-end; width: 82px; position: relative; height: 30px; } .vc-leg { width: 3px; height: 30px; background: linear-gradient(to right, var(--color-bg-alt), var(--color-border)); border-radius: 0 0 2px 2px; transform-origin: top center; } .vc-leg--l { transform: rotate(-22deg); } .vc-leg--c { height: 20px; } .vc-leg--r { transform: rotate(22deg); } .vc-legs::after { content: ''; position: absolute; top: 9px; left: 9px; right: 9px; height: 2px; background: var(--color-border); border-radius: 1px; opacity: .7; } /* ══ Keyframes ══ */ @keyframes cam-subject-1 { 0%, 30% { opacity: 1; } 33%, 100% { opacity: 0; } } @keyframes cam-subject-2 { 0%, 30% { opacity: 0; } 33%, 63% { opacity: 1; } 66%, 100% { opacity: 0; } } @keyframes cam-subject-3 { 0%, 63% { opacity: 0; } 66%, 100% { opacity: 1; } } @keyframes cam-flash-pulse { 0% { opacity: 0; } 0.5% { opacity: 0.9; } 2.5% { opacity: 0; } 33% { opacity: 0; } 33.5% { opacity: 0.9; } 35.5% { opacity: 0; } 66% { opacity: 0; } 66.5% { opacity: 0.9; } 68.5% { opacity: 0; } 100% { opacity: 0; } } @keyframes pc-flash-glow { 0% { background: #c8c870; filter: brightness(1); } 0.5% { background: #ffffa0; filter: brightness(4); } 2.5% { background: #c8c870; filter: brightness(1); } 33% { background: #c8c870; filter: brightness(1); } 33.5% { background: #ffffa0; filter: brightness(4); } 35.5% { background: #c8c870; filter: brightness(1); } 66% { background: #c8c870; filter: brightness(1); } 66.5% { background: #ffffa0; filter: brightness(4); } 68.5% { background: #c8c870; filter: brightness(1); } 100% { background: #c8c870; filter: brightness(1); } } @keyframes pc-shutter { 0% { transform: scaleY(1); } 0.4% { transform: scaleY(0.7) translateY(1px); } 2% { transform: scaleY(1); } 33% { transform: scaleY(1); } 33.4% { transform: scaleY(0.7) translateY(1px); } 35% { transform: scaleY(1); } 66% { transform: scaleY(1); } 66.4% { transform: scaleY(0.7) translateY(1px); } 68% { transform: scaleY(1); } 100% { transform: scaleY(1); } } @keyframes pc-print-1 { 0% { opacity: 0; transform: rotate(-12deg) translateY(-16px); } 1.5% { opacity: 1; } 4% { opacity: 1; transform: rotate(-12deg) translateY(0); } 95% { opacity: 1; transform: rotate(-12deg) translateY(0); } 99% { opacity: 0; } 100% { opacity: 0; transform: rotate(-12deg) translateY(-16px); } } @keyframes pc-print-2 { 0%, 33% { opacity: 0; transform: rotate(-2deg) translateY(-16px); } 34.5% { opacity: 1; } 37% { opacity: 1; transform: rotate(-2deg) translateY(0); } 95% { opacity: 1; transform: rotate(-2deg) translateY(0); } 99% { opacity: 0; } 100% { opacity: 0; transform: rotate(-2deg) translateY(-16px); } } @keyframes pc-print-3 { 0%, 66% { opacity: 0; transform: rotate(10deg) translateY(-16px); } 67.5% { opacity: 1; } 70% { opacity: 1; transform: rotate(10deg) translateY(0); } 95% { opacity: 1; transform: rotate(10deg) translateY(0); } 99% { opacity: 0; } 100% { opacity: 0; transform: rotate(10deg) translateY(-16px); } } @keyframes vc-rec-blink { 0%, 45% { opacity: 1; } 55%, 100% { opacity: 0.15; } } @keyframes vc-lens-zoom { 0%, 100% { transform: translateY(-50%) scale(1); } 50% { transform: translateY(-50%) scale(1.08); } } /* ── Responsive scale-down ── */ @media (max-width: 900px) { .cam-stage { transform: scale(0.85); transform-origin: center center; } } @media (max-width: 640px) { .cam-stage { transform: scale(0.72); transform-origin: center center; } } /* ── Reduced-motion ── */ @media (prefers-reduced-motion: reduce) { .cam-subject--food, .cam-subject--laptop, .cam-flash-overlay, .pc-print--2, .pc-print--3 { animation: none !important; opacity: 0 !important; } .cam-subject--shoe { animation: none !important; opacity: 1 !important; } .pc-shutter-btn, .pc-flash-unit::after, .vc-lens-barrel, .vc-rec-light { animation: none !important; } .pc-print--1 { animation: none !important; opacity: 1 !important; transform: rotate(-12deg) translateY(0) !important; } } /* ═══════════════════════════════════════════════════════════════════════ USE CASES SHOWCASE (uc-*) Four animated circles in a rounded-border track beneath the hero. ═══════════════════════════════════════════════════════════════════════ */ .uc-track { display: flex; justify-content: space-between; align-items: flex-start; gap: 1.5rem; border: 1px solid var(--color-border); border-radius: var(--radius-xl, 1.25rem); padding: 2.5rem 3rem; background: var(--color-bg-alt); } .uc-item { display: flex; flex-direction: column; align-items: center; flex: 1; } .uc-circle { width: 158px; height: 158px; border-radius: 50%; border: 1.5px solid var(--color-border); overflow: hidden; position: relative; background: var(--color-bg); flex-shrink: 0; } .uc-item-body { margin-top: 1.1rem; text-align: center; } .uc-item-title { font-size: .875rem; font-weight: 600; color: var(--color-heading); } .uc-item-desc { font-size: .75rem; color: var(--color-muted); margin-top: .3rem; line-height: 1.45; max-width: 160px; } /* ── Shared inner wrapper ─────────────────────────────────────────────── */ .uc-inner { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 18px; box-sizing: border-box; gap: 6px; } /* ══════════════════════════════════ 1 — MENU BOARD ══════════════════════════════════ */ .uc-inner--menu { gap: 0; padding: 14px 18px; } .uc-menu-header { width: 100%; height: 16px; border-radius: 3px; background: var(--color-primary); margin-bottom: 10px; flex-shrink: 0; } .uc-menu-row { width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 5px 4px; border-radius: 3px; gap: 6px; flex-shrink: 0; } .uc-menu-row + .uc-menu-row { margin-top: 4px; } .uc-menu-divider { width: 100%; height: 1px; background: var(--color-border); margin: 6px 0; flex-shrink: 0; } .uc-menu-name { height: 7px; flex: 1; border-radius: 3px; background: var(--color-border); } .uc-menu-name--sm { max-width: 55%; } .uc-menu-price { height: 7px; width: 22px; border-radius: 3px; background: var(--color-border); flex-shrink: 0; } .uc-menu-row--highlight { background: color-mix(in srgb, var(--color-primary) 15%, transparent); animation: uc-menu-highlight 3s ease-in-out infinite; } .uc-menu-row--highlight .uc-menu-name, .uc-menu-row--highlight .uc-menu-price { background: var(--color-primary); animation: uc-menu-price-update 3s ease-in-out infinite; } @keyframes uc-menu-highlight { 0%, 100% { background: color-mix(in srgb, var(--color-primary) 15%, transparent); } 45%, 55% { background: color-mix(in srgb, var(--color-accent) 25%, transparent); } } @keyframes uc-menu-price-update { 0%, 38% { opacity: 1; } 42% { opacity: 0; } 48% { opacity: 1; } 52% { opacity: 0; } 58%, 100%{ opacity: 1; } } /* ══════════════════════════════════ 2 — EVENT DISPLAY ══════════════════════════════════ */ .uc-inner--event { gap: 0; padding: 16px 18px; position: relative; } .uc-event-header { width: 100%; height: 13px; border-radius: 3px; background: var(--color-border); margin-bottom: 10px; flex-shrink: 0; display: flex; align-items: center; padding: 0 6px; font-size: 9px; font-weight: 700; color: var(--color-text); letter-spacing: 0.5px; } .uc-event-row { width: 100%; display: flex; align-items: center; gap: 8px; flex-shrink: 0; } .uc-event-row + .uc-event-row { margin-top: 7px; } .uc-event-time { height: 10px; width: 28px; border-radius: 2px; background: var(--color-border); flex-shrink: 0; font-size: 7px; display: flex; align-items: center; justify-content: center; color: var(--color-muted); font-weight: 600; } .uc-event-title { height: 14px; flex: 1; border-radius: 3px; background: var(--color-border); position: relative; overflow: hidden; font-size: 8px; display: flex; align-items: center; padding: 0 6px; color: var(--color-muted); font-weight: 500; white-space: nowrap; text-overflow: ellipsis; } .uc-event-title::after { content: ''; position: absolute; inset: 0; background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,.2) 50%, transparent 100%); transform: translateX(-150%); pointer-events: none; } .uc-event-title--active { background: var(--color-primary); color: #fff; } .uc-event-title--accent { background: color-mix(in srgb, var(--color-accent) 55%, var(--color-border)); color: var(--color-text); } .uc-event-title--active::after { animation: uc-event-shimmer 2.2s linear infinite; } .uc-event-title--accent::after { animation: uc-event-shimmer 2.2s linear infinite 1.1s; } .uc-event-cursor { position: absolute; top: 32px; left: 0; right: 0; height: 2px; background: var(--color-primary); opacity: .85; pointer-events: none; box-shadow: 0 0 8px rgba(var(--color-primary-rgb), 0.4); animation: uc-event-time-progress 20s linear infinite; } .uc-event-cursor::before { content: ''; position: absolute; left: -6px; top: -4px; width: 12px; height: 10px; background: var(--color-primary); border-radius: 50%; box-shadow: 0 0 8px rgba(var(--color-primary-rgb), 0.6); } @keyframes uc-event-shimmer { 0% { transform: translateX(-150%); } 100% { transform: translateX(250%); } } @keyframes uc-event-time-progress { 0% { top: 32px; } 100% { top: calc(100% - 10px); } } /* ══════════════════════════════════ 3 — OFFICE DASHBOARD ══════════════════════════════════ */ .uc-inner--dashboard { justify-content: flex-end; padding: 18px 16px 12px; } .uc-db-bars { display: flex; align-items: stretch; gap: 9px; width: 100%; height: 80px; } .uc-db-bar { flex: 1; border-radius: 4px 4px 0 0; transform-origin: bottom; transform: scaleY(.55); } .uc-db-bar--1, .uc-db-bar--3 { background: var(--color-primary); } .uc-db-bar--2, .uc-db-bar--4 { background: color-mix(in srgb, var(--color-primary) 45%, var(--color-border)); } .uc-db-bar--1 { animation: uc-db-scale-1 3s ease-in-out infinite; } .uc-db-bar--2 { animation: uc-db-scale-2 3s ease-in-out infinite .4s; } .uc-db-bar--3 { animation: uc-db-scale-3 3s ease-in-out infinite .8s; } .uc-db-bar--4 { animation: uc-db-scale-4 3s ease-in-out infinite 1.2s; } .uc-db-baseline { width: 100%; height: 1px; background: var(--color-border); flex-shrink: 0; margin-bottom: 6px; } .uc-db-labels { display: flex; gap: 9px; width: 100%; flex-shrink: 0; } .uc-db-lbl { flex: 1; height: 5px; border-radius: 2px; background: var(--color-border); opacity: .6; } @keyframes uc-db-scale-1 { 0%, 100% { transform: scaleY(.55); } 40% { transform: scaleY(.82); } 70% { transform: scaleY(.42); } } @keyframes uc-db-scale-2 { 0%, 100% { transform: scaleY(.70); } 40% { transform: scaleY(.38); } 70% { transform: scaleY(.78); } } @keyframes uc-db-scale-3 { 0%, 100% { transform: scaleY(.40); } 40% { transform: scaleY(.68); } 70% { transform: scaleY(.58); } } @keyframes uc-db-scale-4 { 0%, 100% { transform: scaleY(.62); } 40% { transform: scaleY(.50); } 70% { transform: scaleY(.88); } } /* ══════════════════════════════════ 4 — WAYFINDING ══════════════════════════════════ */ .uc-inner--wayfinding { padding: 0; } /* Corridor lines */ .uc-wf-corridor { position: absolute; background: var(--color-border); } .uc-wf-corridor--h { height: 8px; width: 70%; top: 50%; left: 15%; transform: translateY(-50%); border-radius: 2px; } .uc-wf-corridor--v { width: 8px; height: 54%; left: 50%; top: 23%; transform: translateX(-50%); border-radius: 2px; } /* Rooms */ .uc-wf-room { position: absolute; border: 1.5px solid var(--color-border); border-radius: 3px; background: var(--color-bg-alt); } .uc-wf-room--1 { width: 32px; height: 28px; top: 17%; left: 17%; } .uc-wf-room--2 { width: 28px; height: 26px; top: 17%; right: 17%; } .uc-wf-room--3 { width: 30px; height: 28px; bottom: 17%; left: 50%; transform: translateX(-50%); } /* Location dot */ .uc-wf-dot { position: absolute; width: 12px; height: 12px; border-radius: 50%; background: var(--color-primary); top: 50%; left: 36%; transform: translate(-50%, -50%); } .uc-wf-dot::after { content: ''; position: absolute; inset: -5px; border-radius: 50%; border: 1.5px solid var(--color-primary); animation: uc-wf-pulse 2s ease-out infinite; } /* Direction arrow */ .uc-wf-arrow { position: absolute; top: 50%; left: 36%; transform: translate(-50%, calc(-50% - 18px)); width: 0; height: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 11px solid var(--color-accent); animation: uc-wf-arrow-bob 1.8s ease-in-out infinite; } @keyframes uc-wf-pulse { 0% { transform: scale(1); opacity: .7; } 70% { transform: scale(2.4); opacity: 0; } 100% { transform: scale(1); opacity: 0; } } @keyframes uc-wf-arrow-bob { 0%, 100% { transform: translate(-50%, calc(-50% - 18px)); } 50% { transform: translate(-50%, calc(-50% - 24px)); } } /* ── Responsive ──────────────────────────────────────────── */ @media (max-width: 900px) { .uc-track { flex-wrap: wrap; justify-content: center; gap: 2rem; padding: 2.5rem 2rem; } .uc-item { width: calc(50% - 1rem); flex: none; } } @media (max-width: 500px) { .uc-track { padding: 2rem 1.5rem; } .uc-item { width: 100%; } .uc-item-desc { max-width: none; } } /* ── Reduced-motion overrides ────────────────────────────── */ @media (prefers-reduced-motion: reduce) { .uc-menu-row--highlight, .uc-menu-row--highlight .uc-menu-name, .uc-menu-row--highlight .uc-menu-price, .uc-event-title--active::after, .uc-event-title--accent::after, .uc-event-cursor, .uc-db-bar--1, .uc-db-bar--2, .uc-db-bar--3, .uc-db-bar--4, .uc-wf-dot::after, .uc-wf-arrow { animation: none !important; } /* Static bar heights when animation is off */ .uc-db-bar--1 { transform: scaleY(.55) !important; } .uc-db-bar--2 { transform: scaleY(.70) !important; } .uc-db-bar--3 { transform: scaleY(.40) !important; } .uc-db-bar--4 { transform: scaleY(.62) !important; } } /* ═══════════════════════════════════════════════════════════ NEVER GOES DARK ANIMATION (.platform-visual.has-ngd) Sequence (10 s loop): 0 – 30 % : Connected – dots travel player → cloud, cloud green 30 – 45 % : Breaking – line turns red, × icon fades in 45 – 72 % : Offline – × visible, ✓ on player, TV still plays 72 – 85 % : Reconnect – × fades, dots resume, cloud back to green 85 – 100% : Connected – steady state before next loop ═══════════════════════════════════════════════════════════ */ /* ── Wrapper overrides ─────────────────────────────────────── */ .platform-visual.has-ngd { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; position: relative; font-size: inherit; } /* ── Stage ─────────────────────────────────────────────────── */ .ngd-stage { position: relative; width: 100%; max-width: 560px; aspect-ratio: 1/1; margin: 0 auto; } /* ── TV ─────────────────────────────────────────────────────── */ .ngd-tv { position: absolute; left: 20px; top: 72px; display: flex; flex-direction: column; align-items: center; } .ngd-tv__body { width: 400px; height: 235px; background: #111; border: 4px solid #111; border-radius: 6px 6px 4px 4px; outline: 1px solid #000; padding: 3px; display: flex; align-items: stretch; position: relative; box-shadow: 0 14px 48px rgba(0,0,0,.55); } /* HDMI port stub on right side */ .ngd-tv__port { position: absolute; right: -6px; top: 110px; width: 6px; height: 14px; background: #1a1a1a; border: 1px solid #000; border-left: none; border-radius: 0 2px 2px 0; } .ngd-tv__port::before { content: ''; position: absolute; left: 0; top: 2px; width: 3px; height: 8px; background: #333; border-radius: 0 1px 1px 0; } .ngd-tv__screen { --ngd-menu-scale-x: 1.8182; --ngd-menu-scale-y: 1.4506; width: 100%; height: 100%; border-radius: 2px; position: relative; overflow: hidden; background: repeating-linear-gradient( 180deg, transparent, transparent 3px, rgba(0,0,0,.10) 3px, rgba(0,0,0,.10) 4px ), linear-gradient(135deg, #0c1016 0%, #151c28 60%, #0c1016 100%); } /* Scanline sweep */ .ngd-tv__screen::after { content: ''; position: absolute; left: 0; width: 100%; height: 3px; background: linear-gradient(90deg, transparent, rgba(74,222,128,.22), transparent); animation: da-scan 4s linear infinite; pointer-events: none; } /* TV feet */ .ngd-tv__feet { display: flex; justify-content: space-between; width: 224px; } .ngd-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } /* ── Menu board content (always playing) ───────────────────── */ .ngd-menu { position: absolute; left: 0; top: 0; width: 220px; height: 162px; transform: scale(var(--ngd-menu-scale-x), var(--ngd-menu-scale-y)); transform-origin: top left; display: flex; flex-direction: column; padding: 7px 6px 4px; gap: 3px; } .ngd-menu__hd { display: flex; align-items: center; gap: 5px; padding-bottom: 4px; border-bottom: 1px solid rgba(255,200,80,.18); flex-shrink: 0; } .ngd-menu__logo { width: 9px; height: 9px; background: #4CAF50; border-radius: 50%; flex-shrink: 0; } .ngd-menu__ttl { flex: 1; height: 5px; background: rgba(255,200,80,.45); border-radius: 2px; max-width: 55px; } .ngd-menu__cols { display: flex; gap: 6px; flex: 1; } .ngd-menu__col { flex: 1; display: flex; flex-direction: column; gap: 4px; } .ngd-menu__cat { height: 4px; background: rgba(76,175,80,.5); border-radius: 1px; margin-bottom: 1px; } .ngd-menu__row { display: flex; align-items: center; gap: 3px; padding: 2px 3px; border-radius: 2px; transition: background .3s; } .ngd-menu__row--hl { background: rgba(76,175,80,.14); animation: ngd-hl-pulse 1.75s ease-in-out infinite; } .ngd-menu__name { flex: 1; height: 4px; background: rgba(255,255,255,.25); border-radius: 1px; } .ngd-menu__row--hl .ngd-menu__name { background: rgba(76,175,80,.55); } .ngd-menu__price { width: 16px; height: 4px; background: rgba(255,200,80,.4); border-radius: 1px; } .ngd-menu__row--hl .ngd-menu__price { background: rgba(255,200,80,.7); } /* Scrolling ticker at bottom */ .ngd-menu__ticker { height: 6px; background: rgba(76,175,80,.12); border-radius: 1px; overflow: hidden; flex-shrink: 0; } .ngd-menu__ticker-inner { width: 250%; height: 100%; background: repeating-linear-gradient( 90deg, rgba(76,175,80,.5) 0px, rgba(76,175,80,.5) 30px, transparent 30px, transparent 50px ); animation: ngd-ticker 2s linear infinite; } /* ── Player device (stick plugged into TV right-side HDMI port) ── */ .ngd-player { position: absolute; /* TV: left(20) + border(4) + width(400) + border(4) = 428px */ left: 428px; /* TV top(72) + border(4) + port.top(110) + port half-h(7) = 193px stick h=32px → top = 193 − 16 = 177px */ top: 177px; display: flex; flex-direction: row; align-items: center; } /* HDMI connector plug — left side, inserts into TV port */ .ngd-player__connector { width: 18px; height: 14px; background: linear-gradient(180deg, #888, #666); border-radius: 2px 0 0 2px; position: relative; box-shadow: 0 1px 3px rgba(0,0,0,.3); flex-shrink: 0; z-index: 1; } .ngd-player__connector::before { content: ''; position: absolute; right: 2px; top: 2px; width: 8px; height: 8px; background: #555; border-radius: 1px; } /* Main stick body — white gradient capsule */ .ngd-player__body { width: 84px; height: 32px; background: linear-gradient(180deg, #f5f5f5, #e0e0e0); border: 1px solid #ccc; border-radius: 0 5px 5px 0; position: relative; box-shadow: 0 2px 8px rgba(0,0,0,.25), inset 0 1px 0 rgba(255,255,255,.6); } /* Brand logo area subtle inset */ .ngd-player__body::before { content: ''; position: absolute; top: 6px; left: 8px; width: 28px; height: 12px; background: rgba(0,0,0,.04); border-radius: 2px; } /* LED indicator — right side of body */ .ngd-player__led { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); width: 4px; height: 4px; border-radius: 50%; background: #4CAF50; box-shadow: 0 0 6px rgba(76,175,80,.8); animation: ngd-led 5s ease-in-out infinite; } /* Checkmark badge — visible only during offline phase */ .ngd-player__check { position: absolute; top: -14px; right: -11px; width: 24px; height: 24px; opacity: 0; transform: scale(0.4); transform-origin: center; animation: ngd-check-show 5s ease-in-out infinite; filter: drop-shadow(0 0 4px rgba(76,175,80,.6)); } /* ── Signal wrap (globe + vertical line to player) ─────────── */ .ngd-signal-wrap { position: absolute; /* body centre X: player left(428) + connector(18) + body half(42) = 488 globe width 88px → half = 44 → left = 488 − 44 = 444px */ left: 444px; top: 22px; width: 88px; display: flex; flex-direction: column; align-items: center; } .ngd-cloud { width: 88px; flex-shrink: 0; } .ngd-cloud__svg { width: 100%; height: auto; display: block; } .ngd-cloud__path { stroke: #4CAF50; opacity: .85; animation: ngd-cloud-color 5s ease-in-out infinite; } /* Vertical signal line */ .ngd-signal-line { width: 3px; height: 92px; background: rgba(76,175,80,.35); border-radius: 2px; position: relative; overflow: visible; animation: ngd-line-col 5s ease-in-out infinite; } /* Dots container — hidden during break phase */ .ngd-signal__dots { position: absolute; inset: 0; overflow: hidden; animation: ngd-dots-vis 5s linear infinite; } .ngd-signal__dot { position: absolute; left: 50%; transform: translateX(-50%); width: 5px; height: 5px; border-radius: 50%; background: #4CAF50; box-shadow: 0 0 5px rgba(76,175,80,.8); animation: ngd-dot-up 0.9s ease-in-out infinite; } .ngd-signal__dot--2 { animation-delay: -0.6s; } .ngd-signal__dot--3 { animation-delay: -1.2s; } /* Break × badge — centered on line */ .ngd-signal__break { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%) scale(0); width: 18px; height: 18px; opacity: 0; animation: ngd-break-show 5s ease-in-out infinite; filter: drop-shadow(0 0 4px rgba(239,68,68,.5)); } /* ═══════════════════════════════════════════════════════════ KEYFRAMES (10 s cycle) ═══════════════════════════════════════════════════════════ */ /* Ticker scroll */ @keyframes ngd-ticker { from { transform: translateX(0); } to { transform: translateX(-50%); } } /* Highlighted menu row pulsing */ @keyframes ngd-hl-pulse { 0%, 100% { background: rgba(76,175,80,.14); } 50% { background: rgba(76,175,80,.28); } } /* Player LED: green → amber → red during disconnect → back to green */ @keyframes ngd-led { 0%, 29% { background: #4CAF50; box-shadow: 0 0 6px rgba(76,175,80,.8); } 33% { background: #f59e0b; box-shadow: 0 0 5px rgba(245,158,11,.6); } 38%, 71% { background: #ef4444; box-shadow: 0 0 4px rgba(239,68,68,.4); } 75% { background: #4CAF50; box-shadow: 0 0 6px rgba(76,175,80,.8); } 100% { background: #4CAF50; box-shadow: 0 0 6px rgba(76,175,80,.8); } } /* Cloud stroke: green → red → green */ @keyframes ngd-cloud-color { 0%, 29% { stroke: #4CAF50; opacity: .85; } 36%, 71% { stroke: #ef4444; opacity: 1; } 76%, 100% { stroke: #4CAF50; opacity: .85; } } /* Signal line colour */ @keyframes ngd-line-col { 0%, 29% { background: rgba(76,175,80,.35); } 36%, 71% { background: rgba(239,68,68,.45); } 76%, 100% { background: rgba(76,175,80,.35); } } /* Dots container: visible during connected phases only */ @keyframes ngd-dots-vis { 0%, 29% { opacity: 1; } 33% { opacity: 0; } 71% { opacity: 0; } 75%, 100% { opacity: 1; } } /* Single dot travelling bottom → top */ @keyframes ngd-dot-up { 0% { bottom: 1px; opacity: 0; } 8% { opacity: 1; } 85% { opacity: 1; } 100% { bottom: calc(100% - 5px); opacity: 0; } } /* Break × badge: appears when disconnected */ @keyframes ngd-break-show { 0%, 29% { opacity: 0; transform: translate(-50%,-50%) scale(0); } 38%, 71% { opacity: 1; transform: translate(-50%,-50%) scale(1); } 76%, 100% { opacity: 0; transform: translate(-50%,-50%) scale(0); } } /* Checkmark: appears when offline, confirming local playback */ @keyframes ngd-check-show { 0%, 44% { opacity: 0; transform: scale(0.4); } 52%, 71% { opacity: 1; transform: scale(1); } 77%, 100% { opacity: 0; transform: scale(0.4); } } /* ── Responsive ─────────────────────────────────────────────── */ @media (max-width: 640px) { .ngd-stage { max-width: 320px; } /* Scale at 84% (320/380) */ .ngd-tv { left: 17px; top: 76px; } .ngd-tv__body { width: 185px; height: 136px; } .ngd-tv__screen { --ngd-menu-scale-x: 0.8409; --ngd-menu-scale-y: 0.8395; } /* port at body midpoint: 136/2 − 7 = 61 */ .ngd-tv__port { top: 61px; } .ngd-tv__feet { gap: 60px; } .ngd-tv__foot { width: 24px; } /* TV right: 17+4+185+4=210; port centre-y: 76+4+61+7=148; player top: 148−13=135 */ .ngd-player { left: 210px; top: 135px; } .ngd-player__connector { width: 12px; height: 9px; } .ngd-player__body { width: 68px; height: 24px; } .ngd-player__body::before { top: 5px; left: 6px; width: 24px; height: 10px; } .ngd-player__led { width: 3px; height: 3px; right: 6px; } /* body centre-x: 210+12+34=256; globe 72px → half=36 → wrap left=220 */ .ngd-signal-wrap { left: 220px; top: 18px; width: 72px; } /* line: wrap.top(18)+globe_h(~52)=70 to player.top(135) → 65px */ .ngd-signal-line { height: 65px; } } /* ── Reduced-motion overrides ───────────────────────────────── */ @media (prefers-reduced-motion: reduce) { .ngd-tv__screen::after, .ngd-menu__ticker-inner, .ngd-menu__row--hl, .ngd-player__led, .ngd-signal__dot, .ngd-signal__dots, .ngd-signal__break, .ngd-cloud__path, .ngd-signal-line, .ngd-player__check { animation: none !important; } /* Static fallback states */ .ngd-player__led { background: #4CAF50; box-shadow: 0 0 5px rgba(76,175,80,.6); } .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; display: flex; align-items: center; justify-content: center; align-self: center; } /* ── Stage ─────────────────────────────────────────────────── */ .bd-stage { position: relative; width: 100%; max-width: 500px; aspect-ratio: 4/3; margin: 0 auto; display: flex; align-items: center; justify-content: center; gap: 22px; } /* ── 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: linear-gradient(135deg, #0c1016 0%, #151c28 60%, #0c1016 100%); } .bd-device__label { font-size: 10px; color: rgba(255,255,255,.45); margin-bottom: 6px; letter-spacing: .5px; text-transform: uppercase; order: -1; } /* ── Tablet (portrait kiosk) ──────────────────────────────── */ .bd-device--tablet .bd-device__body { width: 96px; height: 144px; 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: 216px; height: 130px; } .bd-mount { width: 7px; height: 22px; background: #222; margin-top: -1px; border-radius: 0 0 2px 2px; } .bd-device--wall { animation-delay: 0.5s; } /* ── Interactive tablet on table ───────────────────────────── */ .bd-device--interactive .bd-device__body { width: 132px; height: 89px; border-radius: 6px; transform: perspective(400px) rotateX(25deg); transform-origin: bottom center; } .bd-device--interactive .bd-device__screen { border-radius: 3px; } .bd-table { width: 156px; height: 10px; background: linear-gradient(180deg, #2a2a2a, #1a1a1a); border-radius: 3px; margin-top: -2px; box-shadow: 0 4px 12px rgba(0,0,0,.4); } .bd-device--interactive { 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--interactive .bd-splash { animation-delay: 1s; } .bd-splash__logo { width: 28px; height: 28px; background: var(--color-primary); border-radius: 6px; box-shadow: 0 0 20px rgba(var(--color-primary-rgb),.5), 0 0 50px rgba(var(--color-primary-rgb),.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--interactive .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--interactive .bd-ui { animation-delay: 1s; } /* Brand header bar */ .bd-ui__header { display: flex; align-items: center; gap: 4px; padding: 4px 5px; background: rgba(var(--color-primary-rgb),.15); border-bottom: 1px solid rgba(var(--color-primary-rgb),.25); flex-shrink: 0; } .bd-ui__logo { width: 10px; height: 10px; background: var(--color-primary); border-radius: 3px; flex-shrink: 0; } .bd-ui__brand-bar { flex: 1; height: 4px; background: rgba(var(--color-primary-rgb),.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--interactive .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--interactive .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(var(--color-primary-rgb),.10) 0%, rgba(var(--color-primary-rgb),.05) 100% ); border: 1px solid rgba(var(--color-primary-rgb),.12); } /* ── Promotional content layouts ─────────────────────── */ .bd-promo { flex: 1; display: flex; flex-direction: column; gap: 3px; } /* ── Kiosk: Welcome / check-in screen ── */ .bd-promo--welcome { align-items: center; text-align: center; gap: 4px; } .bd-promo__hero { width: 100%; flex: 1; min-height: 28px; background: linear-gradient(135deg, rgba(var(--color-primary-rgb),.18) 0%, rgba(var(--color-primary-rgb),.06) 100%); border-radius: 2px; } .bd-promo__heading { width: 70%; height: 5px; background: rgba(255,255,255,.3); border-radius: 1px; } .bd-promo__text { width: 85%; height: 3px; background: rgba(255,255,255,.14); border-radius: 1px; } .bd-promo__btn { width: 45%; height: 8px; background: var(--color-primary); border-radius: 3px; margin-top: 2px; } /* ── Wall display: Sale / featured product ── */ .bd-promo--sale { gap: 0; } .bd-promo__cols { display: flex; gap: 5px; flex: 1; } .bd-promo__visual { flex: 1; background: linear-gradient(160deg, rgba(var(--color-primary-rgb),.20) 0%, rgba(var(--color-primary-rgb),.06) 100%); border-radius: 2px; min-height: 24px; } .bd-promo__info { flex: 1; display: flex; flex-direction: column; gap: 3px; justify-content: center; } .bd-promo__badge { width: 28px; height: 6px; background: rgba(239,68,68,.7); border-radius: 2px; } .bd-promo--sale .bd-promo__heading { width: 90%; height: 4px; } .bd-promo--sale .bd-promo__text { width: 100%; height: 3px; } .bd-promo__text--short { width: 65% !important; } .bd-promo__price { width: 36px; height: 6px; background: rgba(255,200,80,.6); border-radius: 1px; margin-top: 1px; } /* ── Interactive: Touch menu / category grid ── */ .bd-promo--menu { gap: 3px; } .bd-promo--menu .bd-promo__heading { width: 55%; height: 4px; } .bd-promo__grid { flex: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 3px; } .bd-promo__tile { background: rgba(255,255,255,.06); border-radius: 2px; display: flex; flex-direction: column; overflow: hidden; } .bd-promo__tile-img { flex: 1; background: linear-gradient(135deg, rgba(var(--color-primary-rgb),.14) 0%, rgba(var(--color-primary-rgb),.04) 100%); } .bd-promo__tile-lbl { height: 4px; margin: 2px 3px; background: rgba(255,255,255,.18); border-radius: 1px; } /* ═══════════════════════════════════════════════════════════ KEYFRAMES (8 s cycle) ═══════════════════════════════════════════════════════════ */ /* Splash: visible 0–30%, fades out 30–40%, 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(var(--color-primary-rgb),.5), 0 0 50px rgba(var(--color-primary-rgb),.15); } 12% { transform: scale(1.08); box-shadow: 0 0 28px rgba(var(--color-primary-rgb),.7), 0 0 60px rgba(var(--color-primary-rgb),.25); } 35%, 100% { transform: scale(0.6); opacity: 0; } } /* UI chrome: hidden 0–28%, fades in 28–38%, 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); } } /* ── Responsive ─────────────────────────────────────────────── */ @media (max-width: 900px) { .bd-stage { max-width: 430px; gap: 14px; } .bd-device--tablet .bd-device__body { width: 76px; height: 114px; } .bd-device--wall .bd-device__body { width: 170px; height: 102px; } .bd-device--interactive .bd-device__body { width: 101px; height: 67px; } .bd-table { width: 120px; } } @media (max-width: 640px) { .bd-stage { max-width: 340px; gap: 10px; } .bd-device--tablet .bd-device__body { width: 60px; height: 90px; } .bd-device--wall .bd-device__body { width: 138px; height: 83px; } .bd-device--interactive .bd-device__body { width: 83px; height: 55px; } .bd-device__label { font-size: 9px; } .bd-table { width: 98px; height: 7px; } } /* ── Reduced-motion overrides ───────────────────────────────── */ @media (prefers-reduced-motion: reduce) { .bd-splash, .bd-splash__logo, .bd-ui, .bd-ui__brand-bar, .bd-ui__content { 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); } } /* ═══════════════════════════════════════════════════════════════ GALLERY TV SLIDESHOW (.platform-visual.has-gallery-tv) ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-gallery-tv { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; font-size: inherit; } .gtv-stage { width: 100%; max-width: 520px; margin: 0 auto; } /* TV frame (mirrors dashboard-tv pattern) */ .gtv-tv { display: flex; flex-direction: column; align-items: center; width: 100%; } .gtv-tv__body { width: 100%; background: #111; border: 5px solid #1a1a1a; border-radius: 8px 8px 4px 4px; outline: 2px solid #000; padding: 4px; position: relative; box-shadow: 0 14px 48px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.04), inset 0 1px 0 rgba(255,255,255,0.06); } .gtv-tv__body::after { content: '\25CF'; position: absolute; bottom: -14px; left: 50%; transform: translateX(-50%); font-size: 7px; color: rgba(74,222,128,0.8); filter: drop-shadow(0 0 3px rgba(74,222,128,0.5)); } .gtv-tv__screen { width: 100%; aspect-ratio: 16/9; background: var(--color-bg); border-radius: 2px; overflow: hidden; position: relative; } .gtv-tv__feet { display: flex; justify-content: space-between; width: 60%; max-width: 300px; } .gtv-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } /* Slides */ .gtv-slides { position: relative; width: 100%; height: 100%; } .gtv-slide { position: absolute; inset: 0; opacity: 0; transition: opacity 0.8s ease; } .gtv-slide.is-active { opacity: 1; } .gtv-slide img { width: 100%; height: 100%; object-fit: cover; display: block; } /* ── Reduced-motion overrides for gallery TV ── */ @media (prefers-reduced-motion: reduce) { .gtv-slide { transition: none !important; } } /* ══════════════════════════════════════════════════════════════════════════════ VIDEO EDITOR ANIMATOR (.platform-visual.has-video-editor) Laptop frame with dark editor UI, animated timeline playhead and preview. ══════════════════════════════════════════════════════════════════════════════ */ .platform-visual.has-video-editor { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; display: flex; align-items: center; justify-content: center; min-height: 200px; } .ve-stage { width: 100%; max-width: 560px; } .ve-svg { width: 100%; height: auto; display: block; filter: drop-shadow(0 8px 28px rgba(0, 0, 0, 0.18)); } /* ═══════════════════════════════════════════════════════════════ HOSPITALITY SIGN ANIMATION (.platform-visual.has-hospitality) Rotating display: Breakfast -> Lunch -> Dinner (9s cycle) ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-hospitality { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; font-size: inherit; } .hosp-stage { width: 100%; max-width: 520px; margin: 0 auto; } .hosp-tv { display: flex; flex-direction: column; align-items: center; width: 100%; } .hosp-tv__body { width: 100%; background: #111; border: 5px solid #1a1a1a; border-radius: 8px 8px 4px 4px; outline: 2px solid #000; padding: 4px; position: relative; box-shadow: 0 14px 48px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.06); } .hosp-tv__screen { width: 100%; aspect-ratio: 16/9; background: #0a0a0a; border-radius: 2px; overflow: hidden; position: relative; } .hosp-tv__feet { display: flex; justify-content: space-between; width: 60%; max-width: 300px; } .hosp-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } /* POS Sync Indicator */ .hosp-pos { position: absolute; top: 12px; right: 12px; display: flex; align-items: center; gap: 6px; background: rgba(0,0,0,0.5); padding: 4px 8px; border-radius: 40px; z-index: 10; border: 1px solid rgba(255,255,255,0.1); backdrop-filter: blur(4px); } .hosp-pos__dot { width: 6px; height: 6px; background: #4ade80; border-radius: 50%; box-shadow: 0 0 8px #4ade80; animation: hosp-pos-pulse 2s ease-in-out infinite; } .hosp-pos__txt { font-size: 9px; color: #fff; font-weight: 500; letter-spacing: 0.3px; } /* Menu Slides */ .hosp-slides { position: relative; width: 100%; height: 100%; } .hosp-slide { position: absolute; inset: 0; opacity: 0; animation: hosp-slide-fade 9s infinite; display: flex; flex-direction: column; } .hosp-slide--breakfast { animation-delay: 0s; } .hosp-slide--lunch { animation-delay: 3s; } .hosp-slide--dinner { animation-delay: 6s; } .hosp-menu { padding: 24px 32px; height: 100%; display: flex; flex-direction: column; background: linear-gradient(135deg, rgba(20,20,25,1) 0%, rgba(30,30,40,1) 100%); color: #fff; } .hosp-menu__hd { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; } .hosp-menu__badge { font-size: 10px; text-transform: uppercase; letter-spacing: 1px; background: var(--color-primary); padding: 2px 8px; border-radius: 4px; font-weight: 700; } .hosp-menu__time { font-size: 11px; color: rgba(255,255,255,0.5); font-family: monospace; } .hosp-menu__title { font-size: 24px; font-weight: 800; margin-bottom: 20px; color: #fff; } .hosp-menu__items { display: flex; flex-direction: column; gap: 16px; } .hosp-menu__item { display: flex; justify-content: space-between; align-items: flex-start; border-bottom: 1px solid rgba(255,255,255,0.05); padding-bottom: 8px; } .hosp-menu__name { font-size: 15px; font-weight: 600; color: #fff; margin-bottom: 2px; } .hosp-menu__desc { font-size: 12px; color: rgba(255,255,255,0.4); } .hosp-menu__price { font-size: 16px; font-weight: 700; color: var(--color-primary); } /* Keyframes */ @keyframes hosp-pos-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.4; transform: scale(0.8); } } @keyframes hosp-slide-fade { 0%, 2% { opacity: 0; transform: translateY(10px); } 5%, 30% { opacity: 1; transform: translateY(0); } 33%, 100% { opacity: 0; transform: translateY(-10px); } } @media (max-width: 640px) { .hosp-menu { padding: 16px 20px; } .hosp-menu__title { font-size: 18px; margin-bottom: 12px; } .hosp-menu__item { gap: 12px; } .hosp-menu__name { font-size: 13px; } .hosp-menu__desc { display: none; } .hosp-menu__price { font-size: 14px; } } /* ═══════════════════════════════════════════════════════════════ RETAIL PROMO ANIMATION (.platform-visual.has-retail) TV cycling 3 slides: Flash Sale → New In Store → Member Rewards (9s) ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-retail { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .retail-stage { width: 100%; max-width: 520px; margin: 0 auto; } .retail-tv { display: flex; flex-direction: column; align-items: center; width: 100%; } .retail-tv__body { width: 100%; background: #111; border: 5px solid #1a1a1a; border-radius: 8px 8px 4px 4px; outline: 2px solid #000; padding: 4px; box-shadow: 0 14px 48px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.06); } .retail-tv__screen { width: 100%; aspect-ratio: 16/9; background: #0a0a0a; border-radius: 2px; overflow: hidden; position: relative; } .retail-tv__feet { display: flex; justify-content: space-between; width: 60%; max-width: 300px; } .retail-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } .retail-slides { position: relative; width: 100%; height: 100%; } .retail-slide { position: absolute; inset: 0; opacity: 0; animation: retail-fade 9s infinite; display: flex; align-items: stretch; } .retail-slide--sale { animation-delay: 0s; } .retail-slide--new { animation-delay: 3s; } .retail-slide--loyalty { animation-delay: 6s; } .retail-promo { width: 100%; padding: 20px 28px; display: flex; flex-direction: column; justify-content: center; gap: 10px; } /* Sale slide */ .retail-slide--sale .retail-promo { background: linear-gradient(135deg, #1a0a0a 0%, #2a0d0d 100%); } /* New arrivals slide */ .retail-slide--new .retail-promo { background: linear-gradient(135deg, #0a0f1a 0%, #0d1a2a 100%); } /* Loyalty slide */ .retail-slide--loyalty .retail-promo { background: linear-gradient(135deg, #0a1a0d 0%, #0d2a12 100%); } .retail-promo__eyebrow { font-size: 10px; text-transform: uppercase; letter-spacing: 1.5px; color: rgba(255,255,255,0.5); } .retail-promo__headline { font-size: 28px; font-weight: 800; color: #fff; line-height: 1.1; } .retail-promo__badge { display: inline-block; background: var(--color-primary); color: #fff; font-size: 13px; font-weight: 700; padding: 4px 12px; border-radius: 4px; width: fit-content; } .retail-promo__items { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; } .retail-promo__item { display: flex; align-items: center; gap: 8px; color: rgba(255,255,255,0.8); font-size: 13px; } .retail-promo__dot { width: 6px; height: 6px; border-radius: 50%; background: var(--color-primary); flex-shrink: 0; } .retail-promo__cta { font-size: 11px; color: rgba(255,255,255,0.4); text-transform: uppercase; letter-spacing: 1px; margin-top: 4px; } /* New arrivals swatches */ .retail-promo__grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin: 4px 0; } .retail-promo__swatch { aspect-ratio: 1; border-radius: 4px; animation: retail-swatch-pulse 3s ease-in-out infinite; } .retail-promo__swatch--a { background: #c8a882; animation-delay: 0s; } .retail-promo__swatch--b { background: #4a7c59; animation-delay: 0.4s; } .retail-promo__swatch--c { background: #2c4a8a; animation-delay: 0.8s; } .retail-promo__swatch--d { background: #8a2c2c; animation-delay: 1.2s; } .retail-promo__sub { font-size: 12px; color: rgba(255,255,255,0.5); } /* Loyalty points */ .retail-promo__points { display: flex; align-items: baseline; gap: 10px; } .retail-promo__pts-val { font-size: 48px; font-weight: 900; color: var(--color-accent); line-height: 1; } .retail-promo__pts-lbl { font-size: 15px; color: rgba(255,255,255,0.8); } .retail-promo__bar { height: 8px; background: rgba(255,255,255,0.12); border-radius: 4px; overflow: hidden; } .retail-promo__bar-fill { height: 100%; width: 72%; background: var(--color-accent); border-radius: 4px; animation: retail-bar-grow 2s ease-out infinite alternate; } @keyframes retail-fade { 0%, 2% { opacity: 0; transform: translateY(10px); } 5%, 30% { opacity: 1; transform: translateY(0); } 33%, 100% { opacity: 0; transform: translateY(-10px); } } @keyframes retail-swatch-pulse { 0%, 100% { opacity: 0.7; transform: scale(1); } 50% { opacity: 1; transform: scale(1.04); } } @keyframes retail-bar-grow { from { width: 50%; } to { width: 82%; } } @media (prefers-reduced-motion: reduce) { .retail-slide { animation: none; opacity: 0; } .retail-slide--sale { opacity: 1; } .retail-promo__swatch { animation: none; } .retail-promo__bar-fill { animation: none; } } @media (max-width: 640px) { .retail-promo { padding: 14px 18px; gap: 7px; } .retail-promo__headline { font-size: 20px; } .retail-promo__pts-val { font-size: 36px; } } /* ═══════════════════════════════════════════════════════════════ CORPORATE MEETING ROOM PANEL (.platform-visual.has-corporate) ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-corporate { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .corp-stage { width: 100%; max-width: 400px; margin: 0 auto; } .corp-panel { background: #0f1117; border: 1px solid #1e2435; border-radius: 12px; padding: 24px 28px; display: flex; flex-direction: column; gap: 20px; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); color: #fff; } .corp-panel__header { display: flex; justify-content: space-between; align-items: center; } .corp-panel__room { font-size: 20px; font-weight: 700; color: #fff; } .corp-panel__status { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; padding: 4px 10px; border-radius: 20px; } .corp-panel__status--busy { background: rgba(239,68,68,0.15); color: #f87171; border: 1px solid rgba(239,68,68,0.3); } .corp-panel__dot { width: 7px; height: 7px; border-radius: 50%; background: #ef4444; animation: corp-dot-pulse 1.8s ease-in-out infinite; } .corp-panel__meeting { border-left: 3px solid var(--color-primary); padding-left: 14px; display: flex; flex-direction: column; gap: 4px; } .corp-panel__meeting-name { font-size: 16px; font-weight: 600; color: #fff; } .corp-panel__meeting-time { font-size: 13px; color: rgba(255,255,255,0.5); font-family: monospace; } .corp-panel__organiser { font-size: 12px; color: rgba(255,255,255,0.35); } /* Timeline bar */ .corp-panel__timeline { display: flex; flex-direction: column; gap: 6px; } .corp-panel__tl-track { height: 8px; background: rgba(255,255,255,0.08); border-radius: 4px; position: relative; overflow: hidden; } .corp-panel__tl-fill { position: absolute; left: 0; top: 0; bottom: 0; width: 42%; background: linear-gradient(90deg, var(--color-primary), #ff6b35); border-radius: 4px; animation: corp-tl-progress 12s linear infinite; } .corp-panel__tl-now { position: absolute; top: -2px; bottom: -2px; left: 42%; width: 2px; background: #fff; border-radius: 2px; animation: corp-tl-now 12s linear infinite; } .corp-panel__tl-labels { display: flex; justify-content: space-between; font-size: 10px; color: rgba(255,255,255,0.3); font-family: monospace; } /* Next meeting */ .corp-panel__next { background: rgba(255,255,255,0.04); border-radius: 8px; padding: 12px 14px; display: flex; flex-direction: column; gap: 3px; } .corp-panel__next-lbl { font-size: 10px; text-transform: uppercase; letter-spacing: 1px; color: rgba(255,255,255,0.35); } .corp-panel__next-name { font-size: 14px; font-weight: 500; color: rgba(255,255,255,0.8); } .corp-panel__next-time { font-size: 12px; color: rgba(255,255,255,0.4); font-family: monospace; } /* Teams indicator */ .corp-panel__teams { display: flex; align-items: center; gap: 8px; font-size: 12px; color: rgba(255,255,255,0.45); } .corp-panel__teams-icon { width: 18px; height: 18px; background: #4a90d9; border-radius: 4px; flex-shrink: 0; } @keyframes corp-dot-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.4; transform: scale(0.7); } } @keyframes corp-tl-progress { 0% { width: 35%; } 100% { width: 55%; } } @keyframes corp-tl-now { 0% { left: 35%; } 100% { left: 55%; } } @media (prefers-reduced-motion: reduce) { .corp-panel__dot { animation: none; } .corp-panel__tl-fill { animation: none; } .corp-panel__tl-now { animation: none; } } @media (max-width: 640px) { .corp-panel { padding: 18px 20px; gap: 16px; } .corp-panel__room { font-size: 16px; } .corp-panel__meeting-name { font-size: 14px; } } /* ═══════════════════════════════════════════════════════════════ EDUCATION SCHEDULE BOARD (.platform-visual.has-education) ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-education { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .edu-stage { width: 100%; max-width: 480px; margin: 0 auto; } .edu-board { background: #0d1117; border: 1px solid #1e2435; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5); color: #fff; } .edu-board__header { display: flex; justify-content: space-between; align-items: center; padding: 14px 20px; background: linear-gradient(135deg, #1a1f2e 0%, #141928 100%); border-bottom: 1px solid rgba(255,255,255,0.06); } .edu-board__title { font-size: 15px; font-weight: 700; color: #fff; } .edu-board__date { font-size: 11px; color: rgba(255,255,255,0.4); font-family: monospace; } .edu-board__rows { display: flex; flex-direction: column; } .edu-board__row { display: grid; grid-template-columns: 56px 1fr 70px auto; align-items: center; gap: 12px; padding: 10px 20px; border-bottom: 1px solid rgba(255,255,255,0.04); transition: background 0.2s; } .edu-row--done { opacity: 0.35; } .edu-row--now { background: rgba(76,175,80,0.08); border-left: 3px solid var(--color-accent); padding-left: 17px; animation: edu-row-pulse 3s ease-in-out infinite; } .edu-row__time { font-size: 12px; color: rgba(255,255,255,0.45); font-family: monospace; } .edu-row__subject { font-size: 13px; font-weight: 500; color: rgba(255,255,255,0.85); } .edu-row--now .edu-row__subject { color: #fff; font-weight: 600; } .edu-row__room { font-size: 11px; color: rgba(255,255,255,0.35); text-align: right; } .edu-row__badge { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; background: var(--color-accent); color: #fff; padding: 2px 7px; border-radius: 4px; } /* Emergency alert bar */ .edu-board__alert { display: flex; align-items: center; gap: 10px; padding: 10px 20px; background: rgba(245,158,11,0.12); border-top: 1px solid rgba(245,158,11,0.25); animation: edu-alert-glow 2.5s ease-in-out infinite; } .edu-alert__icon { width: 20px; height: 20px; border-radius: 50%; background: rgba(245,158,11,0.3); border: 1px solid #f59e0b; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 800; color: #f59e0b; flex-shrink: 0; line-height: 20px; text-align: center; } .edu-alert__txt { font-size: 12px; color: #fbbf24; } @keyframes edu-row-pulse { 0%, 100% { background: rgba(76,175,80,0.08); } 50% { background: rgba(76,175,80,0.14); } } @keyframes edu-alert-glow { 0%, 100% { background: rgba(245,158,11,0.10); } 50% { background: rgba(245,158,11,0.18); } } @media (prefers-reduced-motion: reduce) { .edu-row--now { animation: none; } .edu-board__alert { animation: none; } } @media (max-width: 640px) { .edu-board__row { grid-template-columns: 46px 1fr auto; gap: 8px; padding: 9px 14px; } .edu-row__room { display: none; } .edu-row__subject { font-size: 12px; } .edu-board__header { padding: 12px 14px; } } /* ═══════════════════════════════════════════════════════════════ OUTDOOR MARKETPLACE BOARD (.platform-visual.has-outdoor) ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-outdoor { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .outdoor-stage { width: 100%; max-width: 520px; margin: 0 auto; } .outdoor-board { background: #1a1a1a; border: 6px solid #222; border-radius: 8px; outline: 2px solid #000; box-shadow: 0 16px 60px rgba(0,0,0,0.65), inset 0 1px 0 rgba(255,255,255,0.06); position: relative; } .outdoor-board__screen { aspect-ratio: 16/7; overflow: hidden; background: #090909; border-radius: 2px; position: relative; } .outdoor-board__bezel { height: 10px; background: linear-gradient(180deg, #1a1a1a 0%, #111 100%); border-top: 1px solid #0a0a0a; } .outdoor-slides { position: relative; width: 100%; height: 100%; } .outdoor-slide { position: absolute; inset: 0; opacity: 0; animation: outdoor-fade 8s infinite; } .outdoor-slide--info { animation-delay: 0s; } .outdoor-slide--directory { animation-delay: 4s; } /* Market info slide */ .outdoor-info { height: 100%; padding: 18px 24px; background: linear-gradient(135deg, #0d1a0d 0%, #0a1a10 100%); display: flex; flex-direction: column; gap: 12px; color: #fff; } .outdoor-info__header { display: flex; justify-content: space-between; align-items: flex-start; } .outdoor-info__name { font-size: 20px; font-weight: 800; color: #fff; } .outdoor-info__weather { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; } .outdoor-info__temp { font-size: 24px; font-weight: 700; color: #fbbf24; } .outdoor-info__cond { font-size: 10px; color: rgba(255,255,255,0.5); } .outdoor-info__details { display: flex; flex-direction: column; gap: 7px; } .outdoor-info__row { display: flex; align-items: center; gap: 8px; font-size: 13px; color: rgba(255,255,255,0.8); } .outdoor-info__icon { width: 16px; height: 16px; border-radius: 3px; background: rgba(76,175,80,0.3); border: 1px solid rgba(76,175,80,0.5); flex-shrink: 0; } /* Directory slide */ .outdoor-dir { height: 100%; padding: 18px 24px; background: linear-gradient(135deg, #0d0d1a 0%, #0a0a1a 100%); display: flex; flex-direction: column; gap: 12px; color: #fff; } .outdoor-dir__title { font-size: 16px; font-weight: 700; color: #fff; border-bottom: 1px solid rgba(255,255,255,0.08); padding-bottom: 8px; } .outdoor-dir__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; flex: 1; align-content: start; } .outdoor-dir__cell { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.08); border-radius: 6px; padding: 8px 10px; display: flex; flex-direction: column; gap: 3px; } .outdoor-dir__zone { font-size: 10px; font-weight: 700; color: var(--color-accent); font-family: monospace; text-transform: uppercase; } .outdoor-dir__cat { font-size: 12px; color: rgba(255,255,255,0.7); } @keyframes outdoor-fade { 0%, 2% { opacity: 0; transform: scale(0.98); } 8%, 45% { opacity: 1; transform: scale(1); } 50%, 100% { opacity: 0; transform: scale(0.98); } } @media (prefers-reduced-motion: reduce) { .outdoor-slide { animation: none; opacity: 0; } .outdoor-slide--info { opacity: 1; } } @media (max-width: 640px) { .outdoor-info { padding: 12px 16px; } .outdoor-dir { padding: 12px 16px; } .outdoor-info__name { font-size: 16px; } } /* ═══════════════════════════════════════════════════════════════ LIVE DATA / OPS BOARD (.platform-visual.has-live-data) KPI counters ticked by solutions-animator.js ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-live-data { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .ld-stage { width: 100%; max-width: 480px; margin: 0 auto; } .ld-board { background: #0a0d14; border: 1px solid #1a2035; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.6); color: #fff; } .ld-board__header { display: flex; justify-content: space-between; align-items: center; padding: 12px 18px; background: rgba(255,255,255,0.03); border-bottom: 1px solid rgba(255,255,255,0.06); } .ld-board__title { font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.7); text-transform: uppercase; letter-spacing: 0.8px; font-size: 11px; } .ld-board__live { display: flex; align-items: center; gap: 5px; font-size: 10px; font-weight: 700; color: #f87171; text-transform: uppercase; letter-spacing: 1px; } .ld-board__live-dot { width: 6px; height: 6px; border-radius: 50%; background: #ef4444; animation: ld-live-pulse 1.4s ease-in-out infinite; } .ld-kpis { display: grid; grid-template-columns: repeat(4, 1fr); border-bottom: 1px solid rgba(255,255,255,0.06); } .ld-kpi { padding: 14px 12px; border-right: 1px solid rgba(255,255,255,0.06); display: flex; flex-direction: column; gap: 4px; } .ld-kpi:last-child { border-right: none; } .ld-kpi__label { font-size: 9px; text-transform: uppercase; letter-spacing: 0.6px; color: rgba(255,255,255,0.35); } .ld-kpi__value { font-size: 18px; font-weight: 700; color: #fff; font-family: monospace; transition: color 0.2s; } .ld-kpi__trend::after { display: block; font-size: 10px; margin-top: 2px; } .ld-kpi--up .ld-kpi__value { color: #4ade80; } .ld-kpi--down .ld-kpi__value { color: #f87171; } .ld-kpi--up .ld-kpi__trend::after { content: '▲'; color: #4ade80; } .ld-kpi--down .ld-kpi__trend::after { content: '▼'; color: #f87171; } .ld-kpi--neutral .ld-kpi__trend::after { content: '—'; color: rgba(255,255,255,0.3); } /* Sparkline chart area */ .ld-chart { padding: 12px 18px 8px; border-bottom: 1px solid rgba(255,255,255,0.06); } .ld-sparkline { width: 100%; height: 60px; display: block; } .ld-chart__label { font-size: 10px; color: rgba(255,255,255,0.25); margin-top: 4px; } /* Service status row */ .ld-status { display: flex; align-items: center; gap: 16px; padding: 10px 18px; flex-wrap: wrap; } .ld-svc { display: flex; align-items: center; gap: 5px; font-size: 11px; color: rgba(255,255,255,0.55); } .ld-svc__dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; } .ld-svc--ok .ld-svc__dot { background: #4ade80; box-shadow: 0 0 6px #4ade80; } .ld-svc--warn .ld-svc__dot { background: #fbbf24; box-shadow: 0 0 6px #fbbf24; animation: ld-warn-pulse 1.5s ease-in-out infinite; } .ld-svc--err .ld-svc__dot { background: #f87171; box-shadow: 0 0 6px #f87171; animation: ld-warn-pulse 0.8s ease-in-out infinite; } @keyframes ld-live-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } @keyframes ld-warn-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } @media (max-width: 640px) { .ld-kpis { grid-template-columns: repeat(2, 1fr); } .ld-kpi__value { font-size: 15px; } .ld-status { gap: 10px; padding: 8px 14px; } } /* ═══════════════════════════════════════════════════════════════ HEALTHCARE QUEUE BOARD (.platform-visual.has-healthcare) ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-healthcare { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .hc-stage { width: 100%; max-width: 460px; margin: 0 auto; } .hc-board { background: #0a1419; border: 1px solid #162030; border-radius: 10px; overflow: hidden; box-shadow: 0 10px 32px rgba(0,0,0,0.35); color: #fff; } .hc-board__header { display: flex; align-items: center; gap: 12px; padding: 12px 18px; background: #0d1c2a; border-bottom: 1px solid rgba(255,255,255,0.07); } .hc-board__logo { width: 28px; height: 28px; border-radius: 6px; background: linear-gradient(135deg, #0ea5e9, #38bdf8); flex-shrink: 0; } .hc-board__title { font-size: 15px; font-weight: 600; color: #fff; } /* Now serving hero */ .hc-now { padding: 20px 18px 16px; text-align: center; border-bottom: 1px solid rgba(255,255,255,0.06); background: linear-gradient(135deg, rgba(14,165,233,0.06) 0%, rgba(56,189,248,0.03) 100%); } .hc-now__lbl { font-size: 11px; text-transform: uppercase; letter-spacing: 1.5px; color: rgba(255,255,255,0.4); margin-bottom: 6px; } .hc-now__number { font-size: 40px; font-weight: 900; color: #38bdf8; font-family: monospace; letter-spacing: 4px; animation: hc-number-flash 3.5s ease-in-out infinite; } .hc-now__counter { font-size: 12px; color: rgba(255,255,255,0.5); margin-top: 4px; } /* Counter rows */ .hc-counters { display: flex; flex-direction: column; border-bottom: 1px solid rgba(255,255,255,0.06); } .hc-counter { display: grid; grid-template-columns: 32px 1fr auto auto; align-items: center; gap: 10px; padding: 10px 18px; border-bottom: 1px solid rgba(255,255,255,0.04); font-size: 12px; } .hc-counter:last-child { border-bottom: none; } .hc-counter--active { } .hc-counter--closed { opacity: 0.3; } .hc-counter__id { font-size: 11px; font-weight: 700; color: rgba(255,255,255,0.4); font-family: monospace; } .hc-counter__doctor { color: rgba(255,255,255,0.75); font-size: 12px; } .hc-counter__ticket { font-size: 13px; font-weight: 700; color: #38bdf8; font-family: monospace; min-width: 36px; text-align: right; } .hc-counter__wait { font-size: 11px; color: rgba(255,255,255,0.35); min-width: 50px; text-align: right; } .hc-board__footer { padding: 10px 18px; font-size: 11px; color: rgba(255,255,255,0.3); text-align: center; background: rgba(255,255,255,0.02); } @keyframes hc-number-flash { 0%, 100% { opacity: 1; color: #38bdf8; } 10% { opacity: 0.5; color: #7dd3fc; } 20% { opacity: 1; color: #38bdf8; } } @media (prefers-reduced-motion: reduce) { .hc-now__number { animation: none; } } @media (max-width: 640px) { .hc-now__number { font-size: 28px; } .hc-counter { grid-template-columns: 28px 1fr auto; gap: 8px; } .hc-counter__wait { display: none; } } /* ═══════════════════════════════════════════════════════════════ TRANSIT DEPARTURE BOARD (.platform-visual.has-transit) Split-flap flip characters; rows cycled by solutions-animator.js ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-transit { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .transit-stage { width: 100%; max-width: 500px; margin: 0 auto; } .transit-board { background: #111; border: 1px solid #1a1a1a; border-radius: 8px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.7); font-family: monospace; } .transit-board__header { display: flex; justify-content: space-between; align-items: center; padding: 10px 16px; background: #1a1a1a; border-bottom: 1px solid rgba(255,255,255,0.06); } .transit-board__title { font-size: 14px; font-weight: 700; color: #f5f5a0; letter-spacing: 1px; text-transform: uppercase; } .transit-board__clock { font-size: 18px; font-weight: 700; color: #f5f5a0; letter-spacing: 2px; } .transit-board__cols { display: grid; grid-template-columns: 56px 1fr 64px 80px; gap: 0; padding: 6px 16px; background: #161616; border-bottom: 1px solid rgba(255,255,255,0.08); } .transit-col-hd { font-size: 9px; text-transform: uppercase; letter-spacing: 1px; color: rgba(255,255,255,0.3); } .transit-rows { display: flex; flex-direction: column; } .transit-row { display: grid; grid-template-columns: 56px 1fr 64px 80px; align-items: center; padding: 7px 16px; border-bottom: 1px solid rgba(255,255,255,0.04); gap: 0; transition: background 0.3s; } .transit-row:last-child { border-bottom: none; } .transit-cell { font-size: 13px; color: #f5f5a0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .transit-cell--time { font-weight: 700; letter-spacing: 1px; } .transit-cell--plat { text-align: center; color: rgba(245,245,160,0.7); } .transit-cell--status { } .transit-status--on-time { color: #4ade80; } .transit-status--delayed { color: #f87171; animation: transit-delayed-blink 2s step-end infinite; } .transit-status--cancelled { color: #f87171; text-decoration: line-through; } /* Split-flap character flip animation */ .transit-flap { display: inline-block; animation: transit-flap-flip 0s; } .transit-flap.is-flipping { animation: transit-flap-flip 0.25s ease-in-out forwards; } @keyframes transit-flap-flip { 0% { transform: scaleY(1); } 40% { transform: scaleY(0); opacity: 0.5; } 60% { transform: scaleY(0); opacity: 0.5; } 100% { transform: scaleY(1); } } @keyframes transit-delayed-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } @media (prefers-reduced-motion: reduce) { .transit-flap.is-flipping { animation: none; } .transit-status--delayed { animation: none; } } @media (max-width: 640px) { .transit-board__cols, .transit-row { grid-template-columns: 50px 1fr 52px; } .transit-cell--plat { display: none; } .transit-col-hd:nth-child(3) { display: none; } .transit-cell { font-size: 11px; } } /* ═══════════════════════════════════════════════════════════════ FITNESS CLASS SCHEDULE (.platform-visual.has-fitness) ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-fitness { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .fit-stage { width: 100%; max-width: 460px; margin: 0 auto; } .fit-board { background: #0d0d0d; border: 1px solid #1a1a1a; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.6); color: #fff; } .fit-board__header { display: flex; align-items: center; gap: 10px; padding: 12px 18px; background: #111; border-bottom: 1px solid rgba(255,255,255,0.07); } .fit-board__logo { width: 26px; height: 26px; border-radius: 6px; background: linear-gradient(135deg, var(--color-primary), #ff6b35); flex-shrink: 0; } .fit-board__title { font-size: 14px; font-weight: 700; color: #fff; } /* Live now hero */ .fit-now { padding: 18px 18px 14px; background: linear-gradient(135deg, rgba(216,51,2,0.1) 0%, rgba(255,107,53,0.06) 100%); border-bottom: 1px solid rgba(255,255,255,0.06); } .fit-now__badge { display: inline-flex; align-items: center; gap: 6px; background: var(--color-primary); color: #fff; font-size: 10px; font-weight: 800; letter-spacing: 1px; padding: 3px 10px; border-radius: 4px; margin-bottom: 8px; animation: fit-badge-pulse 2s ease-in-out infinite; } .fit-now__name { font-size: 22px; font-weight: 800; color: #fff; margin-bottom: 4px; } .fit-now__detail { font-size: 12px; color: rgba(255,255,255,0.45); margin-bottom: 12px; } /* Capacity bar */ .fit-now__capacity { display: flex; align-items: center; gap: 10px; } .fit-cap__lbl { font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px; color: rgba(255,255,255,0.35); white-space: nowrap; } .fit-cap__track { flex: 1; height: 8px; background: rgba(255,255,255,0.1); border-radius: 4px; overflow: hidden; } .fit-cap__fill { height: 100%; width: 80%; background: linear-gradient(90deg, var(--color-primary), #ff6b35); border-radius: 4px; animation: fit-cap-breathe 3s ease-in-out infinite alternate; } .fit-cap__val { font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.6); white-space: nowrap; font-family: monospace; } /* Upcoming classes list */ .fit-upcoming { display: flex; flex-direction: column; } .fit-class { display: grid; grid-template-columns: 48px 1fr 1fr auto; align-items: center; gap: 10px; padding: 10px 18px; border-bottom: 1px solid rgba(255,255,255,0.04); font-size: 12px; } .fit-class:last-child { border-bottom: none; } .fit-class__time { font-size: 12px; font-weight: 600; color: rgba(255,255,255,0.5); font-family: monospace; } .fit-class__name { font-size: 13px; font-weight: 500; color: rgba(255,255,255,0.85); } .fit-class__coach { font-size: 11px; color: rgba(255,255,255,0.35); } .fit-class__spaces { font-size: 11px; color: rgba(255,255,255,0.4); text-align: right; white-space: nowrap; } .fit-class--filling .fit-class__spaces { color: #fbbf24; font-weight: 600; } @keyframes fit-badge-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(216,51,2,0.5); } 50% { box-shadow: 0 0 0 6px rgba(216,51,2,0); } } @keyframes fit-cap-breathe { from { width: 76%; } to { width: 83%; } } @media (prefers-reduced-motion: reduce) { .fit-now__badge { animation: none; } .fit-cap__fill { animation: none; } } @media (max-width: 640px) { .fit-now { padding: 14px 14px 12px; } .fit-now__name { font-size: 18px; } .fit-class { grid-template-columns: 42px 1fr auto; gap: 8px; padding: 9px 14px; } .fit-class__coach { display: none; } } /* ═══════════════════════════════════════════════════════════ LOBBY & RECEPTION ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-lobby { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .lobby-stage { width: 100%; max-width: 480px; aspect-ratio: 16 / 10; position: relative; margin: 0 auto; } .lobby-screen { width: 100%; height: 100%; background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); border-radius: 10px; overflow: hidden; position: relative; box-shadow: 0 20px 60px rgba(0,0,0,0.5); } .lobby-hdr { display: flex; justify-content: space-between; align-items: center; padding: 10px 16px; background: rgba(255,255,255,0.08); font-size: 11px; color: rgba(255,255,255,0.7); } .lobby-hdr__logo { font-weight: 700; color: #e2c076; letter-spacing: 0.5px; } .lobby-slides { position: relative; height: calc(100% - 70px); overflow: hidden; } .lobby-slide { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 16px; opacity: 0; animation: lobby-cycle 12s infinite; } .lobby-slide--welcome { animation-delay: 0s; } .lobby-slide--amenities { animation-delay: 4s; } .lobby-slide--events { animation-delay: 8s; } .lobby-welcome__msg { font-size: 28px; font-weight: 700; color: #fff; } .lobby-welcome__sub { font-size: 13px; color: rgba(255,255,255,0.6); margin-top: 6px; } .lobby-amen__title { font-size: 14px; font-weight: 600; color: #e2c076; margin-bottom: 12px; } .lobby-amen__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } .lobby-amen__item { background: rgba(255,255,255,0.08); border-radius: 8px; padding: 10px; font-size: 12px; color: rgba(255,255,255,0.8); text-align: center; } .lobby-events__title { font-size: 14px; font-weight: 600; color: #e2c076; margin-bottom: 10px; text-align: center; } .lobby-events__list { width: 100%; } .lobby-events__item { display: flex; gap: 10px; padding: 6px 0; font-size: 12px; color: rgba(255,255,255,0.8); } .lobby-events__time { color: #e2c076; font-weight: 600; min-width: 40px; } .lobby-wifi { position: absolute; bottom: 0; left: 0; right: 0; padding: 8px 16px; background: rgba(255,255,255,0.05); font-size: 10px; color: rgba(255,255,255,0.5); text-align: center; } @keyframes lobby-cycle { 0%, 5% { opacity: 0; transform: translateY(8px); } 8%, 28% { opacity: 1; transform: translateY(0); } 33%, 100%{ opacity: 0; transform: translateY(-8px); } } @media (prefers-reduced-motion: reduce) { .lobby-slide { animation: none; } .lobby-slide--welcome { opacity: 1; transform: none; } } @media (max-width: 640px) { .lobby-welcome__msg { font-size: 22px; } .lobby-amen__grid { gap: 6px; } } /* ═══════════════════════════════════════════════════════════ CONFERENCE ROOM PANEL ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-conference { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .conf-stage { width: 100%; max-width: 400px; margin: 0 auto; } .conf-panel { background: #0f1117; border: 1px solid #1e2435; border-radius: 12px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); padding: 20px; } .conf-panel__room { font-size: 20px; font-weight: 700; color: #fff; margin-bottom: 8px; } .conf-panel__status { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; } .conf-status__dot { width: 10px; height: 10px; border-radius: 50%; background: var(--color-primary); animation: conf-dot-pulse 2s ease-in-out infinite; } .conf-panel__current { margin-bottom: 16px; } .conf-current__label { font-size: 10px; text-transform: uppercase; letter-spacing: 1px; color: rgba(255,255,255,0.4); } .conf-current__title { font-size: 16px; font-weight: 600; color: #fff; margin-top: 4px; } .conf-current__meta { font-size: 12px; color: rgba(255,255,255,0.5); margin-top: 4px; } .conf-panel__timeline { margin-bottom: 16px; } .conf-tl__bar { height: 4px; background: rgba(255,255,255,0.1); border-radius: 2px; overflow: hidden; } .conf-tl__fill { height: 100%; width: 0%; background: var(--color-primary); border-radius: 2px; animation: conf-fill 8s linear infinite; } .conf-panel__next { font-size: 12px; color: rgba(255,255,255,0.5); padding-top: 12px; border-top: 1px solid rgba(255,255,255,0.08); } .conf-next__label { color: rgba(255,255,255,0.4); } .conf-next__title { color: rgba(255,255,255,0.7); } .conf-next__time { float: right; color: rgba(255,255,255,0.4); } @keyframes conf-dot-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(216,51,2,0.6); } 50% { box-shadow: 0 0 0 6px rgba(216,51,2,0); } } @keyframes conf-fill { from { width: 35%; } to { width: 90%; } } @media (prefers-reduced-motion: reduce) { .conf-status__dot { animation: none; } .conf-tl__fill { animation: none; width: 60%; } } @media (max-width: 640px) { .conf-panel { padding: 16px; } .conf-panel__room { font-size: 17px; } } /* ═══════════════════════════════════════════════════════════ DAY-PART RETAIL PROMO ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-daypart { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .daypart-stage { width: 100%; max-width: 520px; aspect-ratio: 16 / 10; margin: 0 auto; } .daypart-screen { width: 100%; height: 100%; background: linear-gradient(135deg, #0f0c29, #302b63, #24243e); border-radius: 10px; overflow: hidden; position: relative; box-shadow: 0 20px 60px rgba(0,0,0,0.5); } .daypart-hdr { display: flex; justify-content: space-between; align-items: center; padding: 10px 16px; background: rgba(255,255,255,0.06); } .daypart-hdr__clock { font-size: 14px; font-weight: 700; color: #fff; font-variant-numeric: tabular-nums; } .daypart-hdr__badge { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; padding: 3px 10px; border-radius: 20px; background: rgba(216,51,2,0.2); color: #ff9068; } .daypart-slides { position: relative; height: calc(100% - 42px); overflow: hidden; } .daypart-slide { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; text-align: center; opacity: 0; animation: daypart-cycle 12s infinite; } .daypart-slide--morning { animation-delay: 0s; } .daypart-slide--afternoon { animation-delay: 4s; } .daypart-slide--evening { animation-delay: 8s; } .daypart-promo__tag { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.5px; color: #ff9068; margin-bottom: 8px; } .daypart-promo__title { font-size: 24px; font-weight: 700; color: #fff; margin-bottom: 6px; } .daypart-promo__sub { font-size: 13px; color: rgba(255,255,255,0.6); } @keyframes daypart-cycle { 0%, 5% { opacity: 0; transform: scale(0.96); } 8%, 28% { opacity: 1; transform: scale(1); } 33%, 100%{ opacity: 0; transform: scale(1.02); } } @media (prefers-reduced-motion: reduce) { .daypart-slide { animation: none; } .daypart-slide--morning { opacity: 1; transform: none; } } @media (max-width: 640px) { .daypart-promo__title { font-size: 20px; } } /* ═══════════════════════════════════════════════════════════ IN-STORE WAYFINDING KIOSK ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-wayfind { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .wayfind-stage { width: 100%; max-width: 400px; margin: 0 auto; } .wayfind-kiosk { background: #0f1117; border: 1px solid #1e2435; border-radius: 12px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); padding: 16px; } .wayfind-kiosk__search { display: flex; align-items: center; gap: 8px; background: rgba(255,255,255,0.06); border-radius: 8px; padding: 10px 14px; margin-bottom: 14px; } .wayfind-search__icon { font-size: 14px; } .wayfind-search__text { font-size: 13px; color: rgba(255,255,255,0.35); } .wayfind-kiosk__map { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; position: relative; margin-bottom: 14px; } .wayfind-zone { background: rgba(255,255,255,0.05); border-radius: 6px; padding: 16px 8px; text-align: center; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.6); border: 1px solid rgba(255,255,255,0.06); } .wayfind-zone--a { animation: wayfind-glow 6s ease-in-out infinite; } .wayfind-zone--b { animation: wayfind-glow 6s ease-in-out infinite 1.5s; } .wayfind-zone--c { animation: wayfind-glow 6s ease-in-out infinite 3s; } .wayfind-zone--d { animation: wayfind-glow 6s ease-in-out infinite 4.5s; } .wayfind-pin { position: absolute; bottom: 8px; left: 50%; transform: translateX(-50%); display: flex; align-items: center; gap: 4px; } .wayfind-pin__dot { width: 10px; height: 10px; border-radius: 50%; background: var(--color-primary); animation: wayfind-pin-pulse 2s infinite; } .wayfind-pin__label { font-size: 9px; color: rgba(255,255,255,0.5); white-space: nowrap; } .wayfind-kiosk__dir { display: flex; flex-direction: column; gap: 6px; } .wayfind-dir__item { font-size: 12px; color: rgba(255,255,255,0.6); padding: 8px 10px; background: rgba(255,255,255,0.04); border-radius: 6px; } .wayfind-dir__arrow { color: var(--color-primary); font-weight: 700; margin-right: 6px; } @keyframes wayfind-glow { 0%, 100% { border-color: rgba(255,255,255,0.06); background: rgba(255,255,255,0.05); } 25% { border-color: rgba(216,51,2,0.4); background: rgba(216,51,2,0.08); } } @keyframes wayfind-pin-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(216,51,2,0.6); } 50% { box-shadow: 0 0 0 8px rgba(216,51,2,0); } } @media (prefers-reduced-motion: reduce) { .wayfind-zone { animation: none; } .wayfind-pin__dot { animation: none; } } @media (max-width: 640px) { .wayfind-kiosk { padding: 12px; } } /* ═══════════════════════════════════════════════════════════ STOREFRONT WINDOW DISPLAY ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-storefront { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .store-stage { width: 100%; max-width: 520px; aspect-ratio: 16 / 10; position: relative; margin: 0 auto; } .store-window { width: 100%; height: 100%; position: relative; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5); } .store-window__sun { position: absolute; top: -20px; right: -20px; width: 80px; height: 80px; border-radius: 50%; background: radial-gradient(circle, rgba(255,200,50,0.4), transparent 70%); animation: store-sun-pulse 4s ease-in-out infinite; z-index: 2; } .store-window__screen { width: 100%; height: 100%; background: linear-gradient(135deg, #1a1a2e, #2d1b4e); position: relative; overflow: hidden; } .store-slides { position: relative; width: 100%; height: 100%; } .store-slide { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; text-align: center; opacity: 0; animation: store-cycle 12s infinite; } .store-slide--new { animation-delay: 0s; } .store-slide--sale { animation-delay: 4s; } .store-slide--hours { animation-delay: 8s; } .store-slide__tag { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.5px; color: #e2c076; margin-bottom: 8px; } .store-slide__title { font-size: 26px; font-weight: 700; color: #fff; } .store-slide__cta { font-size: 13px; color: var(--color-primary); font-weight: 600; margin-top: 10px; } .store-slide__sub { font-size: 13px; color: rgba(255,255,255,0.5); margin-top: 4px; } .store-window__glare { position: absolute; inset: 0; background: linear-gradient(120deg, rgba(255,255,255,0.08) 0%, transparent 50%); pointer-events: none; z-index: 1; } @keyframes store-cycle { 0%, 5% { opacity: 0; } 8%, 28% { opacity: 1; } 33%, 100%{ opacity: 0; } } @keyframes store-sun-pulse { 0%, 100% { opacity: 0.6; transform: scale(1); } 50% { opacity: 1; transform: scale(1.15); } } @media (prefers-reduced-motion: reduce) { .store-slide { animation: none; } .store-slide--new { opacity: 1; } .store-window__sun { animation: none; } } @media (max-width: 640px) { .store-slide__title { font-size: 20px; } } /* ═══════════════════════════════════════════════════════════ CORPORATE ANNOUNCEMENT BOARD ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-announcement { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .announce-stage { width: 100%; max-width: 460px; margin: 0 auto; } .announce-board { background: #0d1117; border: 1px solid #1e2435; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); } .announce-hdr { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: rgba(255,255,255,0.04); } .announce-hdr__title { font-size: 14px; font-weight: 700; color: #fff; } .announce-hdr__live { font-size: 11px; color: #22c55e; animation: announce-live-blink 2s infinite; } .announce-cards { padding: 12px; display: flex; flex-direction: column; gap: 8px; } .announce-card { border-radius: 8px; padding: 12px; opacity: 0; animation: announce-card-in 12s infinite; } .announce-card--urgent { background: rgba(220,38,38,0.1); border-left: 3px solid #dc2626; animation-delay: 0s; } .announce-card--celebration { background: rgba(34,197,94,0.1); border-left: 3px solid #22c55e; animation-delay: 4s; } .announce-card--hr { background: rgba(59,130,246,0.1); border-left: 3px solid #3b82f6; animation-delay: 8s; } .announce-card__badge { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: rgba(255,255,255,0.5); margin-bottom: 4px; } .announce-card--urgent .announce-card__badge { color: #dc2626; } .announce-card--celebration .announce-card__badge { color: #22c55e; } .announce-card--hr .announce-card__badge { color: #3b82f6; } .announce-card__title { font-size: 14px; font-weight: 600; color: #fff; margin-bottom: 4px; } .announce-card__body { font-size: 12px; color: rgba(255,255,255,0.5); line-height: 1.4; } @keyframes announce-card-in { 0%, 5% { opacity: 0; transform: translateX(-8px); } 8%, 28% { opacity: 1; transform: translateX(0); } 33%, 100%{ opacity: 0; transform: translateX(8px); } } @keyframes announce-live-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } @media (prefers-reduced-motion: reduce) { .announce-card { animation: none; opacity: 1; transform: none; } .announce-hdr__live { animation: none; } } @media (max-width: 640px) { .announce-card { padding: 10px; } .announce-card__title { font-size: 13px; } } /* ═══════════════════════════════════════════════════════════ CAMPUS WAYFINDING KIOSK ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-campus-wayfind { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .campus-stage { width: 100%; max-width: 400px; margin: 0 auto; } .campus-kiosk { background: #0f1117; border: 1px solid #1e2435; border-radius: 12px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); padding: 16px; } .campus-kiosk__hdr { font-size: 16px; font-weight: 700; color: #fff; margin-bottom: 12px; text-align: center; } .campus-kiosk__search { display: flex; align-items: center; gap: 8px; background: rgba(255,255,255,0.06); border-radius: 8px; padding: 10px 14px; margin-bottom: 14px; } .campus-search__icon { font-size: 14px; } .campus-search__text { font-size: 13px; color: rgba(255,255,255,0.35); } .campus-kiosk__map { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; position: relative; margin-bottom: 12px; } .campus-bldg { background: rgba(255,255,255,0.05); border-radius: 6px; padding: 18px 8px; text-align: center; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.6); border: 1px solid rgba(255,255,255,0.06); } .campus-bldg--lib { animation: campus-highlight 8s ease-in-out infinite; } .campus-bldg--sci { animation: campus-highlight 8s ease-in-out infinite 2s; } .campus-bldg--arts { animation: campus-highlight 8s ease-in-out infinite 4s; } .campus-bldg--sports { animation: campus-highlight 8s ease-in-out infinite 6s; } .campus-pin { position: absolute; bottom: 6px; left: 50%; transform: translateX(-50%); } .campus-pin__dot { display: block; width: 10px; height: 10px; border-radius: 50%; background: #3b82f6; animation: campus-pin-pulse 2s infinite; } .campus-kiosk__legend { font-size: 10px; color: rgba(255,255,255,0.4); display: flex; align-items: center; gap: 6px; } .campus-legend__dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; } .campus-legend__dot--you { background: #3b82f6; } @keyframes campus-highlight { 0%, 100% { border-color: rgba(255,255,255,0.06); } 12.5%, 25% { border-color: rgba(59,130,246,0.5); background: rgba(59,130,246,0.08); } } @keyframes campus-pin-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(59,130,246,0.6); } 50% { box-shadow: 0 0 0 8px rgba(59,130,246,0); } } @media (prefers-reduced-motion: reduce) { .campus-bldg { animation: none; } .campus-pin__dot { animation: none; } } @media (max-width: 640px) { .campus-kiosk { padding: 12px; } } /* ═══════════════════════════════════════════════════════════ EMERGENCY OVERRIDE ALERT ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-emergency { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .emerg-stage { width: 100%; max-width: 480px; aspect-ratio: 16 / 10; margin: 0 auto; } .emerg-screen { width: 100%; height: 100%; position: relative; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5); } .emerg-screen__normal { position: absolute; inset: 0; background: #0d1117; padding: 20px; animation: emerg-normal 8s infinite; } .emerg-normal__hdr { font-size: 14px; font-weight: 700; color: #fff; margin-bottom: 12px; } .emerg-normal__item { font-size: 12px; color: rgba(255,255,255,0.5); padding: 6px 0; } .emerg-screen__alert { position: absolute; inset: 0; background: #7f1d1d; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; text-align: center; opacity: 0; animation: emerg-alert 8s infinite; } .emerg-alert__icon { font-size: 32px; animation: emerg-icon-flash 1s infinite; } .emerg-alert__title { font-size: 18px; font-weight: 800; color: #fff; letter-spacing: 2px; margin-top: 8px; } .emerg-alert__msg { font-size: 12px; color: rgba(255,255,255,0.8); margin-top: 8px; line-height: 1.4; } .emerg-alert__pulse { position: absolute; inset: 0; border: 3px solid #dc2626; animation: emerg-border-pulse 1.5s infinite; border-radius: 10px; } @keyframes emerg-normal { 0%, 45% { opacity: 1; } 50%, 95% { opacity: 0; } 100% { opacity: 1; } } @keyframes emerg-alert { 0%, 45% { opacity: 0; } 50%, 95% { opacity: 1; } 100% { opacity: 0; } } @keyframes emerg-icon-flash { 0%, 100% { opacity: 1; } 50% { opacity: 0.2; } } @keyframes emerg-border-pulse { 0% { opacity: 1; } 100% { opacity: 0; transform: scale(1.03); } } @media (prefers-reduced-motion: reduce) { .emerg-screen__normal { animation: none; opacity: 0; } .emerg-screen__alert { animation: none; opacity: 1; } .emerg-alert__icon { animation: none; } .emerg-alert__pulse { animation: none; opacity: 0.5; } } @media (max-width: 640px) { .emerg-alert__title { font-size: 15px; } } /* ═══════════════════════════════════════════════════════════ OUTDOOR ENCLOSURE ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-enclosure { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .encl-stage { width: 100%; max-width: 400px; position: relative; padding-top: 20px; margin: 0 auto; } .encl-rain { position: absolute; inset: 0; overflow: hidden; pointer-events: none; } .encl-rain__drop { position: absolute; width: 2px; background: rgba(100,160,255,0.35); border-radius: 1px; animation: encl-drop 1.2s linear infinite; } .encl-rain__drop:nth-child(1) { left: 8%; height: 16px; animation-delay: 0s; } .encl-rain__drop:nth-child(2) { left: 18%; height: 12px; animation-delay: 0.15s; } .encl-rain__drop:nth-child(3) { left: 28%; height: 18px; animation-delay: 0.3s; } .encl-rain__drop:nth-child(4) { left: 38%; height: 14px; animation-delay: 0.45s; } .encl-rain__drop:nth-child(5) { left: 48%; height: 16px; animation-delay: 0.6s; } .encl-rain__drop:nth-child(6) { left: 58%; height: 12px; animation-delay: 0.1s; } .encl-rain__drop:nth-child(7) { left: 68%; height: 18px; animation-delay: 0.25s; } .encl-rain__drop:nth-child(8) { left: 78%; height: 14px; animation-delay: 0.4s; } .encl-rain__drop:nth-child(9) { left: 88%; height: 16px; animation-delay: 0.55s; } .encl-rain__drop:nth-child(10) { left: 13%; height: 12px; animation-delay: 0.7s; } .encl-rain__drop:nth-child(11) { left: 43%; height: 18px; animation-delay: 0.85s; } .encl-rain__drop:nth-child(12) { left: 73%; height: 14px; animation-delay: 1s; } .encl-unit { position: relative; z-index: 1; } .encl-unit__body { background: #1f2937; border-radius: 10px; border: 3px solid #374151; padding: 4px; box-shadow: 0 8px 24px rgba(0,0,0,0.3); } .encl-unit__screen { background: linear-gradient(135deg, #1a1a2e, #16213e); border-radius: 6px; padding: 28px 16px; text-align: center; } .encl-screen__content { font-size: 14px; font-weight: 600; color: rgba(255,255,255,0.7); } .encl-unit__badge { position: absolute; top: -8px; right: 12px; background: #15803d; color: #fff; font-size: 10px; font-weight: 800; padding: 4px 10px; border-radius: 4px; letter-spacing: 1px; } .encl-unit__temp { text-align: center; margin-top: 10px; font-size: 11px; color: rgba(255,255,255,0.5); } @keyframes encl-drop { from { top: -20px; opacity: 1; } to { top: 110%; opacity: 0.3; } } @media (prefers-reduced-motion: reduce) { .encl-rain__drop { animation: none; opacity: 0.3; } } @media (max-width: 640px) { .encl-stage { padding-top: 14px; } } /* ═══════════════════════════════════════════════════════════ HIGH-BRIGHTNESS COMPARISON ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-brightness { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .bright-stage { width: 100%; max-width: 460px; position: relative; padding-top: 10px; margin: 0 auto; } .bright-sun { position: absolute; top: -10px; right: 20px; width: 50px; height: 50px; border-radius: 50%; background: radial-gradient(circle, rgba(255,200,50,0.5), transparent 70%); animation: bright-sun-glow 3s ease-in-out infinite; } .bright-compare { display: flex; gap: 12px; align-items: center; } .bright-panel { flex: 1; } .bright-panel__screen { border-radius: 8px; padding: 24px 12px; text-align: center; border: 2px solid rgba(255,255,255,0.08); } .bright-panel__screen--dim { background: rgba(255,255,255,0.03); opacity: 0.4; } .bright-panel__screen--vivid { background: linear-gradient(135deg, #1a1a2e, #16213e); animation: bright-vivid-pulse 3s ease-in-out infinite; } .bright-panel__text { font-size: 14px; font-weight: 600; color: #fff; } .bright-panel__screen--dim .bright-panel__text { color: rgba(255,255,255,0.3); } .bright-panel__label { text-align: center; font-size: 11px; color: rgba(255,255,255,0.5); margin-top: 8px; font-weight: 600; } .bright-vs { font-size: 12px; font-weight: 700; color: rgba(255,255,255,0.3); } @keyframes bright-sun-glow { 0%, 100% { opacity: 0.7; transform: scale(1); } 50% { opacity: 1; transform: scale(1.2); } } @keyframes bright-vivid-pulse { 0%, 100% { box-shadow: 0 0 12px rgba(216,51,2,0.15); } 50% { box-shadow: 0 0 24px rgba(216,51,2,0.3); } } @media (prefers-reduced-motion: reduce) { .bright-sun { animation: none; } .bright-panel__screen--vivid { animation: none; } } @media (max-width: 640px) { .bright-panel__screen { padding: 18px 10px; } } /* ═══════════════════════════════════════════════════════════ CELLULAR CONNECTIVITY ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-cellular { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .cell-stage { width: 100%; max-width: 380px; margin: 0 auto; display: flex; flex-direction: column; align-items: center; gap: 16px; padding: 20px 0; } .cell-tower { position: relative; width: 80px; height: 100px; } .cell-tower__mast { position: absolute; left: 50%; bottom: 0; width: 6px; height: 60px; background: linear-gradient(to top, #374151, #6b7280); transform: translateX(-50%); border-radius: 3px; } .cell-tower__base { position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 30px; height: 8px; background: #374151; border-radius: 2px; } .cell-wave { position: absolute; top: 10px; left: 50%; transform: translateX(-50%); border: 2px solid rgba(216,51,2,0.4); border-radius: 50%; animation: cell-wave-expand 3s ease-out infinite; } .cell-wave--1 { width: 30px; height: 30px; animation-delay: 0s; } .cell-wave--2 { width: 50px; height: 50px; animation-delay: 1s; } .cell-wave--3 { width: 70px; height: 70px; animation-delay: 2s; } .cell-badge { font-size: 14px; font-weight: 800; color: #fff; background: rgba(216,51,2,0.15); padding: 6px 16px; border-radius: 20px; letter-spacing: 1px; } .cell-signal { display: flex; gap: 3px; align-items: flex-end; } .cell-signal__bar { width: 6px; background: #22c55e; border-radius: 2px; animation: cell-bar-fill 3s ease-in-out infinite; } .cell-signal__bar--1 { height: 6px; animation-delay: 0s; } .cell-signal__bar--2 { height: 12px; animation-delay: 0.3s; } .cell-signal__bar--3 { height: 18px; animation-delay: 0.6s; } .cell-signal__bar--4 { height: 24px; animation-delay: 0.9s; } .cell-status { font-size: 12px; color: #22c55e; font-weight: 600; } @keyframes cell-wave-expand { 0% { opacity: 1; transform: translateX(-50%) scale(0.5); } 100% { opacity: 0; transform: translateX(-50%) scale(1.5); } } @keyframes cell-bar-fill { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } @media (prefers-reduced-motion: reduce) { .cell-wave { animation: none; opacity: 0.3; } .cell-signal__bar { animation: none; } } @media (max-width: 640px) { .cell-tower { transform: scale(0.85); } } /* ═══════════════════════════════════════════════════════════ DESIGNER EDITOR CANVAS ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-designer { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .designer-stage { width: 100%; max-width: 480px; margin: 0 auto; } .designer-editor { background: #0d1117; border: 1px solid #1e2435; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); display: grid; grid-template-columns: 1fr 90px; grid-template-rows: auto 1fr; } .designer-toolbar { grid-column: 1 / -1; display: flex; gap: 8px; padding: 10px 14px; background: rgba(255,255,255,0.04); border-bottom: 1px solid rgba(255,255,255,0.06); } .designer-tool { width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; background: rgba(255,255,255,0.06); border-radius: 6px; font-size: 13px; color: rgba(255,255,255,0.5); } .designer-canvas { padding: 14px; display: flex; flex-direction: column; gap: 8px; } .designer-widget { border-radius: 6px; padding: 12px 10px; border: 1px dashed rgba(255,255,255,0.12); opacity: 0; animation: designer-drop 8s infinite; } .designer-widget--text { background: rgba(59,130,246,0.08); animation-delay: 0s; } .designer-widget--img { background: rgba(34,197,94,0.08); animation-delay: 1s; } .designer-widget--ticker { background: rgba(234,179,8,0.08); animation-delay: 2s; } .designer-widget--video { background: rgba(168,85,247,0.08); animation-delay: 3s; } .designer-widget__label { font-size: 11px; color: rgba(255,255,255,0.5); } .designer-layers { padding: 14px 10px; border-left: 1px solid rgba(255,255,255,0.06); } .designer-layers__title { font-size: 10px; font-weight: 600; color: rgba(255,255,255,0.4); text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; } .designer-layer { font-size: 11px; color: rgba(255,255,255,0.4); padding: 4px 6px; border-radius: 4px; margin-bottom: 3px; } @keyframes designer-drop { 0%, 8% { opacity: 0; transform: translateY(-8px); } 15%, 80% { opacity: 1; transform: translateY(0); } 90%, 100%{ opacity: 0; } } @media (prefers-reduced-motion: reduce) { .designer-widget { animation: none; opacity: 1; transform: none; } } @media (max-width: 640px) { .designer-editor { grid-template-columns: 1fr; } .designer-layers { display: none; } } /* ═══════════════════════════════════════════════════════════ MEDIA LIBRARY GRID ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-media-library { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .medialib-stage { width: 100%; max-width: 460px; margin: 0 auto; } .medialib-panel { background: #0d1117; border: 1px solid #1e2435; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); padding: 16px; } .medialib-hdr { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; } .medialib-hdr__title { font-size: 14px; font-weight: 700; color: #fff; } .medialib-hdr__count { font-size: 11px; color: rgba(255,255,255,0.4); } .medialib-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 14px; } .medialib-thumb { aspect-ratio: 1; border-radius: 8px; display: flex; align-items: center; justify-content: center; opacity: 0; animation: medialib-fade 10s infinite; } .medialib-thumb--img { background: rgba(59,130,246,0.1); animation-delay: 0s; } .medialib-thumb--vid { background: rgba(168,85,247,0.1); animation-delay: 0.4s; } .medialib-thumb--pdf { background: rgba(220,38,38,0.1); animation-delay: 0.8s; } .medialib-thumb--ppt { background: rgba(234,179,8,0.1); animation-delay: 1.2s; } .medialib-thumb--img2 { background: rgba(34,197,94,0.1); animation-delay: 1.6s; } .medialib-thumb--audio { background: rgba(236,72,153,0.1); animation-delay: 2s; } .medialib-thumb__icon { font-size: 16px; color: rgba(255,255,255,0.5); font-weight: 700; } .medialib-upload { display: flex; align-items: center; gap: 10px; } .medialib-upload__bar { flex: 1; height: 4px; background: rgba(255,255,255,0.08); border-radius: 2px; overflow: hidden; position: relative; } .medialib-upload__bar::after { content: ''; position: absolute; inset: 0; background: #3b82f6; border-radius: 2px; animation: medialib-progress 4s ease-in-out infinite; transform-origin: left; } .medialib-upload__text { font-size: 11px; color: rgba(255,255,255,0.4); white-space: nowrap; } @keyframes medialib-fade { 0%, 8% { opacity: 0; transform: scale(0.85); } 16%, 75%{ opacity: 1; transform: scale(1); } 85%, 100%{ opacity: 0; transform: scale(0.95); } } @keyframes medialib-progress { 0% { transform: scaleX(0); } 80% { transform: scaleX(0.95); } 100% { transform: scaleX(0); } } @media (prefers-reduced-motion: reduce) { .medialib-thumb { animation: none; opacity: 1; transform: none; } .medialib-upload__bar::after { animation: none; transform: scaleX(0.6); } } @media (max-width: 640px) { .medialib-grid { grid-template-columns: repeat(2, 1fr); } } /* ═══════════════════════════════════════════════════════════ PUBLISH WORKFLOW ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-publish { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .publish-stage { width: 100%; max-width: 460px; padding: 16px 0; margin: 0 auto; } .publish-flow { display: flex; align-items: center; justify-content: center; gap: 10px; margin-bottom: 20px; } .publish-step { text-align: center; } .publish-step__badge { display: block; font-size: 12px; font-weight: 700; padding: 8px 16px; border-radius: 8px; margin-bottom: 6px; } .publish-step--draft .publish-step__badge { background: rgba(234,179,8,0.15); color: #eab308; } .publish-step--review .publish-step__badge { background: rgba(59,130,246,0.15); color: #3b82f6; } .publish-step--live .publish-step__badge { background: rgba(34,197,94,0.15); color: #22c55e; } .publish-step__label { font-size: 10px; color: rgba(255,255,255,0.4); } .publish-arrow { font-size: 16px; color: rgba(255,255,255,0.2); } .publish-step--draft { animation: pub-step-highlight 6s infinite 0s; } .publish-step--review { animation: pub-step-highlight 6s infinite 2s; } .publish-step--live { animation: pub-step-highlight 6s infinite 4s; } .publish-bar { height: 4px; background: rgba(255,255,255,0.08); border-radius: 2px; overflow: hidden; margin-bottom: 10px; } .publish-bar__fill { height: 100%; width: 0%; background: linear-gradient(90deg, #eab308, #3b82f6, #22c55e); border-radius: 2px; animation: pub-bar-fill 6s ease-in-out infinite; } .publish-status { font-size: 12px; color: rgba(255,255,255,0.4); text-align: center; animation: pub-status-fade 6s infinite; } @keyframes pub-step-highlight { 0%, 10% { opacity: 0.4; transform: scale(1); } 16%, 28% { opacity: 1; transform: scale(1.08); } 33%, 100% { opacity: 0.4; transform: scale(1); } } @keyframes pub-bar-fill { 0% { width: 0%; } 80% { width: 100%; } 100% { width: 100%; opacity: 0; } } @keyframes pub-status-fade { 0%, 60% { opacity: 0; } 70%, 90% { opacity: 1; } 100% { opacity: 0; } } @media (prefers-reduced-motion: reduce) { .publish-step--draft, .publish-step--review, .publish-step--live { animation: none; opacity: 1; } .publish-bar__fill { animation: none; width: 100%; } .publish-status { animation: none; opacity: 1; } } @media (max-width: 640px) { .publish-step__badge { padding: 6px 12px; font-size: 11px; } } /* ═══════════════════════════════════════════════════════════ SCREEN GROUPS HIERARCHY ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-screen-groups { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .groups-stage { width: 100%; max-width: 400px; padding: 10px 0; margin: 0 auto; } .groups-tree { margin-bottom: 16px; } .groups-node { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-radius: 8px; margin-bottom: 4px; background: rgba(255,255,255,0.04); } .groups-node__icon { font-size: 8px; } .groups-node--root .groups-node__icon { color: var(--color-primary); } .groups-node--region .groups-node__icon { color: #3b82f6; } .groups-node--site .groups-node__icon { color: #22c55e; } .groups-node__name { font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.8); flex: 1; } .groups-node__count { font-size: 10px; font-weight: 700; color: rgba(255,255,255,0.4); background: rgba(255,255,255,0.06); padding: 2px 8px; border-radius: 10px; } .groups-branch { padding-left: 20px; border-left: 2px solid rgba(255,255,255,0.06); margin-left: 16px; } .groups-branch--deep { padding-left: 16px; margin-left: 12px; } .groups-push { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 10px; border-radius: 8px; background: rgba(216,51,2,0.08); position: relative; overflow: hidden; } .groups-push__ripple { position: absolute; inset: 0; border-radius: 8px; border: 2px solid rgba(216,51,2,0.3); animation: groups-ripple 3s ease-out infinite; } .groups-push__label { font-size: 12px; font-weight: 600; color: var(--color-primary); } @keyframes groups-ripple { 0% { opacity: 1; transform: scale(0.95); } 100% { opacity: 0; transform: scale(1.05); } } @media (prefers-reduced-motion: reduce) { .groups-push__ripple { animation: none; opacity: 0.3; } } @media (max-width: 640px) { .groups-branch { padding-left: 14px; margin-left: 12px; } } /* ═══════════════════════════════════════════════════════════ MONITORING DASHBOARD ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-monitoring { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .monitor-stage { width: 100%; max-width: 460px; margin: 0 auto; } .monitor-dash { background: #0d1117; border: 1px solid #1e2435; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); padding: 16px; } .monitor-hdr { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; } .monitor-hdr__title { font-size: 14px; font-weight: 700; color: #fff; } .monitor-hdr__count { font-size: 11px; color: #22c55e; font-weight: 600; } .monitor-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; margin-bottom: 14px; } .monitor-tile { display: flex; align-items: center; gap: 6px; padding: 8px 10px; border-radius: 6px; background: rgba(255,255,255,0.04); font-size: 11px; color: rgba(255,255,255,0.6); } .monitor-tile__dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } .monitor-tile--ok .monitor-tile__dot { background: #22c55e; } .monitor-tile--warn .monitor-tile__dot { background: #eab308; animation: monitor-warn-blink 1.5s infinite; } .monitor-tile__name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .monitor-screenshot { background: rgba(255,255,255,0.04); border-radius: 8px; padding: 10px; text-align: center; } .monitor-screenshot__img { width: 100%; aspect-ratio: 16 / 9; background: rgba(255,255,255,0.06); border-radius: 4px; margin-bottom: 6px; animation: monitor-screenshot-flash 6s infinite; } .monitor-screenshot__label { font-size: 10px; color: rgba(255,255,255,0.4); } @keyframes monitor-warn-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } @keyframes monitor-screenshot-flash { 0%, 90% { opacity: 1; } 93% { opacity: 0.3; } 96% { opacity: 1; } } @media (prefers-reduced-motion: reduce) { .monitor-tile--warn .monitor-tile__dot { animation: none; } .monitor-screenshot__img { animation: none; } } @media (max-width: 640px) { .monitor-grid { grid-template-columns: repeat(2, 1fr); } } /* ═══════════════════════════════════════════════════════════ PATIENT WAYFINDING KIOSK ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-patient-wayfind { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .pwayfind-stage { width: 100%; max-width: 400px; margin: 0 auto; } .pwayfind-kiosk { background: #0f1117; border: 1px solid #1e2435; border-radius: 12px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); padding: 16px; } .pwayfind-hdr { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; } .pwayfind-hdr__title { font-size: 16px; font-weight: 700; color: #fff; } .pwayfind-hdr__a11y { font-size: 20px; color: rgba(255,255,255,0.3); } .pwayfind-search { display: flex; align-items: center; gap: 8px; background: rgba(255,255,255,0.06); border-radius: 8px; padding: 10px 14px; margin-bottom: 14px; } .pwayfind-search__icon { font-size: 14px; } .pwayfind-search__text { font-size: 13px; color: rgba(255,255,255,0.6); animation: pwayfind-typing 4s steps(13) infinite; overflow: hidden; white-space: nowrap; width: 0; border-right: 2px solid rgba(255,255,255,0.4); } .pwayfind-result { background: rgba(59,130,246,0.06); border-radius: 8px; padding: 12px; margin-bottom: 14px; border-left: 3px solid #3b82f6; opacity: 0; animation: pwayfind-result-in 4s ease infinite; animation-delay: 2s; } .pwayfind-result__dept { font-size: 13px; font-weight: 600; color: #fff; margin-bottom: 8px; } .pwayfind-result__route { display: flex; align-items: center; gap: 8px; font-size: 11px; color: rgba(255,255,255,0.5); } .pwayfind-route__line { flex: 1; height: 2px; background: linear-gradient(90deg, #3b82f6, #22c55e); border-radius: 1px; } .pwayfind-route__start { white-space: nowrap; color: #3b82f6; } .pwayfind-route__end { white-space: nowrap; color: #22c55e; } .pwayfind-quick { display: flex; gap: 6px; flex-wrap: wrap; } .pwayfind-quick__item { font-size: 11px; padding: 6px 12px; border-radius: 20px; background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.5); } @keyframes pwayfind-typing { 0% { width: 0; } 50% { width: 100%; } 80% { width: 100%; } 100% { width: 0; } } @keyframes pwayfind-result-in { 0%, 40% { opacity: 0; transform: translateY(6px); } 50%, 80% { opacity: 1; transform: translateY(0); } 90%, 100%{ opacity: 0; } } @media (prefers-reduced-motion: reduce) { .pwayfind-search__text { animation: none; width: auto; border-right: none; } .pwayfind-result { animation: none; opacity: 1; transform: none; } } @media (max-width: 640px) { .pwayfind-kiosk { padding: 12px; } } /* ═══════════════════════════════════════════════════════════ WAITING ROOM INFORMATION DISPLAY ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-waiting-room { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .waitroom-stage { width: 100%; max-width: 520px; margin: 0 auto; } .waitroom-tv { display: flex; flex-direction: column; align-items: center; width: 100%; } .waitroom-tv__body { width: 100%; background: #111; border: 5px solid #1a1a1a; border-radius: 8px 8px 4px 4px; outline: 2px solid #000; padding: 4px; box-shadow: 0 14px 48px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.06); } .waitroom-tv__screen { width: 100%; aspect-ratio: 16 / 9; background: #0a0a0a; border-radius: 2px; overflow: hidden; position: relative; } .waitroom-slides { position: relative; width: 100%; height: 100%; } .waitroom-slide { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; text-align: center; opacity: 0; animation: waitroom-cycle 12s infinite; } .waitroom-slide--tips { animation-delay: 0s; } .waitroom-slide--wait { animation-delay: 4s; } .waitroom-slide--info { animation-delay: 8s; } .waitroom-tips__title { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; color: #22c55e; margin-bottom: 8px; } .waitroom-tips__text { font-size: 14px; color: rgba(255,255,255,0.7); line-height: 1.5; } .waitroom-wait__title { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; color: #3b82f6; margin-bottom: 8px; } .waitroom-wait__value { font-size: 32px; font-weight: 800; color: #fff; } .waitroom-wait__queue { font-size: 12px; color: rgba(255,255,255,0.5); margin-top: 4px; } .waitroom-info__title { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; color: rgba(255,255,255,0.4); margin-bottom: 8px; } .waitroom-info__text { font-size: 13px; color: rgba(255,255,255,0.6); line-height: 1.5; } .waitroom-tv__feet { display: flex; justify-content: space-between; width: 60%; max-width: 300px; } .waitroom-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } @keyframes waitroom-cycle { 0%, 5% { opacity: 0; transform: translateY(8px); } 8%, 28% { opacity: 1; transform: translateY(0); } 33%, 100%{ opacity: 0; transform: translateY(-8px); } } @media (prefers-reduced-motion: reduce) { .waitroom-slide { animation: none; } .waitroom-slide--tips { opacity: 1; transform: none; } } @media (max-width: 640px) { .waitroom-wait__value { font-size: 26px; } } /* ═══════════════════════════════════════════════════════════ MULTI-ZONE LAYOUT ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-multi-zone { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .mzone-stage { width: 100%; max-width: 520px; margin: 0 auto; } .mzone-tv { display: flex; flex-direction: column; align-items: center; width: 100%; } .mzone-tv__body { width: 100%; background: #111; border: 5px solid #1a1a1a; border-radius: 8px 8px 4px 4px; outline: 2px solid #000; padding: 4px; box-shadow: 0 14px 48px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.06); } .mzone-tv__screen { width: 100%; aspect-ratio: 16 / 9; background: #0a0a0a; border-radius: 2px; overflow: hidden; } .mzone-layout { width: 100%; height: 100%; display: grid; grid-template-columns: 1fr 120px; grid-template-rows: 1fr 28px; } .mzone-main { background: #0f0f1a; display: flex; align-items: center; justify-content: center; border-right: 1px solid rgba(255,255,255,0.06); border-bottom: 1px solid rgba(255,255,255,0.06); } .mzone-main__label { font-size: 14px; color: rgba(255,255,255,0.3); } .mzone-side { padding: 10px 8px; background: rgba(255,255,255,0.02); border-bottom: 1px solid rgba(255,255,255,0.06); overflow: hidden; } .mzone-side__title { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: var(--color-primary); margin-bottom: 6px; } .mzone-side__item { font-size: 10px; color: rgba(255,255,255,0.5); padding: 3px 0; } .mzone-ticker { grid-column: 1 / -1; background: rgba(216,51,2,0.08); padding: 6px 12px; font-size: 10px; color: rgba(255,255,255,0.5); white-space: nowrap; overflow: hidden; animation: mzone-scroll 20s linear infinite; } .mzone-tv__feet { display: flex; justify-content: space-between; width: 60%; max-width: 300px; } .mzone-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } @keyframes mzone-scroll { from { text-indent: 100%; } to { text-indent: -200%; } } @media (prefers-reduced-motion: reduce) { .mzone-ticker { animation: none; text-indent: 0; } } @media (max-width: 640px) { .mzone-layout { grid-template-columns: 1fr 90px; } } /* ═══════════════════════════════════════════════════════════ MEMBERSHIP PROMO CYCLING ANIMATION ═══════════════════════════════════════════════════════════ */ .platform-visual.has-membership { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .member-stage { width: 100%; max-width: 520px; aspect-ratio: 16 / 10; margin: 0 auto; } .member-screen { width: 100%; height: 100%; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5); position: relative; } .member-slides { position: relative; width: 100%; height: 100%; } .member-slide { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; text-align: center; opacity: 0; animation: member-cycle 12s infinite; } .member-slide--jan { background: linear-gradient(135deg, #1e3a5f, #0f172a); animation-delay: 0s; } .member-slide--summer { background: linear-gradient(135deg, #7c2d12, #1c1917); animation-delay: 4s; } .member-slide--sept { background: linear-gradient(135deg, #14532d, #0f172a); animation-delay: 8s; } .member-slide__tag { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.5px; color: var(--color-primary); margin-bottom: 6px; } .member-slide__title { font-size: 24px; font-weight: 700; color: #fff; margin-bottom: 6px; } .member-slide__price { font-size: 14px; color: rgba(255,255,255,0.6); margin-bottom: 12px; } .member-slide__cta { font-size: 12px; font-weight: 600; color: #fff; background: var(--color-primary); padding: 6px 18px; border-radius: 20px; display: inline-block; } @keyframes member-cycle { 0%, 5% { opacity: 0; transform: scale(0.96); } 8%, 28% { opacity: 1; transform: scale(1); } 33%, 100%{ opacity: 0; transform: scale(1.02); } } @media (prefers-reduced-motion: reduce) { .member-slide { animation: none; } .member-slide--jan { opacity: 1; transform: none; } } @media (max-width: 640px) { .member-slide__title { font-size: 20px; } } /* ═══════════════════════════════════════════════════════════════ VIDEO & MOTION GRAPHICS ANIMATION (.platform-visual.has-video-motion) Looping reel with kinetic typography and motion preview ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-video-motion { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .vidmo-stage { width: 100%; max-width: 520px; margin: 0 auto; } .vidmo-tv { display: flex; flex-direction: column; align-items: center; width: 100%; } .vidmo-tv__body { width: 100%; background: #111; border: 5px solid #1a1a1a; border-radius: 8px 8px 4px 4px; outline: 2px solid #000; padding: 4px; box-shadow: 0 14px 48px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.06); } .vidmo-tv__screen { width: 100%; aspect-ratio: 16/9; background: #0a0a0a; border-radius: 2px; overflow: hidden; position: relative; } .vidmo-tv__feet { display: flex; justify-content: space-between; width: 60%; max-width: 300px; } .vidmo-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } /* Slides */ .vidmo-slides { position: relative; width: 100%; height: 100%; } .vidmo-slide { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 24px; text-align: center; opacity: 0; animation: vidmo-cycle 12s infinite; } .vidmo-slide--kinetic { animation-delay: 0s; } .vidmo-slide--promo { animation-delay: 4s; } .vidmo-slide--loop { animation-delay: 8s; } /* Kinetic typography slide */ .vidmo-kinetic { display: flex; flex-direction: column; gap: 4px; align-items: center; } .vidmo-kinetic__word { font-weight: 800; text-transform: uppercase; letter-spacing: 2px; color: #fff; opacity: 0; animation: vidmo-word-in 12s infinite; } .vidmo-kinetic__word--1 { font-size: 28px; animation-delay: 0.2s; } .vidmo-kinetic__word--2 { font-size: 20px; color: var(--color-primary); animation-delay: 0.5s; } .vidmo-kinetic__word--3 { font-size: 16px; color: rgba(255,255,255,0.5); animation-delay: 0.8s; } /* Promo slide */ .vidmo-promo { position: relative; width: 80%; max-width: 280px; } .vidmo-promo__bg { position: absolute; inset: 0; background: linear-gradient(135deg, rgba(216,51,2,0.2), transparent); border-radius: 10px; animation: vidmo-bg-pulse 4s ease-in-out infinite; } .vidmo-promo__label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 1.5px; color: var(--color-primary); margin-bottom: 6px; position: relative; } .vidmo-promo__title { font-size: 22px; font-weight: 800; color: #fff; position: relative; } .vidmo-promo__sub { font-size: 12px; color: rgba(255,255,255,0.5); margin-top: 6px; position: relative; } /* Loop counter slide */ .vidmo-loop { display: flex; flex-direction: column; align-items: center; gap: 10px; } .vidmo-loop__icon { width: 40px; height: 40px; border-radius: 50%; border: 2px solid var(--color-primary); display: flex; align-items: center; justify-content: center; font-size: 16px; animation: vidmo-icon-spin 4s linear infinite; } .vidmo-loop__text { font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.6); } .vidmo-loop__formats { display: flex; gap: 8px; } .vidmo-loop__fmt { font-size: 10px; font-weight: 700; padding: 3px 8px; border-radius: 4px; background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.4); letter-spacing: 0.5px; } /* Progress bar */ .vidmo-progress { position: absolute; bottom: 0; left: 0; right: 0; height: 3px; background: rgba(255,255,255,0.06); } .vidmo-progress__bar { height: 100%; background: var(--color-primary); animation: vidmo-progress-fill 12s linear infinite; } @keyframes vidmo-cycle { 0%, 2% { opacity: 0; transform: translateY(10px); } 5%, 30% { opacity: 1; transform: translateY(0); } 33%, 100%{ opacity: 0; transform: translateY(-10px); } } @keyframes vidmo-word-in { 0%, 2% { opacity: 0; transform: scale(0.8); } 5%, 28% { opacity: 1; transform: scale(1); } 33%, 100%{ opacity: 0; transform: scale(1.05); } } @keyframes vidmo-bg-pulse { 0%, 100% { opacity: 0.6; } 50% { opacity: 1; } } @keyframes vidmo-icon-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes vidmo-progress-fill { 0% { width: 0%; } 95% { width: 100%; } 100% { width: 0%; } } @media (prefers-reduced-motion: reduce) { .vidmo-slide { animation: none; } .vidmo-slide--kinetic { opacity: 1; transform: none; } .vidmo-kinetic__word { animation: none; opacity: 1; transform: none; } .vidmo-loop__icon { animation: none; } .vidmo-progress__bar { animation: none; width: 60%; } } @media (max-width: 640px) { .vidmo-kinetic__word--1 { font-size: 22px; } .vidmo-promo__title { font-size: 18px; } } /* ═══════════════════════════════════════════════════════════════ BRANDED LAYOUT DESIGN ANIMATION (.platform-visual.has-brand-layout) Template builder showing brand elements snapping into place ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-brand-layout { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; } .blay-stage { width: 100%; max-width: 480px; margin: 0 auto; } .blay-editor { background: #0d1117; border: 1px solid #1e2435; border-radius: 10px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04); } .blay-toolbar { display: flex; align-items: center; gap: 10px; padding: 10px 16px; background: rgba(255,255,255,0.03); border-bottom: 1px solid rgba(255,255,255,0.06); } .blay-toolbar__title { font-size: 12px; font-weight: 600; color: rgba(255,255,255,0.5); flex: 1; } .blay-toolbar__dots { display: flex; gap: 4px; } .blay-toolbar__dot { width: 8px; height: 8px; border-radius: 50%; } .blay-toolbar__dot--r { background: #ff5f56; } .blay-toolbar__dot--y { background: #ffbd2e; } .blay-toolbar__dot--g { background: #27c93f; } .blay-body { display: grid; grid-template-columns: 1fr 140px; } /* Canvas area */ .blay-canvas { padding: 16px; border-right: 1px solid rgba(255,255,255,0.06); } .blay-preview { background: #0a0a0e; border-radius: 6px; overflow: hidden; position: relative; aspect-ratio: 16/10; } /* Brand elements dropping in */ .blay-el { position: absolute; opacity: 0; animation: blay-drop 10s infinite; } .blay-el--logo { top: 12px; left: 12px; width: 60px; height: 18px; background: var(--color-primary); border-radius: 3px; animation-delay: 0s; } .blay-el--hero { top: 38px; left: 12px; right: 12px; height: 48%; background: linear-gradient(135deg, rgba(255,255,255,0.04), rgba(255,255,255,0.08)); border-radius: 4px; animation-delay: 0.5s; } .blay-el--headline { bottom: 38%; left: 12px; width: 65%; height: 12px; background: rgba(255,255,255,0.2); border-radius: 2px; animation-delay: 1s; } .blay-el--body { bottom: 28%; left: 12px; width: 80%; height: 6px; background: rgba(255,255,255,0.08); border-radius: 2px; animation-delay: 1.3s; } .blay-el--body2 { bottom: 22%; left: 12px; width: 70%; height: 6px; background: rgba(255,255,255,0.06); border-radius: 2px; animation-delay: 1.5s; } .blay-el--cta { bottom: 10%; left: 12px; width: 80px; height: 24px; background: var(--color-primary); border-radius: 4px; animation-delay: 1.8s; } .blay-el--accent { top: 0; right: 0; width: 4px; height: 100%; background: var(--color-primary); animation-delay: 2.1s; } /* Brand guide panel */ .blay-panel { padding: 14px 12px; } .blay-panel__title { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: rgba(255,255,255,0.35); margin-bottom: 12px; } .blay-colors { display: flex; gap: 6px; margin-bottom: 14px; } .blay-color { width: 22px; height: 22px; border-radius: 4px; border: 1px solid rgba(255,255,255,0.1); } .blay-color--1 { background: var(--color-primary); } .blay-color--2 { background: #1a1a2e; } .blay-color--3 { background: #fff; } .blay-color--4 { background: #6b7280; } .blay-fonts { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; } .blay-font { display: flex; flex-direction: column; gap: 2px; } .blay-font__label { font-size: 8px; text-transform: uppercase; letter-spacing: 0.5px; color: rgba(255,255,255,0.25); } .blay-font__sample { font-size: 14px; font-weight: 700; color: rgba(255,255,255,0.6); } .blay-font__sample--body { font-size: 11px; font-weight: 400; } .blay-spacing { display: flex; flex-direction: column; gap: 4px; } .blay-spacing__label { font-size: 8px; text-transform: uppercase; letter-spacing: 0.5px; color: rgba(255,255,255,0.25); } .blay-spacing__bars { display: flex; align-items: flex-end; gap: 3px; height: 20px; } .blay-spacing__bar { width: 12px; border-radius: 2px; background: rgba(255,255,255,0.1); } .blay-spacing__bar--sm { height: 6px; } .blay-spacing__bar--md { height: 12px; } .blay-spacing__bar--lg { height: 18px; } .blay-spacing__bar--xl { height: 20px; } @keyframes blay-drop { 0%, 5% { opacity: 0; transform: translateY(-8px); } 12%, 75% { opacity: 1; transform: translateY(0); } 85%, 100%{ opacity: 0; } } @media (prefers-reduced-motion: reduce) { .blay-el { animation: none; opacity: 1; transform: none; } } @media (max-width: 640px) { .blay-body { grid-template-columns: 1fr; } .blay-panel { display: none; } } /* ═══════════════════════════════════════════════════════════════ DIGITAL MENU BOARD ANIMATION (.platform-visual.has-menu-board) Rotating restaurant menu with categories and prices ═══════════════════════════════════════════════════════════════ */ .platform-visual.has-menu-board { background: none !important; border: none !important; border-radius: 0; aspect-ratio: unset; padding: 0; overflow: visible; box-shadow: none; font-size: inherit; } .menu-stage { width: 100%; max-width: 520px; margin: 0 auto; } .menu-tv { display: flex; flex-direction: column; align-items: center; width: 100%; } .menu-tv__body { width: 100%; background: #111; border: 5px solid #1a1a1a; border-radius: 8px 8px 4px 4px; outline: 2px solid #000; padding: 4px; position: relative; box-shadow: 0 14px 48px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.06); } .menu-tv__screen { width: 100%; aspect-ratio: 16/9; background: #0a0a0a; border-radius: 2px; overflow: hidden; position: relative; } .menu-tv__feet { display: flex; justify-content: space-between; width: 60%; max-width: 300px; } .menu-tv__foot { width: 12px; height: 8px; background: #111; border: 1px solid #000; border-radius: 0 0 4px 4px; } /* Live badge */ .menu-live { position: absolute; top: 10px; right: 10px; display: flex; align-items: center; gap: 5px; background: rgba(0,0,0,0.5); padding: 3px 8px; border-radius: 20px; z-index: 10; border: 1px solid rgba(255,255,255,0.1); backdrop-filter: blur(4px); } .menu-live__dot { width: 6px; height: 6px; background: #4ade80; border-radius: 50%; box-shadow: 0 0 8px #4ade80; animation: menu-live-pulse 2s ease-in-out infinite; } .menu-live__text { font-size: 9px; color: #fff; font-weight: 500; letter-spacing: 0.3px; } /* Menu slides */ .menu-slides { position: relative; width: 100%; height: 100%; } .menu-slide { position: absolute; inset: 0; opacity: 0; animation: menu-slide-fade 9s infinite; display: flex; flex-direction: column; } .menu-slide--mains { animation-delay: 0s; } .menu-slide--drinks { animation-delay: 3s; } .menu-slide--dessert { animation-delay: 6s; } .menu-content { padding: 20px 28px; height: 100%; display: flex; flex-direction: column; background: linear-gradient(135deg, rgba(15,15,20,1) 0%, rgba(25,25,35,1) 100%); color: #fff; } .menu-content__hd { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; } .menu-content__badge { font-size: 10px; text-transform: uppercase; letter-spacing: 1px; background: var(--color-primary); padding: 2px 8px; border-radius: 4px; font-weight: 700; } .menu-content__time { font-size: 11px; color: rgba(255,255,255,0.5); font-family: monospace; } .menu-content__title { font-size: 22px; font-weight: 800; margin-bottom: 16px; color: #fff; } .menu-content__items { display: flex; flex-direction: column; gap: 12px; } .menu-content__item { display: flex; justify-content: space-between; align-items: flex-start; border-bottom: 1px solid rgba(255,255,255,0.05); padding-bottom: 6px; } .menu-content__name { font-size: 14px; font-weight: 600; color: #fff; margin-bottom: 2px; } .menu-content__desc { font-size: 11px; color: rgba(255,255,255,0.35); } .menu-content__price { font-size: 15px; font-weight: 700; color: var(--color-primary); white-space: nowrap; } @keyframes menu-live-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.4; transform: scale(0.8); } } @keyframes menu-slide-fade { 0%, 2% { opacity: 0; transform: translateY(10px); } 5%, 30% { opacity: 1; transform: translateY(0); } 33%, 100%{ opacity: 0; transform: translateY(-10px); } } @media (prefers-reduced-motion: reduce) { .menu-slide { animation: none; } .menu-slide--mains { opacity: 1; transform: none; } .menu-live__dot { animation: none; } } @media (max-width: 640px) { .menu-content { padding: 14px 18px; } .menu-content__title { font-size: 17px; margin-bottom: 10px; } .menu-content__name { font-size: 12px; } .menu-content__desc { display: none; } .menu-content__price { font-size: 13px; } }