From eebdeebce208012fa935840d74ef34dd013ed373 Mon Sep 17 00:00:00 2001 From: Ariel Aharonson Date: Wed, 10 Jun 2026 11:41:09 +0300 Subject: [PATCH 1/9] feat(REB-289): Add Rylo redirect overlay on translate app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Blocks the legacy dictionary app at sign.mt with a full-screen, non-dismissible popup that redirects users to rylo.com/sign/translate via a CTA matching the Rylo website (cloud sky background, orange CTA). Web only — skipped on native apps. The CTA logs a rylo_redirect_click analytics event before navigating same-tab. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../rylo-redirect-overlay.component.html | 10 +++ .../rylo-redirect-overlay.component.scss | 70 ++++++++++++++++++ .../rylo-redirect-overlay.component.spec.ts | 29 ++++++++ .../rylo-redirect-overlay.component.ts | 34 +++++++++ .../pages/translate/translate.component.html | 2 + .../pages/translate/translate.component.ts | 3 +- src/assets/rylo-clouds.webp | Bin 0 -> 2636 bytes src/theme/fonts/poppins.css | 8 ++ 8 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html create mode 100644 src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.scss create mode 100644 src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.spec.ts create mode 100644 src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.ts create mode 100644 src/assets/rylo-clouds.webp diff --git a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html new file mode 100644 index 00000000..67b3a69d --- /dev/null +++ b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html @@ -0,0 +1,10 @@ +@if (visible) { + +} diff --git a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.scss b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.scss new file mode 100644 index 00000000..e447376b --- /dev/null +++ b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.scss @@ -0,0 +1,70 @@ +@forward '../../../theme/fonts/poppins.css'; + +:host { + display: contents; +} + +.rylo-overlay { + position: fixed; + inset: 0; + z-index: 99999; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + padding: 24px; + background-color: #5d7c93; + background-image: url('/assets/rylo-clouds.webp'); + background-position: bottom center; + background-repeat: no-repeat; + background-size: 100% auto; +} + +.rylo-overlay__content { + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; + max-width: 720px; + text-align: center; +} + +.rylo-overlay__title { + margin: 0; + font-family: 'Poppins', sans-serif; + font-weight: 600; + font-size: clamp(28px, 5vw, 56px); + line-height: 1.1; + letter-spacing: -0.02em; + color: #faf5f2; +} + +.rylo-overlay__cta { + display: inline-flex; + align-items: center; + justify-content: center; + height: 48px; + padding: 8px 24px; + border-radius: 12px; + background-color: #ff8b2b; + color: #191412; + font-family: 'Poppins', sans-serif; + font-weight: 600; + font-size: 16px; + text-decoration: none; + box-shadow: + 0 8px 12px rgba(25, 20, 18, 0.15), + inset 0 0 8px rgba(255, 255, 255, 0.4); + transition: + transform 0.15s ease, + filter 0.15s ease; +} + +.rylo-overlay__cta:hover { + transform: translateY(-1px); + filter: brightness(1.03); +} + +.rylo-overlay__cta:active { + transform: translateY(0); +} diff --git a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.spec.ts b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.spec.ts new file mode 100644 index 00000000..bace02e9 --- /dev/null +++ b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.spec.ts @@ -0,0 +1,29 @@ +import {TestBed} from '@angular/core/testing'; +import {Capacitor} from '@capacitor/core'; +import {RyloRedirectOverlayComponent} from './rylo-redirect-overlay.component'; + +describe('RyloRedirectOverlayComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RyloRedirectOverlayComponent], + }).compileComponents(); + }); + + it('renders the redirect overlay with a CTA to Rylo on web', () => { + spyOn(Capacitor, 'isNativePlatform').and.returnValue(false); + const fixture = TestBed.createComponent(RyloRedirectOverlayComponent); + fixture.detectChanges(); + + const cta = fixture.nativeElement.querySelector('.rylo-overlay__cta') as HTMLAnchorElement; + expect(cta).toBeTruthy(); + expect(cta.getAttribute('href')).toBe('https://rylo.com/sign/translate'); + }); + + it('renders nothing on native platforms', () => { + spyOn(Capacitor, 'isNativePlatform').and.returnValue(true); + const fixture = TestBed.createComponent(RyloRedirectOverlayComponent); + fixture.detectChanges(); + + expect(fixture.nativeElement.querySelector('.rylo-overlay')).toBeNull(); + }); +}); diff --git a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.ts b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.ts new file mode 100644 index 00000000..0a533e59 --- /dev/null +++ b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.ts @@ -0,0 +1,34 @@ +import {Component} from '@angular/core'; +import {Capacitor} from '@capacitor/core'; +import {FirebaseAnalytics} from '@capacitor-firebase/analytics'; +import {environment} from '../../../environments/environment'; + +const RYLO_TRANSLATE_URL = 'https://rylo.com/sign/translate'; + +@Component({ + selector: 'app-rylo-redirect-overlay', + standalone: true, + templateUrl: './rylo-redirect-overlay.component.html', + styleUrl: './rylo-redirect-overlay.component.scss', +}) +export class RyloRedirectOverlayComponent { + readonly visible = !Capacitor.isNativePlatform(); + readonly redirectUrl = RYLO_TRANSLATE_URL; + + async redirect(event: Event): Promise { + event.preventDefault(); + await this.logRedirectEvent(); + window.location.href = this.redirectUrl; + } + + private async logRedirectEvent(): Promise { + if (!environment.firebase.measurementId || !('window' in globalThis)) { + return; + } + try { + await FirebaseAnalytics.logEvent({name: 'rylo_redirect_click'}); + } catch { + // Analytics must never block the redirect. + } + } +} diff --git a/src/app/pages/translate/translate.component.html b/src/app/pages/translate/translate.component.html index b2ab62ef..e5155f4c 100644 --- a/src/app/pages/translate/translate.component.html +++ b/src/app/pages/translate/translate.component.html @@ -3,3 +3,5 @@ } @else { } + + diff --git a/src/app/pages/translate/translate.component.ts b/src/app/pages/translate/translate.component.ts index 41a4f2e6..c00aef72 100644 --- a/src/app/pages/translate/translate.component.ts +++ b/src/app/pages/translate/translate.component.ts @@ -10,12 +10,13 @@ import {Meta, Title} from '@angular/platform-browser'; import {MediaMatcher} from '@angular/cdk/layout'; import {TranslateMobileComponent} from './translate-mobile/translate-mobile.component'; import {TranslateDesktopComponent} from './translate-desktop/translate-desktop.component'; +import {RyloRedirectOverlayComponent} from '../../components/rylo-redirect-overlay/rylo-redirect-overlay.component'; @Component({ selector: 'app-translate', templateUrl: './translate.component.html', styleUrls: ['./translate.component.scss'], - imports: [TranslateMobileComponent, TranslateDesktopComponent], + imports: [TranslateMobileComponent, TranslateDesktopComponent, RyloRedirectOverlayComponent], }) export class TranslateComponent extends BaseComponent implements OnInit { private store = inject(Store); diff --git a/src/assets/rylo-clouds.webp b/src/assets/rylo-clouds.webp new file mode 100644 index 0000000000000000000000000000000000000000..4347e7c1e5ef4c6cf34ecb251f02aa8fa74d1dbc GIT binary patch literal 2636 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 literal 0 HcmV?d00001 diff --git a/src/theme/fonts/poppins.css b/src/theme/fonts/poppins.css index 39943f8c..e09db4a8 100644 --- a/src/theme/fonts/poppins.css +++ b/src/theme/fonts/poppins.css @@ -5,3 +5,11 @@ font-display: swap; src: url(https://fonts.gstatic.com/s/poppins/v24/pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2) format('woff2'); } + +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/poppins/v24/pxiByp8kv8JHgFVrLEj6Z1xlFd2JQEk.woff2) format('woff2'); +} From d09761f87a939a680dfc21ecbd0c47faf206006e Mon Sep 17 00:00:00 2001 From: Ariel Aharonson Date: Wed, 10 Jun 2026 11:44:32 +0300 Subject: [PATCH 2/9] chore: Simplify after Rylo redirect overlay Route the redirect analytics event through GoogleAnalyticsService (new logEvent method reusing its isSupported guard) instead of importing FirebaseAnalytics and duplicating the environment guard in the component. Collapse the redundant URL constant into a single field. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../rylo-redirect-overlay.component.ts | 22 ++++++------------- .../google-analytics.service.ts | 7 ++++++ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.ts b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.ts index 0a533e59..88b04fed 100644 --- a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.ts +++ b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.ts @@ -1,9 +1,6 @@ -import {Component} from '@angular/core'; +import {Component, inject} from '@angular/core'; import {Capacitor} from '@capacitor/core'; -import {FirebaseAnalytics} from '@capacitor-firebase/analytics'; -import {environment} from '../../../environments/environment'; - -const RYLO_TRANSLATE_URL = 'https://rylo.com/sign/translate'; +import {GoogleAnalyticsService} from '../../core/modules/google-analytics/google-analytics.service'; @Component({ selector: 'app-rylo-redirect-overlay', @@ -12,23 +9,18 @@ const RYLO_TRANSLATE_URL = 'https://rylo.com/sign/translate'; styleUrl: './rylo-redirect-overlay.component.scss', }) export class RyloRedirectOverlayComponent { + private ga = inject(GoogleAnalyticsService); + readonly visible = !Capacitor.isNativePlatform(); - readonly redirectUrl = RYLO_TRANSLATE_URL; + readonly redirectUrl = 'https://rylo.com/sign/translate'; async redirect(event: Event): Promise { event.preventDefault(); - await this.logRedirectEvent(); - window.location.href = this.redirectUrl; - } - - private async logRedirectEvent(): Promise { - if (!environment.firebase.measurementId || !('window' in globalThis)) { - return; - } try { - await FirebaseAnalytics.logEvent({name: 'rylo_redirect_click'}); + await this.ga.logEvent('rylo_redirect_click'); } catch { // Analytics must never block the redirect. } + window.location.href = this.redirectUrl; } } diff --git a/src/app/core/modules/google-analytics/google-analytics.service.ts b/src/app/core/modules/google-analytics/google-analytics.service.ts index 66066a0c..987e3cb7 100644 --- a/src/app/core/modules/google-analytics/google-analytics.service.ts +++ b/src/app/core/modules/google-analytics/google-analytics.service.ts @@ -30,6 +30,13 @@ export class GoogleAnalyticsService { await FirebaseAnalytics.setCurrentScreen({screenName}); } + async logEvent(name: string, params?: Record) { + if (!this.isSupported) { + return; + } + await FirebaseAnalytics.logEvent({name, params}); + } + logPerformanceMetrics() { if (!this.isSupported) { return; From db731adc4fc00d923784cf64e63ec12eee02131a Mon Sep 17 00:00:00 2001 From: Ariel Aharonson Date: Wed, 10 Jun 2026 11:55:37 +0300 Subject: [PATCH 3/9] feat(REB-289): Use official Rylo hero background and split headline Swap the cropped cloud asset for the official Rylo hero background image, and split the copy into a bold headline plus a smaller subtitle paragraph. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../rylo-redirect-overlay.component.html | 7 ++-- .../rylo-redirect-overlay.component.scss | 30 ++++++++++++++---- src/assets/rylo-clouds.webp | Bin 2636 -> 0 bytes src/assets/rylo-hero-background.webp | Bin 0 -> 22676 bytes 4 files changed, 27 insertions(+), 10 deletions(-) delete mode 100644 src/assets/rylo-clouds.webp create mode 100644 src/assets/rylo-hero-background.webp diff --git a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html index 67b3a69d..8260a7fc 100644 --- a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html +++ b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html @@ -1,9 +1,10 @@ @if (visible) { diff --git a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.scss b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.scss index e447376b..84aff98a 100644 --- a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.scss +++ b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.scss @@ -14,31 +14,47 @@ overflow: hidden; padding: 24px; background-color: #5d7c93; - background-image: url('/assets/rylo-clouds.webp'); - background-position: bottom center; + background-image: + linear-gradient(rgba(25, 20, 18, 0.28), rgba(25, 20, 18, 0.28)), url('/assets/rylo-hero-background.webp'); + background-position: center; background-repeat: no-repeat; - background-size: 100% auto; + background-size: cover; } .rylo-overlay__content { display: flex; flex-direction: column; align-items: center; - gap: 24px; - max-width: 720px; + gap: 32px; + max-width: 640px; text-align: center; } +.rylo-overlay__text { + display: flex; + flex-direction: column; + gap: 12px; +} + .rylo-overlay__title { margin: 0; font-family: 'Poppins', sans-serif; font-weight: 600; - font-size: clamp(28px, 5vw, 56px); - line-height: 1.1; + font-size: clamp(26px, 4vw, 44px); + line-height: 1.15; letter-spacing: -0.02em; color: #faf5f2; } +.rylo-overlay__subtitle { + margin: 0; + font-family: 'Poppins', sans-serif; + font-weight: 400; + font-size: clamp(15px, 2vw, 18px); + line-height: 1.4; + color: rgba(250, 245, 242, 0.88); +} + .rylo-overlay__cta { display: inline-flex; align-items: center; diff --git a/src/assets/rylo-clouds.webp b/src/assets/rylo-clouds.webp deleted file mode 100644 index 4347e7c1e5ef4c6cf34ecb251f02aa8fa74d1dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2636 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 diff --git a/src/assets/rylo-hero-background.webp b/src/assets/rylo-hero-background.webp new file mode 100644 index 0000000000000000000000000000000000000000..5e085b2220470cf1ca1213530309aa83a82bac1a GIT binary patch literal 22676 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 RLh=a4P$%f8cqq1`005LAkoW)q literal 0 HcmV?d00001 From 4b134fb5c03c01b0bfa50f4b1f4893573f3eb2cd Mon Sep 17 00:00:00 2001 From: Ariel Aharonson Date: Wed, 10 Jun 2026 12:00:20 +0300 Subject: [PATCH 4/9] feat(REB-289): Make redirect a centered modal card with backdrop Restore the cloud background and present the redirect as a contained, centered modal card over a dimmed backdrop instead of a full-screen takeover. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../rylo-redirect-overlay.component.html | 4 +- .../rylo-redirect-overlay.component.scss | 35 ++++++++++-------- src/assets/rylo-clouds.webp | Bin 0 -> 2636 bytes src/assets/rylo-hero-background.webp | Bin 22676 -> 0 bytes 4 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 src/assets/rylo-clouds.webp delete mode 100644 src/assets/rylo-hero-background.webp diff --git a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html index 8260a7fc..48ddf46d 100644 --- a/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html +++ b/src/app/components/rylo-redirect-overlay/rylo-redirect-overlay.component.html @@ -1,6 +1,6 @@ @if (visible) { -