diff --git a/frontend/rabbi_gerzi/cypress/e2e/about.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/about.cy.ts index 5464354..be249f8 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/about.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/about.cy.ts @@ -8,12 +8,12 @@ describe('about page', () => { cy.contains('Torah Media').should('be.visible') cy.contains('About').should('be.visible') cy.contains('Contact').should('be.visible') - cy.contains('Invest in Pilzno').should('be.visible') + cy.contains('Donate').should('be.visible') }) cy.get('[data-cy="about-hero"]').within(() => { cy.contains('h1', 'About Rabbi Gerzi').should('be.visible') - cy.contains('Integrated Torah life') + cy.contains('Healthy, Integrated and Balanced Torah living') .should('be.visible') cy.get('[data-cy="about-hero-image"]') .should('be.visible') @@ -121,7 +121,7 @@ describe('about page', () => { cy.get('[data-cy="footer"]').within(() => { cy.contains('Torah Media').should('be.visible') cy.contains('About').should('be.visible') - cy.contains('Invest in Pilzno').should('be.visible') + cy.contains('Donate').should('be.visible') cy.contains('Contact').should('be.visible') cy.contains(/Rabbi Gerzi 2025/).should('be.visible') }) diff --git a/frontend/rabbi_gerzi/cypress/e2e/contact.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/contact.cy.ts index d76f080..ad066b2 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/contact.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/contact.cy.ts @@ -8,7 +8,7 @@ describe('contact page', () => { cy.contains('Torah Media').should('be.visible') cy.contains('About').should('be.visible') cy.contains('Contact').should('be.visible') - cy.contains('Invest in Pilzno').should('be.visible') + cy.contains('Donate').should('be.visible') }) cy.get('[data-cy="contact-hero"]').within(() => { @@ -111,7 +111,7 @@ describe('contact page', () => { cy.get('[data-cy="footer"]').within(() => { cy.contains('Torah Media').should('be.visible') cy.contains('About').should('be.visible') - cy.contains('Invest in Pilzno').should('be.visible') + cy.contains('Donate').should('be.visible') cy.contains('Contact').should('be.visible') cy.contains(/Rabbi Gerzi 2025/).should('be.visible') }) diff --git a/frontend/rabbi_gerzi/cypress/e2e/home.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/home.cy.ts index bdeb13f..e95938a 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/home.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/home.cy.ts @@ -8,14 +8,14 @@ describe('homepage hero', () => { cy.contains('Torah Media').should('be.visible') cy.contains('About').should('be.visible') cy.contains('Contact').should('be.visible') - cy.contains('Invest in Pilzno').should('be.visible') + cy.contains('Donate').should('be.visible') }) }) - it('links the navbar investment item to Causematch', () => { + it('links the navbar Donate item to Causematch', () => { const donateHref = 'https://causematch.com/pilzno_donate' - cy.contains('header.site-header a', 'Invest in Pilzno') + cy.contains('header.site-header a', 'Donate') .should('be.visible') .and('have.attr', 'href', donateHref) .and('have.attr', 'target', '_blank') @@ -30,46 +30,74 @@ describe('homepage hero', () => { cy.contains('Torah Media').should('be.visible') cy.contains('About').should('be.visible') cy.contains('Contact').should('be.visible') - cy.contains('Invest in Pilzno').should('be.visible') + cy.contains('Donate').should('be.visible') }) cy.contains('h1', 'Torah Media').should('be.visible') }) - it('renders the Rabbi Gerzi hero in Pilzno language', () => { + it('renders the hero headline with italic emphasis', () => { cy.get('[data-cy="hero"]').within(() => { - cy.contains('PILZNO').should('be.visible') - cy.contains('RAMAT BET SHEMESH').should('be.visible') - cy.contains('h1', 'Rabbi Yehoshua Gerzi').should('be.visible') - cy.contains('Create Geula').should('be.visible') - cy.contains('Elevate Life').should('be.visible') - cy.contains('Geula mindset').should('be.visible') - cy.contains('Integrated Torah life').should('be.visible') + cy.contains('upgrade our lives').should('be.visible') + cy.contains('em', 'healthy').should('be.visible') + cy.contains('em', 'integrated').should('be.visible') + cy.contains('em', 'balanced').should('be.visible') + cy.contains('Torah existence').should('be.visible') + cy.contains('Rabbi Yehoshua Gerzi').should('be.visible') }) }) - it('renders the rabbi portrait image in the brand hero', () => { - cy.get('[data-cy="hero-rabbi-portrait"]') + it('renders the rabbi portrait image', () => { + cy.get('[data-cy="hero-portrait"]') .should('be.visible') .and('have.attr', 'alt') .and('match', /Rabbi Yehoshua Gerzi/i) }) - it('uses Pilzno brand colors and typography tokens', () => { - cy.get('[data-cy="hero"]').then((heroElements) => { - const heroStyle = getComputedStyle(heroElements[0]) - const appDocument = heroElements[0].ownerDocument - const documentStyle = getComputedStyle(appDocument.documentElement) + it('lets the rabbi portrait rise above the circular frame', () => { + cy.get('[data-cy="hero-portrait"]').then( + (portraitElements) => { + const portraitImage = portraitElements[0] + const frameElement = portraitImage.parentElement - expect(documentStyle.getPropertyValue('--color-brand-purple').trim()) - .to.equal('#2a1f3d') - expect(documentStyle.getPropertyValue('--color-gold').trim()) - .to.equal('#c9a84c') - expect(documentStyle.getPropertyValue('--font-display').trim()) - .to.contain('Cormorant Garamond') - expect(documentStyle.getPropertyValue('--font-ui').trim()) - .to.contain('Jost') - expect(heroStyle.backgroundColor).to.equal('rgb(42, 31, 61)') - }) + if (frameElement === null) { + throw new Error('Portrait frame is missing') + } + + const frameStyle = getComputedStyle(frameElement) + + expect(frameStyle.overflowX).to.equal('visible') + expect(frameStyle.overflowY).to.equal('visible') + expect(portraitImage.getBoundingClientRect().top).to.be.lessThan( + frameElement.getBoundingClientRect().top, + ) + }, + ) + }) + + it('extends the circular background to the portrait base edges', () => { + cy.get('[data-cy="hero-portrait"]').then( + (portraitElements) => { + const portraitImage = portraitElements[0] + const frameElement = portraitImage.parentElement + + if (frameElement === null) { + throw new Error('Portrait frame is missing') + } + + const portraitBounds = portraitImage.getBoundingClientRect() + const frameBounds = frameElement.getBoundingClientRect() + const backgroundStyle = getComputedStyle(frameElement, '::before') + const backgroundWidth = Number.parseFloat(backgroundStyle.width) + const backgroundLeft = + frameBounds.left + (frameBounds.width - backgroundWidth) / 2 + const backgroundRight = backgroundLeft + backgroundWidth + + expect(backgroundStyle.content).to.not.equal('none') + expect(backgroundWidth).to.be.closeTo(portraitBounds.width, 1) + expect(backgroundLeft).to.be.closeTo(portraitBounds.left, 1) + expect(backgroundRight).to.be.closeTo(portraitBounds.right, 1) + }, + ) }) }) @@ -84,9 +112,8 @@ describe('homepage discover path section', () => { .should('be.visible') cy.contains('Rabbi Yehoshua Gerzi has dedicated his life') .should('be.visible') - cy.contains('Integrated Torah life') + cy.contains('Healthy, Integrated and Balanced Torah Living') .should('be.visible') - cy.contains('Geula mindset').should('be.visible') cy.contains('Ramat Beit Shemesh').should('be.visible') cy.contains('Pilzno Institute of Higher Learning').should('be.visible') }) @@ -550,16 +577,16 @@ describe('homepage get involved and footer', () => { cy.get('[data-cy="footer"]').within(() => { cy.contains('Torah Media').should('be.visible') cy.contains('About').should('be.visible') - cy.contains('Invest in Pilzno').should('be.visible') + cy.contains('Donate').should('be.visible') cy.contains('Contact').should('be.visible') cy.contains(/Rabbi Gerzi 2025/).should('be.visible') }) }) - it('links the footer investment item to Causematch', () => { + it('links the footer Donate item to Causematch', () => { const donateHref = 'https://causematch.com/pilzno_donate' - cy.contains('[data-cy="footer"] a', 'Invest in Pilzno') + cy.contains('[data-cy="footer"] a', 'Donate') .should('be.visible') .and('have.attr', 'href', donateHref) .and('have.attr', 'target', '_blank') diff --git a/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts index 3f884db..805be28 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts @@ -9,7 +9,7 @@ describe('media page sets', () => { cy.contains('Torah Media').should('be.visible') cy.contains('About').should('be.visible') cy.contains('Contact').should('be.visible') - cy.contains('Invest in Pilzno').should('be.visible') + cy.contains('Donate').should('be.visible') }) cy.contains('h1', 'Torah Media').should('be.visible') cy.get('[data-cy="media-set-grid"]').should('be.visible') diff --git a/frontend/rabbi_gerzi/index.html b/frontend/rabbi_gerzi/index.html index 62fd8a6..93c0fb1 100644 --- a/frontend/rabbi_gerzi/index.html +++ b/frontend/rabbi_gerzi/index.html @@ -12,7 +12,7 @@ diff --git a/frontend/rabbi_gerzi/src/assets/global.css b/frontend/rabbi_gerzi/src/assets/global.css index c9ff3b7..759e690 100644 --- a/frontend/rabbi_gerzi/src/assets/global.css +++ b/frontend/rabbi_gerzi/src/assets/global.css @@ -1,27 +1,14 @@ :root { - --color-brand-purple: #2a1f3d; - --color-brand-purple-dark: #20182f; - --color-gold: #c9a84c; - --color-cream: #faf9f5; - --color-light-bg: #f5f2ec; - --color-body-text: #3d3530; - --color-text: var(--color-body-text); - --color-text-muted: #756b62; - --color-border: #ded6c8; - --color-white: var(--color-cream); - --color-slate: var(--color-brand-purple); - --color-slate-dark: var(--color-brand-purple-dark); - --color-olive: var(--color-gold); - --color-pillar-physical: #dce6d4; - --color-pillar-relationships: #e8d8d4; - --color-pillar-wisdom: #dbd6e8; - --color-pillar-guidance: #d0dce8; - --font-display: 'Cormorant Garamond', Georgia, serif; - --font-ui: 'Jost', system-ui, -apple-system, sans-serif; - --font-hebrew: 'Frank Ruhl Libre', serif; - --font-quote: 'Lora', Georgia, serif; - --font-serif: var(--font-display); - --font-sans: var(--font-ui); + --color-cream: #f4efe1; + --color-slate: #2b3f4e; + --color-slate-dark: #213240; + --color-olive: #5e6b4c; + --color-text: #1f1f1f; + --color-text-muted: #5a5a5a; + --color-white: #ffffff; + --color-border: #e6e1d2; + --font-serif: 'Merriweather', Georgia, serif; + --font-sans: 'Inter', system-ui, -apple-system, sans-serif; } * { @@ -34,7 +21,7 @@ body { padding: 0; font-family: var(--font-sans); color: var(--color-text); - background: var(--color-cream); + background: var(--color-white); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } diff --git a/frontend/rabbi_gerzi/src/components/ElementParentLink.vue b/frontend/rabbi_gerzi/src/components/ElementParentLink.vue index 9baafea..f105b68 100644 --- a/frontend/rabbi_gerzi/src/components/ElementParentLink.vue +++ b/frontend/rabbi_gerzi/src/components/ElementParentLink.vue @@ -34,7 +34,7 @@ defineProps() gap: 0.35rem; min-height: 2.2rem; padding: 0.35rem 0; - color: var(--color-brand-purple); + color: var(--color-slate); font-family: var(--font-sans); font-size: 0.9rem; font-weight: 600; diff --git a/frontend/rabbi_gerzi/src/components/ElementSiblingNavigation.vue b/frontend/rabbi_gerzi/src/components/ElementSiblingNavigation.vue index 56ba23f..7eaa976 100644 --- a/frontend/rabbi_gerzi/src/components/ElementSiblingNavigation.vue +++ b/frontend/rabbi_gerzi/src/components/ElementSiblingNavigation.vue @@ -127,8 +127,8 @@ function siblingElementAtOffset(offset: number): ChildElement | null { .element-sibling-navigation__link:hover, .element-sibling-navigation__link:focus-visible { - border-color: var(--color-brand-purple); - color: var(--color-brand-purple); + border-color: var(--color-slate); + color: var(--color-slate); } .element-sibling-navigation__link:focus-visible { diff --git a/frontend/rabbi_gerzi/src/components/RichTextEditor.vue b/frontend/rabbi_gerzi/src/components/RichTextEditor.vue index 5f8f7ab..7fef966 100644 --- a/frontend/rabbi_gerzi/src/components/RichTextEditor.vue +++ b/frontend/rabbi_gerzi/src/components/RichTextEditor.vue @@ -775,11 +775,11 @@ function deleteTable(): void { overflow: hidden; border: 1px solid var(--color-border); border-radius: 4px; - background: var(--color-cream); + background: var(--color-white); } .rich-text-editor:focus-within { - border-color: var(--color-brand-purple); + border-color: var(--color-slate); } .rich-text-editor__toolbar { @@ -789,7 +789,7 @@ function deleteTable(): void { gap: 0.45rem; padding: 0.55rem; border-bottom: 1px solid var(--color-border); - background: var(--color-light-bg); + background: #fbfaf6; } .rich-text-editor__select { @@ -798,7 +798,7 @@ function deleteTable(): void { border: 1px solid var(--color-border); border-radius: 4px; color: var(--color-text); - background: var(--color-cream); + background: var(--color-white); font-family: var(--font-sans); font-size: 0.86rem; } @@ -808,7 +808,7 @@ function deleteTable(): void { overflow: hidden; border: 1px solid var(--color-border); border-radius: 4px; - background: var(--color-cream); + background: var(--color-white); } .rich-text-editor__button { @@ -833,7 +833,7 @@ function deleteTable(): void { .rich-text-editor__button:focus-visible, .rich-text-editor__button--active { color: var(--color-white); - background: var(--color-brand-purple); + background: var(--color-slate); outline: none; } @@ -844,7 +844,7 @@ function deleteTable(): void { } .rich-text-editor__content { - background: var(--color-cream); + background: var(--color-white); } .rich-text-editor__content :deep(.rich-text-editor__surface) { @@ -869,8 +869,8 @@ function deleteTable(): void { .rich-text-editor__content :deep(h3), .rich-text-editor__content :deep(h4) { margin: 1.1rem 0 0.45rem; - color: var(--color-brand-purple); - font-family: var(--font-display); + color: #2c2c2c; + font-family: var(--font-serif); font-weight: 500; line-height: 1.25; } @@ -900,19 +900,17 @@ function deleteTable(): void { .rich-text-editor__content :deep(blockquote) { margin: 1rem 0; padding: 0.1rem 0 0.1rem 1rem; - border-left: 3px solid var(--color-gold); + border-left: 3px solid var(--color-olive); color: var(--color-text-muted); - font-family: var(--font-quote); - font-style: italic; } .rich-text-editor__content :deep(mark) { padding: 0 0.16em; - background: rgb(201 168 76 / 28%); + background: #fff3a7; } .rich-text-editor__content :deep(a) { - color: var(--color-brand-purple); + color: var(--color-slate); font-weight: 600; text-decoration: underline; text-underline-offset: 0.16em; @@ -945,7 +943,7 @@ function deleteTable(): void { } .rich-text-editor__content :deep(th) { - background: var(--color-light-bg); + background: #f6f3eb; font-weight: 700; } diff --git a/frontend/rabbi_gerzi/src/components/SiteFooter.vue b/frontend/rabbi_gerzi/src/components/SiteFooter.vue index e32bd9b..f2ea224 100644 --- a/frontend/rabbi_gerzi/src/components/SiteFooter.vue +++ b/frontend/rabbi_gerzi/src/components/SiteFooter.vue @@ -17,6 +17,11 @@ interface ExternalFooterLink { type FooterLink = RouteFooterLink | ExternalFooterLink +const signatureImage = { + src: '/assets/signature.png', + alt: "R' Yehoshua Gerzi", +} + const socialGlyphs: Record = { YouTube: '▶', Spotify: '♫', @@ -38,7 +43,7 @@ const footerLinkColumns: FooterLink[][] = [ [ { kind: 'external', - label: 'Invest in Pilzno', + label: 'Donate', linkAttributes: donateLinkAttributes, }, { kind: 'route', label: 'Contact', to: '/contact' }, @@ -50,13 +55,7 @@ const footerLinkColumns: FooterLink[][] = [