Merge branch 'master' into bflat-fy-upload-visible

This commit is contained in:
Brandon Thomas authored and GitHub committed 2023-05-23 04:03:18 -04:00
commit 79f6f64b45
28 files changed
+1993 -756

No files matched your search

+2 -1
View File
@@ -20,7 +20,8 @@ jobs:
git config --local user.name "GitHub Action"
git checkout -b staging
- name: push changes
uses: ad-m/github-push-action@master
#uses: ad-m/github-push-action@master
uses: ad-m/github-push-action@0fafdd62b84042d49ec0cb92d9cac7f7ce4ec79e
with:
# Note: Github does not allow the default access token to push to
# protected branches. Using a PAT with permissions can bypass this,
@@ -1,9 +1,19 @@
import { ApiConfig } from "@storyteller/components";
export enum EnqueueVoiceConversionFrequencyMethod {
Crepe = "crepe",
Dio = "dio",
Harvest = "harvest",
}
export interface EnqueueVoiceConversionRequest {
uuid_idempotency_token: string,
voice_conversion_model_token: string,
source_media_upload_token: string,
// Optional args
override_f0_method?: EnqueueVoiceConversionFrequencyMethod,
transpose?: number,
}
export interface EnqueueVoiceConversionSuccessResponse {
+1
View File
@@ -45,6 +45,7 @@
"react-dom": "^16.13.1",
"react-drag-drop-files": "^2.3.9",
"react-i18next": "^11.15.4",
"react-range": "^1.8.14",
"react-reveal": "^1.2.2",
"react-router-dom": "^5.2.0",
"react-scripts": "5.0.0",
@@ -724,6 +724,10 @@ styles with important tags:
box-shadow: none;
cursor: pointer;
&.no-padding {
padding-left: 0.5rem;
}
&:hover {
background-color: lighten($input-dark, 5%);
border-color: lighten($input-dark, 5%) !important;
@@ -866,6 +870,13 @@ styles with important tags:
fill: lighten($secondary, 5%);
}
.tippy-box[data-theme~="range-slider"] {
margin-top: -5px;
background-color: lighten($panel, 10%);
color: $white;
font-size: 13px !important;
}
.sliding-content {
overflow: hidden;
opacity: 0;
@@ -1269,6 +1280,19 @@ styles with important tags:
.alert-info {
font-size: 14px;
}
.range-slider-value {
text-align: center;
max-width: 50px;
padding: 6px;
border-radius: 8px;
pointer-events: none;
background-color: lighten($panel, 5%) !important;
border-width: 1px;
border-color: rgba(255, 255, 255, 0.12) !important;
color: rgba($white, 0.85) !important;
font-weight: 500 !important;
}
}
select {
@@ -1404,6 +1428,10 @@ textarea {
height: 450px;
}
.session-vc-section {
height: 565px;
}
.session-tts-section::-webkit-scrollbar {
width: 10px;
}
@@ -21,6 +21,7 @@ import {
import { VcModelListSearch } from "./components/VcModelListSearchComponent";
import {
EnqueueVoiceConversion,
EnqueueVoiceConversionFrequencyMethod,
EnqueueVoiceConversionIsSuccess,
EnqueueVoiceConversionRequest,
} from "@storyteller/components/src/api/voice_conversion/EnqueueVoiceConversion";
@@ -30,6 +31,9 @@ import {
InferenceJob,
} from "@storyteller/components/src/jobs/InferenceJob";
import { SessionVoiceConversionResultsList } from "../../../_common/SessionVoiceConversionResultsList";
import { Link } from "react-router-dom";
import PitchShiftComponent from "./components/PitchShiftComponent";
import PitchEstimateMethodComponent from "./components/PitchEstimateMethodComponent";
interface Props {
sessionWrapper: SessionWrapper;
@@ -55,6 +59,7 @@ interface Props {
function VcModelListPage(props: Props) {
usePrefixedDocumentTitle("Voice Conversion");
const [convertLoading, setConvertLoading] = useState(false);
const [canConvert, setCanConvert] = useState(false);
@@ -66,6 +71,11 @@ function VcModelListPage(props: Props) {
uuidv4()
);
const [maybeF0MethodOverride, setMaybeF0MethodOverride] =
useState<EnqueueVoiceConversionFrequencyMethod | undefined>(undefined);
const [semitones, setSemitones] = useState(0);
// NB: Something of a UI hack here.
// The 3rd party microphone component doesn't let you clear it, so we emulate form clearing
// with this variable.
@@ -144,6 +154,14 @@ function VcModelListPage(props: Props) {
source_media_upload_token: mediaUploadToken,
};
if (semitones !== 0) {
request.transpose = semitones;
}
if (maybeF0MethodOverride !== undefined) {
request.override_f0_method = maybeF0MethodOverride;
}
Analytics.voiceConversionGenerate(
props.maybeSelectedVoiceConversionModel.token
);
@@ -164,6 +182,16 @@ function VcModelListPage(props: Props) {
ev.preventDefault();
};
const handlePitchChange = (value: any) => {
setSemitones(value);
changeConvertIdempotencyToken();
};
const handlePitchMethodChange = (value: any) => {
setMaybeF0MethodOverride(value);
changeConvertIdempotencyToken();
};
const speakButtonClass = convertLoading
? "btn btn-primary w-100 disabled"
: "btn btn-primary w-100";
@@ -277,6 +305,26 @@ function VcModelListPage(props: Props) {
</div>
</div>
<div>
<label className="sub-title">Pitch Control</label>
<div className="d-flex flex-column gap-3">
<div>
<PitchEstimateMethodComponent
pitchMethod={maybeF0MethodOverride}
onMethodChange={handlePitchMethodChange}
/>
</div>
<div>
<PitchShiftComponent
min={-36}
max={36}
step={1}
value={semitones}
onPitchChange={handlePitchChange}
/>
</div>
</div>
</div>
{/*<div>
<label className="sub-title">
Or pick from your audio collection (5 files)
@@ -346,6 +394,27 @@ function VcModelListPage(props: Props) {
</div>
</div>
<div>
<label className="sub-title">Pitch Control</label>
<div className="d-flex flex-column gap-3">
<div>
<PitchEstimateMethodComponent
pitchMethod={maybeF0MethodOverride}
onMethodChange={handlePitchMethodChange}
/>
</div>
<div>
<PitchShiftComponent
min={-36}
max={36}
step={1}
value={semitones}
onPitchChange={handlePitchChange}
/>
</div>
</div>
</div>
<div>
<label className="sub-title">Convert Audio</label>
@@ -378,7 +447,7 @@ function VcModelListPage(props: Props) {
/>
Session V2V Results
</h4>
<div className="d-flex flex-column gap-3 session-tts-section">
<div className="d-flex flex-column gap-3 session-tts-section session-vc-section">
<SessionVoiceConversionResultsList
inferenceJobs={
props.inferenceJobsByCategory.get(
@@ -0,0 +1,77 @@
import React from "react";
import Select from "react-select";
import { EnqueueVoiceConversionFrequencyMethod } from "@storyteller/components/src/api/voice_conversion/EnqueueVoiceConversion";
interface PitchShiftProps {
pitchMethod?: EnqueueVoiceConversionFrequencyMethod,
onMethodChange: (newMethod?: EnqueueVoiceConversionFrequencyMethod) => void;
}
const dropdownFieldClass = {
control: (state: any) =>
state.isFocused
? "select-search no-padding focused rounded"
: "select-search no-padding rounded",
option: (state: any) => (state.isFocused ? "select-option" : "select-option"),
input: (state: any) => (state.isFocused ? "select-input" : "select-input"),
placeholder: (state: any) =>
state.isFocused ? "select-placeholder" : "select-placeholder",
singleValue: (state: any) =>
state.isFocused ? "select-value" : "select-value",
menu: (state: any) =>
state.isFocused ? "select-container" : "select-container",
indicatorSeparator: (state: any) =>
state.isFocused ? "select-separator" : "select-separator",
};
function PitchEstimateMethodComponent(props: PitchShiftProps) {
const handleMethodChange = (option: any, actionMeta: any) => {
const pitchMethodName = option?.value;
let pitchMethod = undefined;
switch (pitchMethodName) {
case "crepe":
pitchMethod = EnqueueVoiceConversionFrequencyMethod.Crepe;
break;
case "harvest":
pitchMethod = EnqueueVoiceConversionFrequencyMethod.Harvest;
break;
case "dio":
pitchMethod = EnqueueVoiceConversionFrequencyMethod.Dio;
break;
}
props.onMethodChange(pitchMethod);
};
interface DropdownOption {
label: string;
value: EnqueueVoiceConversionFrequencyMethod;
}
const options : DropdownOption[] = [
{ label: "DIO", value: EnqueueVoiceConversionFrequencyMethod.Dio },
{ label: "CREPE", value: EnqueueVoiceConversionFrequencyMethod.Crepe },
{ label: "Harvest", value: EnqueueVoiceConversionFrequencyMethod.Harvest },
];
const selectedOption = options.find((option) => option.value === props.pitchMethod) || options[0];
return (
<>
<div>
<Select
value={selectedOption} // Controlled components use "value" instead of "defaultValue".
options={options}
classNames={dropdownFieldClass}
//placeholder={options[0]}
isSearchable={false}
onChange={handleMethodChange}
/>
</div>
</>
);
}
export default PitchEstimateMethodComponent;
@@ -0,0 +1,89 @@
import React from "react";
import { Range } from "react-range";
import Tippy from "@tippyjs/react";
interface PitchShiftProps {
min: number;
max: number;
step: number;
value: number;
onPitchChange: (value: number) => void;
}
function PitchShiftComponent({
min,
max,
step,
value,
onPitchChange,
}: PitchShiftProps) {
const handlePitchChange = (newValue: number[]) => {
onPitchChange(newValue[0]);
};
const renderTrack = ({ props, children }: any) => (
<div
{...props}
style={{
...props.style,
height: "8px",
width: "100%",
backgroundColor: "#4f4f66",
borderRadius: "4px",
}}
>
{children}
</div>
);
const renderThumb = ({ props, isDragged, isHovered }: any) => (
<Tippy
content="Semitones"
placement="bottom"
theme="range-slider"
arrow={false}
>
<div
{...props}
style={{
...props.style,
height: "22px",
width: "22px",
borderRadius: "50%",
backgroundColor: isHovered ? "#fff" : "#e66462",
display: "flex",
justifyContent: "center",
alignItems: "center",
outline: "none",
boxShadow: "0px 0px 10px rgba(0, 0, 0, 0.15)", // Add soft shadow on hover
}}
></div>
</Tippy>
);
return (
<>
<div className="d-flex gap-3 align-items-center">
<div className="flex-grow-1">
<Range
step={step}
min={min}
max={max}
values={[value]} // Changed from `values` to `[value]`
onChange={handlePitchChange}
renderTrack={renderTrack}
renderThumb={renderThumb}
/>
</div>
<input
className="form-control range-slider-value"
value={value.toFixed(0)}
disabled
></input>
</div>
</>
);
}
export default PitchShiftComponent;
Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
+187 -223
View File
@@ -4,6 +4,7 @@
$light-text-color: #777;
$button-text-color: #666;
$primary: #fa6b68;
$secondary: #36364e;
$white: #ffffff;
$heading-font-family: "Poppins", sans-serif;
@@ -40,6 +41,11 @@ p {
font-weight: 400;
}
li {
font-size: 18px;
line-height: 1.6;
}
::-moz-selection {
/* Code for Firefox */
color: $white;
@@ -57,11 +63,15 @@ p {
}
.container {
max-width: 1200px;
max-width: 1300px;
padding-right: var(--bs-gutter-x, 1.2rem);
padding-left: var(--bs-gutter-x, 1.2rem);
}
.rounded {
border-radius: 0.5rem !important;
}
.git-sha {
color: #999;
font-size: 0.8rem;
@@ -77,18 +87,6 @@ p {
supported by Chrome, Edge, Opera and Firefox */
}
.bg-hero {
background: rgb(34, 34, 56);
background: linear-gradient(
180deg,
rgba(34, 34, 56, 1) 0%,
rgba(23, 23, 37, 1) 100%
);
height: 100vh;
overflow: hidden;
position: relative;
}
.bg-hero-2 {
background: rgb(34, 34, 56);
background: linear-gradient(
@@ -101,23 +99,6 @@ p {
position: relative;
}
.bg-overlay {
width: 100%;
height: 100%;
background-color: rgba(11, 12, 20, 0.6);
position: absolute;
top: 0;
}
.bg-video {
object-fit: cover;
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
}
#logo {
transition: 0.3s all;
@@ -204,7 +185,7 @@ p {
}
.btn {
border-radius: 5px;
border-radius: 50px;
outline: none;
font-size: 16px;
font-weight: 500;
@@ -246,20 +227,20 @@ p {
.btn-secondary,
.btn-secondary:focus,
.btn-secondary:active {
background-color: $white;
color: #2c2c40;
background-color: $secondary;
color: $white;
border: 2.5px solid;
border-color: $white;
border-color: $secondary;
transition: 0.2s;
outline: none;
box-shadow: none;
}
.btn-secondary:hover {
background-color: #ccc;
color: #2c2c40;
border: 2.5px solid;
border-color: #ccc;
&:hover {
background-color: lighten($secondary, 3%) !important;
border-color: lighten($secondary, 3%) !important;
color: $white;
border: 2.5px solid;
}
}
.btn span {
@@ -291,88 +272,45 @@ p {
font-size: 16px;
}
.hero-title {
font-size: 5.6rem;
font-weight: 700;
width: 100%;
// letter-spacing: 3px;
text-shadow: 0px 5px 12px rgba(#0d0d14, 0.2);
z-index: 1;
// white-space: nowrap;
margin: 0;
line-height: 1.1;
.hero-video {
z-index: 2;
border: 3px solid;
border-color: rgba(#4d4d66, 0.5);
border-radius: 1.5rem !important;
overflow: hidden;
object-fit: cover;
.hero-title-one {
text-align: left;
overflow: hidden;
margin: 0;
line-height: 1;
padding-bottom: 12px;
span {
color: $primary;
}
video {
width: 100%;
}
}
.hero-title-container {
position: absolute;
bottom: 100px;
padding: 0;
.hero-video-container {
width: 1000px;
margin-bottom: -18rem;
}
.video-bottom {
margin-bottom: 18rem;
}
.hero-title {
font-size: 3.6rem;
font-weight: 700;
width: 90%;
z-index: 1;
margin: 0;
line-height: 1.3;
}
.hero-sub-title {
font-weight: 400;
font-size: 24px;
margin-top: -18px;
color: #e7e7e7;
font-size: 1.3rem;
width: 65%;
color: rgba($white, 0.7);
line-height: 1.4;
}
// .hero-title {
// font-size: 7.5rem;
// font-weight: 900;
// text-transform: uppercase;
// width: 100%;
// padding-top: 130px;
// // letter-spacing: 3px;
// // text-shadow: 0px 10px 100px #171725;
// z-index: 1;
// white-space: nowrap;
// position: relative;
// .hero-title-one {
// text-align: left;
// overflow: hidden;
// span {
// color: $primary;
// }
// }
// .hero-title-two {
// margin-top: -35px;
// text-align: right;
// overflow: hidden;
// }
// }
// .hero-sub-title {
// max-width: 320px;
// margin-top: -10px;
// text-align: end;
// font-size: 18px;
// }
// .hero-title-outline {
// position: absolute;
// width: 100%;
// transform: scale(1.72);
// top: -44px;
// overflow: hidden;
// -webkit-text-stroke: 1px rgba($white, 0.06);
// }
.text-outline {
color: transparent;
-webkit-text-stroke: 1px rgba($white, 0.06);
@@ -504,6 +442,22 @@ p {
);
}
.bg-hero {
background: rgb(25, 25, 41);
background: linear-gradient(
180deg,
rgba(23, 23, 37, 1) 0%,
rgba(29, 29, 48, 1) 100%
);
}
// .bg-video {
// position: absolute;
// width: 100%;
// -webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */
// filter: grayscale(100%);
// }
.section {
margin-top: -1px;
padding-top: 5rem;
@@ -597,7 +551,7 @@ p {
.card {
height: 100%;
padding: 28px;
border-radius: 8px;
border-radius: 0.5rem;
border: 2px solid;
border-color: rgba(#4d4d66, 0.5);
display: flex;
@@ -720,7 +674,7 @@ p {
.footer-social-icon {
background: rgb(47, 47, 75);
border-radius: 8px;
border-radius: 0.5rem;
height: 50px;
width: 50px;
display: flex;
@@ -776,7 +730,7 @@ p {
.form-select {
border-width: 1px;
border-color: $white;
border-radius: 5px;
border-radius: 0.5rem;
padding: 0.5rem 0.75rem;
&:focus {
@@ -956,7 +910,6 @@ $font: montserrat, sans-serif;
display: block;
height: 25%;
height: calc(100% / 4);
min-height: 50px;
position: relative;
opacity: 0;
@@ -973,17 +926,17 @@ $font: montserrat, sans-serif;
width: 100%;
}
&:after {
content: "";
position: absolute;
bottom: 0;
left: 50%;
width: 0%;
transform: translateX(-50%);
height: 3px;
background: $color-link;
transition: 0.35s;
}
// &:after {
// content: "";
// position: absolute;
// bottom: 0;
// left: 50%;
// width: 0%;
// transform: translateX(-50%);
// height: 3px;
// background: $color-link;
// transition: 0.35s;
// }
}
}
}
@@ -1016,6 +969,7 @@ $font: montserrat, sans-serif;
}
.about-card {
border-radius: 0.5rem;
min-height: 185px;
line-height: 1.5;
padding: 28px;
@@ -1034,7 +988,7 @@ $font: montserrat, sans-serif;
}
.img-border {
border-radius: 8px;
border-radius: 0.5rem;
border: 2px solid;
border-color: rgba(#4d4d66, 0.5);
}
@@ -1094,6 +1048,49 @@ span.swiper-pagination-bullet.swiper-pagination-bullet-active {
opacity: 1;
}
.research-swiper {
height: 100%;
.research-swiper-thumb-container {
max-height: 500px;
.swiper-slide {
display: flex;
align-items: center;
border-radius: 0.5rem !important;
height: 60px !important;
background-color: $secondary;
padding: 2rem 1.5rem;
cursor: pointer;
border: 2px solid;
border-color: $secondary;
transition: 0.2s all;
&:hover {
background-color: rgb(37, 37, 56);
border-color: lighten($secondary, 10%);
}
}
.swiper-slide-thumb-active {
background-color: #161624 !important;
border-color: $primary !important;
}
}
.research-swiper-video-container {
border-radius: 0.5rem;
border: 2px solid;
border-color: rgba(#4d4d66, 1);
.swiper-slide {
video {
object-fit: cover;
}
}
}
}
:root {
--swiper-theme-color: #fa6b68 !important;
}
@@ -1134,43 +1131,46 @@ span.swiper-pagination-bullet.swiper-pagination-bullet-active {
}
}
.img-team {
border-radius: 8px;
.border-frame {
border: 2px solid;
border-color: rgba(#4d4d66, 1);
border-color: $secondary;
}
.panel {
background-color: #181827;
border-radius: 0.5rem;
overflow: hidden;
border: 2px solid;
border-color: $secondary;
}
.img-team {
border-bottom: 2px solid;
border-color: $secondary;
}
.team-role-text {
padding-top: 2px;
line-height: 1.4;
margin-bottom: 0;
}
.img-layers {
display: flex;
position: relative;
#hero-title {
opacity: 0;
transform: translate(-8rem, 0);
}
.img-front-right {
position: absolute;
max-width: 380px;
right: -14%;
bottom: 12%;
}
#sub-title {
opacity: 0;
transform: translate(8rem, 0);
}
.img-front-left {
position: absolute;
max-width: 380px;
left: -14%;
bottom: 12%;
}
#hero-btn {
opacity: 0;
transform: translate(4rem, 0);
.img-back {
border-radius: 8px;
border: 2px solid;
border-color: rgba(#4d4d66, 0.25);
}
.img-mascot {
filter: drop-shadow(0px 0px 50px rgba(0, 0, 0, 0.95));
.btn-primary {
padding: 1rem 2.4rem;
}
}
@@ -1201,31 +1201,6 @@ span.swiper-pagination-bullet.swiper-pagination-bullet-active {
border-radius: 0 0 0 0;
}
// .hero-title {
// font-size: 8vw;
// white-space: nowrap;
// line-height: 1;
// // letter-spacing: normal;
// .hero-title-one {
// text-align: center;
// }
// .hero-title-two {
// text-align: center;
// margin: 0;
// }
// }
.hero-title {
font-size: 6.5vw;
}
.hero-sub-title {
font-size: 22px;
margin-top: 18px;
}
.lead {
font-size: 18px;
}
@@ -1274,10 +1249,6 @@ span.swiper-pagination-bullet.swiper-pagination-bullet-active {
left: 0;
}
}
.bg-hero-2 {
height: 800px;
}
}
@media (max-width: 767.98px) {
@@ -1304,20 +1275,6 @@ span.swiper-pagination-bullet.swiper-pagination-bullet-active {
height: 180px;
}
// .bg-hero {
// min-height: 1020px;
// max-height: 1020px;
// }
.hero-title {
font-size: 11.5vw;
}
.hero-sub-title {
font-size: 18px;
margin-top: 18px;
}
.shape-1-container {
left: 12%;
bottom: 14%;
@@ -1389,32 +1346,39 @@ span.swiper-pagination-bullet.swiper-pagination-bullet-active {
}
}
.bg-hero-2 {
height: 670px;
.hero-title {
font-size: 2rem;
width: 100%;
}
.hero-sub-title {
font-size: 16px;
width: 100%;
}
.hero-video-container {
margin-bottom: -6rem;
}
.video-bottom {
margin-bottom: 6rem;
}
.hero-video {
border-radius: 0.8rem !important;
}
#hero-btn {
.btn-primary {
padding: 0.8rem 1.8rem;
font-size: 15px;
}
}
.img-brandon {
border-bottom-right-radius: 0.5rem;
border-color: $secondary !important;
border-bottom: 2px solid;
border-right: 2px solid;
}
}
#sub-title {
opacity: 0;
transform: translate(8rem, 0);
}
#hero-btn {
opacity: 0;
transform: translate(4rem, 0);
}
// #pascal {
// opacity: 0;
// transform: translate(0, 300px);
// }
// #basilisk {
// opacity: 0;
// transform: translate(300px, 0);
// }
// #roko {
// opacity: 0;
// transform: translate(-300px, 0);
// }
+1 -1
View File
@@ -36,7 +36,7 @@ function App() {
containerRef={containerRef}
>
<BrowserRouter>
<div data-scroll-container ref={containerRef}>
<div data-scroll-container ref={containerRef} id="scroller">
<div>
<TopNav />
<Switch>
+27 -28
View File
@@ -44,9 +44,9 @@ function TopNav(props: Props) {
? "container-fluid nav-scroll"
: "container-fluid";
const backToTop = showTopBtn
? "btn-to-top nav-link show"
: "btn-to-top nav-link";
// const backToTop = showTopBtn
// ? "btn-to-top nav-link show"
// : "btn-to-top nav-link";
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
@@ -145,31 +145,31 @@ function TopNav(props: Props) {
<li>
<a
id="nav-btn-4"
href="#social"
href="#vision"
className="nav-link"
data-scroll-to
>
Social AI
Vision
</a>
</li>
<li>
<a
id="nav-btn-4"
href="#products"
className="nav-link"
data-scroll-to
>
Products
</a>
</li>
<li>
<a
id="nav-btn-2"
href="#film"
href="#research"
className="nav-link"
data-scroll-to
>
Film
</a>
</li>
<li>
<a
id="nav-btn-3"
href="#music"
className="nav-link"
data-scroll-to
>
Music
Research
</a>
</li>
<li>
@@ -179,7 +179,7 @@ function TopNav(props: Props) {
className="nav-link"
data-scroll-to
>
Our Team
Team
</a>
</li>
</ul>
@@ -230,24 +230,23 @@ function TopNav(props: Props) {
</a>
</li>
<li className="nav-link">
<a onClick={menuToggle} href="#social" data-scroll-to>
Social AI
<a onClick={menuToggle} href="#vision" data-scroll-to>
Vision
</a>
</li>
<li className="nav-link">
<a onClick={menuToggle} href="#film" data-scroll-to>
Film
<a onClick={menuToggle} href="#products" data-scroll-to>
Products
</a>
</li>
<li className="nav-link">
<a onClick={menuToggle} href="#music" data-scroll-to>
Music
<a onClick={menuToggle} href="#research" data-scroll-to>
Research
</a>
</li>
<li className="nav-link">
<a onClick={menuToggle} href="#team" data-scroll-to>
Our Team
Team
</a>
</li>
<li className="mt-4">
@@ -265,10 +264,10 @@ function TopNav(props: Props) {
</div>
</nav>
<a href="#home" className={backToTop} data-scroll-to>
{/* <a href="#home" className={backToTop} data-scroll-to>
<div className="btt-shape"></div>
Back to Top
</a>
</a> */}
</>
);
}
@@ -1,4 +1,8 @@
/*! locomotive-scroll v4.1.3 | MIT License | https://github.com/locomotivemtl/locomotive-scroll */
#scroller {
will-change: transform;
}
html.has-scroll-smooth {
overflow: hidden;
position: fixed;
@@ -85,3 +89,9 @@ html.has-scroll-dragging {
right: auto;
bottom: 0;
}
@media (max-width: 992px) {
#scroller {
will-change: initial;
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+11
View File
@@ -4387,6 +4387,7 @@ __metadata:
react-dom: ^16.13.1
react-drag-drop-files: ^2.3.9
react-i18next: ^11.15.4
react-range: ^1.8.14
react-reveal: ^1.2.2
react-router-dom: ^5.2.0
react-scripts: 5.0.0
@@ -17132,6 +17133,16 @@ __metadata:
languageName: node
linkType: hard
"react-range@npm:^1.8.14":
version: 1.8.14
resolution: "react-range@npm:1.8.14"
peerDependencies:
react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0
react-dom: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0
checksum: 7020c011dc293db46ede9b7cb014dbfe71d59f96aad9cf9b12e9de26c2b600c504e11d39368af8c539c4a3dc1f93e966745063e0b494c388c28fbadd338164bb
languageName: node
linkType: hard
"react-reconciler@npm:0.25.1":
version: 0.25.1
resolution: "react-reconciler@npm:0.25.1"