diff --git a/web/modules/custom/riverside_pt/css/app.css b/web/modules/custom/riverside_pt/css/app.css index aebdbf9..4c9cffc 100644 --- a/web/modules/custom/riverside_pt/css/app.css +++ b/web/modules/custom/riverside_pt/css/app.css @@ -1,1904 +1,3 @@ -@import url('https://fonts.googleapis.com/css2?family=Hedvig+Letters+Sans:wght@400;500;600&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Hedvig+Letters+Sans:wght@400;500;600&display=swap");*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: } -*, ::before, ::after{ - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} - -::backdrop{ - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} - -/* -! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ - -html, -:host { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ - font-feature-settings: normal; - /* 5 */ - font-variation-settings: normal; - /* 6 */ - -webkit-tap-highlight-color: transparent; - /* 7 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-feature-settings: normal; - /* 2 */ - font-variation-settings: normal; - /* 3 */ - font-size: 1em; - /* 4 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-feature-settings: inherit; - /* 1 */ - font-variation-settings: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - letter-spacing: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -input:where([type='button']), -input:where([type='reset']), -input:where([type='submit']) { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Reset default styling for dialogs. -*/ - -dialog { - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden]:where(:not([hidden="until-found"])) { - display: none; -} - -html { - background-color: #86aab6; - scroll-behavior: smooth; -} - -@media (min-width: 768px) { - [id] { - scroll-margin-top: 110px; - /* fixed header (78px) + breathing room */ - } -} - -/* Neutralise any theme container constraints */ - -/* Hide Olivero/theme chrome we don't use */ - -.container{ - width: 100%; -} - -@media (min-width: 768px){ - .container{ - max-width: 768px; - } -} - -@media (min-width: 1024px){ - .container{ - max-width: 1024px; - } -} - -@media (min-width: 1280px){ - .container{ - max-width: 1280px; - } -} - -@media (min-width: 1780px){ - .container{ - max-width: 1780px; - } -} - -/* Mobile nav: max-height slide can't be expressed with utilities alone */ - -@media (max-width: calc(1024px - 1px)) { - #rpt-main-nav { - flex: none; - position: static; - order: 10; - width: 100%; - background: #fff; - border-top: 1px solid #e5e7eb; - max-height: 0; - overflow: hidden; - opacity: 0; - transition: max-height 0.3s ease, opacity 0.25s ease; - } - - #rpt-main-nav.is-open { - max-height: 500px; - opacity: 1; - } - - #rpt-main-nav ul { - flex-direction: column; - align-items: stretch; - } -} - -/* Hamburger open-state animation */ - -.rpt-header__hamburger[aria-expanded="true"] span:nth-child(1) { - width: 100% !important; - transform: translateY(10px) rotate(45deg); -} - -.rpt-header__hamburger[aria-expanded="true"] span:nth-child(2) { - opacity: 0; -} - -.rpt-header__hamburger[aria-expanded="true"] span:nth-child(3) { - width: 100% !important; - transform: translateY(-10px) rotate(-45deg); -} - -.pointer-events-none{ - pointer-events: none; -} - -.visible{ - visibility: visible; -} - -.static{ - position: static; -} - -.fixed{ - position: fixed; -} - -.absolute{ - position: absolute; -} - -.relative{ - position: relative; -} - -.inset-0{ - inset: 0px; -} - -.left-3{ - left: 0.75rem; -} - -.right-3{ - right: 0.75rem; -} - -.top-1\/2{ - top: 50%; -} - -.z-10{ - z-index: 10; -} - -.mx-auto{ - margin-left: auto; - margin-right: auto; -} - -.my-3{ - margin-top: 0.75rem; - margin-bottom: 0.75rem; -} - -.mb-0\.5{ - margin-bottom: 0.125rem; -} - -.mb-1{ - margin-bottom: 0.25rem; -} - -.mb-10{ - margin-bottom: 2.5rem; -} - -.mb-12{ - margin-bottom: 3rem; -} - -.mb-16{ - margin-bottom: 4rem; -} - -.mb-2{ - margin-bottom: 0.5rem; -} - -.mb-4{ - margin-bottom: 1rem; -} - -.mb-5{ - margin-bottom: 1.25rem; -} - -.mb-6{ - margin-bottom: 1.5rem; -} - -.mb-\[1vw\]{ - margin-bottom: 1vw; -} - -.ml-auto{ - margin-left: auto; -} - -.mt-0{ - margin-top: 0px; -} - -.mt-0\.5{ - margin-top: 0.125rem; -} - -.mt-2{ - margin-top: 0.5rem; -} - -.mt-8{ - margin-top: 2rem; -} - -.mt-\[2vw\]{ - margin-top: 2vw; -} - -.mb-3{ - margin-bottom: 0.75rem; -} - -.block{ - display: block; -} - -.inline-block{ - display: inline-block; -} - -.flex{ - display: flex; -} - -.inline-flex{ - display: inline-flex; -} - -.grid{ - display: grid; -} - -.hidden{ - display: none; -} - -.h-1{ - height: 0.25rem; -} - -.h-10{ - height: 2.5rem; -} - -.h-11{ - height: 2.75rem; -} - -.h-14{ - height: 3.5rem; -} - -.h-3{ - height: 0.75rem; -} - -.h-48{ - height: 12rem; -} - -.h-72{ - height: 18rem; -} - -.h-8{ - height: 2rem; -} - -.h-\[240px\]{ - height: 240px; -} - -.h-\[420px\]{ - height: 420px; -} - -.h-full{ - height: 100%; -} - -.min-h-\[480px\]{ - min-height: 480px; -} - -.w-10{ - width: 2.5rem; -} - -.w-11{ - width: 2.75rem; -} - -.w-14{ - width: 3.5rem; -} - -.w-3{ - width: 0.75rem; -} - -.w-8{ - width: 2rem; -} - -.w-\[45\%\]{ - width: 45%; -} - -.w-full{ - width: 100%; -} - -.min-w-0{ - min-width: 0px; -} - -.max-w-\[1040px\]{ - max-width: 1040px; -} - -.max-w-\[1200px\]{ - max-width: 1200px; -} - -.max-w-\[520px\]{ - max-width: 520px; -} - -.max-w-\[700px\]{ - max-width: 700px; -} - -.max-w-\[860px\]{ - max-width: 860px; -} - -.max-w-lg{ - max-width: 32rem; -} - -.flex-1{ - flex: 1 1 0%; -} - -.shrink-0{ - flex-shrink: 0; -} - -.basis-full{ - flex-basis: 100%; -} - -.-translate-y-1\/2{ - --tw-translate-y: -50%; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.transform{ - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.cursor-pointer{ - cursor: pointer; -} - -.resize-none{ - resize: none; -} - -.resize{ - resize: both; -} - -.list-none{ - list-style-type: none; -} - -.grid-cols-1{ - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.flex-col{ - flex-direction: column; -} - -.flex-wrap{ - flex-wrap: wrap; -} - -.items-end{ - align-items: flex-end; -} - -.items-center{ - align-items: center; -} - -.justify-end{ - justify-content: flex-end; -} - -.justify-center{ - justify-content: center; -} - -.justify-between{ - justify-content: space-between; -} - -.gap-1{ - gap: 0.25rem; -} - -.gap-1\.5{ - gap: 0.375rem; -} - -.gap-12{ - gap: 3rem; -} - -.gap-2{ - gap: 0.5rem; -} - -.gap-3{ - gap: 0.75rem; -} - -.gap-4{ - gap: 1rem; -} - -.gap-5{ - gap: 1.25rem; -} - -.gap-6{ - gap: 1.5rem; -} - -.gap-8{ - gap: 2rem; -} - -.gap-\[1vw\]{ - gap: 1vw; -} - -.gap-x-8{ - -moz-column-gap: 2rem; - column-gap: 2rem; -} - -.gap-y-0{ - row-gap: 0px; -} - -.gap-y-5{ - row-gap: 1.25rem; -} - -.self-end{ - align-self: flex-end; -} - -.overflow-hidden{ - overflow: hidden; -} - -.whitespace-nowrap{ - white-space: nowrap; -} - -.rounded{ - border-radius: 0.25rem; -} - -.rounded-\[3px\]{ - border-radius: 3px; -} - -.rounded-full{ - border-radius: 9999px; -} - -.rounded-lg{ - border-radius: 0.5rem; -} - -.rounded-none{ - border-radius: 0px; -} - -.rounded-xl{ - border-radius: 0.75rem; -} - -.border{ - border-width: 1px; -} - -.border-0{ - border-width: 0px; -} - -.border-2{ - border-width: 2px; -} - -.border-b{ - border-bottom-width: 1px; -} - -.border-t{ - border-top-width: 1px; -} - -.border-gray-200{ - --tw-border-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); -} - -.border-gray-300{ - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity, 1)); -} - -.border-green-200{ - --tw-border-opacity: 1; - border-color: rgb(187 247 208 / var(--tw-border-opacity, 1)); -} - -.border-pt-blue-200{ - --tw-border-opacity: 1; - border-color: rgb(184 212 220 / var(--tw-border-opacity, 1)); -} - -.border-pt-blue-300{ - --tw-border-opacity: 1; - border-color: rgb(157 189 203 / var(--tw-border-opacity, 1)); -} - -.border-pt-blue-500{ - --tw-border-opacity: 1; - border-color: rgb(48 111 142 / var(--tw-border-opacity, 1)); -} - -.border-pt-navy{ - --tw-border-opacity: 1; - border-color: rgb(30 58 95 / var(--tw-border-opacity, 1)); -} - -.border-white{ - --tw-border-opacity: 1; - border-color: rgb(255 255 255 / var(--tw-border-opacity, 1)); -} - -.border-white\/60{ - border-color: rgb(255 255 255 / 0.6); -} - -.bg-current{ - background-color: currentColor; -} - -.bg-green-50{ - --tw-bg-opacity: 1; - background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1)); -} - -.bg-pt-blue-100{ - --tw-bg-opacity: 1; - background-color: rgb(221 232 240 / var(--tw-bg-opacity, 1)); -} - -.bg-pt-blue-300{ - --tw-bg-opacity: 1; - background-color: rgb(157 189 203 / var(--tw-bg-opacity, 1)); -} - -.bg-pt-blue-400{ - --tw-bg-opacity: 1; - background-color: rgb(134 170 182 / var(--tw-bg-opacity, 1)); -} - -.bg-pt-blue-500{ - --tw-bg-opacity: 1; - background-color: rgb(48 111 142 / var(--tw-bg-opacity, 1)); -} - -.bg-pt-navy{ - --tw-bg-opacity: 1; - background-color: rgb(30 58 95 / var(--tw-bg-opacity, 1)); -} - -.bg-pt-sage-400{ - --tw-bg-opacity: 1; - background-color: rgb(131 161 161 / var(--tw-bg-opacity, 1)); -} - -.bg-pt-sage-500{ - --tw-bg-opacity: 1; - background-color: rgb(111 143 150 / var(--tw-bg-opacity, 1)); -} - -.bg-transparent{ - background-color: transparent; -} - -.bg-white{ - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); -} - -.bg-white\/90{ - background-color: rgb(255 255 255 / 0.9); -} - -.bg-gradient-to-b{ - background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); -} - -.bg-gradient-to-t{ - background-image: linear-gradient(to top, var(--tw-gradient-stops)); -} - -.from-black\/60{ - --tw-gradient-from: rgb(0 0 0 / 0.6) var(--tw-gradient-from-position); - --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); -} - -.from-pt-sage-400{ - --tw-gradient-from: #83a1a1 var(--tw-gradient-from-position); - --tw-gradient-to: rgb(131 161 161 / 0) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); -} - -.via-black\/30{ - --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-from), rgb(0 0 0 / 0.3) var(--tw-gradient-via-position), var(--tw-gradient-to); -} - -.to-pt-blue-400{ - --tw-gradient-to: #86aab6 var(--tw-gradient-to-position); -} - -.to-transparent{ - --tw-gradient-to: transparent var(--tw-gradient-to-position); -} - -.object-cover{ - -o-object-fit: cover; - object-fit: cover; -} - -.object-\[center_0\%\]{ - -o-object-position: center 0%; - object-position: center 0%; -} - -.p-0{ - padding: 0px; -} - -.p-2{ - padding: 0.5rem; -} - -.p-4{ - padding: 1rem; -} - -.p-5{ - padding: 1.25rem; -} - -.p-6{ - padding: 1.5rem; -} - -.p-8{ - padding: 2rem; -} - -.px-3{ - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-4{ - padding-left: 1rem; - padding-right: 1rem; -} - -.px-5{ - padding-left: 1.25rem; - padding-right: 1.25rem; -} - -.px-6{ - padding-left: 1.5rem; - padding-right: 1.5rem; -} - -.px-\[4em\]{ - padding-left: 4em; - padding-right: 4em; -} - -.py-16{ - padding-top: 4rem; - padding-bottom: 4rem; -} - -.py-2{ - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-20{ - padding-top: 5rem; - padding-bottom: 5rem; -} - -.py-24{ - padding-top: 6rem; - padding-bottom: 6rem; -} - -.py-3{ - padding-top: 0.75rem; - padding-bottom: 0.75rem; -} - -.py-5{ - padding-top: 1.25rem; - padding-bottom: 1.25rem; -} - -.py-\[1em\]{ - padding-top: 1em; - padding-bottom: 1em; -} - -.pb-1{ - padding-bottom: 0.25rem; -} - -.pb-4{ - padding-bottom: 1rem; -} - -.pb-5{ - padding-bottom: 1.25rem; -} - -.pt-0{ - padding-top: 0px; -} - -.pt-20{ - padding-top: 5rem; -} - -.pt-4{ - padding-top: 1rem; -} - -.pt-8{ - padding-top: 2rem; -} - -.pt-px{ - padding-top: 1px; -} - -.text-left{ - text-align: left; -} - -.text-center{ - text-align: center; -} - -.font-hedvig{ - font-family: Hedvig Letters Sans, sans-serif; -} - -.font-serif{ - font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; -} - -.text-2xl{ - font-size: 1.5rem; - line-height: 2rem; -} - -.text-\[0\.6875rem\]{ - font-size: 0.6875rem; -} - -.text-\[1\.0625rem\]{ - font-size: 1.0625rem; -} - -.text-\[15px\]{ - font-size: 15px; -} - -.text-\[2\.25rem\]{ - font-size: 2.25rem; -} - -.text-\[4\.5rem\]{ - font-size: 4.5rem; -} - -.text-\[clamp\(0\.25rem\2c 1vw\2c 1\.25vw\)\]{ - font-size: clamp(0.25rem, 1vw, 1.25vw); -} - -.text-\[clamp\(1\.5rem\2c 3\.5vw\2c 3\.25rem\)\]{ - font-size: clamp(1.5rem, 3.5vw, 3.25rem); -} - -.text-\[clamp\(1\.75rem\2c 3vw\2c 2\.5rem\)\]{ - font-size: clamp(1.75rem, 3vw, 2.5rem); -} - -.text-\[clamp\(1rem\2c 2vw\2c 1\.5vw\)\]{ - font-size: clamp(1rem, 2vw, 1.5vw); -} - -.text-\[clamp\(2\.5rem\2c 5vw\2c 4rem\)\]{ - font-size: clamp(2.5rem, 5vw, 4rem); -} - -.text-\[clamp\(2\.75rem\2c 4\.5vw\2c 4rem\)\]{ - font-size: clamp(2.75rem, 4.5vw, 4rem); -} - -.text-\[clamp\(3\.5rem\2c 8vw\2c 6rem\)\]{ - font-size: clamp(3.5rem, 8vw, 6rem); -} - -.text-base{ - font-size: 1rem; - line-height: 1.5rem; -} - -.text-lg{ - font-size: 1.125rem; - line-height: 1.75rem; -} - -.text-sm{ - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-xl{ - font-size: 1.25rem; - line-height: 1.75rem; -} - -.text-xs{ - font-size: 0.75rem; - line-height: 1rem; -} - -.font-bold{ - font-weight: 700; -} - -.font-light{ - font-weight: 300; -} - -.font-medium{ - font-weight: 500; -} - -.font-normal{ - font-weight: 400; -} - -.font-semibold{ - font-weight: 600; -} - -.uppercase{ - text-transform: uppercase; -} - -.leading-\[1\.1\]{ - line-height: 1.1; -} - -.leading-none{ - line-height: 1; -} - -.leading-relaxed{ - line-height: 1.625; -} - -.leading-snug{ - line-height: 1.375; -} - -.leading-tight{ - line-height: 1.25; -} - -.tracking-widest{ - letter-spacing: 0.1em; -} - -.text-\[blue-900\]{ - color: blue-900; -} - -.text-gray-400{ - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity, 1)); -} - -.text-gray-500{ - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity, 1)); -} - -.text-gray-600{ - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity, 1)); -} - -.text-gray-700{ - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity, 1)); -} - -.text-gray-800{ - --tw-text-opacity: 1; - color: rgb(31 41 55 / var(--tw-text-opacity, 1)); -} - -.text-gray-900{ - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity, 1)); -} - -.text-green-700{ - --tw-text-opacity: 1; - color: rgb(21 128 61 / var(--tw-text-opacity, 1)); -} - -.text-green-800{ - --tw-text-opacity: 1; - color: rgb(22 101 52 / var(--tw-text-opacity, 1)); -} - -.text-pt-blue-500{ - --tw-text-opacity: 1; - color: rgb(48 111 142 / var(--tw-text-opacity, 1)); -} - -.text-red-500{ - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity, 1)); -} - -.text-white{ - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity, 1)); -} - -.text-white\/70{ - color: rgb(255 255 255 / 0.7); -} - -.text-white\/80{ - color: rgb(255 255 255 / 0.8); -} - -.no-underline{ - text-decoration-line: none; -} - -.shadow{ - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-sm{ - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.filter{ - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.transition{ - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.transition-\[transform\2c opacity\]{ - transition-property: transform,opacity; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.transition-colors{ - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.transition-transform{ - transition-property: transform; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.duration-200{ - transition-duration: 200ms; -} - -.duration-\[250ms\]{ - transition-duration: 250ms; -} - -.ease-in-out{ - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); -} - -.\[text-shadow\:-56\.21px_2\.55px_10\.22px_rgb\(0_0_0\/10\%\)\]{ - text-shadow: -56.21px 2.55px 10.22px rgb(0 0 0/10%); -} - -.hover\:border-pt-blue-500:hover{ - --tw-border-opacity: 1; - border-color: rgb(48 111 142 / var(--tw-border-opacity, 1)); -} - -.hover\:border-pt-blue-600:hover{ - --tw-border-opacity: 1; - border-color: rgb(31 90 110 / var(--tw-border-opacity, 1)); -} - -.hover\:bg-gray-100:hover{ - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-pt-blue-50:hover{ - --tw-bg-opacity: 1; - background-color: rgb(232 242 246 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-pt-blue-600:hover{ - --tw-bg-opacity: 1; - background-color: rgb(31 90 110 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-pt-sage-500:hover{ - --tw-bg-opacity: 1; - background-color: rgb(111 143 150 / var(--tw-bg-opacity, 1)); -} - -.hover\:text-\[blue-900\]:hover{ - color: blue-900; -} - -.hover\:text-\[pt-blue-600\]:hover{ - color: pt-blue-600; -} - -.hover\:text-white:hover{ - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity, 1)); -} - -.focus\:border-pt-blue-500:focus{ - --tw-border-opacity: 1; - border-color: rgb(48 111 142 / var(--tw-border-opacity, 1)); -} - -.focus\:outline-none:focus{ - outline: 2px solid transparent; - outline-offset: 2px; -} - -.disabled\:opacity-30:disabled{ - opacity: 0.3; -} - -.disabled\:opacity-50:disabled{ - opacity: 0.5; -} - -@media not all and (min-width: 768px){ - .max-sm\:text-sm{ - font-size: 0.875rem; - line-height: 1.25rem; - } -} - -@media (min-width: 768px){ - .sm\:col-span-2{ - grid-column: span 2 / span 2; - } - - .sm\:block{ - display: block; - } - - .sm\:inline-block{ - display: inline-block; - } - - .sm\:hidden{ - display: none; - } - - .sm\:w-auto{ - width: auto; - } - - .sm\:grow{ - flex-grow: 1; - } - - .sm\:grow-\[2\]{ - flex-grow: 2; - } - - .sm\:basis-\[10\%\]{ - flex-basis: 10%; - } - - .sm\:basis-\[34\%\]{ - flex-basis: 34%; - } - - .sm\:basis-\[40\%\]{ - flex-basis: 40%; - } - - .sm\:basis-\[50\%\]{ - flex-basis: 50%; - } - - .sm\:basis-\[58\%\]{ - flex-basis: 58%; - } - - .sm\:basis-\[8\%\]{ - flex-basis: 8%; - } - - .sm\:grid-cols-2{ - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .sm\:justify-center{ - justify-content: center; - } - - .sm\:px-0{ - padding-left: 0px; - padding-right: 0px; - } - - .sm\:pb-0{ - padding-bottom: 0px; - } - - .sm\:pb-8{ - padding-bottom: 2rem; - } - - .sm\:pt-8{ - padding-top: 2rem; - } - - .sm\:text-\[clamp\(0\.25rem\2c 1vw\2c 1\.25vw\)\]{ - font-size: clamp(0.25rem, 1vw, 1.25vw); - } -} - -@media (min-width: 1024px){ - .md\:fixed{ - position: fixed; - } - - .md\:left-0{ - left: 0px; - } - - .md\:right-0{ - right: 0px; - } - - .md\:top-0{ - top: 0px; - } - - .md\:z-50{ - z-index: 50; - } - - .md\:m-0{ - margin: 0px; - } - - .md\:my-0{ - margin-top: 0px; - margin-bottom: 0px; - } - - .md\:mt-\[78px\]{ - margin-top: 78px; - } - - .md\:hidden{ - display: none; - } - - .md\:h-\[520px\]{ - height: 520px; - } - - .md\:h-full{ - height: 100%; - } - - .md\:w-\[46\%\]{ - width: 46%; - } - - .md\:flex-row{ - flex-direction: row; - } - - .md\:gap-20{ - gap: 5rem; - } - - .md\:gap-8{ - gap: 2rem; - } - - .md\:px-3\.5{ - padding-left: 0.875rem; - padding-right: 0.875rem; - } - - .md\:py-1{ - padding-top: 0.25rem; - padding-bottom: 0.25rem; - } - - .md\:hover\:bg-transparent:hover{ - background-color: transparent; - } -} - -@media (min-width: 1280px){ - .xl\:grid-cols-4{ - grid-template-columns: repeat(4, minmax(0, 1fr)); - } -} - -@media (min-width: 1780px){ - .\32xl\:static{ - position: static; - } - - .\32xl\:inset-auto{ - inset: auto; - } - - .\32xl\:flex{ - display: flex; - } - - .\32xl\:hidden{ - display: none; - } - - .\32xl\:min-h-0{ - min-height: 0px; - } - - .\32xl\:w-\[62\%\]{ - width: 62%; - } - - .\32xl\:flex-1{ - flex: 1 1 0%; - } - - .\32xl\:flex-none{ - flex: none; - } - - .\32xl\:grow-0{ - flex-grow: 0; - } - - .\32xl\:basis-full{ - flex-basis: 100%; - } - - .\32xl\:justify-center{ - justify-content: center; - } - - .\32xl\:bg-pt-blue-400{ - --tw-bg-opacity: 1; - background-color: rgb(134 170 182 / var(--tw-bg-opacity, 1)); - } - - .\32xl\:p-0{ - padding: 0px; - } - - .\32xl\:pb-0{ - padding-bottom: 0px; - } - - .\32xl\:pl-16{ - padding-left: 4rem; - } - - .\32xl\:pr-12{ - padding-right: 3rem; - } -} +/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html{background-color:#86aab6;scroll-behavior:smooth}.container{width:100%}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1780px){.container{max-width:1780px}}@media (max-width:calc(1024px - 1px)){#rpt-main-nav{flex:none;position:static;order:10;width:100%;background:#fff;border-top:1px solid #e5e7eb;max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .25s ease}#rpt-main-nav.is-open{max-height:500px;opacity:1}#rpt-main-nav ul{flex-direction:column;align-items:stretch}}.rpt-header__hamburger[aria-expanded=true] span:first-child{width:100%!important;transform:translateY(10px) rotate(45deg)}.rpt-header__hamburger[aria-expanded=true] span:nth-child(2){opacity:0}.rpt-header__hamburger[aria-expanded=true] span:nth-child(3){width:100%!important;transform:translateY(-10px) rotate(-45deg)}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.left-3{left:.75rem}.right-3{right:.75rem}.top-1\/2{top:50%}.z-10{z-index:10}.mx-auto{margin-left:auto;margin-right:auto}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-\[1vw\]{margin-bottom:1vw}.ml-auto{margin-left:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-8{margin-top:2rem}.mt-\[2vw\]{margin-top:2vw}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-48{height:12rem}.h-72{height:18rem}.h-8{height:2rem}.h-\[240px\]{height:240px}.h-\[420px\]{height:420px}.h-full{height:100%}.min-h-\[320px\]{min-height:320px}.min-h-\[480px\]{min-height:480px}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-8{width:2rem}.w-\[45\%\]{width:45%}.w-full{width:100%}.min-w-0{min-width:0}.max-w-2xl{max-width:42rem}.max-w-\[1040px\]{max-width:1040px}.max-w-\[1200px\]{max-width:1200px}.max-w-\[520px\]{max-width:520px}.max-w-\[700px\]{max-width:700px}.max-w-\[860px\]{max-width:860px}.max-w-lg{max-width:32rem}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[1vw\]{gap:1vw}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-0{row-gap:0}.gap-y-5{row-gap:1.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.self-end{align-self:flex-end}.overflow-hidden{overflow:hidden}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[3px\]{border-radius:3px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-none{border-radius:0}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.border-pt-blue-200{--tw-border-opacity:1;border-color:rgb(184 212 220/var(--tw-border-opacity,1))}.border-pt-blue-300{--tw-border-opacity:1;border-color:rgb(157 189 203/var(--tw-border-opacity,1))}.border-pt-blue-500{--tw-border-opacity:1;border-color:rgb(48 111 142/var(--tw-border-opacity,1))}.border-pt-navy{--tw-border-opacity:1;border-color:rgb(30 58 95/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-white\/60{border-color:hsla(0,0%,100%,.6)}.bg-current{background-color:currentColor}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.bg-pt-blue-100{--tw-bg-opacity:1;background-color:rgb(221 232 240/var(--tw-bg-opacity,1))}.bg-pt-blue-300{--tw-bg-opacity:1;background-color:rgb(157 189 203/var(--tw-bg-opacity,1))}.bg-pt-blue-400{--tw-bg-opacity:1;background-color:rgb(134 170 182/var(--tw-bg-opacity,1))}.bg-pt-blue-50{--tw-bg-opacity:1;background-color:rgb(232 242 246/var(--tw-bg-opacity,1))}.bg-pt-blue-500{--tw-bg-opacity:1;background-color:rgb(48 111 142/var(--tw-bg-opacity,1))}.bg-pt-navy{--tw-bg-opacity:1;background-color:rgb(30 58 95/var(--tw-bg-opacity,1))}.bg-pt-sage-400{--tw-bg-opacity:1;background-color:rgb(131 161 161/var(--tw-bg-opacity,1))}.bg-pt-sage-500{--tw-bg-opacity:1;background-color:rgb(111 143 150/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/90{background-color:hsla(0,0%,100%,.9)}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-black\/60{--tw-gradient-from:rgba(0,0,0,.6) var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-pt-sage-400{--tw-gradient-from:#83a1a1 var(--tw-gradient-from-position);--tw-gradient-to:rgba(131,161,161,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-black\/30{--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),rgba(0,0,0,.3) var(--tw-gradient-via-position),var(--tw-gradient-to)}.to-pt-blue-400{--tw-gradient-to:#86aab6 var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.object-\[center_0\%\]{-o-object-position:center 0;object-position:center 0}.p-0{padding:0}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[4em\]{padding-left:4em;padding-right:4em}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-\[1em\]{padding-top:1em;padding-bottom:1em}.pb-1{padding-bottom:.25rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pt-0{padding-top:0}.pt-20{padding-top:5rem}.pt-4{padding-top:1rem}.pt-8{padding-top:2rem}.pt-px{padding-top:1px}.text-left{text-align:left}.text-center{text-align:center}.font-hedvig{font-family:Hedvig Letters Sans,sans-serif}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[1\.0625rem\]{font-size:1.0625rem}.text-\[15px\]{font-size:15px}.text-\[2\.25rem\]{font-size:2.25rem}.text-\[2\.5rem\]{font-size:2.5rem}.text-\[4\.5rem\]{font-size:4.5rem}.text-\[clamp\(0\.25rem\2c 1vw\2c 1\.25vw\)\]{font-size:clamp(.25rem,1vw,1.25vw)}.text-\[clamp\(1\.5rem\2c 3\.5vw\2c 3\.25rem\)\]{font-size:clamp(1.5rem,3.5vw,3.25rem)}.text-\[clamp\(1\.75rem\2c 3vw\2c 2\.5rem\)\]{font-size:clamp(1.75rem,3vw,2.5rem)}.text-\[clamp\(1rem\2c 2vw\2c 1\.5vw\)\]{font-size:clamp(1rem,2vw,1.5vw)}.text-\[clamp\(2\.5rem\2c 5vw\2c 4rem\)\]{font-size:clamp(2.5rem,5vw,4rem)}.text-\[clamp\(2\.75rem\2c 4\.5vw\2c 4rem\)\]{font-size:clamp(2.75rem,4.5vw,4rem)}.text-\[clamp\(3\.5rem\2c 8vw\2c 6rem\)\]{font-size:clamp(3.5rem,8vw,6rem)}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-\[1\.1\]{line-height:1.1}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-widest{letter-spacing:.1em}.text-\[blue-900\]{color:blue-900}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.text-pt-blue-500{--tw-text-opacity:1;color:rgb(48 111 142/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/70{color:hsla(0,0%,100%,.7)}.text-white\/80{color:hsla(0,0%,100%,.8)}.no-underline{text-decoration-line:none}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[transform\2c opacity\]{transition-property:transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-\[250ms\]{transition-duration:.25s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.\[text-shadow\:-56\.21px_2\.55px_10\.22px_rgb\(0_0_0\/10\%\)\]{text-shadow:-56.21px 2.55px 10.22px rgb(0 0 0/10%)}.hover\:border-pt-blue-500:hover{--tw-border-opacity:1;border-color:rgb(48 111 142/var(--tw-border-opacity,1))}.hover\:border-pt-blue-600:hover{--tw-border-opacity:1;border-color:rgb(31 90 110/var(--tw-border-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-pt-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(232 242 246/var(--tw-bg-opacity,1))}.hover\:bg-pt-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(31 90 110/var(--tw-bg-opacity,1))}.hover\:bg-pt-sage-500:hover{--tw-bg-opacity:1;background-color:rgb(111 143 150/var(--tw-bg-opacity,1))}.hover\:text-\[blue-900\]:hover{color:blue-900}.hover\:text-\[pt-blue-600\]:hover{color:pt-blue-600}.hover\:text-pt-blue-600:hover{--tw-text-opacity:1;color:rgb(31 90 110/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-pt-blue-500:focus{--tw-border-opacity:1;border-color:rgb(48 111 142/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media not all and (min-width:768px){.max-sm\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width:768px){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:hidden{display:none}.sm\:w-auto{width:auto}.sm\:grow{flex-grow:1}.sm\:grow-\[2\]{flex-grow:2}.sm\:basis-\[10\%\]{flex-basis:10%}.sm\:basis-\[34\%\]{flex-basis:34%}.sm\:basis-\[40\%\]{flex-basis:40%}.sm\:basis-\[50\%\]{flex-basis:50%}.sm\:basis-\[58\%\]{flex-basis:58%}.sm\:basis-\[8\%\]{flex-basis:8%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:justify-center{justify-content:center}.sm\:px-0{padding-left:0;padding-right:0}.sm\:pb-0{padding-bottom:0}.sm\:pb-8{padding-bottom:2rem}.sm\:pt-8{padding-top:2rem}.sm\:text-\[clamp\(0\.25rem\2c 1vw\2c 1\.25vw\)\]{font-size:clamp(.25rem,1vw,1.25vw)}}@media (min-width:1024px){.md\:fixed{position:fixed}.md\:left-0{left:0}.md\:right-0{right:0}.md\:top-0{top:0}.md\:z-50{z-index:50}.md\:m-0{margin:0}.md\:my-0{margin-top:0;margin-bottom:0}.md\:mt-\[78px\]{margin-top:78px}.md\:hidden{display:none}.md\:h-\[520px\]{height:520px}.md\:h-full{height:100%}.md\:w-\[46\%\]{width:46%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:gap-20{gap:5rem}.md\:gap-8{gap:2rem}.md\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.md\:py-1{padding-top:.25rem;padding-bottom:.25rem}.md\:hover\:bg-transparent:hover{background-color:transparent}}@media (min-width:1280px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1780px){.\32xl\:static{position:static}.\32xl\:inset-auto{inset:auto}.\32xl\:flex{display:flex}.\32xl\:hidden{display:none}.\32xl\:min-h-0{min-height:0}.\32xl\:w-\[62\%\]{width:62%}.\32xl\:flex-1{flex:1 1 0%}.\32xl\:flex-none{flex:none}.\32xl\:grow-0{flex-grow:0}.\32xl\:basis-full{flex-basis:100%}.\32xl\:justify-center{justify-content:center}.\32xl\:bg-pt-blue-400{--tw-bg-opacity:1;background-color:rgb(134 170 182/var(--tw-bg-opacity,1))}.\32xl\:p-0{padding:0}.\32xl\:pb-0{padding-bottom:0}.\32xl\:pl-16{padding-left:4rem}.\32xl\:pr-12{padding-right:3rem}} \ No newline at end of file diff --git a/web/modules/custom/riverside_pt/css/tailwind.css b/web/modules/custom/riverside_pt/css/tailwind.css index 499c702..1d33701 100644 --- a/web/modules/custom/riverside_pt/css/tailwind.css +++ b/web/modules/custom/riverside_pt/css/tailwind.css @@ -9,11 +9,6 @@ background-color: theme('colors.pt-blue.400'); scroll-behavior: smooth; } - @media (min-width: theme('screens.sm')) { - [id] { - scroll-margin-top: 110px; /* fixed header (78px) + breathing room */ - } - } /* Neutralise any theme container constraints */ .page-wrapper { max-width: none; diff --git a/web/modules/custom/riverside_pt/js/scroll.js b/web/modules/custom/riverside_pt/js/scroll.js index d35f578..59dabb6 100644 --- a/web/modules/custom/riverside_pt/js/scroll.js +++ b/web/modules/custom/riverside_pt/js/scroll.js @@ -1,13 +1,38 @@ -// Add data-scroll-to="#target-id" to any link to smooth-scroll instead of navigate. -(function () { - document.addEventListener('DOMContentLoaded', function () { - document.addEventListener('click', function (e) { - var link = e.target.closest('[data-scroll-to]'); - if (!link) return; - var target = document.querySelector(link.dataset.scrollTo); - if (!target) return; - e.preventDefault(); - target.scrollIntoView({ behavior: 'smooth' }); - }); +import zenscroll from "https://esm.sh/zenscroll@4.0.2"; + +var FIXED_BUFFER = 91; // breathing room below fixed header when menu is closed +var MOBILE_BUFFER = 0; // no offset needed when header is in-flow (scrolls away) + +// Returns the effective scroll offset to clear the header. +// When the hamburger is open, offsetHeight already includes the expanded nav, +// so no extra buffer is needed. When closed, add FIXED_BUFFER for breathing room. +function headerOffset() { + var header = document.querySelector(".rpt-header"); + if (!header) return MOBILE_BUFFER; + var pos = window.getComputedStyle(header).position; + if (pos !== "fixed" && pos !== "sticky") return MOBILE_BUFFER; + var nav = document.getElementById("rpt-main-nav"); + var menuOpen = nav && nav.classList.contains("is-open"); + return header.offsetHeight + (menuOpen ? 0 : FIXED_BUFFER); +} + +// On load: if the URL has a hash (e.g. /home#pt-services from another page), +// re-scroll with the correct header offset instead of the browser's native jump. +document.addEventListener("DOMContentLoaded", function () { + if (!window.location.hash) return; + var target = document.querySelector(window.location.hash); + if (!target) return; + // Defer until layout is stable, then position correctly. + requestAnimationFrame(function () { + zenscroll.to(target, 0, headerOffset()); }); -})(); +}); + +document.addEventListener("click", function (e) { + var link = e.target.closest("[data-scroll-to]"); + if (!link) return; + var target = document.querySelector(link.dataset.scrollTo); + if (!target) return; + e.preventDefault(); + zenscroll.to(target, 400, headerOffset()); +}); diff --git a/web/modules/custom/riverside_pt/riverside_pt.install b/web/modules/custom/riverside_pt/riverside_pt.install index e3701d7..9cfda64 100644 --- a/web/modules/custom/riverside_pt/riverside_pt.install +++ b/web/modules/custom/riverside_pt/riverside_pt.install @@ -203,7 +203,19 @@ function _riverside_pt_build_navigation(): void { $link->delete(); } - foreach (['Services', 'About', 'FAQ', 'Contact'] as $title) { + // Clean up legacy nodes for pages we now serve via custom controllers/routes + foreach (['About', 'Contact'] as $title) { + $nodes = $em->getStorage('node')->loadByProperties(['title' => $title, 'type' => 'page']); + foreach ($nodes as $node) { + $node->delete(); + } + $aliases = $em->getStorage('path_alias')->loadByProperties(['alias' => '/' . strtolower($title)]); + foreach ($aliases as $alias) { + $alias->delete(); + } + } + + foreach (['FAQ'] as $title) { if ($em->getStorage('node')->loadByProperties(['title' => $title, 'type' => 'page'])) { continue; } @@ -218,12 +230,12 @@ function _riverside_pt_build_navigation(): void { $defs = [ ['title' => 'Home', 'uri' => 'route:', 'weight' => 0, 'class' => NULL], - ['title' => 'Services', 'uri' => 'internal:/services', 'weight' => 1, 'class' => NULL], + ['title' => 'Services', 'uri' => 'internal:/home#pt-services', 'weight' => 1, 'class' => NULL], ['title' => 'About', 'uri' => 'internal:/about', 'weight' => 2, 'class' => NULL], - ['title' => 'FAQ', 'uri' => 'internal:/faq', 'weight' => 3, 'class' => NULL], + ['title' => 'FAQ', 'uri' => 'internal:/home#pt-faq', 'weight' => 3, 'class' => NULL], - ['title' => 'Contact', 'uri' => 'internal:/contact', 'weight' => 4, 'class' => 'nav-cta nav-cta--primary'], - ['title' => 'Book An Appointment', 'uri' => 'internal:/home', 'weight' => 5, 'class' => 'nav-cta nav-cta--primary'], + ['title' => 'Contact', 'uri' => 'internal:/contact', 'weight' => 4, 'class' => 'nav-cta nav-cta--primary'], + ['title' => 'Book An Appointment', 'uri' => 'internal:/home#book-an-appointment','weight' => 5, 'class' => 'nav-cta nav-cta--primary'], ]; foreach ($defs as $def) { diff --git a/web/modules/custom/riverside_pt/riverside_pt.libraries.yml b/web/modules/custom/riverside_pt/riverside_pt.libraries.yml index c168bb2..223c706 100644 --- a/web/modules/custom/riverside_pt/riverside_pt.libraries.yml +++ b/web/modules/custom/riverside_pt/riverside_pt.libraries.yml @@ -4,7 +4,7 @@ app: css/app.css: {} js: js/nav.js: {} - js/scroll.js: {} + js/scroll.js: { attributes: { type: module } } js/phone-format.js: {} js/components/rpt-toggle.js: { attributes: { type: module } } js/components/rpt-carousel.js: { attributes: { type: module } } diff --git a/web/modules/custom/riverside_pt/riverside_pt.module b/web/modules/custom/riverside_pt/riverside_pt.module index ffaf084..f32a8c6 100644 --- a/web/modules/custom/riverside_pt/riverside_pt.module +++ b/web/modules/custom/riverside_pt/riverside_pt.module @@ -25,6 +25,22 @@ function riverside_pt_theme(): array { 'riverside_pt_home' => [ 'variables' => [], ], + 'riverside_pt_about' => [ + 'variables' => [], + ], + 'riverside_pt_service' => [ + 'variables' => [ + 'slug' => NULL, + 'title' => NULL, + 'description' => NULL, + 'long_description' => NULL, + 'what_to_expect' => NULL, + 'benefits' => [], + ], + ], + 'riverside_pt_contact' => [ + 'variables' => [], + ], ]; } @@ -75,24 +91,64 @@ function riverside_pt_preprocess_riverside_pt_header(array &$variables): void { } function riverside_pt_mail(string $key, array &$message, array $params): void { - if ($key !== 'booking_request') { + $service_map = [ + 'diagnostic' => 'Diagnostic Assessment', + 'sports' => 'Sports Rehabilitation', + 'surgical' => 'Surgery Rehabilitation', + 'neuro' => 'Neurological Therapy', + ]; + $service_label = $service_map[$params['service'] ?? ''] ?? 'Appointment'; + + if ($key === 'booking_request') { + $start = new \DateTime($params['start']); + $end = new \DateTime($params['end']); + + $message['subject'] = 'Booking request — ' . $start->format('M j, Y g:i A'); + $lines = [ + 'Name: ' . ($params['first_name'] ?? '') . ' ' . ($params['last_name'] ?? ''), + 'Email: ' . ($params['email'] ?? ''), + 'Service: ' . $service_label, + 'Phone: ' . ($params['phone'] ?? ''), + 'Slot: ' . $start->format('l, F j, Y') . ', ' . $start->format('g:i A') . '–' . $end->format('g:i A'), + ]; + + if (!empty($params['comments'])) { + $lines[] = 'Comments: ' . $params['comments']; + } + + $message['body'][] = implode("\n", $lines); return; } - $start = new \DateTime($params['start']); - $end = new \DateTime($params['end']); + if ($key === 'booking_confirmation') { + $start = new \DateTime($params['start']); + $end = new \DateTime($params['end']); - $message['subject'] = 'Booking request — ' . $start->format('M j, Y g:i A'); - $lines = [ - 'Name: ' . ($params['first_name'] ?? '') . ' ' . ($params['last_name'] ?? ''), - 'Email: ' . ($params['email'] ?? ''), - 'Phone: ' . ($params['phone'] ?? ''), - 'Slot: ' . $start->format('l, F j, Y') . ', ' . $start->format('g:i A') . '–' . $end->format('g:i A'), - ]; + $first = $params['first_name'] ?? 'Patient'; + $message['subject'] = 'Your appointment is confirmed — ' . $start->format('M j, Y g:i A'); - if (!empty($params['comments'])) { - $lines[] = 'Comments: ' . $params['comments']; + $lines = [ + 'Dear ' . $first . ',', + '', + 'Your appointment is *confirmed* for:', + $start->format('l, F j, Y') . ', ' . $start->format('g:i A') . '–' . $end->format('g:i A') . ' PST', + '', + 'Service: ' . $service_label, + ]; + + $full_name = trim(($params['first_name'] ?? '') . ' ' . ($params['last_name'] ?? '')); + if ($full_name) { + $lines[] = 'Name: ' . $full_name; + } + if (!empty($params['phone'])) { + $lines[] = 'Phone: ' . $params['phone']; + } + + $lines[] = ''; + $lines[] = 'We look forward to seeing you at Riverside Physical Therapy.'; + $lines[] = 'If you need to cancel or reschedule, please contact us as soon as possible.'; + + $message['body'][] = implode("\n", $lines); + return; } - - $message['body'][] = implode("\n", $lines); } diff --git a/web/modules/custom/riverside_pt/riverside_pt.routing.yml b/web/modules/custom/riverside_pt/riverside_pt.routing.yml index 94e1b49..56d0945 100644 --- a/web/modules/custom/riverside_pt/riverside_pt.routing.yml +++ b/web/modules/custom/riverside_pt/riverside_pt.routing.yml @@ -31,3 +31,44 @@ riverside_pt.schedule_events: options: _auth: - cookie + +riverside_pt.about: + path: '/about' + defaults: + _controller: '\Drupal\riverside_pt\Controller\PageController::page' + _title: 'About' + requirements: + _permission: 'access content' + +riverside_pt.services: + path: '/services' + defaults: + _controller: '\Drupal\riverside_pt\Controller\HomeController::redirectToAnchor' + destination: '/home#pt-services' + requirements: + _access: 'TRUE' + +riverside_pt.faq: + path: '/faq' + defaults: + _controller: '\Drupal\riverside_pt\Controller\HomeController::redirectToAnchor' + destination: '/home#pt-faq' + requirements: + _access: 'TRUE' + +riverside_pt.service: + path: '/services/{slug}' + defaults: + _controller: '\Drupal\riverside_pt\Controller\PageController::service' + _title: 'Service' + requirements: + _permission: 'access content' + slug: 'diagnostic-assessment|sports-rehabilitation|pre-post-surgical-rehab|neurological-therapy' + +riverside_pt.contact: + path: '/contact' + defaults: + _controller: '\Drupal\riverside_pt\Controller\PageController::contact' + _title: 'Contact' + requirements: + _permission: 'access content' diff --git a/web/modules/custom/riverside_pt/src/Controller/HomeController.php b/web/modules/custom/riverside_pt/src/Controller/HomeController.php index 1dba4cf..ee018f7 100644 --- a/web/modules/custom/riverside_pt/src/Controller/HomeController.php +++ b/web/modules/custom/riverside_pt/src/Controller/HomeController.php @@ -4,9 +4,15 @@ namespace Drupal\riverside_pt\Controller; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Url; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpFoundation\Request; class HomeController extends ControllerBase { + public function redirectToAnchor(Request $request): RedirectResponse { + return new RedirectResponse($request->attributes->get('destination'), 301); + } + public function page(): array { $holidays = $this->config('riverside_pt.settings')->get('holidays') ?? []; $holidayMap = []; diff --git a/web/modules/custom/riverside_pt/src/Controller/PageController.php b/web/modules/custom/riverside_pt/src/Controller/PageController.php new file mode 100644 index 0000000..1ae9eb7 --- /dev/null +++ b/web/modules/custom/riverside_pt/src/Controller/PageController.php @@ -0,0 +1,111 @@ + 'riverside_pt_about', + '#cache' => ['max-age' => 0], + ]; + } + + public function contact(): array { + return [ + '#theme' => 'riverside_pt_contact', + '#cache' => ['max-age' => 0], + ]; + } + + public function service($slug): array { + $services = $this->getServices(); + $service = $services[$slug] ?? NULL; + + if (!$service) { + throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException(); + } + + return [ + '#theme' => 'riverside_pt_service', + '#slug' => $slug, + '#title' => $service['title'], + '#description' => $service['description'], + '#long_description' => $service['long_description'], + '#what_to_expect' => $service['what_to_expect'], + '#benefits' => $service['benefits'], + '#cache' => ['max-age' => 0], + ]; + } + + private function getServices(): array { + return [ + 'diagnostic-assessment' => [ + 'title' => 'Diagnostic Assessment', + 'description' => 'Your recovery starts with clarity. We perform a thorough evaluation of your condition, movement, and goals to create a precise, personalized treatment plan from day one.', + 'long_description' => '

Our comprehensive diagnostic assessment is the foundation of effective physical therapy. During this 60-minute session, our expert therapists conduct a detailed evaluation including:

+ +

This allows us to identify the root cause of your pain or limitation, not just the symptoms.

', + 'what_to_expect' => '

You will be asked to perform various movements and exercises while we observe and measure. We may use hands-on techniques to assess joint mobility and soft tissue. Wear comfortable clothing that allows easy movement and access to the area being evaluated. The goal is to gather enough information to design a targeted treatment plan that addresses your specific needs and goals.

', + 'benefits' => [ + 'Accurate identification of the source of your pain or dysfunction', + 'Personalized treatment plan tailored to your body and lifestyle', + 'Clear understanding of your condition and recovery timeline', + 'Baseline measurements to track progress objectively', + 'Prevention of future injuries through early detection of imbalances', + ], + ], + 'sports-rehabilitation' => [ + 'title' => 'Sports Rehabilitation', + 'description' => 'We help athletes recover from injury and return to peak performance with targeted, sport-specific programs built around your body and your goals.', + 'long_description' => '

Whether you\'re a weekend warrior or a competitive athlete, our sports rehabilitation program is designed to get you back in the game safely and stronger than before. We combine evidence-based techniques with sport-specific training to address the unique demands of your activity.

+

Our therapists have experience working with athletes from a variety of sports including running, cycling, soccer, basketball, tennis, golf, and more.

', + 'what_to_expect' => '

Treatment sessions focus on restoring mobility, strength, power, and coordination specific to your sport. We incorporate functional movements, plyometrics, agility drills, and sport-specific simulations. You will receive a customized home exercise program and guidance on return-to-sport criteria and injury prevention strategies.

', + 'benefits' => [ + 'Faster, safer return to your sport or activity', + 'Sport-specific strengthening and conditioning', + 'Improved performance and biomechanics', + 'Reduced risk of re-injury', + 'Education on proper warm-up, recovery, and training principles', + ], + ], + 'pre-post-surgical-rehab' => [ + 'title' => 'Pre/Post-Surgical Rehab', + 'description' => 'Expert care before and after surgery to reduce recovery time, minimize complications, and restore full strength and function.', + 'long_description' => '

Surgery is often just one step in the recovery journey. Our pre- and post-surgical rehabilitation programs are designed to optimize outcomes and get you back to your normal activities as quickly and safely as possible.

+

Pre-hab (pre-surgery rehab) can significantly improve post-op results by strengthening supporting muscles and improving range of motion before the procedure.

', + 'what_to_expect' => '

Pre-surgery: We focus on maximizing strength, flexibility, and cardiovascular health to prepare your body for surgery and the demands of recovery. Post-surgery: We follow evidence-based protocols specific to your procedure (joint replacements, ACL reconstruction, rotator cuff repair, spinal surgery, etc.), progressing you through phases of healing while monitoring for any complications.

', + 'benefits' => [ + 'Shorter hospital stays and faster initial recovery', + 'Reduced post-operative pain and swelling', + 'Restored range of motion and strength more quickly', + 'Lower risk of complications such as blood clots or stiffness', + 'Better long-term functional outcomes', + ], + ], + 'neurological-therapy' => [ + 'title' => 'Neurological Therapy', + 'description' => 'Specialized therapy for nervous system conditions — helping you rebuild strength, coordination, and independence at every stage of recovery.', + 'long_description' => '

Neurological conditions such as stroke, Parkinson\'s disease, multiple sclerosis, traumatic brain injury, or spinal cord injury can significantly impact mobility, balance, and daily function. Our neurological physical therapy program uses specialized techniques to help you regain as much independence as possible.

+

We work closely with neurologists, occupational therapists, and other healthcare providers to create a coordinated care plan.

', + 'what_to_expect' => '

Sessions may include balance and gait training, functional electrical stimulation, task-specific training, manual therapy, and exercises to improve strength, coordination, and proprioception. We also focus on fall prevention strategies and adaptive techniques to help you safely perform daily activities.

', + 'benefits' => [ + 'Improved balance, coordination, and walking ability', + 'Increased strength and endurance', + 'Greater independence in daily living activities', + 'Reduced fall risk', + 'Better quality of life and confidence', + ], + ], + ]; + } + +} diff --git a/web/modules/custom/riverside_pt/src/Controller/ScheduleController.php b/web/modules/custom/riverside_pt/src/Controller/ScheduleController.php index 0bcc6c4..d1b1b9d 100644 --- a/web/modules/custom/riverside_pt/src/Controller/ScheduleController.php +++ b/web/modules/custom/riverside_pt/src/Controller/ScheduleController.php @@ -69,6 +69,18 @@ class ScheduleController extends ControllerBase { $to = $this->configFactory->get('riverside_pt.settings')->get('notification_email'); $lang = \Drupal::languageManager()->getDefaultLanguage()->getId(); + // Send confirmation to the user + $this->mailManager->mail('riverside_pt', 'booking_confirmation', $email, $lang, [ + 'first_name' => $firstName, + 'last_name' => $lastName, + 'email' => $email, + 'phone' => $phone, + 'comments' => $comments, + 'start' => $start, + 'end' => $end, + 'service' => $service, + ]); + $sent = $this->mailManager->mail('riverside_pt', 'booking_request', $to, $lang, [ 'first_name' => $firstName, 'last_name' => $lastName, @@ -77,6 +89,7 @@ class ScheduleController extends ControllerBase { 'comments' => $comments, 'start' => $start, 'end' => $end, + 'service' => $service, ]); $this->tempStore->delete('booking_slot'); diff --git a/web/modules/custom/riverside_pt/templates/riverside-pt-about.html.twig b/web/modules/custom/riverside_pt/templates/riverside-pt-about.html.twig new file mode 100644 index 0000000..9c5411d --- /dev/null +++ b/web/modules/custom/riverside_pt/templates/riverside-pt-about.html.twig @@ -0,0 +1,57 @@ +
+
+
+ + Our clinic + +
+
+
+ +
+

+ About Riverside Physical Therapy +

+

Helping you restore strength and reclaim your life since 2011.

+
+ +
+
+
+ +
+
+

Our Story

+
+

Riverside Physical Therapy was founded with a simple belief: every patient deserves a thorough evaluation and a truly personalized plan. What started as a small clinic has grown into a trusted partner for hundreds of patients across the region.

+

Our team of licensed physical therapists brings together decades of experience in orthopedic, sports, post-surgical, and neurological rehabilitation. We stay current with the latest evidence-based techniques so you get care that actually works.

+
+
+
+ +
+
+

What Sets Us Apart

+
+
+

One-on-one care

+

You work with the same therapist throughout your treatment. No hand-offs, no assembly line.

+
+
+

Root cause focus

+

We don't just chase symptoms. We find and treat the underlying movement problems.

+
+
+

Real results

+

Our patients consistently report faster recovery times and lasting improvements.

+
+
+
+
+ +
+
+

Ready to start your recovery?

+ Make an Appointment +
+
diff --git a/web/modules/custom/riverside_pt/templates/riverside-pt-contact.html.twig b/web/modules/custom/riverside_pt/templates/riverside-pt-contact.html.twig new file mode 100644 index 0000000..17b59df --- /dev/null +++ b/web/modules/custom/riverside_pt/templates/riverside-pt-contact.html.twig @@ -0,0 +1,52 @@ +
+

Contact Us

+

+ We'd love to hear from you. Reach out with questions about our services, insurance, or to schedule a visit. +

+ +
+
+

Our Location

+
+

Riverside Physical Therapy

+

123 Riverside Drive, Suite 200

+

Riverside, CA 92501

+
+ +

Get in Touch

+ + +

Office Hours

+
+

Monday – Friday: 7:00 AM – 7:00 PM

+

Saturday: 8:00 AM – 12:00 PM

+

Sunday: Closed

+
+
+ +
+

Send Us a Message

+

+ For appointment requests, please use our online booking tool — it's the fastest way to get scheduled. +

+ +
+

Ready to get started?

+ + Make an Appointment + +

+ Or call us at (951) 555-0123 during business hours. +

+
+ +

+ We typically respond to emails within 1 business day. For urgent matters, please call. +

+
+
+
diff --git a/web/modules/custom/riverside_pt/templates/riverside-pt-home.html.twig b/web/modules/custom/riverside_pt/templates/riverside-pt-home.html.twig index 13b9765..52b73d3 100644 --- a/web/modules/custom/riverside_pt/templates/riverside-pt-home.html.twig +++ b/web/modules/custom/riverside_pt/templates/riverside-pt-home.html.twig @@ -34,8 +34,7 @@ class="w-full sm:w-auto text-center max-sm:text-sm sm:text-[clamp(0.25rem,1vw,1.25vw)] px-[4em] py-[1em] bg-pt-blue-500 text-white font-medium no-underline transition-colors border-2 border-pt-blue-500 hover:bg-pt-blue-600 hover:border-pt-blue-600" >Book An Appointment @@ -57,7 +56,7 @@

Diagnostic Assessment

Your recovery starts with clarity. We perform a thorough evaluation of your condition, movement, and goals to create a precise, personalized treatment plan from day one.

- More Info → + More Info →
@@ -65,7 +64,7 @@

Sports Rehabilitation

We help athletes recover from injury and return to peak performance with targeted, sport-specific programs built around your body and your goals.

- More Info → + More Info →
@@ -73,7 +72,7 @@

Pre/Post-Surgical Rehab

Expert care before and after surgery to reduce recovery time, minimize complications, and restore full strength and function.

- More Info → + More Info →
@@ -81,7 +80,7 @@

Neurological Therapy

Specialized therapy for nervous system conditions — helping you rebuild strength, coordination, and independence at every stage of recovery.

- More Info → + More Info →
diff --git a/web/modules/custom/riverside_pt/templates/riverside-pt-service.html.twig b/web/modules/custom/riverside_pt/templates/riverside-pt-service.html.twig new file mode 100644 index 0000000..a2e02ef --- /dev/null +++ b/web/modules/custom/riverside_pt/templates/riverside-pt-service.html.twig @@ -0,0 +1,42 @@ +
+ + +

{{ title }}

+

{{ description }}

+ +
+ {{ long_description|raw }} +
+ +
+
+

What to Expect

+
+ {{ what_to_expect|raw }} +
+
+
+

Key Benefits

+
    + {% for benefit in benefits %} +
  • + + {{ benefit }} +
  • + {% endfor %} +
+
+
+ +
+

Ready to get started with {{ title }}?

+ + Make an Appointment → + +

or call us to discuss your needs

+
+