├── amplifyPublishIgnore.json ├── src ├── features │ ├── apps │ │ ├── index.js │ │ └── store │ │ │ ├── modules │ │ │ ├── state │ │ │ │ ├── getters.js │ │ │ │ ├── state.js │ │ │ │ ├── index.js │ │ │ │ └── actions.js │ │ │ ├── context │ │ │ │ ├── getters.js │ │ │ │ ├── state.js │ │ │ │ ├── mutations.js │ │ │ │ ├── index.js │ │ │ │ └── actions.js │ │ │ ├── query-params │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── state.js │ │ │ │ ├── index.js │ │ │ │ └── mutations.js │ │ │ ├── actions │ │ │ │ ├── state.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── getters.js │ │ │ └── config │ │ │ │ ├── state.js │ │ │ │ ├── index.js │ │ │ │ └── mutations.js │ │ │ ├── index.js │ │ │ └── state.js │ ├── pages │ │ ├── index.js │ │ ├── store │ │ │ ├── index.js │ │ │ └── state.js │ │ └── routes.js │ ├── checkout │ │ └── views │ │ │ ├── Cancel.vue │ │ │ └── Success.vue │ └── assets │ │ ├── components │ │ └── MoveAssetDialog.vue │ │ ├── store │ │ ├── index.js │ │ ├── state.js │ │ └── mutations.js │ │ ├── routes.js │ │ └── views │ │ └── SharedAssetsView.vue ├── tt-core │ ├── systems │ │ └── index.js │ ├── scenes │ │ ├── charts │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── office │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── anatomy_eye │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── base_stealing │ │ │ ├── state.js │ │ │ └── index.js │ │ ├── basketball │ │ │ └── index.js │ │ ├── consulting │ │ │ └── index.js │ │ ├── editor_360 │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── editor_basic │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── gitfolio │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── material_ui │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── meditation │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── powerlines │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── socialwork │ │ │ └── index.js │ │ ├── anatomy_pregnancy │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── anatomy_spine │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── avatar_recording │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── construction_live │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── gratitude_forest │ │ │ └── index.js │ │ ├── networking_test │ │ │ └── index.js │ │ ├── biometric_visualizer │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── mouse_interaction_test │ │ │ ├── index.js │ │ │ └── state.js │ │ ├── networking_basketball │ │ │ └── index.js │ │ ├── networking_shooter │ │ │ └── index.js │ │ ├── biometric_visualizer_360 │ │ │ └── index.js │ │ ├── PDF │ │ │ └── app.js │ │ └── Text │ │ │ └── app.js │ ├── components │ │ ├── tt-scene-helper.js │ │ ├── github-api.js │ │ ├── ui │ │ │ ├── index.js │ │ │ ├── double-click.js │ │ │ └── icon.js │ │ ├── tt-visible.js │ │ ├── remove-in-seconds.js │ │ ├── tt-interactable.js │ │ ├── handle-events.js │ │ ├── tt-overlay.js │ │ ├── tt-position.js │ │ ├── tt-data-tag.js │ │ ├── transform-gizmo.js │ │ ├── tt-raycastable.js │ │ ├── button-colors.js │ │ ├── tt-triggerable.js │ │ └── tt-center-mesh.js │ └── services │ │ ├── Camera.js │ │ ├── Session.js │ │ └── Asset.js ├── components │ ├── lms │ │ ├── Toolbar.vue │ │ ├── AdminSectionCard.vue │ │ ├── StudentLessonNav.vue │ │ ├── Student │ │ │ └── Viewers │ │ │ │ └── PDFViewer.vue │ │ └── Admin │ │ │ └── CourseNav.vue │ ├── TTCheckbox.vue │ ├── TTPanel.vue │ ├── steps │ │ ├── types │ │ │ ├── FLAG │ │ │ │ └── index.js │ │ │ ├── TEXT_INPUT │ │ │ │ └── index.js │ │ │ ├── HOTSPOTS │ │ │ │ └── index.js │ │ │ ├── LINK_LAUNCHER │ │ │ │ ├── index.js │ │ │ │ └── View.vue │ │ │ ├── GOTO │ │ │ │ ├── index.js │ │ │ │ └── View.vue │ │ │ ├── ENDING │ │ │ │ └── index.js │ │ │ ├── SPONSOR_OVERLAY │ │ │ │ └── index.js │ │ │ ├── ADVANCED_INTERACTION │ │ │ │ ├── index.js │ │ │ │ └── View.vue │ │ │ ├── VIDEO_OVERLAY │ │ │ │ ├── index.js │ │ │ │ └── OptionsEditor.vue │ │ │ ├── PICTURE_CHOICE │ │ │ │ └── index.js │ │ │ ├── NARRATION_ONLY │ │ │ │ ├── index.js │ │ │ │ └── Editor.vue │ │ │ ├── TITLE_OVERLAY │ │ │ │ └── index.js │ │ │ ├── MULTIPLE_CHOICE │ │ │ │ └── index.js │ │ │ ├── SET_ENVIRONMENT │ │ │ │ └── index.js │ │ │ ├── CLIPBOARD_OVERLAY │ │ │ │ ├── index.js │ │ │ │ └── OptionsEditor.vue │ │ │ ├── IMAGE_OVERLAY │ │ │ │ ├── index.js │ │ │ │ ├── View.vue │ │ │ │ └── OptionsEditor.vue │ │ │ ├── EMBED_OVERLAY │ │ │ │ ├── index.js │ │ │ │ └── View.vue │ │ │ ├── TABLE_OVERLAY │ │ │ │ └── index.js │ │ │ ├── DEFAULT │ │ │ │ ├── index.js │ │ │ │ ├── View.vue │ │ │ │ ├── OptionsEditor.vue │ │ │ │ └── Editor.vue │ │ │ └── AI_GENERAL │ │ │ │ ├── View.vue │ │ │ │ └── index.js │ │ └── components │ │ │ ├── EnvironmentViewerContainer.vue │ │ │ └── StepEditorContainer.vue │ ├── HelloWorld.vue │ ├── editor │ │ ├── input-controllers │ │ │ ├── NumberInput.vue │ │ │ ├── BooleanInput.vue │ │ │ ├── EntityIdInput.vue │ │ │ ├── ComponentIdInput.vue │ │ │ ├── index.js │ │ │ ├── ObjectInput.vue │ │ │ ├── PropIdInput.vue │ │ │ ├── ArrayInput.vue │ │ │ ├── ComponentAttributeInput.vue │ │ │ └── OptionsInput.vue │ │ └── component-editors │ │ │ ├── EnvironmentEditor.vue │ │ │ ├── DefaultComponentEditor.vue │ │ │ └── BaseComponentEditor.vue │ ├── TTButton.vue │ ├── EmptyMessage.vue │ └── SplitButton.vue ├── assets │ ├── scss │ │ ├── theme │ │ │ ├── base │ │ │ │ ├── _base.scss │ │ │ │ ├── _fonts.scss │ │ │ │ ├── _typography.scss │ │ │ │ └── _scroll-reveal.scss │ │ │ ├── elements │ │ │ │ ├── _forms.scss │ │ │ │ ├── _modal.scss │ │ │ │ ├── _tabs.scss │ │ │ │ ├── _accordion.scss │ │ │ │ ├── _carousel.scss │ │ │ │ ├── _containers.scss │ │ │ │ ├── _hamburger.scss │ │ │ │ ├── _buttons.scss │ │ │ │ └── _timeline.scss │ │ │ ├── layout │ │ │ │ ├── _footer.scss │ │ │ │ ├── _main.scss │ │ │ │ └── _header.scss │ │ │ ├── patterns │ │ │ │ ├── _split.scss │ │ │ │ └── _tiles.scss │ │ │ ├── sections │ │ │ │ ├── _hero.scss │ │ │ │ ├── _signin.scss │ │ │ │ ├── _team.scss │ │ │ │ ├── _clients.scss │ │ │ │ ├── _roadmap.scss │ │ │ │ ├── _section.scss │ │ │ │ ├── _features-split.scss │ │ │ │ ├── _features-tabs.scss │ │ │ │ ├── _features-tiles.scss │ │ │ │ ├── _cta.scss │ │ │ │ └── _news.scss │ │ │ └── illustrations │ │ │ │ └── _illustrations.scss │ │ ├── core │ │ │ ├── base │ │ │ │ └── _fonts.scss │ │ │ ├── sections │ │ │ │ ├── _roadmap.scss │ │ │ │ ├── _section.scss │ │ │ │ ├── _features-split.scss │ │ │ │ ├── _cta.scss │ │ │ │ └── _clients.scss │ │ │ ├── layout │ │ │ │ └── _main.scss │ │ │ └── elements │ │ │ │ └── _containers.scss │ │ ├── scenario_defaults.scss │ │ ├── settings │ │ │ ├── base │ │ │ │ ├── _misc.scss │ │ │ │ └── _scroll-reveal.scss │ │ │ ├── patterns │ │ │ │ ├── _tiles.scss │ │ │ │ └── _split.scss │ │ │ ├── elements │ │ │ │ ├── _accordion.scss │ │ │ │ └── _carousel.scss │ │ │ ├── sections │ │ │ │ ├── _roadmap.scss │ │ │ │ ├── _cta.scss │ │ │ │ ├── _hero.scss │ │ │ │ ├── _features-split.scss │ │ │ │ ├── _clients.scss │ │ │ │ ├── _signin.scss │ │ │ │ ├── _team.scss │ │ │ │ ├── _news.scss │ │ │ │ └── _features-tabs.scss │ │ │ └── layout │ │ │ │ └── _header.scss │ │ └── scenario_global.scss │ ├── logo.png │ ├── Roboto-msdf.png │ ├── images │ │ ├── editor.png │ │ ├── frank.jpeg │ │ ├── keenan.jpeg │ │ ├── team-1.jpg │ │ ├── team-2.jpg │ │ ├── team-3.jpg │ │ ├── team-4.jpg │ │ ├── tt-logo.png │ │ ├── RocketMan.png │ │ ├── monitoring.png │ │ ├── TT-Graphic-1.png │ │ ├── news-image-01.jpg │ │ ├── news-image-02.jpg │ │ ├── news-image-03.jpg │ │ ├── team-member-01.jpg │ │ ├── team-member-02.jpg │ │ ├── team-member-03.jpg │ │ ├── team-member-04.jpg │ │ ├── team-member-05.jpg │ │ ├── team-member-06.jpg │ │ ├── LandingPages-Logo.png │ │ ├── image-placeholder.png │ │ ├── EmptyStates │ │ │ ├── State-1.png │ │ │ ├── State-2.png │ │ │ ├── State-3.png │ │ │ ├── State-4.png │ │ │ ├── State-1-Small.png │ │ │ ├── State-2-Small.png │ │ │ ├── State-3-Small.png │ │ │ └── State-4-Small.png │ │ ├── TT-Logo-Text-Stacked.png │ │ ├── testimonial-image-01.jpg │ │ ├── testimonial-image-02.jpg │ │ ├── testimonial-image-03.jpg │ │ ├── TransferThoughts-Logo.png │ │ ├── features-split-image-01.png │ │ ├── features-split-image-02.png │ │ ├── features-split-image-03.png │ │ ├── features-split-top-03.png │ │ ├── TT-Logo-Text-Stacked-White.png │ │ ├── feature-tile-icon-02.svg │ │ ├── feature-tile-icon-05.svg │ │ ├── illustration-element-01.svg │ │ ├── feature-tile-icon-01.svg │ │ ├── illustration-section-01.svg │ │ ├── feature-tile-icon-04.svg │ │ ├── logo.svg │ │ └── feature-tile-icon-06.svg │ └── logo.svg ├── views │ ├── Admin │ │ └── AdminAppReports.vue │ ├── Channel │ │ └── Index.vue │ ├── Studio │ │ └── Index.vue │ ├── Assets.vue │ ├── WhiteLabel.vue │ ├── NotFound.vue │ ├── FriendlyURL.vue │ └── Remix.vue ├── scss │ ├── variables │ │ ├── _icons.scss │ │ ├── _timeline.scss │ │ ├── _light-theme.scss │ │ ├── _pagination.scss │ │ ├── _sliders.scss │ │ ├── _border-radius.scss │ │ ├── _buttons.scss │ │ ├── _card.scss │ │ ├── _alerts.scss │ │ ├── _list-item.scss │ │ ├── _forms.scss │ │ ├── _switch.scss │ │ └── _typography.scss │ └── variables.scss ├── stores │ ├── redirect │ │ ├── state.js │ │ ├── mutations.js │ │ ├── getters.js │ │ └── index.js │ ├── sessions │ │ ├── state.js │ │ ├── index.js │ │ ├── getters.js │ │ └── mutations.js │ ├── steps │ │ ├── state.js │ │ ├── index.js │ │ ├── mutations.js │ │ └── utils.js │ ├── user │ │ ├── state.js │ │ ├── index.js │ │ ├── getters.js │ │ └── mutations.js │ ├── courses │ │ ├── index.js │ │ └── mutations.js │ └── ResourceBase │ │ ├── state.js │ │ ├── index.js │ │ └── mutations.js ├── plugins │ └── vuetify.js ├── apps │ ├── paintchat │ │ ├── store.js │ │ ├── router.js │ │ └── index.js │ ├── timebox │ │ ├── store.js │ │ ├── router.js │ │ └── index.js │ ├── lev-360-editor │ │ ├── App.vue │ │ └── store.js │ ├── tt-360-editor │ │ ├── App.vue │ │ └── store.js │ ├── tt-app │ │ ├── store.js │ │ └── App.vue │ ├── twinlab │ │ ├── store.js │ │ └── App.vue │ └── patientlibrary │ │ ├── store.js │ │ └── App.vue ├── directives │ ├── text.vue │ └── size.vue ├── mixins │ └── RoutingMixin.js ├── utils │ └── auth.js ├── services │ └── environments-service.js ├── tt-api │ └── services │ │ ├── blockadelabs.js │ │ └── openai.js └── libs │ └── timeline │ ├── GanttElastic.standalone.vue │ └── components │ └── TaskList │ └── TaskListItem.vue ├── amplify ├── backend │ ├── storage │ │ └── s3f39ed916 │ │ │ └── storage-params.json │ ├── function │ │ ├── CreateAssetVariation │ │ │ ├── parameters.json │ │ │ ├── custom-policies.json │ │ │ ├── src │ │ │ │ ├── event.json │ │ │ │ └── package.json │ │ │ ├── amplify.state │ │ │ └── function-parameters.json │ │ ├── StripeCheckoutSession │ │ │ ├── function-parameters.json │ │ │ ├── custom-policies.json │ │ │ ├── src │ │ │ │ ├── event.json │ │ │ │ └── package.json │ │ │ └── amplify.state │ │ ├── StripeWebhook │ │ │ ├── function-parameters.json │ │ │ ├── custom-policies.json │ │ │ ├── amplify.state │ │ │ └── src │ │ │ │ ├── event.json │ │ │ │ └── package.json │ │ ├── transferthought1015a9c5PreSignup │ │ │ ├── custom-policies.json │ │ │ ├── parameters.json │ │ │ ├── src │ │ │ │ ├── event.json │ │ │ │ ├── custom.js │ │ │ │ ├── package.json │ │ │ │ └── yarn.lock │ │ │ ├── amplify.state │ │ │ └── function-parameters.json │ │ ├── transferthought1015a9c5PostConfirmation │ │ │ ├── custom-policies.json │ │ │ ├── parameters.json │ │ │ ├── src │ │ │ │ ├── event.json │ │ │ │ ├── custom.js │ │ │ │ └── package.json │ │ │ ├── amplify.state │ │ │ └── function-parameters.json │ │ └── transferthought1015a9c5PreAuthentication │ │ │ ├── custom-policies.json │ │ │ ├── src │ │ │ ├── event.json │ │ │ ├── custom.js │ │ │ ├── package.json │ │ │ └── yarn.lock │ │ │ ├── parameters.json │ │ │ ├── amplify.state │ │ │ └── function-parameters.json │ ├── auth │ │ └── userPoolGroups │ │ │ └── user-pool-group-precedence.json │ ├── tags.json │ ├── api │ │ ├── transferthought │ │ │ ├── transform.conf.json │ │ │ ├── schema │ │ │ │ ├── Generation.graphql │ │ │ │ ├── PromoCode.graphql │ │ │ │ ├── Redirects.graphql │ │ │ │ ├── Course.graphql │ │ │ │ ├── Session.graphql │ │ │ │ ├── Event.graphql │ │ │ │ └── User.graphql │ │ │ └── parameters.json │ │ └── Stripe │ │ │ └── cli-inputs.json │ └── predictions │ │ ├── transcriptionb08cd37b │ │ └── parameters.json │ │ └── speechGeneratoreebef0ec │ │ └── parameters.json ├── README.md ├── hooks │ └── README.md ├── .config │ └── project-config.json └── cli.json ├── public ├── captions │ ├── Ria.txt │ ├── Major.txt │ ├── Dason.txt │ ├── Dason.txt.meta │ ├── Johanna.txt.meta │ ├── Major.txt.meta │ ├── Ria.txt.meta │ └── Johanna.txt └── favicon.ico ├── .eslintignore ├── babel.config.js ├── cypress ├── fixtures │ └── example.json ├── e2e │ └── auth │ │ └── login.cy.js └── support │ ├── e2e.js │ └── commands.js ├── cypress.config.js ├── .graphqlconfig.yml ├── .eslintrc.js ├── .gitignore ├── vue.config.js └── LICENSE /amplifyPublishIgnore.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /src/features/apps/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/features/pages/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/tt-core/systems/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/lms/Toolbar.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/base/_base.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/base/_fonts.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/features/checkout/views/Cancel.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/Admin/AdminAppReports.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/base/_typography.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_forms.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_modal.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_tabs.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/layout/_footer.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/layout/_main.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/patterns/_split.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/patterns/_tiles.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_hero.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_signin.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_team.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/lms/AdminSectionCard.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/lms/StudentLessonNav.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/features/checkout/views/Success.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/base/_scroll-reveal.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_accordion.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_carousel.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_containers.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_hamburger.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_clients.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_roadmap.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_section.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/state/getters.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_features-split.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_features-tabs.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/context/getters.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/features/assets/components/MoveAssetDialog.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /amplify/backend/storage/s3f39ed916/storage-params.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /src/features/apps/store/modules/query-params/actions.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/query-params/getters.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /amplify/backend/function/CreateAssetVariation/parameters.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /src/scss/variables/_icons.scss: -------------------------------------------------------------------------------- 1 | $icon-size: 1.5rem !default; 2 | -------------------------------------------------------------------------------- /src/scss/variables/_timeline.scss: -------------------------------------------------------------------------------- 1 | $timeline-line-width: 1px !default; -------------------------------------------------------------------------------- /src/scss/variables/_light-theme.scss: -------------------------------------------------------------------------------- 1 | $material-light: ('background': #f8f9fe); -------------------------------------------------------------------------------- /src/scss/variables/_pagination.scss: -------------------------------------------------------------------------------- 1 | $pagination-item-font-size: .875rem !default; -------------------------------------------------------------------------------- /src/stores/redirect/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | data: null, 3 | }); 4 | -------------------------------------------------------------------------------- /public/captions/Ria.txt: -------------------------------------------------------------------------------- 1 | No thank you. 2 | Ohhh. Ummm. Well... 3 | I'm pretty shy, no thanks -------------------------------------------------------------------------------- /src/features/apps/store/modules/query-params/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | }); 3 | -------------------------------------------------------------------------------- /amplify/backend/function/StripeCheckoutSession/function-parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "lambdaLayers": [] 3 | } -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | aws-exports.js 2 | src/tt-core/* 3 | src/libs/* 4 | amplify-codegen-temp/models/models 5 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /src/features/apps/store/modules/actions/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | actions: {}, 3 | }); 4 | -------------------------------------------------------------------------------- /src/scss/variables/_sliders.scss: -------------------------------------------------------------------------------- 1 | $slider-thumb-size: 15px !default; 2 | $slider-track-width: 5px !default; -------------------------------------------------------------------------------- /amplify/backend/function/StripeWebhook/function-parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "lambdaLayers": [], 3 | "permissions": {} 4 | } -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset', 4 | ], 5 | }; 6 | -------------------------------------------------------------------------------- /src/assets/Roboto-msdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/Roboto-msdf.png -------------------------------------------------------------------------------- /src/stores/sessions/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | list: [], 3 | byId: {}, 4 | allIds: [], 5 | }); 6 | -------------------------------------------------------------------------------- /amplify/backend/function/StripeWebhook/custom-policies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Action": [], 4 | "Resource": [] 5 | } 6 | ] -------------------------------------------------------------------------------- /src/assets/images/editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/editor.png -------------------------------------------------------------------------------- /src/assets/images/frank.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/frank.jpeg -------------------------------------------------------------------------------- /src/assets/images/keenan.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/keenan.jpeg -------------------------------------------------------------------------------- /src/assets/images/team-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-1.jpg -------------------------------------------------------------------------------- /src/assets/images/team-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-2.jpg -------------------------------------------------------------------------------- /src/assets/images/team-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-3.jpg -------------------------------------------------------------------------------- /src/assets/images/team-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-4.jpg -------------------------------------------------------------------------------- /src/assets/images/tt-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/tt-logo.png -------------------------------------------------------------------------------- /src/features/apps/store/modules/state/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | state: {}, 3 | cachedState: null, 4 | }); 5 | -------------------------------------------------------------------------------- /src/assets/images/RocketMan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/RocketMan.png -------------------------------------------------------------------------------- /src/assets/images/monitoring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/monitoring.png -------------------------------------------------------------------------------- /src/features/apps/store/modules/config/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | config: {}, 3 | cachedConfig: null, 4 | }); 5 | -------------------------------------------------------------------------------- /amplify/backend/function/CreateAssetVariation/custom-policies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Action": [], 4 | "Resource": [] 5 | } 6 | ] -------------------------------------------------------------------------------- /amplify/backend/function/StripeCheckoutSession/custom-policies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Action": [], 4 | "Resource": [] 5 | } 6 | ] -------------------------------------------------------------------------------- /src/assets/images/TT-Graphic-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/TT-Graphic-1.png -------------------------------------------------------------------------------- /src/assets/images/news-image-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/news-image-01.jpg -------------------------------------------------------------------------------- /src/assets/images/news-image-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/news-image-02.jpg -------------------------------------------------------------------------------- /src/assets/images/news-image-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/news-image-03.jpg -------------------------------------------------------------------------------- /amplify/backend/auth/userPoolGroups/user-pool-group-precedence.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "groupName": "test", 4 | "precedence": 1 5 | } 6 | ] -------------------------------------------------------------------------------- /amplify/backend/function/CreateAssetVariation/src/event.json: -------------------------------------------------------------------------------- 1 | { 2 | "key1": "value1", 3 | "key2": "value2", 4 | "key3": "value3" 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/images/team-member-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-member-01.jpg -------------------------------------------------------------------------------- /src/assets/images/team-member-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-member-02.jpg -------------------------------------------------------------------------------- /src/assets/images/team-member-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-member-03.jpg -------------------------------------------------------------------------------- /src/assets/images/team-member-04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-member-04.jpg -------------------------------------------------------------------------------- /src/assets/images/team-member-05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-member-05.jpg -------------------------------------------------------------------------------- /src/assets/images/team-member-06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/team-member-06.jpg -------------------------------------------------------------------------------- /src/assets/scss/theme/layout/_header.scss: -------------------------------------------------------------------------------- 1 | .header-nav { 2 | 3 | a:not(.button) { 4 | @include font-family(heading); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /amplify/backend/function/StripeCheckoutSession/src/event.json: -------------------------------------------------------------------------------- 1 | { 2 | "key1": "value1", 3 | "key2": "value2", 4 | "key3": "value3" 5 | } 6 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreSignup/custom-policies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Action": [], 4 | "Resource": [] 5 | } 6 | ] -------------------------------------------------------------------------------- /src/assets/images/LandingPages-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/LandingPages-Logo.png -------------------------------------------------------------------------------- /src/assets/images/image-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/image-placeholder.png -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PostConfirmation/custom-policies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Action": [], 4 | "Resource": [] 5 | } 6 | ] -------------------------------------------------------------------------------- /src/assets/images/EmptyStates/State-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/EmptyStates/State-1.png -------------------------------------------------------------------------------- /src/assets/images/EmptyStates/State-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/EmptyStates/State-2.png -------------------------------------------------------------------------------- /src/assets/images/EmptyStates/State-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/EmptyStates/State-3.png -------------------------------------------------------------------------------- /src/assets/images/EmptyStates/State-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/EmptyStates/State-4.png -------------------------------------------------------------------------------- /src/assets/images/TT-Logo-Text-Stacked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/TT-Logo-Text-Stacked.png -------------------------------------------------------------------------------- /src/assets/images/testimonial-image-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/testimonial-image-01.jpg -------------------------------------------------------------------------------- /src/assets/images/testimonial-image-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/testimonial-image-02.jpg -------------------------------------------------------------------------------- /src/assets/images/testimonial-image-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/testimonial-image-03.jpg -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreAuthentication/custom-policies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Action": [], 4 | "Resource": [] 5 | } 6 | ] -------------------------------------------------------------------------------- /src/assets/images/TransferThoughts-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/TransferThoughts-Logo.png -------------------------------------------------------------------------------- /src/assets/images/features-split-image-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/features-split-image-01.png -------------------------------------------------------------------------------- /src/assets/images/features-split-image-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/features-split-image-02.png -------------------------------------------------------------------------------- /src/assets/images/features-split-image-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/features-split-image-03.png -------------------------------------------------------------------------------- /src/assets/images/features-split-top-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/features-split-top-03.png -------------------------------------------------------------------------------- /src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuetify from 'vuetify/lib/framework'; 3 | 4 | Vue.use(Vuetify); 5 | 6 | export default Vuetify; 7 | -------------------------------------------------------------------------------- /src/stores/redirect/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | setRedirectData(state, redirectData) { 3 | state.data = redirectData; 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreAuthentication/src/event.json: -------------------------------------------------------------------------------- 1 | { 2 | "key1": "value1", 3 | "key2": "value2", 4 | "key3": "value3" 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/images/EmptyStates/State-1-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/EmptyStates/State-1-Small.png -------------------------------------------------------------------------------- /src/assets/images/EmptyStates/State-2-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/EmptyStates/State-2-Small.png -------------------------------------------------------------------------------- /src/assets/images/EmptyStates/State-3-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/EmptyStates/State-3-Small.png -------------------------------------------------------------------------------- /src/assets/images/EmptyStates/State-4-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/EmptyStates/State-4-Small.png -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreSignup/parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "modules": "custom", 3 | "resourceName": "transferthought1015a9c5PreSignup" 4 | } -------------------------------------------------------------------------------- /src/assets/images/TT-Logo-Text-Stacked-White.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transferthought/transfer-thought/HEAD/src/assets/images/TT-Logo-Text-Stacked-White.png -------------------------------------------------------------------------------- /src/scss/variables/_border-radius.scss: -------------------------------------------------------------------------------- 1 | $border-radius-root: .375rem !default; 2 | 3 | $rounded: ( 4 | 'sm': .25rem, 5 | 'lg': .4375rem, 6 | 'xl': .5rem, 7 | ); -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PostConfirmation/parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "modules": "custom", 3 | "resourceName": "transferthought1015a9c5PostConfirmation" 4 | } -------------------------------------------------------------------------------- /src/scss/variables/_buttons.scss: -------------------------------------------------------------------------------- 1 | $btn-hover-opacity: 0 !default; 2 | $btn-active-opacity: 0 !default; 3 | $btn-focus-opacity: 0 !default; 4 | $btn-letter-spacing: .02em !default; -------------------------------------------------------------------------------- /src/tt-core/scenes/charts/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/office/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreAuthentication/parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "modules": "custom", 3 | "resourceName": "transferthought1015a9c5PreAuthentication" 4 | } -------------------------------------------------------------------------------- /src/assets/scss/core/base/_fonts.scss: -------------------------------------------------------------------------------- 1 | @if ( $font--provider == 'Google Fonts' ) { 2 | @import url('https://fonts.googleapis.com/css?family=#{$font--import}&display=swap'); 3 | } -------------------------------------------------------------------------------- /src/assets/scss/scenario_defaults.scss: -------------------------------------------------------------------------------- 1 | #progress-toolbar { 2 | background-color: var(--v-primary-base); 3 | } 4 | 5 | // .title-overlay { 6 | // // color: white; 7 | // } 8 | -------------------------------------------------------------------------------- /src/tt-core/scenes/anatomy_eye/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/base_stealing/state.js: -------------------------------------------------------------------------------- 1 | const initialState = { 2 | }; 3 | const handlers = { 4 | }; 5 | 6 | export { 7 | initialState, 8 | handlers, 9 | }; 10 | -------------------------------------------------------------------------------- /src/tt-core/scenes/basketball/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/consulting/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/editor_360/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/editor_basic/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/gitfolio/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/material_ui/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/meditation/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/meditation/state.js: -------------------------------------------------------------------------------- 1 | const initialState = { 2 | }; 3 | 4 | const handlers = { 5 | }; 6 | 7 | export { 8 | initialState, 9 | handlers, 10 | }; 11 | -------------------------------------------------------------------------------- /src/tt-core/scenes/powerlines/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/socialwork/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_features-tiles.scss: -------------------------------------------------------------------------------- 1 | .features-tiles-item-image { 2 | display: inline-flex; 3 | border-radius: 50%; 4 | background-color: get-color(dark, 2); 5 | } 6 | -------------------------------------------------------------------------------- /src/tt-core/scenes/anatomy_pregnancy/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/anatomy_spine/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/avatar_recording/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/base_stealing/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/construction_live/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/gratitude_forest/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/material_ui/state.js: -------------------------------------------------------------------------------- 1 | const initialState = { 2 | }; 3 | 4 | const handlers = { 5 | }; 6 | 7 | export { 8 | initialState, 9 | handlers, 10 | }; 11 | -------------------------------------------------------------------------------- /src/tt-core/scenes/networking_test/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/scss/variables/_card.scss: -------------------------------------------------------------------------------- 1 | $card-elevation: 0 !default; 2 | $card-border-radius: .375rem !default; 3 | $card-text-line-height: 1.5 !default; 4 | $card-text-letter-spacing: unset !default; -------------------------------------------------------------------------------- /src/tt-core/scenes/biometric_visualizer/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/mouse_interaction_test/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/networking_basketball/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/tt-core/scenes/networking_shooter/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/apps/paintchat/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | 4 | Vue.use(Vuex); 5 | 6 | export default new Vuex.Store({ 7 | modules: { 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /src/stores/redirect/getters.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/prefer-default-export */ 2 | import _ from 'lodash'; 3 | 4 | export const redirectData = (state) => { 5 | return state?.data; 6 | }; 7 | -------------------------------------------------------------------------------- /src/tt-core/scenes/biometric_visualizer_360/index.js: -------------------------------------------------------------------------------- 1 | import scene from './scene.html'; 2 | import { initialState, handlers } from './state'; 3 | 4 | export { scene, initialState, handlers }; 5 | -------------------------------------------------------------------------------- /src/views/Channel/Index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PostConfirmation/src/event.json: -------------------------------------------------------------------------------- 1 | { 2 | "request": { 3 | "userPoolId": "testID", 4 | "userName": "testUser" 5 | }, 6 | "response": {} 7 | } 8 | -------------------------------------------------------------------------------- /src/scss/variables/_alerts.scss: -------------------------------------------------------------------------------- 1 | $alert-font-size: .875rem !default; 2 | $alert-padding: 1rem 1.5rem !default; 3 | 4 | $snackbar-content-padding: 1rem 1.5rem !default; 5 | $snackbar-elevation: 0 !default; -------------------------------------------------------------------------------- /src/scss/variables/_list-item.scss: -------------------------------------------------------------------------------- 1 | $list-item-dense-title-font-size: .875rem !default; 2 | $list-group-dense-sub-group-header-padding: 8px !default; 3 | $list-group-sub-group-item-padding: 45px !default; -------------------------------------------------------------------------------- /amplify/backend/tags.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Key": "user:Stack", 4 | "Value": "{project-env}" 5 | }, 6 | { 7 | "Key": "user:Application", 8 | "Value": "{project-name}" 9 | } 10 | ] -------------------------------------------------------------------------------- /cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /src/views/Studio/Index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreSignup/src/event.json: -------------------------------------------------------------------------------- 1 | { 2 | "request": { 3 | "userAttributes": { 4 | "email": "testEmail@domain.com" 5 | } 6 | }, 7 | "response": {} 8 | } 9 | -------------------------------------------------------------------------------- /src/assets/scss/settings/base/_misc.scss: -------------------------------------------------------------------------------- 1 | // Larger images, extra width 2 | $image-larger--extra-width: 48px; // left and right exceeding pixels (.image-larger) 3 | 4 | // img radius 5 | $img-radius: 2px; 6 | -------------------------------------------------------------------------------- /src/stores/steps/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | currentStepIndex: null, 3 | started: false, 4 | paused: false, 5 | transcriptPlaying: false, 6 | transcriptFinished: false, 7 | }); 8 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/transform.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 5, 3 | "ElasticsearchWarning": true, 4 | "StackMapping": { 5 | "QuerysourceByDestinationResolver": "Redirects" 6 | } 7 | } -------------------------------------------------------------------------------- /src/tt-core/scenes/powerlines/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | }; 5 | 6 | const handlers = { 7 | }; 8 | 9 | export { 10 | initialState, 11 | handlers, 12 | }; 13 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-scene-helper.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('tt-scene-helper', { 4 | tick(t, dt) { 5 | this.el.emit('tick', { t, dt }); 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /amplify/backend/function/StripeWebhook/amplify.state: -------------------------------------------------------------------------------- 1 | { 2 | "pluginId": "amplify-nodejs-function-runtime-provider", 3 | "functionRuntime": "nodejs", 4 | "useLegacyBuild": true, 5 | "defaultEditorFile": "src/app.js" 6 | } -------------------------------------------------------------------------------- /public/captions/Major.txt: -------------------------------------------------------------------------------- 1 | I've seen a lot 2 | Ya know what it is? When a door slams. That's when I get irritable and anxious! 3 | Oh man, I'm sorry, my NRT isn't working these days. It really does help to talk about these things. -------------------------------------------------------------------------------- /src/features/apps/store/modules/context/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | inVRMode: false, 3 | mode: 'edit', 4 | selectedEntityId: null, 5 | inAnimationMode: false, 6 | animationContext: {}, 7 | }); 8 | -------------------------------------------------------------------------------- /src/features/pages/store/index.js: -------------------------------------------------------------------------------- 1 | import ResourceBase from '../../../stores/ResourceBase'; 2 | import state from './state'; 3 | import * as actions from './actions'; 4 | export default new ResourceBase({ state, actions }); 5 | -------------------------------------------------------------------------------- /src/scss/variables/_forms.scss: -------------------------------------------------------------------------------- 1 | // $text-field-filled-full-width-outlined-slot-min-height: 46px !default; 2 | // $text-field-outlined-fieldset-border: 0 !default; 3 | // $text-field-outlined-fieldset-border-width: 0 !default; 4 | -------------------------------------------------------------------------------- /src/tt-core/scenes/office/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | }; 5 | 6 | const handlers = { 7 | }; 8 | 9 | export { 10 | initialState, 11 | handlers, 12 | }; 13 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/schema/Generation.graphql: -------------------------------------------------------------------------------- 1 | type Generation @model @key(fields: ["prompt"]) { 2 | prompt: String! 3 | status: String! 4 | createdAt: AWSDateTime! 5 | updatedAt: AWSDateTime! 6 | } 7 | -------------------------------------------------------------------------------- /src/tt-core/scenes/anatomy_eye/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | }; 5 | 6 | const handlers = { 7 | }; 8 | 9 | export { 10 | initialState, 11 | handlers, 12 | }; 13 | -------------------------------------------------------------------------------- /src/tt-core/scenes/anatomy_spine/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | }; 5 | 6 | const handlers = { 7 | }; 8 | 9 | export { 10 | initialState, 11 | handlers, 12 | }; 13 | -------------------------------------------------------------------------------- /amplify/backend/function/CreateAssetVariation/amplify.state: -------------------------------------------------------------------------------- 1 | { 2 | "pluginId": "amplify-nodejs-function-runtime-provider", 3 | "functionRuntime": "nodejs", 4 | "useLegacyBuild": true, 5 | "defaultEditorFile": "src/index.js" 6 | } -------------------------------------------------------------------------------- /amplify/backend/function/StripeCheckoutSession/amplify.state: -------------------------------------------------------------------------------- 1 | { 2 | "pluginId": "amplify-nodejs-function-runtime-provider", 3 | "functionRuntime": "nodejs", 4 | "useLegacyBuild": true, 5 | "defaultEditorFile": "src/index.js" 6 | } -------------------------------------------------------------------------------- /src/tt-core/scenes/anatomy_pregnancy/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | }; 5 | 6 | const handlers = { 7 | }; 8 | 9 | export { 10 | initialState, 11 | handlers, 12 | }; 13 | -------------------------------------------------------------------------------- /public/captions/Dason.txt: -------------------------------------------------------------------------------- 1 | Well I know we have confidentiality stuff in here but I saw Johanna do something earlier that she might not want us to know. 2 | Let's just say it might have involved the Golden Pantry. I'm sorry, I'm done talking. -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreSignup/amplify.state: -------------------------------------------------------------------------------- 1 | { 2 | "pluginId": "amplify-nodejs-function-runtime-provider", 3 | "functionRuntime": "nodejs", 4 | "useLegacyBuild": true, 5 | "defaultEditorFile": "src/index.js" 6 | } -------------------------------------------------------------------------------- /src/features/apps/store/modules/context/mutations.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export default { 4 | update(state, payload) { 5 | const { selector, value } = payload; 6 | _.set(state, selector, value); 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /src/scss/variables/_switch.scss: -------------------------------------------------------------------------------- 1 | $switch-track-inset-height: 24px !default; 2 | $switch-track-inset-width: 46px !default; 3 | $switch-thumb-height: 18px !default; 4 | $switch-thumb-width: 18px !default; 5 | $switch-thumb-top: calc(50% - 9px) !default; -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PostConfirmation/amplify.state: -------------------------------------------------------------------------------- 1 | { 2 | "pluginId": "amplify-nodejs-function-runtime-provider", 3 | "functionRuntime": "nodejs", 4 | "useLegacyBuild": true, 5 | "defaultEditorFile": "src/index.js" 6 | } -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreAuthentication/amplify.state: -------------------------------------------------------------------------------- 1 | { 2 | "pluginId": "amplify-nodejs-function-runtime-provider", 3 | "functionRuntime": "nodejs", 4 | "useLegacyBuild": true, 5 | "defaultEditorFile": "src/index.js" 6 | } -------------------------------------------------------------------------------- /src/components/TTCheckbox.vue: -------------------------------------------------------------------------------- 1 | 4 | 12 | 14 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/schema/PromoCode.graphql: -------------------------------------------------------------------------------- 1 | type PromoCode @model(subscriptions: null) @auth(rules: [{ allow: public, operations: [read, update] }, { allow: private, operations: [read, update] }]) { 2 | id: ID! 3 | isValid: Boolean! 4 | } 5 | -------------------------------------------------------------------------------- /public/captions/Dason.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1b44ba67f60eb7648a8e493a6ff5e6c3 3 | timeCreated: 1523846518 4 | licenseType: Free 5 | TextScriptImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /public/captions/Johanna.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e8ddd65db0cf32e40a154b0345fa439d 3 | timeCreated: 1523846518 4 | licenseType: Free 5 | TextScriptImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /public/captions/Major.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f3f18fbd7674dba4cb7868a63a9f6736 3 | timeCreated: 1523846519 4 | licenseType: Free 5 | TextScriptImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /public/captions/Ria.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1ce6fad78a2912444ac5f40c07fe3841 3 | timeCreated: 1523846518 4 | licenseType: Free 5 | TextScriptImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /amplify/backend/api/Stripe/cli-inputs.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "paths": { 4 | "/webhook": { 5 | "name": "/webhook", 6 | "lambdaFunction": "StripeWebhook", 7 | "permissions": { 8 | "setting": "open" 9 | } 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/components/TTPanel.vue: -------------------------------------------------------------------------------- 1 | 4 | 12 | 17 | -------------------------------------------------------------------------------- /src/tt-core/components/github-api.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('github-api', { 4 | init() { 5 | setTimeout(() => { 6 | AFRAME.scenes[0].emit('fetchRepos', {}); 7 | }, 1000); 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreSignup/src/custom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('@types/aws-lambda').APIGatewayProxyHandler} 3 | */ 4 | exports.handler = async (event, context) => { 5 | // insert code to be executed by your lambda trigger 6 | return event 7 | }; 8 | -------------------------------------------------------------------------------- /src/components/steps/types/FLAG/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-flag', 3 | type: 'FLAG', 4 | category: 'ASSESSMENT', 5 | display: 'Flag Placing', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: {}, 10 | }; 11 | -------------------------------------------------------------------------------- /src/tt-core/scenes/PDF/app.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable max-len */ 2 | export default { 3 | name: 'PDF', 4 | state: { 5 | "value": "", 6 | "responses": {}, 7 | "lessonType": "pdf", 8 | }, 9 | config: {}, 10 | actions: { 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /src/apps/timebox/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | 4 | Vue.use(Vuex); 5 | 6 | export default new Vuex.Store({ 7 | state: { 8 | }, 9 | mutations: { 10 | }, 11 | actions: { 12 | }, 13 | modules: { 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /src/tt-core/scenes/Text/app.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable max-len */ 2 | export default { 3 | name: 'Text', 4 | state: { 5 | "value": "", 6 | "responses": {}, 7 | "lessonType": "text", 8 | }, 9 | config: {}, 10 | actions: { 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PostConfirmation/src/custom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('@types/aws-lambda').APIGatewayProxyHandler} 3 | */ 4 | exports.handler = async (event, context) => { 5 | // insert code to be executed by your lambda trigger 6 | return event 7 | }; 8 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreAuthentication/src/custom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('@types/aws-lambda').APIGatewayProxyHandler} 3 | */ 4 | exports.handler = async (event, context) => { 5 | // insert code to be executed by your lambda trigger 6 | return event 7 | }; 8 | -------------------------------------------------------------------------------- /src/apps/lev-360-editor/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /src/apps/tt-360-editor/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /src/components/steps/types/TEXT_INPUT/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-text-short', 3 | type: 'TEXT_INPUT', 4 | category: 'ASSESSMENT', 5 | display: 'Text Input', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: {}, 10 | }; 11 | -------------------------------------------------------------------------------- /src/stores/user/state.js: -------------------------------------------------------------------------------- 1 | export default () => ({ 2 | user: null, 3 | data: {}, 4 | permissions: { 5 | pilot: [], 6 | pro: ['apps.canRemoveRemix', 'apps.canSetPrivate'], 7 | enterprise: ['apps.canRemoveRemix', 'apps.canSetPrivate'], 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/steps/types/HOTSPOTS/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-crosshairs', 3 | type: 'HOTSPOTS', 4 | category: 'ASSESSMENT', 5 | display: 'Clickable Hotspots', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: {}, 10 | }; 11 | -------------------------------------------------------------------------------- /src/components/steps/types/LINK_LAUNCHER/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-link-plus', 3 | type: 'LINK_LAUNCHER', 4 | category: 'OVERLAY', 5 | display: 'Link Launcher', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: {}, 10 | }; 11 | -------------------------------------------------------------------------------- /cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress'); 2 | 3 | module.exports = defineConfig({ 4 | e2e: { 5 | baseUrl: 'http://localhost:8080', 6 | setupNodeEvents(on, config) { 7 | // implement node event listeners here 8 | }, 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/stores/user/index.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /amplify/backend/function/StripeWebhook/src/event.json: -------------------------------------------------------------------------------- 1 | { 2 | "httpMethod": "POST", 3 | "path": "/item", 4 | "queryStringParameters": { 5 | "limit": "10" 6 | }, 7 | "headers": { 8 | "Content-Type": "application/json" 9 | }, 10 | "body": "{\"msg\":\"Hello from the event.json body\"}" 11 | } 12 | -------------------------------------------------------------------------------- /src/apps/lev-360-editor/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import user from '@/stores/user'; 4 | import apps from '@/features/apps/store'; 5 | 6 | Vue.use(Vuex); 7 | 8 | export default new Vuex.Store({ 9 | modules: { 10 | user, 11 | apps, 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /src/components/steps/types/GOTO/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-directions-fork', 3 | type: 'GOTO', 4 | category: 'OTHER', 5 | display: 'Goto Step', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: {}, 11 | }; 12 | -------------------------------------------------------------------------------- /src/stores/courses/index.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /src/stores/redirect/index.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /src/stores/sessions/index.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /src/components/steps/types/ENDING/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-wrench', 3 | type: 'ENDING', 4 | category: 'OTHER', 5 | display: 'Advanced Interaction', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: {}, 11 | }; 12 | -------------------------------------------------------------------------------- /src/features/assets/store/index.js: -------------------------------------------------------------------------------- 1 | import ResourceBase from '../../../stores/ResourceBase'; 2 | import state from './state'; 3 | import * as actions from './actions'; 4 | import mutations from './mutations'; 5 | import * as getters from './getters'; 6 | export default new ResourceBase({ state, actions, mutations, getters }); 7 | -------------------------------------------------------------------------------- /src/tt-core/services/Camera.js: -------------------------------------------------------------------------------- 1 | import Entity from './Entity'; 2 | 3 | export default class Camera extends Entity { 4 | constructor(scene, data) { 5 | super(scene, data); 6 | 7 | this.el.setAttribute('camera', ''); 8 | // this.el.setAttribute('cursor', 'rayOrigin: mouse'); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/actions/index.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/config/index.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/state/index.js: -------------------------------------------------------------------------------- 1 | import * as actions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /src/components/steps/types/SPONSOR_OVERLAY/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-wrench', 3 | type: 'SPONSOR_OVERLAY', 4 | category: 'OTHER', 5 | display: 'Transfer Thought Sponsor', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: {}, 11 | }; 12 | -------------------------------------------------------------------------------- /src/views/Assets.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "AppSyncApiName": "transferthought", 3 | "DynamoDBBillingMode": "PAY_PER_REQUEST", 4 | "DynamoDBEnableServerSideEncryption": false, 5 | "AuthCognitoUserPoolId": { 6 | "Fn::GetAtt": [ 7 | "authtransferthought1015a9c5", 8 | "Outputs.UserPoolId" 9 | ] 10 | } 11 | } -------------------------------------------------------------------------------- /src/components/steps/types/ADVANCED_INTERACTION/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-wrench', 3 | type: 'ADVANCED_INTERACTION', 4 | category: 'OTHER', 5 | display: 'Advanced Interaction', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: {}, 11 | }; 12 | -------------------------------------------------------------------------------- /src/tt-core/components/ui/index.js: -------------------------------------------------------------------------------- 1 | import './btn'; 2 | import './checkbox'; 3 | import './radio'; 4 | import './input-text'; 5 | import './rounded'; 6 | import './paging'; 7 | import './scroll-pane'; 8 | 9 | import Utils from './utils'; 10 | 11 | const utils = new Utils(); 12 | 13 | window.UI = { 14 | // Utils 15 | utils, 16 | }; 17 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreSignup/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "transferthought1015a9c5PreSignup", 3 | "version": "2.0.0", 4 | "description": "Lambda function generated by Amplify", 5 | "main": "index.js", 6 | "license": "Apache-2.0", 7 | "devDependencies": { 8 | "@types/aws-lambda": "^8.10.92" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/context/index.js: -------------------------------------------------------------------------------- 1 | import * as storeActions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions: storeActions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/query-params/index.js: -------------------------------------------------------------------------------- 1 | import * as storeActions from './actions'; 2 | import * as getters from './getters'; 3 | import mutations from './mutations'; 4 | import state from './state'; 5 | 6 | export default { 7 | namespaced: true, 8 | actions: storeActions, 9 | getters, 10 | mutations, 11 | state, 12 | }; 13 | -------------------------------------------------------------------------------- /src/components/steps/types/VIDEO_OVERLAY/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-video', 3 | type: 'VIDEO_OVERLAY', 4 | category: 'OVERLAY', 5 | display: 'Video Overlay', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: {}, 10 | isEmpty(stepData) { 11 | return !stepData.src; 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreAuthentication/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "transferthought1015a9c5PreAuthentication", 3 | "version": "2.0.0", 4 | "description": "Lambda function generated by Amplify", 5 | "main": "index.js", 6 | "license": "Apache-2.0", 7 | "devDependencies": { 8 | "@types/aws-lambda": "^8.10.92" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /amplify/backend/function/StripeCheckoutSession/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stripecheckoutsession", 3 | "version": "2.0.0", 4 | "description": "Lambda function generated by Amplify", 5 | "main": "index.js", 6 | "license": "Apache-2.0", 7 | "devDependencies": { 8 | "@types/aws-lambda": "^8.10.92", 9 | "stripe": "^8.222.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/assets/images/feature-tile-icon-02.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/steps/types/PICTURE_CHOICE/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-image-multiple', 3 | type: 'PICTURE_CHOICE', 4 | category: 'ASSESSMENT', 5 | display: 'Picture Choice', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: {}, 10 | isEmpty(stepData) { 11 | return !stepData.options; 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /src/components/steps/types/NARRATION_ONLY/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-account-voice', 3 | type: 'NARRATION_ONLY', 4 | category: 'OVERLAY', 5 | display: 'Narration Only', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: { 11 | showAutoProgressOptions: true, 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /src/components/steps/types/TITLE_OVERLAY/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-format-title', 3 | type: 'TITLE_OVERLAY', 4 | category: 'OVERLAY', 5 | display: 'Title Overlay', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: { 11 | showAutoProgressOptions: true, 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /src/directives/text.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /src/stores/sessions/getters.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/prefer-default-export */ 2 | import _ from 'lodash'; 3 | 4 | export const getSessionById = (state) => (sessionId) => state.byId[sessionId]; 5 | export const getCurrentSessionIdForUser = (state) => () => _.find(state.allIds, (sessionId) => { 6 | const session = state.byId[sessionId]; 7 | return session.completedAt === null; 8 | }); 9 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-visible.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('tt-visible', { 4 | schema: { visible: { default: true } }, 5 | 6 | update() { 7 | this.el.object3D.visible = this.data.visible; 8 | }, 9 | tick() { 10 | // eslint-disable-next-line no-undef 11 | TWEEN.update(TWEEN.now()); 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /src/components/steps/types/MULTIPLE_CHOICE/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-format-list-checkbox', 3 | type: 'MULTIPLE_CHOICE', 4 | category: 'ASSESSMENT', 5 | display: 'Multiple Choice', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: {}, 10 | isEmpty(stepData) { 11 | return !stepData.options; 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /src/components/steps/types/SET_ENVIRONMENT/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-image-filter-hdr', 3 | type: 'SET_ENVIRONMENT', 4 | category: 'OVERLAY', 5 | display: 'Set Environment', 6 | defaults: { 7 | autoProgressType: 'timeout', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: { 11 | showAutoProgressOptions: true, 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /src/assets/images/feature-tile-icon-05.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_cta.scss: -------------------------------------------------------------------------------- 1 | .cta-inner { 2 | padding-left: 16px; 3 | padding-right: 16px; 4 | background-color: get-color(primary, 1); 5 | background: linear-gradient(to right top, get-color(primary, 1) 0, get-color(primary, 3) 100%); 6 | } 7 | 8 | @include media( '>medium' ) { 9 | 10 | .cta-inner { 11 | padding-left: 48px; 12 | padding-right: 48px; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/features/assets/routes.js: -------------------------------------------------------------------------------- 1 | import { requiresAuth } from '@/utils/auth'; 2 | 3 | export const MyAssets = { 4 | path: '/assets', 5 | name: 'MyAssets', 6 | beforeEnter: requiresAuth, 7 | meta: { title: 'Transfer Thought | My Assets' }, 8 | component: () => import(/* webpackChunkName: "MyAssets" */ '@/features/assets/MyAssets.vue'), 9 | }; 10 | 11 | export default [MyAssets]; 12 | -------------------------------------------------------------------------------- /src/assets/images/illustration-element-01.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/steps/types/CLIPBOARD_OVERLAY/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-clipboard-outline', 3 | type: 'CLIPBOARD_OVERLAY', 4 | category: 'OVERLAY', 5 | display: 'Clipboard Overlay', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: { 11 | showAutoProgressOptions: true, 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /src/tt-core/components/remove-in-seconds.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | AFRAME.registerComponent('remove-in-seconds', { 4 | schema: { 5 | default: 1, 6 | }, 7 | 8 | init() { 9 | setTimeout(this.destroy.bind(this), this.data * 1000); 10 | }, 11 | 12 | destroy() { 13 | const { el } = this; 14 | el.parentNode.removeChild(el); 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /.graphqlconfig.yml: -------------------------------------------------------------------------------- 1 | projects: 2 | transferthought: 3 | schemaPath: src/tt-api/graphql/schema.json 4 | includes: 5 | - src/graphql/**/*.js 6 | excludes: 7 | - ./amplify/** 8 | extensions: 9 | amplify: 10 | codeGenTarget: javascript 11 | generatedFileName: '' 12 | docsFilePath: src/tt-api/graphql 13 | extensions: 14 | amplify: 15 | version: 3 16 | -------------------------------------------------------------------------------- /amplify/backend/function/StripeWebhook/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stripewebhook", 3 | "version": "1.0.0", 4 | "description": "Lambda function generated by Amplify", 5 | "main": "index.js", 6 | "license": "Apache-2.0", 7 | "dependencies": { 8 | "stripe": "^8.222.0" 9 | }, 10 | "devDependencies": { 11 | "@types/aws-lambda": "^8.10.92" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /public/captions/Johanna.txt: -------------------------------------------------------------------------------- 1 | It's not easy...little Jay is breastfeeding a lot these days. 2 | Well it feels like I never sleep and we have these meetings so early. 3 | I drive here and you know they just changed the baby seat requirements. Jay isn't a big baby but he does take up a lot of room length�wise. He also doesn't sleep much it seems like. Did I say that already? 4 | I feel like I'm dominating the conversation. -------------------------------------------------------------------------------- /src/stores/user/getters.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/prefer-default-export */ 2 | import _ from 'lodash'; 3 | 4 | export const permissions = (state) => { 5 | return state.permissions[state.data.plan]; 6 | }; 7 | 8 | export const hasAccess = (state, getters) => (settingSelector) => { 9 | const permissions = getters['permissions']; 10 | return _.includes(permissions, settingSelector); 11 | }; 12 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-interactable.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('tt-interactable', { 4 | schema: { value: { default: true } }, 5 | 6 | update() { 7 | if (this.data.value) { 8 | this.el.classList.add('interactable'); 9 | } else { 10 | this.el.classList.remove('interactable'); 11 | } 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /src/stores/ResourceBase/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | entitiesById: {}, 3 | entityIds: [], 4 | subscriptionStatus: 'IDLE', 5 | singleStatus: 'IDLE', 6 | listStatus: 'IDLE', 7 | defaults: {}, 8 | queries: { 9 | list: null, 10 | single: null, 11 | }, 12 | mutations: { 13 | create: null, 14 | update: null, 15 | delete: null, 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /amplify/backend/predictions/transcriptionb08cd37b/parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "resourceName": "transcriptionb08cd37b", 3 | "convertPolicyName": "transcriptionPolicyb08cd37b", 4 | "authRoleName": { 5 | "Ref": "AuthRoleName" 6 | }, 7 | "unauthRoleName": { 8 | "Ref": "UnauthRoleName" 9 | }, 10 | "convertType": "transcription", 11 | "language": "en-US", 12 | "access": "auth" 13 | } -------------------------------------------------------------------------------- /src/assets/images/feature-tile-icon-01.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/images/illustration-section-01.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/steps/types/IMAGE_OVERLAY/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-image', 3 | type: 'IMAGE_OVERLAY', 4 | category: 'OVERLAY', 5 | display: 'Image Overlay', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | }, 9 | settings: { 10 | showAutoProgressOptions: true, 11 | }, 12 | isEmpty(stepData) { 13 | return !stepData.src; 14 | }, 15 | }; 16 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PostConfirmation/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "transferthought1015a9c5PostConfirmation", 3 | "version": "2.0.0", 4 | "description": "Lambda function generated by Amplify", 5 | "main": "index.js", 6 | "license": "Apache-2.0", 7 | "dependencies": { 8 | "axios": "latest" 9 | }, 10 | "devDependencies": { 11 | "@types/aws-lambda": "^8.10.92" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/tt-core/scenes/editor_360/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | selectedEnvironment: 'forest', 5 | workerModel: '#Spanner1', 6 | }; 7 | 8 | const handlers = { 9 | selectEnvironment(state, action) { 10 | console.log(action); 11 | state.selectedEnvironment = action.environment; 12 | }, 13 | }; 14 | 15 | export { 16 | initialState, 17 | handlers, 18 | }; 19 | -------------------------------------------------------------------------------- /src/tt-core/scenes/editor_basic/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | selectedEnvironment: 'forest', 5 | workerModel: '#Spanner1', 6 | }; 7 | 8 | const handlers = { 9 | selectEnvironment(state, action) { 10 | console.log(action); 11 | state.selectedEnvironment = action.environment; 12 | }, 13 | }; 14 | 15 | export { 16 | initialState, 17 | handlers, 18 | }; 19 | -------------------------------------------------------------------------------- /amplify/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Amplify CLI 2 | This directory was generated by [Amplify CLI](https://docs.amplify.aws/cli). 3 | 4 | Helpful resources: 5 | - Amplify documentation: https://docs.amplify.aws. 6 | - Amplify CLI documentation: https://docs.amplify.aws/cli. 7 | - More details on this folder & generated files: https://docs.amplify.aws/cli/reference/files. 8 | - Join Amplify's community: https://amplify.aws/community/. 9 | -------------------------------------------------------------------------------- /src/components/steps/types/EMBED_OVERLAY/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-application-brackets', 3 | type: 'EMBED_OVERLAY', 4 | category: 'OVERLAY', 5 | display: 'HTML Overlay', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: { 10 | showAutoProgressOptions: true, 11 | }, 12 | isEmpty(stepData) { 13 | return !stepData.src; 14 | }, 15 | }; 16 | -------------------------------------------------------------------------------- /src/stores/courses/mutations.js: -------------------------------------------------------------------------------- 1 | import { _ } from 'core-js'; 2 | 3 | export default { 4 | setCourses(state, courses) { 5 | state.list = courses; 6 | }, 7 | addNewCourse(state, course) { 8 | state.list.unshift(course); 9 | }, 10 | removeCourse(state, courseId) { 11 | const index = _.findIndex(state.list, { id: courseId }); 12 | state.list.splice(index, 1); 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /src/tt-core/scenes/charts/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | selectedEnvironment: 'forest', 5 | workerModel: '#Spanner1', 6 | }; 7 | 8 | const handlers = { 9 | selectEnvironment(state, action) { 10 | console.log(action); 11 | state.selectedEnvironment = action.environment; 12 | }, 13 | }; 14 | 15 | export { 16 | initialState, 17 | handlers, 18 | }; 19 | -------------------------------------------------------------------------------- /amplify/hooks/README.md: -------------------------------------------------------------------------------- 1 | # Command Hooks 2 | 3 | Command hooks can be used to run custom scripts upon Amplify CLI lifecycle events like pre-push, post-add-function, etc. 4 | 5 | To get started, add your script files based on the expected naming convention in this directory. 6 | 7 | Learn more about the script file naming convention, hook parameters, third party dependencies, and advanced configurations at https://docs.amplify.aws/cli/usage/command-hooks 8 | -------------------------------------------------------------------------------- /src/apps/tt-app/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import user from '@/stores/user'; 4 | import apps from '@/features/apps/store'; 5 | import assets from '@/features/assets/store'; 6 | import sessions from '@/stores/sessions'; 7 | 8 | Vue.use(Vuex); 9 | 10 | export default new Vuex.Store({ 11 | modules: { 12 | user, 13 | apps, 14 | assets, 15 | sessions, 16 | }, 17 | }); 18 | -------------------------------------------------------------------------------- /src/assets/scss/settings/patterns/_tiles.scss: -------------------------------------------------------------------------------- 1 | // Tiles (core/patterns/_tiles.scss) 2 | $tiles-items--padding__mobile: 24px; // padding between tiles (mobile) 3 | $tiles-items--padding__desktop: null; // padding between tiles (desktop) 4 | $tiles-item--width: 330px; // tile item, width 5 | $tiles-item--inner-padding-v: 32px; // tile item, inner top and bottom padding 6 | $tiles-item--inner-padding-h: 24px; // tile item, inner left and right padding 7 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/query-params/mutations.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export default { 4 | init(state) { 5 | const { query } = window.TT.router.currentRoute; 6 | _.forEach(query, (value, key) => { 7 | state[key] = value; 8 | }); 9 | }, 10 | update(state, payload) { 11 | const { selector, value } = payload; 12 | _.set(state.state, selector, value); 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /src/stores/steps/index.js: -------------------------------------------------------------------------------- 1 | import { createAppStatePlugin } from './plugins'; 2 | import * as storeActions from './actions'; 3 | import * as getters from './getters'; 4 | import mutations from './mutations'; 5 | import state from './state'; 6 | 7 | export default { 8 | namespaced: true, 9 | actions: storeActions, 10 | getters, 11 | mutations, 12 | state, 13 | }; 14 | 15 | export const plugins = []; // [createAppStatePlugin()]; 16 | -------------------------------------------------------------------------------- /src/tt-core/scenes/avatar_recording/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | selectedEnvironment: 'forest', 5 | workerModel: '#Spanner1', 6 | }; 7 | 8 | const handlers = { 9 | selectEnvironment(state, action) { 10 | console.log(action); 11 | state.selectedEnvironment = action.environment; 12 | }, 13 | }; 14 | 15 | export { 16 | initialState, 17 | handlers, 18 | }; 19 | -------------------------------------------------------------------------------- /src/components/steps/types/TABLE_OVERLAY/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-table', 3 | type: 'TABLE_OVERLAY', 4 | category: 'OVERLAY', 5 | display: 'Table Overlay', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | }, 9 | settings: { 10 | showAutoProgressOptions: true, 11 | }, 12 | isEmpty(stepData) { 13 | return !stepData.getFieldsAction && !stepData.getValuesAction; 14 | }, 15 | }; 16 | -------------------------------------------------------------------------------- /amplify/.config/project-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "providers": [ 3 | "awscloudformation" 4 | ], 5 | "projectName": "TransferThought", 6 | "version": "3.1", 7 | "frontend": "javascript", 8 | "javascript": { 9 | "framework": "vue", 10 | "config": { 11 | "SourceDir": "src", 12 | "DistributionDir": "dist", 13 | "BuildCommand": "npm.cmd run-script build", 14 | "StartCommand": "npm.cmd run-script serve" 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreSignup/src/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/aws-lambda@^8.10.92": 6 | version "8.10.138" 7 | resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.138.tgz#11d0b6978c00ab34c38532f04306bb2e6f78163e" 8 | integrity sha512-71EHMl70TPWIAsFuHd85NHq6S6T2OOjiisPTrH7RgcjzpJpPh4RQJv7PvVvIxc6PIp8CLV7F9B+TdjcAES5vcA== 9 | -------------------------------------------------------------------------------- /amplify/backend/predictions/speechGeneratoreebef0ec/parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "resourceName": "speechGeneratoreebef0ec", 3 | "convertPolicyName": "speechGeneratorPolicyeebef0ec", 4 | "authRoleName": { 5 | "Ref": "AuthRoleName" 6 | }, 7 | "unauthRoleName": { 8 | "Ref": "UnauthRoleName" 9 | }, 10 | "convertType": "speechGenerator", 11 | "language": "en-US", 12 | "voice": "Joanna", 13 | "access": "authAndGuest" 14 | } -------------------------------------------------------------------------------- /src/components/steps/types/DEFAULT/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-format-title', 3 | type: 'DEFAULT', 4 | category: 'OVERLAY', 5 | display: 'Default', 6 | defaults: { 7 | autoProgressType: 'transcript', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: { 11 | showAutoProgressOptions: true, 12 | }, 13 | getTextFromResponseData(stepData, responseData) { 14 | return ''; 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreAuthentication/src/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/aws-lambda@^8.10.92": 6 | version "8.10.138" 7 | resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.138.tgz#11d0b6978c00ab34c38532f04306bb2e6f78163e" 8 | integrity sha512-71EHMl70TPWIAsFuHd85NHq6S6T2OOjiisPTrH7RgcjzpJpPh4RQJv7PvVvIxc6PIp8CLV7F9B+TdjcAES5vcA== 9 | -------------------------------------------------------------------------------- /src/assets/scss/settings/elements/_accordion.scss: -------------------------------------------------------------------------------- 1 | // Accordion (core/elements/_accordion.scss) 2 | $accordion-item--padding-v: 24px; // accordion item, top and bottom padding 3 | $accordion-item--padding-h: null; // accordion item, left and right padding 4 | $accordion-icon--size: 16px; // accordion icon, width and height 5 | $accordion-icon--thickness: 2px; // accordion icon, stroke width 6 | $accordion-icon--radius: null; // accordion icon, lines radius cap 7 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_buttons.scss: -------------------------------------------------------------------------------- 1 | .button { 2 | @include font-family(heading); 3 | box-shadow: 0 8px 16px rgba(get-color(dark, 1), .12); 4 | 5 | &:not(.button-dark):not(.button-primary):not(.button-secondary) { 6 | background: linear-gradient(65deg, get-color(light, 1) 0, rgba(get-color(light, 1), .8) 100%); 7 | background-origin: border-box; 8 | 9 | &:hover { 10 | background-color: color-bg(button-light-hover); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/views/WhiteLabel.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 24 | -------------------------------------------------------------------------------- /src/assets/images/feature-tile-icon-04.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/steps/types/DEFAULT/View.vue: -------------------------------------------------------------------------------- 1 | 4 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/schema/Redirects.graphql: -------------------------------------------------------------------------------- 1 | type Redirect 2 | @model 3 | @key(fields: ["source"]) 4 | @key(name: "SourceByDestination", fields: ["destination"], queryField: "sourceByDestination") 5 | @auth(rules: [{ allow: public, operations: [read] }, { allow: private, operations: [read] }, { allow: owner, operations: [create, update, delete] }]) { 6 | source: String! 7 | destination: String! 8 | createdAt: AWSDateTime! 9 | updatedAt: AWSDateTime! 10 | } 11 | -------------------------------------------------------------------------------- /src/stores/user/mutations.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export default { 4 | setUser(state, { authUser, userData }) { 5 | state.authorized = !!authUser && authUser.attributes && authUser.attributes.email_verified; 6 | state.user = authUser; 7 | state.data = userData; 8 | }, 9 | updateUserData(state, { key, value }) { 10 | state.data[key] = value; 11 | }, 12 | updateUserPlan(state, plan) { 13 | state.data.plan = plan; 14 | }, 15 | }; 16 | -------------------------------------------------------------------------------- /src/assets/scss/scenario_global.scss: -------------------------------------------------------------------------------- 1 | .pointer-events-none, 2 | .pointer-events-none * { 3 | pointer-events: none !important; 4 | } 5 | .user-select-none, 6 | .user-select-none * { 7 | user-select: none !important; 8 | } 9 | 10 | .pointer-events-auto, 11 | .pointer-events-auto * { 12 | pointer-events: auto !important; 13 | } 14 | .user-select-auto, 15 | .user-select-auto * { 16 | user-select: auto !important; 17 | } 18 | 19 | .flex-wrap-no-wrap { 20 | flex-wrap: nowrap !important; 21 | } 22 | -------------------------------------------------------------------------------- /src/components/editor/input-controllers/NumberInput.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 22 | -------------------------------------------------------------------------------- /src/tt-core/components/handle-events.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('handle-events', { 4 | init() { 5 | const { el } = this; 6 | this.el.addEventListener('click', () => { 7 | if (AFRAME.scenes[0].systems.state.state.step === 'SELECT_CHARACTER' || AFRAME.scenes[0].systems.state.state.step === 'ROUND_2') { 8 | AFRAME.scenes[0].emit('personSelected', { character: el.id }); 9 | } 10 | }); 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-overlay.js: -------------------------------------------------------------------------------- 1 | AFRAME.registerComponent('tt-overlay', { 2 | dependencies: [], 3 | init: function() { 4 | this.el.sceneEl.renderer.sortObjects = true; 5 | this.el.object3D.renderOrder = 100; 6 | if (this.el.components.material) { 7 | this.el.components.material.material.depthTest = false; 8 | } 9 | if (this.el.components.text) { 10 | this.el.components.text.material.depthTest = false; 11 | } 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /src/directives/size.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /src/components/steps/types/DEFAULT/OptionsEditor.vue: -------------------------------------------------------------------------------- 1 | 2 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/assets/scss/settings/base/_scroll-reveal.scss: -------------------------------------------------------------------------------- 1 | $scroll-reveal--transition-duration: 0.8s; 2 | $scroll-reveal--transition-timing: cubic-bezier(0.39, 0.575, 0.565, 1); 3 | $scroll-reveal--from-top-amount: -10px; 4 | $scroll-reveal--from-bottom-amount: 10px; 5 | $scroll-reveal--from-left-amount: -10px; 6 | $scroll-reveal--from-right-amount: 10px; 7 | $scroll-reveal--scale-up-amount: 0.95; 8 | $scroll-reveal--scale-down-amount: 1.05; 9 | $scroll-reveal--rotate-from-left-amount: -45deg; 10 | $scroll-reveal--rotate-from-right-amount: 45deg; 11 | -------------------------------------------------------------------------------- /src/mixins/RoutingMixin.js: -------------------------------------------------------------------------------- 1 | export default { 2 | data: {}, 3 | methods: { 4 | getRouteHref(name, params) { 5 | const routeData = this.$router.resolve({ name, params }); 6 | return routeData.href; 7 | }, 8 | to(name, params, newWindow) { 9 | if (newWindow) { 10 | window.open(this.getRouteHref(name, params), '_blank'); 11 | } else { 12 | this.$router.push({ name, params }); 13 | } 14 | }, 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | Artboard 46 2 | -------------------------------------------------------------------------------- /cypress/e2e/auth/login.cy.js: -------------------------------------------------------------------------------- 1 | describe('The Sign In Page', () => { 2 | beforeEach(() => {}); 3 | 4 | it('sets auth cookie when logging in via form submission', function() { 5 | cy.visit('/signin'); 6 | 7 | cy.get('input#user-email').type('support@transferthought.com'); 8 | 9 | // {enter} causes the form to submit 10 | cy.get('input#user-password').type(`TT_Support123{enter}`); 11 | 12 | const fullUrl = Cypress.config('baseUrl') + '/'; 13 | cy.url().should('equal', fullUrl); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/features/assets/views/SharedAssetsView.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 28 | 30 | -------------------------------------------------------------------------------- /src/apps/twinlab/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import user from '@/stores/user'; 4 | import apps from '@/features/apps/store'; 5 | import sessions from '@/stores/sessions'; 6 | import courses from '@/stores/courses'; 7 | import steps, { plugins } from '@/stores/steps'; 8 | 9 | Vue.use(Vuex); 10 | 11 | export default new Vuex.Store({ 12 | modules: { 13 | user, 14 | sessions, 15 | apps, 16 | courses, 17 | assets, 18 | steps, 19 | }, 20 | plugins: [...plugins], 21 | }); 22 | -------------------------------------------------------------------------------- /src/assets/scss/theme/sections/_news.scss: -------------------------------------------------------------------------------- 1 | .news { 2 | 3 | .tiles-item-inner { 4 | background: get-color(dark, 2); 5 | } 6 | } 7 | 8 | 9 | .news-item-title { 10 | 11 | a { 12 | color: get-color(light, 1) !important; 13 | text-decoration: none; 14 | } 15 | } 16 | 17 | .news-item-more { 18 | @include font-weight(header-link); 19 | 20 | a { 21 | color: get-color(light, 1); 22 | text-decoration: none; 23 | 24 | &:hover { 25 | color: get-color(primary, 1); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/components/editor/input-controllers/BooleanInput.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 24 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-position.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('tt-position', { 4 | schema: { 5 | x: { type: 'number' }, 6 | y: { type: 'number' }, 7 | z: { type: 'number' }, 8 | }, 9 | 10 | update() { 11 | const { object3D } = this.el; 12 | const { data } = this; 13 | object3D.position.set(data.x, data.y, data.z); 14 | }, 15 | 16 | remove() { 17 | // Pretty much for mixins. 18 | this.el.object3D.position.set(0, 0, 0); 19 | }, 20 | }); 21 | -------------------------------------------------------------------------------- /src/stores/steps/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | setCurrentStepIndex(state, newIndex) { 3 | state.currentStepIndex = newIndex; 4 | }, 5 | setStarted(state, started) { 6 | state.started = started; 7 | }, 8 | setPause(state, pause) { 9 | state.paused = pause; 10 | }, 11 | setTranscriptPlaying(state, transcriptPlaying) { 12 | state.transcriptPlaying = transcriptPlaying; 13 | }, 14 | setTranscriptFinished(state, transcriptFinished) { 15 | state.transcriptFinished = transcriptFinished; 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_roadmap.scss: -------------------------------------------------------------------------------- 1 | // Roadmap (core/sections/_roadmap.scss) ----------------------------- 2 | $roadmap--padding-t__mobile: null; // roadmap, top padding (mobile) 3 | $roadmap--padding-b__mobile: null; // roadmap, bottom padding (mobile) 4 | $roadmap--padding-t__desktop: null; // roadmap, top padding (desktop) 5 | $roadmap--padding-b__desktop: null; // roadmap, bottom padding (desktop) 6 | $roadmap-header--padding__mobile: null; // roadmap header, bottom padding (mobile) 7 | $roadmap-header--padding__desktop: null; // roadmap header, bottom padding (desktop) -------------------------------------------------------------------------------- /src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import store from '@/apps/tt-360-editor/store'; 2 | 3 | export const requiresAuth = (to, from, next) => { 4 | console.log('to', to); 5 | if (store.state.user.user) { 6 | next(); 7 | } else if (to.meta.noAuthRedirectPath) { 8 | next(`${to.meta.noAuthRedirectPath}?redirect=${to.path}`); 9 | } else { 10 | next(`/signin?redirect=${to.path}`); 11 | } 12 | }; 13 | 14 | export const checkAuth = (to, from, next) => { 15 | if (store.state.user.user) { 16 | next('/'); 17 | } else { 18 | next(); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/assets/scss/core/sections/_roadmap.scss: -------------------------------------------------------------------------------- 1 | .roadmap { 2 | 3 | .section-inner { 4 | padding-top: $roadmap--padding-t__mobile; 5 | padding-bottom: $roadmap--padding-b__mobile; 6 | } 7 | 8 | .section-header { 9 | padding-bottom: $roadmap-header--padding__mobile; 10 | } 11 | } 12 | 13 | @include media( '>medium' ) { 14 | 15 | .roadmap { 16 | 17 | .section-inner { 18 | padding-top: $roadmap--padding-t__desktop; 19 | padding-bottom: $roadmap--padding-b__desktop; 20 | } 21 | 22 | .section-header { 23 | padding-bottom: $roadmap-header--padding__desktop; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/context/actions.js: -------------------------------------------------------------------------------- 1 | export function setSelectedEntityId({ commit }, selectedEntityId) { 2 | commit('update', { selector: 'selectedEntityId', value: selectedEntityId }); 3 | if (!selectedEntityId) { 4 | commit('update', { selector: 'inAnimationMode', value: false }); 5 | } 6 | const camera = document.getElementById('camera'); 7 | if (camera) { 8 | const lookControls = camera.components['tt-look-controls']; 9 | if (lookControls) { 10 | lookControls.data.reverseMouseDrag = !selectedEntityId; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/apps/paintchat/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import VueRouter from 'vue-router'; 3 | 4 | Vue.use(VueRouter); 5 | 6 | const routes = [ 7 | { 8 | path: '/', 9 | name: 'PaintChatHome', 10 | component: () => import(/* webpackChunkName: "paintchat" */ '@/views/PaintChatHome.vue'), 11 | }, 12 | { 13 | path: '/:roomId', 14 | name: 'PaintChat', 15 | component: () => import(/* webpackChunkName: "paintchat" */ '@/views/PaintChat.vue'), 16 | }, 17 | ]; 18 | 19 | const router = new VueRouter({ 20 | routes, 21 | }); 22 | 23 | export default router; 24 | -------------------------------------------------------------------------------- /src/assets/scss/theme/illustrations/_illustrations.scss: -------------------------------------------------------------------------------- 1 | [class*=illustration-] { 2 | position: relative; 3 | 4 | &::after { 5 | pointer-events: none; 6 | } 7 | } 8 | 9 | [class*=illustration-element-]::after { 10 | z-index: -1; 11 | } 12 | 13 | [class*=illustration-section-]::after { 14 | z-index: -2; 15 | } 16 | 17 | // Hero illustration 18 | .illustration-section-01::after { 19 | @include illustration('illustration-section-01.svg', 100%, 362px, top); 20 | } 21 | 22 | // Behind hero figure 23 | .illustration-element-01::after { 24 | @include illustration('illustration-element-01.svg', 150%, 150%); 25 | } -------------------------------------------------------------------------------- /src/apps/patientlibrary/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import user from '@/stores/user'; 4 | import apps from '@/features/apps/store'; 5 | import sessions from '@/stores/sessions'; 6 | import courses from '@/stores/courses'; 7 | import assets from '@/features/assets/store'; 8 | import steps, { plugins } from '@/stores/steps'; 9 | 10 | Vue.use(Vuex); 11 | 12 | export default new Vuex.Store({ 13 | modules: { 14 | user, 15 | sessions, 16 | apps, 17 | courses, 18 | assets, 19 | steps, 20 | }, 21 | plugins: [...plugins], 22 | }); 23 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/schema/Course.graphql: -------------------------------------------------------------------------------- 1 | 2 | type Course 3 | @model 4 | @key(name: "OwnerCoursesByTitle", fields: ["owner", "title"], queryField: "ownerCoursesByTitle") 5 | @auth( 6 | rules: [ 7 | { allow: public, operations: [read] }, 8 | { allow: private, operations: [read] } 9 | { allow: owner, operations: [create, update, delete]} 10 | ] 11 | ) 12 | { 13 | id: ID!, 14 | title: String!, 15 | description: String, 16 | owner: String, 17 | sections: String!, 18 | thumbnailUrl: String, 19 | createdAt: AWSDateTime!, 20 | updatedAt: AWSDateTime! 21 | } -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | jest: true 6 | }, 7 | extends: [ 8 | 'plugin:vue/recommended', 9 | '@vue/airbnb', 10 | ], 11 | rules: { 12 | "vue/html-indent": ["error", 4], 13 | indent: ['error', 4], 14 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 15 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 16 | 'max-len': ["error", { "code": 160 }], 17 | }, 18 | parserOptions: { 19 | parser: 'babel-eslint', 20 | }, 21 | }; 22 | -------------------------------------------------------------------------------- /src/scss/variables.scss: -------------------------------------------------------------------------------- 1 | // Here we change the inside variables of Vuetify 2 | // The Argon Design variables are located in "src/assets/scss/argon" 3 | 4 | // @import "variables/typography"; 5 | // @import "variables/icons"; 6 | // @import "variables/list-item"; 7 | // @import "variables/forms"; 8 | // @import "variables/buttons"; 9 | // @import "variables/card"; 10 | // @import "variables/light-theme"; 11 | // @import "variables/border-radius"; 12 | // @import "variables/alerts"; 13 | // @import "variables/timeline"; 14 | // @import "variables/switch"; 15 | // @import "variables/pagination"; 16 | // @import "variables/sliders"; 17 | -------------------------------------------------------------------------------- /src/apps/timebox/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import VueRouter from 'vue-router'; 3 | 4 | Vue.use(VueRouter); 5 | 6 | const routes = [ 7 | { 8 | path: '/', 9 | name: 'VideoConferenceHome', 10 | component: () => import(/* webpackChunkName: "timebox" */ '@/views/VideoConferenceHome.vue'), 11 | }, 12 | { 13 | path: '/:roomId', 14 | name: 'VideoConference', 15 | component: () => import(/* webpackChunkName: "timebox" */ '@/views/VideoConference.vue'), 16 | }, 17 | ]; 18 | 19 | const router = new VueRouter({ 20 | routes, 21 | }); 22 | 23 | export default router; 24 | -------------------------------------------------------------------------------- /src/stores/steps/utils.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/prefer-default-export */ 2 | 3 | import Client from '@/tt-api'; 4 | export const getStepTypeData = (step) => ({ 5 | title: step.name, 6 | }); 7 | 8 | export function getDefaultTexture(modelType) { 9 | if (modelType === 'female') { 10 | return `${Client.getAssetBase()}/Transfer_Thought_Media/avatars/females/textures/Female (19).jpg`; 11 | } 12 | return `${Client.getAssetBase()}/Transfer_Thought_Media/avatars/males/textures/Male (1).png`; 13 | } 14 | 15 | export function getModelType(src) { 16 | return _.includes(src, 'Female') ? 'female' : 'male'; 17 | } 18 | -------------------------------------------------------------------------------- /src/assets/scss/core/sections/_section.scss: -------------------------------------------------------------------------------- 1 | .section-inner { 2 | position: relative; // To always display inner elements above pseudo decorative stuff 3 | padding-top: $section--padding__mobile; 4 | padding-bottom: $section--padding__mobile; 5 | } 6 | 7 | .section-header { 8 | padding-bottom: $section-header--padding__mobile; 9 | } 10 | 11 | @include media( '>medium' ) { 12 | 13 | .section-inner { 14 | padding-top: $section--padding__desktop; 15 | padding-bottom: $section--padding__desktop; 16 | } 17 | 18 | .section-header { 19 | padding-bottom: $section-header--padding__desktop; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_cta.scss: -------------------------------------------------------------------------------- 1 | // Call to action (core/sections/_cta.scss) 2 | $cta--padding-t__mobile: 48px; // cta, top padding (mobile) 3 | $cta--padding-b__mobile: 48px; // cta, bottom padding (mobile) 4 | $cta--padding-t__desktop: 64px; // cta, top padding (desktop) 5 | $cta--padding-b__desktop: 64px; // cta, bottom padding (desktop) 6 | $cta-slogan--padding-v__mobile: 40px; // cta slogan, margin bottom (mobile) 7 | $cta-slogan--padding-v__desktop: null; // cta slogan, margin bottom (desktop) 8 | $cta-slogan--padding-h__desktop: 48px; // cta slogan, minimum distance between slogan and actions (only .cta-split desktop) 9 | -------------------------------------------------------------------------------- /src/tt-core/scenes/mouse_interaction_test/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | //color randomizer 3 | AFRAME.registerComponent('color-randomizer', { 4 | play: function () { 5 | this.el.addEventListener('drag-drop', function (evt) { 6 | evt.detail.dropped.setAttribute('material', 'color', 7 | '#'+Math.random().toString(16).substr(-6)) 8 | // color randomizer credit: http://stackoverflow.com/questions/1484506/random-color-generator-in-javascript#comment6801353_5365036 9 | }) 10 | } 11 | }) 12 | const initialState = { 13 | }; 14 | 15 | const handlers = { 16 | }; 17 | 18 | export { 19 | initialState, 20 | handlers, 21 | }; 22 | -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_hero.scss: -------------------------------------------------------------------------------- 1 | // Hero (core/sections/_hero.scss) ----------------------------- 2 | $hero--padding-t__mobile: null; // hero, top padding (mobile) 3 | $hero--padding-b__mobile: null; // hero, bottom padding (mobile) 4 | $hero--padding-t__desktop: null; // hero, top padding (desktop) 5 | $hero--padding-b__desktop: null; // hero, bottom padding (desktop) 6 | $hero--inner-padding-v_mobile: 48px; // vertical padding, i.e. padding between content and image (mobile, both hero split and hero full) 7 | $hero--inner-padding-v_desktop: 64px; // vertical padding, i.e. padding between content and image (desktop, only hero full) 8 | -------------------------------------------------------------------------------- /src/tt-core/scenes/biometric_visualizer/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | breathSize: "1 1 1" 5 | }; 6 | 7 | const handlers = { 8 | breathSize(state, action) { 9 | state.breathSize = action + " " + action + " " + action; 10 | }, 11 | }; 12 | 13 | window.tt = {}; 14 | window.tt.videoSpeed = function (newSpeed) { 15 | const entity = document.querySelector('#forest'); 16 | entity.playbackRate = newSpeed; 17 | }; 18 | window.tt.breathSize = function (newSize) { 19 | AFRAME.scenes[0].emit('breathSize', newSize); 20 | }; 21 | 22 | export { 23 | initialState, 24 | handlers, 25 | }; 26 | -------------------------------------------------------------------------------- /src/views/NotFound.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | 25 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/schema/Session.graphql: -------------------------------------------------------------------------------- 1 | type Session 2 | @model 3 | @key(name: "UserSessionsByAppId", fields: ["owner", "appId"], queryField: "userSessionsByAppId") 4 | @key(name: "SessionsByAppId", fields: ["appId", "createdAt"], queryField: "sessionsByAppId") 5 | @auth( 6 | rules: [{ allow: public, operations: [read, create] }, { allow: private, operations: [read] }, { allow: owner, operations: [create, update, delete] }] 7 | ) { 8 | id: ID! 9 | owner: String 10 | appId: ID! 11 | data: String! 12 | createdAt: AWSDateTime! 13 | updatedAt: AWSDateTime! 14 | completedAt: AWSDateTime 15 | } 16 | -------------------------------------------------------------------------------- /src/assets/scss/core/sections/_features-split.scss: -------------------------------------------------------------------------------- 1 | .features-split { 2 | 3 | .section-inner { 4 | padding-top: $features-split--padding-t__mobile; 5 | padding-bottom: $features-split--padding-b__mobile; 6 | } 7 | 8 | .section-header { 9 | padding-bottom: $features-split-header--padding__mobile; 10 | } 11 | } 12 | 13 | @include media( '>medium' ) { 14 | 15 | .features-split { 16 | 17 | .section-inner { 18 | padding-top: $features-split--padding-t__desktop; 19 | padding-bottom: $features-split--padding-b__desktop; 20 | } 21 | 22 | .section-header { 23 | padding-bottom: $features-split-header--padding__desktop; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /amplify/backend/function/CreateAssetVariation/function-parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "permissions": { 3 | "api": { 4 | "transferthought": [ 5 | "create", 6 | "read", 7 | "update", 8 | "delete" 9 | ] 10 | }, 11 | "storage": { 12 | "s3f39ed916": [ 13 | "create", 14 | "read", 15 | "update", 16 | "delete" 17 | ], 18 | "Asset:@model(appsync)": [ 19 | "create", 20 | "read", 21 | "update", 22 | "delete" 23 | ] 24 | } 25 | }, 26 | "lambdaLayers": [], 27 | "secretNames": [ 28 | "app_sync_api_key", 29 | "app_sync_url" 30 | ] 31 | } -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_features-split.scss: -------------------------------------------------------------------------------- 1 | // Features split (core/sections/_features-split.scss) --------- 2 | $features-split--padding-t__mobile: null; // features split, top padding (mobile) 3 | $features-split--padding-b__mobile: null; // features split, bottom padding (mobile) 4 | $features-split--padding-t__desktop: null; // features split, top padding (desktop) 5 | $features-split--padding-b__desktop: null; // features split, bottom padding (desktop) 6 | $features-split-header--padding__mobile: null; // features split header, bottom padding (mobile) 7 | $features-split-header--padding__desktop: 92px; // features split header, bottom padding (desktop) 8 | -------------------------------------------------------------------------------- /src/components/TTButton.vue: -------------------------------------------------------------------------------- 1 | 4 | 12 | 33 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-data-tag.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('tt-data-tag', { 4 | schema: { 5 | enabled: { 6 | default: true, 7 | }, 8 | key: { 9 | default: null, 10 | }, 11 | value: { 12 | default: null, 13 | }, 14 | }, 15 | 16 | update(previousData) { 17 | if (previousData.key) { 18 | delete this.el.dataset[previousData.key]; 19 | } 20 | if (this.data.enabled && this.data.key && this.data.value) { 21 | this.el.dataset[this.data.key] = this.data.value; 22 | } 23 | }, 24 | }); 25 | -------------------------------------------------------------------------------- /src/components/steps/types/EMBED_OVERLAY/View.vue: -------------------------------------------------------------------------------- 1 | 6 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/tt-core/scenes/gitfolio/state.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import * as AFRAME from 'aframe'; 3 | 4 | const initialState = { 5 | user: 'kkarich', 6 | repositoryList: [], 7 | }; 8 | 9 | const handlers = { 10 | fetchRepos() { 11 | console.log('Fetching repos'); 12 | 13 | axios.get('https://api.github.com/users/kkarich/repos').then((res) => { 14 | const { data } = res; 15 | AFRAME.scenes[0].emit('updateRepos', data); 16 | }); 17 | }, 18 | updateRepos(state, action) { 19 | state.repositoryList.push(...action); 20 | }, 21 | }; 22 | 23 | export { 24 | initialState, 25 | handlers, 26 | }; 27 | -------------------------------------------------------------------------------- /src/components/editor/input-controllers/EntityIdInput.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | -------------------------------------------------------------------------------- /src/tt-core/components/transform-gizmo.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js'; 3 | 4 | AFRAME.registerComponent('transform-gizmo', { 5 | schema: { 6 | default: 1, 7 | }, 8 | 9 | init() { 10 | var transformElement = this.el; 11 | 12 | setTimeout(function () { 13 | var control = new TransformControls(AFRAME.scenes[0].camera , AFRAME.scenes[0].renderer.domElement ); 14 | 15 | control.attach( transformElement.getObject3D('mesh') ); 16 | AFRAME.scenes[0].object3D.add( control ); 17 | }, 1000); 18 | 19 | }, 20 | 21 | }); -------------------------------------------------------------------------------- /src/components/editor/input-controllers/ComponentIdInput.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 24 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/state/actions.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export const update = ({ commit }, payload) => { 4 | commit('update', payload); 5 | }; 6 | export const remove = ({ commit }, payload) => { 7 | commit('remove', payload); 8 | }; 9 | export const insert = ({ state, commit }, payload) => { 10 | const { selector, value } = payload; 11 | const currentValue = _.get(state.state, selector, []); 12 | if (_.isArray(currentValue)) { 13 | commit('update', { selector, value: [...currentValue, value] }); 14 | } 15 | }; 16 | export const extend = ({ state }, payload) => { 17 | state.state = _.extend({}, state.state, payload.state); 18 | }; 19 | -------------------------------------------------------------------------------- /amplify/backend/function/CreateAssetVariation/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "createassetvariation", 3 | "version": "2.0.0", 4 | "description": "Lambda function generated by Amplify", 5 | "main": "index.js", 6 | "license": "Apache-2.0", 7 | "scripts": { 8 | "preinstall": "SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install --arch=x64 --platform=linux --libc=glibc sharp" 9 | }, 10 | "dependencies": { 11 | "axios": "^1.6.7", 12 | "graphql": "^14.6.0", 13 | "graphql-tag": "^2.10.1", 14 | "uuid": "^9.0.1" 15 | }, 16 | "devDependencies": { 17 | "@types/aws-lambda": "^8.10.92", 18 | "sharp": "^0.33.4" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/components/steps/types/CLIPBOARD_OVERLAY/OptionsEditor.vue: -------------------------------------------------------------------------------- 1 | 4 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/features/assets/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | // resource data 3 | idAttribute: 'id', 4 | queries: { 5 | list: 'ownerAssetsByUpdatedAt', 6 | single: 'getAsset', 7 | filter: { tag: { eq: 'unknown' } }, 8 | }, 9 | mutations: { 10 | create: 'createAsset', 11 | update: 'updateAsset', 12 | delete: 'deleteAsset', 13 | }, 14 | subscriptions: { 15 | onUpdate: 'onUpdateAsset', 16 | }, 17 | defaults: { 18 | name: 'New Asset', 19 | tag: 'unknown', 20 | fileType: '', 21 | key: '', 22 | }, 23 | // other data 24 | uploading: [], 25 | currentParentId: null, 26 | }; 27 | -------------------------------------------------------------------------------- /src/assets/scss/core/layout/_main.scss: -------------------------------------------------------------------------------- 1 | .is-boxed { 2 | background: color-bg(body-outer); 3 | 4 | .body-wrap { 5 | max-width: $container--width-boxed; 6 | margin: 0 auto; 7 | box-shadow: color-bg(body-shadow); 8 | 9 | &::before { 10 | content: ''; 11 | position: absolute; 12 | top: 0; 13 | left: 0; 14 | width: 100%; 15 | height: 100%; 16 | background: color-bg(body); 17 | z-index: -10; 18 | } 19 | } 20 | } 21 | 22 | .body-wrap { 23 | position: relative; 24 | overflow: hidden; 25 | // Sticky footer 26 | display: flex; 27 | flex-direction: column; 28 | min-height: 100vh; 29 | } 30 | 31 | .site-content { 32 | flex: 1 0 auto; 33 | } 34 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreSignup/function-parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "trigger": true, 3 | "modules": [ 4 | "custom" 5 | ], 6 | "parentResource": "transferthought1015a9c5", 7 | "functionName": "transferthought1015a9c5PreSignup", 8 | "resourceName": "transferthought1015a9c5PreSignup", 9 | "parentStack": "auth", 10 | "triggerEnvs": [], 11 | "triggerDir": "/snapshot/repo/build/node_modules/@aws-amplify/amplify-category-auth/provider-utils/awscloudformation/triggers/PreSignup", 12 | "triggerTemplate": "PreSignup.json.ejs", 13 | "triggerEventPath": "PreSignup.event.json", 14 | "roleName": "transferthought1015a9c5PreSignup", 15 | "skipEdit": true, 16 | "enableCors": false 17 | } -------------------------------------------------------------------------------- /src/assets/images/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-raycastable.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('tt-raycastable', { 4 | schema: { 5 | enabled: { 6 | default: true, 7 | }, 8 | objectClass: { 9 | default: 'raycastable', 10 | }, 11 | }, 12 | 13 | update(previousData) { 14 | if (previousData.objectClass !== this.data.objectClass) { 15 | this.el.classList.remove(previousData.objectClass); 16 | } 17 | if (this.data.enabled) { 18 | this.el.classList.add(this.data.objectClass); 19 | } else { 20 | this.el.classList.remove(this.data.objectClass); 21 | } 22 | }, 23 | }); 24 | -------------------------------------------------------------------------------- /src/components/steps/components/EnvironmentViewerContainer.vue: -------------------------------------------------------------------------------- 1 | 4 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/services/environments-service.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | import SimpleNodeService from './simple-node-service'; 3 | 4 | class EnvironmentsService extends SimpleNodeService { 5 | constructor() { 6 | super(); 7 | this.stateSelector = 'environmentsConfig'; 8 | } 9 | 10 | getEnvironments() { 11 | return this.getData(); 12 | } 13 | 14 | createNewEnvironment(environmentData = {}) { 15 | const newEnvironment = { 16 | id: this.generateId(), 17 | name: 'New Environment', 18 | data: _.defaults({}, environmentData), 19 | }; 20 | return newEnvironment; 21 | } 22 | } 23 | 24 | export default new EnvironmentsService(); 25 | -------------------------------------------------------------------------------- /amplify/cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": { 3 | "graphqltransformer": { 4 | "addmissingownerfields": true, 5 | "validatetypenamereservedwords": true, 6 | "useexperimentalpipelinedtransformer": false, 7 | "enableiterativegsiupdates": false, 8 | "securityEnhancementNotification": false, 9 | "showFieldAuthNotification": false 10 | }, 11 | "frontend-ios": { 12 | "enablexcodeintegration": true 13 | }, 14 | "auth": { 15 | "enablecaseinsensitivity": true 16 | }, 17 | "codegen": { 18 | "useappsyncmodelgenplugin": true 19 | }, 20 | "project": { 21 | "overrides": true 22 | } 23 | }, 24 | "debug": { 25 | "shareProjectConfig": false 26 | } 27 | } -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_clients.scss: -------------------------------------------------------------------------------- 1 | // Clients (core/sections/_clients.scss) 2 | $clients--padding-t__mobile: 26px; // clients, top padding (mobile) 3 | $clients--padding-b__mobile: 26px; // clients, bottom padding (mobile) 4 | $clients--padding-t__desktop: null; // clients, top padding (desktop) 5 | $clients--padding-b__desktop: null; // clients, bottom padding (desktop) 6 | $clients-header--padding__mobile: null; // clients header, bottom padding (mobile) 7 | $clients-header--padding__desktop: null; // clients header, bottom padding (desktop) 8 | $clients-items--padding-v: 12px; // clients item, inner top and bottom padding 9 | $clients-items--padding-h: 28px; // clients item, inner left and right padding -------------------------------------------------------------------------------- /src/assets/images/feature-tile-icon-06.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/apps/twinlab/App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | 21 | 29 | -------------------------------------------------------------------------------- /cypress/support/e2e.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') -------------------------------------------------------------------------------- /src/tt-core/services/Session.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | class Session { 4 | constructor() { 5 | this.createdAt = new Date(); 6 | this.metadata = _.pick(navigator, ['platform', 'userAgent', 'appVersion', 'vendor']); 7 | this.logs = []; 8 | } 9 | 10 | log(name, data = {}) { 11 | const logMetaData = { 12 | name, 13 | timestamp: Date.now(), 14 | }; 15 | this.logs.push(_.defaults(data, logMetaData)); 16 | } 17 | 18 | toJson() { 19 | return { 20 | createdAt: this.createdAt, 21 | metadata: this.metadata, 22 | logs: this.logs.map((log) => JSON.stringify(log)), 23 | }; 24 | } 25 | } 26 | 27 | export default Session; 28 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PostConfirmation/function-parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "trigger": true, 3 | "modules": [ 4 | "custom" 5 | ], 6 | "parentResource": "transferthought1015a9c5", 7 | "functionName": "transferthought1015a9c5PostConfirmation", 8 | "resourceName": "transferthought1015a9c5PostConfirmation", 9 | "parentStack": "auth", 10 | "triggerEnvs": [], 11 | "triggerDir": "/snapshot/repo/build/node_modules/@aws-amplify/amplify-category-auth/provider-utils/awscloudformation/triggers/PostConfirmation", 12 | "triggerTemplate": "PostConfirmation.json.ejs", 13 | "triggerEventPath": "PostConfirmation.event.json", 14 | "roleName": "transferthought1015a9c5PostConfirmation", 15 | "skipEdit": true, 16 | "enableCors": false 17 | } -------------------------------------------------------------------------------- /src/tt-core/components/button-colors.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | const COLORS = [ 4 | '#F85333', 5 | '#48BAEA', 6 | '#e0cb49', 7 | '#33F853', 8 | ]; 9 | 10 | // Set button colors for dynamic list of buttons. 11 | AFRAME.registerComponent('button-colors', { 12 | init() { 13 | this.el.addEventListener('child-attached', () => { 14 | setTimeout(this.setColors.bind(this)); 15 | }); 16 | }, 17 | 18 | setColors() { 19 | // Skip template tag. 20 | for (let i = 1; i < this.el.children.length + 1; i += 1) { 21 | if (this.el.children[i]) { 22 | this.el.children[i].setAttribute('text', 'color', COLORS[i - 1]); 23 | } 24 | } 25 | }, 26 | }); 27 | -------------------------------------------------------------------------------- /amplify/backend/function/transferthought1015a9c5PreAuthentication/function-parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "trigger": true, 3 | "modules": [ 4 | "custom" 5 | ], 6 | "parentResource": "transferthought1015a9c5", 7 | "functionName": "transferthought1015a9c5PreAuthentication", 8 | "resourceName": "transferthought1015a9c5PreAuthentication", 9 | "parentStack": "auth", 10 | "triggerEnvs": [], 11 | "triggerDir": "/snapshot/repo/build/node_modules/@aws-amplify/amplify-category-auth/provider-utils/awscloudformation/triggers/PreAuthentication", 12 | "triggerTemplate": "PreAuthentication.json.ejs", 13 | "triggerEventPath": "PreAuthentication.event.json", 14 | "roleName": "transferthought1015a9c5PreAuthentication", 15 | "skipEdit": true, 16 | "enableCors": false 17 | } -------------------------------------------------------------------------------- /src/apps/tt-360-editor/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import user from '@/stores/user'; 4 | import sessions from '@/stores/sessions'; 5 | import courses from '@/stores/courses'; 6 | import assets from '@/features/assets/store'; 7 | import redirect from '@/stores/redirect'; 8 | import apps from '@/features/apps/store'; 9 | import pages from '@/features/pages/store'; 10 | import steps, { plugins } from '@/stores/steps'; 11 | 12 | Vue.use(Vuex); 13 | 14 | export default new Vuex.Store({ 15 | modules: { 16 | user, 17 | sessions, 18 | app, 19 | apps, 20 | courses, 21 | assets, 22 | steps, 23 | pages, 24 | redirect, 25 | }, 26 | plugins: [...plugins], 27 | }); 28 | -------------------------------------------------------------------------------- /src/assets/scss/settings/patterns/_split.scss: -------------------------------------------------------------------------------- 1 | // Split (core/patterns/_split.scss) 2 | $split-item--padding-v__mobile: 48px; // split item, top and bottom padding (mobile) 3 | $split-item--padding-v__desktop: 80px; // split item, top and bottom padding (desktop) 4 | $split-item-content--padding-h: 52px; // padding distanciating content from the middle of container (desktop) 5 | $split-item-image--padding-h: 12px; // padding distanciating image from the middle of container (desktop) 6 | $split-item--inner-padding-h: $split-item-content--padding-h + $split-item-image--padding-h; // horizontal padding sum, i.e. padding between content and image (desktop) 7 | $split-item--inner-padding-v_mobile: 32px; // vertical padding, i.e. padding between content and image (mobile) 8 | -------------------------------------------------------------------------------- /src/stores/ResourceBase/index.js: -------------------------------------------------------------------------------- 1 | import * as _actions from './actions'; 2 | import * as _getters from './getters'; 3 | import _mutations from './mutations'; 4 | import _state from './state'; 5 | 6 | class ResourceBase { 7 | constructor({ state = {}, actions = {}, mutations = {}, getters = {} }) { 8 | this.namespaced = true; 9 | this.state = () => { 10 | return { 11 | ..._state, 12 | ...state, 13 | }; 14 | }; 15 | this.actions = { 16 | ..._actions, 17 | ...actions, 18 | }; 19 | 20 | this.mutations = { ..._mutations, ...mutations }; 21 | this.getters = { ..._getters, ...getters }; 22 | } 23 | } 24 | 25 | export default ResourceBase; 26 | -------------------------------------------------------------------------------- /src/tt-core/services/Asset.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | import Entity from './Entity'; 3 | 4 | export default class Asset extends Entity { 5 | constructor(scene, data) { 6 | super(scene, data); 7 | this.attributes = data.attributes; 8 | } 9 | 10 | createElement() { 11 | // create the scene element so all the entities can be appended to this element 12 | const assetEl = document.createElement('tt-asset-item'); 13 | assetEl.setAttribute('id', this.id); 14 | assetEl.setAttribute('crossorigin', 'anonymous'); 15 | _.forOwn(this.data.attributes, (attributeValue, attributeName) => { 16 | assetEl.setAttribute(attributeName, attributeValue); 17 | }); 18 | return assetEl; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/schema/Event.graphql: -------------------------------------------------------------------------------- 1 | type Event 2 | @model(subscriptions: null) 3 | @key(fields: ["id", "subscriptionId", "createdAt"]) 4 | @key(name: "BySubscriptionId", fields: ["subscriptionId", "createdAt"], queryField: "itemsBySubscriptionId") 5 | @auth( 6 | rules: [ 7 | { allow: public, operations: [read, create, update, delete] }, 8 | { allow: private, operations: [read, create, update, delete] } 9 | ] 10 | ) 11 | { 12 | id: ID!, 13 | subscriptionId: String!, 14 | name: String!, 15 | data: String!, 16 | createdAt: AWSDateTime! 17 | } 18 | 19 | type Subscription { 20 | onCreateEvent(subscriptionId: String): Event 21 | @aws_subscribe(mutations: ["createEvent"]) 22 | @aws_api_key 23 | @aws_cognito_user_pools 24 | } -------------------------------------------------------------------------------- /src/assets/scss/core/sections/_cta.scss: -------------------------------------------------------------------------------- 1 | .cta { 2 | 3 | .section-inner { 4 | padding-top: $cta--padding-t__mobile; 5 | padding-bottom: $cta--padding-b__mobile; 6 | } 7 | } 8 | 9 | .cta-slogan { 10 | margin-bottom: $cta-slogan--padding-v__mobile; 11 | } 12 | 13 | @include media( '>medium' ) { 14 | 15 | .cta { 16 | 17 | .section-inner { 18 | padding-top: $cta--padding-t__desktop; 19 | padding-bottom: $cta--padding-b__desktop; 20 | } 21 | } 22 | 23 | .cta-split { 24 | display: flex; 25 | justify-content: space-between; 26 | align-items: center; 27 | } 28 | 29 | .cta-slogan { 30 | margin-bottom: $cta-slogan--padding-v__desktop; 31 | 32 | .cta-split & { 33 | margin-bottom: 0; 34 | margin-right: $cta-slogan--padding-h__desktop; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/components/editor/input-controllers/index.js: -------------------------------------------------------------------------------- 1 | import BaseInput from './BaseInput.vue'; 2 | import AssetInput from './AssetInput.vue'; 3 | import BooleanInput from './BooleanInput.vue'; 4 | import FileInput from './FileInput.vue'; 5 | import NumberInput from './NumberInput.vue'; 6 | import ObjectInput from './ObjectInput.vue'; 7 | import EntityIdInput from './EntityIdInput.vue'; 8 | import ComponentIdInput from './ComponentIdInput.vue'; 9 | import StepIdInput from './StepIdInput.vue'; 10 | import PropIdInput from './PropIdInput.vue'; 11 | 12 | export default { 13 | BaseInput, 14 | AssetInput, 15 | BooleanInput, 16 | FileInput, 17 | NumberInput, 18 | ObjectInput, 19 | EntityIdInput, 20 | ComponentIdInput, 21 | StepIdInput, 22 | PropIdInput, 23 | }; 24 | -------------------------------------------------------------------------------- /src/apps/patientlibrary/App.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 28 | 29 | 37 | -------------------------------------------------------------------------------- /src/components/steps/types/ADVANCED_INTERACTION/View.vue: -------------------------------------------------------------------------------- 1 | 4 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/apps/tt-app/App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | 25 | 39 | -------------------------------------------------------------------------------- /src/components/steps/types/NARRATION_ONLY/Editor.vue: -------------------------------------------------------------------------------- 1 | 9 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/features/assets/store/mutations.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | 3 | export default { 4 | addUploadingItem(state, item) { 5 | state.uploading = [item, ...state.uploading]; 6 | }, 7 | updateUploadingItem(state, newItem) { 8 | state.uploading = state.uploading.map((currentItem) => { 9 | if (newItem.id === currentItem.id) { 10 | return newItem; 11 | } 12 | return currentItem; 13 | }); 14 | }, 15 | removeUploadingItem(state, item) { 16 | state.uploading = state.uploading.filter((currentItem) => { 17 | return currentItem.id === item.id; 18 | }); 19 | }, 20 | setCurrentParentId(state, currentParentId) { 21 | state.currentParentId = currentParentId; 22 | }, 23 | }; 24 | -------------------------------------------------------------------------------- /src/features/apps/store/index.js: -------------------------------------------------------------------------------- 1 | import config from './modules/config'; 2 | import actions from './modules/actions'; 3 | import context from './modules/context'; 4 | import queryParams from './modules/query-params'; 5 | import appState from './modules/state/index'; 6 | import * as storeActions from './actions'; 7 | import * as getters from './getters'; 8 | import mutations from './mutations'; 9 | import state from './state'; 10 | 11 | import ResourceBase from '../../../stores/ResourceBase'; 12 | 13 | export default { 14 | ...new ResourceBase({ 15 | actions: storeActions, 16 | getters, 17 | mutations, 18 | state, 19 | }), 20 | modules: { 21 | config, 22 | state: appState, 23 | actions, 24 | context, 25 | queryParams, 26 | }, 27 | }; 28 | -------------------------------------------------------------------------------- /src/tt-api/services/blockadelabs.js: -------------------------------------------------------------------------------- 1 | class BlockadeLabs { 2 | constructor(url, apiKey) { 3 | this.url = url; 4 | this.apiKey = apiKey; 5 | } 6 | async create360Image(prompt) { 7 | try { 8 | const response = await fetch(this.url, { 9 | method: 'POST', 10 | body: { 11 | api_key: this.apiKey, 12 | prompt, 13 | skybox_style_id: 10, 14 | }, 15 | }); 16 | return response.json(); 17 | } catch (err) { 18 | console.log(err); 19 | } 20 | } 21 | } 22 | 23 | const blockadeLabsUrl = 'Blockade_Labs_URL'; 24 | const blockadeLabsApiKey = 'Blockade_Labs_URL'; 25 | 26 | export default new BlockadeLabs(blockadeLabsUrl, blockadeLabsApiKey); 27 | -------------------------------------------------------------------------------- /src/assets/scss/settings/elements/_carousel.scss: -------------------------------------------------------------------------------- 1 | // Carousel (core/elements/_carousel.scss) 2 | 3 | // Background color 4 | $carousel-bullet--bg: ( 5 | carousel-button: get-color(dark, 3), 6 | carousel-button-hover: get-color(light, 2), 7 | carousel-button-active: get-color(light, 3), 8 | // ↓ Inverted colors 9 | carousel-button-inverse: get-color(light, 3), 10 | carousel-button-hover-inverse: get-color(primary, 1), 11 | carousel-button-active-inverse: get-color(dark, 3), 12 | ); 13 | 14 | // More carousel settings 15 | $carousel-bullet--outer-width: 20px; 16 | $carousel-bullet--outer-height: 20px; 17 | $carousel-bullet--width: 8px; 18 | $carousel-bullet--height: 8px; 19 | $carousel-bullet--radius: 50%; 20 | 21 | // Don't change line below! 22 | $icon--color: map-push($icon--color, $carousel-bullet--bg); 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | 23 | #amplify-do-not-edit-begin 24 | amplify/\#current-cloud-backend 25 | amplify/.config/local-* 26 | amplify/logs 27 | amplify/mock-data 28 | amplify/mock-api-resources 29 | amplify/backend/amplify-meta.json 30 | amplify/backend/.temp 31 | build/ 32 | dist/ 33 | node_modules/ 34 | aws-exports.js 35 | awsconfiguration.json 36 | amplifyconfiguration.json 37 | amplifyconfiguration.dart 38 | amplify-build-config.json 39 | amplify-gradle-config.json 40 | amplifytools.xcconfig 41 | .secret-* 42 | **.sample 43 | #amplify-do-not-edit-end 44 | -------------------------------------------------------------------------------- /amplify/backend/api/transferthought/schema/User.graphql: -------------------------------------------------------------------------------- 1 | type User 2 | @model 3 | @auth(rules: [{ allow: owner, operations: [create, read, update, delete] }]) { 4 | owner: String 5 | email: String 6 | firstName: String 7 | lastName: String 8 | autoShowTour: Boolean 9 | plan: String 10 | unlimted: Boolean 11 | unlimtedLifetime: Boolean 12 | totalAllottedViews: Int 13 | totalViews: Int 14 | @auth( 15 | rules: [ 16 | { allow: public, operations: [read, update] } 17 | { allow: private, operations: [read, update] } 18 | ] 19 | ) 20 | currentMonthViews: Int 21 | @auth( 22 | rules: [ 23 | { allow: public, operations: [read, update] } 24 | { allow: private, operations: [read, update] } 25 | ] 26 | ) 27 | createdAt: AWSDateTime! 28 | updatedAt: AWSDateTime! 29 | } 30 | -------------------------------------------------------------------------------- /src/components/editor/component-editors/EnvironmentEditor.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 27 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-triggerable.js: -------------------------------------------------------------------------------- 1 | import * as AFRAME from 'aframe'; 2 | 3 | AFRAME.registerComponent('tt-triggerable', { 4 | schema: { 5 | enabled: { default: true }, 6 | object: { default: 'triggerable' }, 7 | dynamic: { default: false }, 8 | }, 9 | 10 | update(previousData) { 11 | if (this.data.object !== previousData.object) { 12 | this.el.classList.remove(previousData.object); 13 | } 14 | if (this.data.dynamic) { 15 | this.el.setAttribute('data-aabb-collider-dynamic'); 16 | } else { 17 | this.el.removeAttribute('data-aabb-collider-dynamic'); 18 | } 19 | if (this.data.enabled) { 20 | this.el.classList.add(this.data.object); 21 | } else { 22 | this.el.classList.remove(this.data.object); 23 | } 24 | }, 25 | }); 26 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/config/mutations.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export default { 4 | init(state, config) { 5 | state.config = config; 6 | state.cachedConfig = null; 7 | }, 8 | 9 | cache(state) { 10 | state.cachedConfig = _.cloneDeep(state.config); 11 | }, 12 | 13 | reset(state) { 14 | state.config = _.cloneDeep(state.cachedConfig); 15 | state.cachedConfig = null; 16 | }, 17 | 18 | update(state, payload) { 19 | const { id, partial } = payload; 20 | _.extend(state.config[id], partial); 21 | }, 22 | 23 | add(state, payload) { 24 | const { item } = payload; 25 | state.config = { ...state.config, [item.id]: item }; 26 | }, 27 | 28 | delete(state, payload) { 29 | const { id } = payload; 30 | state.config = _.omit(state.config, id); 31 | }, 32 | }; 33 | -------------------------------------------------------------------------------- /src/components/steps/types/GOTO/View.vue: -------------------------------------------------------------------------------- 1 | 4 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/scss/variables/_typography.scss: -------------------------------------------------------------------------------- 1 | $body-font-family: 'Open Sans', sans-serif; 2 | $font-size-root: 1rem; 3 | 4 | $headings: ( 5 | 'h1': ( 6 | 'size': 4.25rem, 7 | 'line-height': 4.25rem, 8 | 'letter-spacing': normal, 9 | ), 10 | 'h2': ( 11 | 'size': 3.5rem, 12 | 'line-height': 3.5rem, 13 | 'letter-spacing': normal, 14 | ), 15 | 'h3': ( 16 | 'size': 2.5rem, 17 | 'line-height': 2.75rem, 18 | 'letter-spacing': normal, 19 | ), 20 | 'h4': ( 21 | 'size': 1.75rem, 22 | 'line-height': 2rem, 23 | 'letter-spacing': normal, 24 | ), 25 | 'h5': ( 26 | 'size': 1.25rem, 27 | 'line-height': 1.75rem, 28 | 'letter-spacing': normal, 29 | ), 30 | 'h6': ( 31 | 'size': 1.1rem, 32 | 'line-height': 1rem, 33 | 'letter-spacing': normal, 34 | ), 35 | ); 36 | -------------------------------------------------------------------------------- /src/components/editor/component-editors/DefaultComponentEditor.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /src/features/pages/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | idAttribute: 'id', 3 | sortKeyAttribute: 'type', 4 | queries: { 5 | list: 'ownerPagesByUpdatedAt', 6 | single: 'getPage', 7 | filter: { type: { eq: 'master' } }, 8 | }, 9 | mutations: { 10 | create: 'createPage', 11 | update: 'updatePage', 12 | delete: 'deletePage', 13 | }, 14 | defaults: { 15 | title: 'Untitled', 16 | data: { 17 | type: 'basic', 18 | description: 'New Page Description...', 19 | logoSrc: 'https://tt-assets-us-east-1.s3.amazonaws.com/assets/images/tt-logo.png', 20 | primaryColor: 'blue', 21 | coverSrc: 'https://tt-assets-us-east-1.s3.amazonaws.com/assets/TT/default_thumbnail.jpg', 22 | coverYOffset: 50, 23 | appListTitle: 'Course List', 24 | }, 25 | apps: [], 26 | }, 27 | }; 28 | -------------------------------------------------------------------------------- /src/components/steps/types/IMAGE_OVERLAY/View.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 24 | 25 | 33 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/actions/mutations.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-param-reassign */ 2 | 3 | import _ from 'lodash'; 4 | 5 | export default { 6 | init(state, actions) { 7 | _.forOwn(actions, (action) => { 8 | if (_.isUndefined(action.type)) { 9 | action.type = 'custom'; 10 | } 11 | }); 12 | state.actions = actions; 13 | }, 14 | 15 | add(state, payload) { 16 | const { action } = payload; 17 | state.actions = { ...state.actions, [action.id]: action }; 18 | }, 19 | 20 | update(state, payload) { 21 | const { id, partial } = payload; 22 | const action = state.actions[id]; 23 | _.forEach(partial, (value, key) => { 24 | action[key] = value; 25 | }); 26 | }, 27 | 28 | delete(state, id) { 29 | state.actions = _.pickBy(state.actions, (action) => action.id !== id); 30 | }, 31 | }; 32 | -------------------------------------------------------------------------------- /cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example commands.js shows you how to 3 | // create various custom commands and overwrite 4 | // existing commands. 5 | // 6 | // For more comprehensive examples of custom 7 | // commands please read more here: 8 | // https://on.cypress.io/custom-commands 9 | // *********************************************** 10 | // 11 | // 12 | // -- This is a parent command -- 13 | // Cypress.Commands.add('login', (email, password) => { ... }) 14 | // 15 | // 16 | // -- This is a child command -- 17 | // Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) 18 | // 19 | // 20 | // -- This is a dual command -- 21 | // Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) 22 | // 23 | // 24 | // -- This will overwrite an existing command -- 25 | // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -------------------------------------------------------------------------------- /src/stores/sessions/mutations.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | function parseSession(session) { 4 | // eslint-disable-next-line no-param-reassign 5 | session.data = JSON.parse(session.data); 6 | } 7 | 8 | export default { 9 | resetSessions(state, sessions) { 10 | _.forEach(sessions, parseSession); 11 | state.byId = _.keyBy(sessions, 'id'); 12 | state.allIds = _.map(sessions, 'id'); 13 | }, 14 | addSession(state, session) { 15 | parseSession(session); 16 | state.byId[session.id] = session; 17 | state.allIds.push(session.id); 18 | }, 19 | updateSession(state, session) { 20 | parseSession(session); 21 | state.byId[session.id] = session; 22 | }, 23 | removeSession(state, session) { 24 | const index = _.findIndex(state.list, { id: session.id }); 25 | state.allIds.splice(index, 1); 26 | delete state.byId[session.id]; 27 | }, 28 | }; 29 | -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_signin.scss: -------------------------------------------------------------------------------- 1 | // Login / Signup forms (core/sections/_signin.scss) 2 | $signin--padding-t__mobile: null; // signin, top padding (mobile) 3 | $signin--padding-b__mobile: null; // signin, bottom padding (mobile) 4 | $signin--padding-t__desktop: null; // signin, top padding (desktop) 5 | $signin--padding-b__desktop: null; // signin, bottom padding (desktop) 6 | $signin-header--padding__mobile: 32px; // signin header, bottom padding (mobile) 7 | $signin-header--padding__desktop: 48px; // signin header, bottom padding (desktop) 8 | $signin-item--width: null; // signin item, width 9 | $signin-item--inner-padding-v: 0; // signin item, inner top and bottom padding (it inherits $tiles-item--inner-padding-v unless you replace null with a new value) 10 | $signin-item--inner-padding-h: 0; // signin item, inner left and right padding (it inherits $tiles-item--inner-padding-h unless you replace null with a new value) 11 | -------------------------------------------------------------------------------- /src/assets/scss/settings/layout/_header.scss: -------------------------------------------------------------------------------- 1 | // Header (core/layout/_header.scss) 2 | 3 | // Background color 4 | $header--bg: ( 5 | header: null, 6 | menu-mobile: darken(get-color(dark, 1), 3%) 7 | ); 8 | 9 | // More header settings 10 | $header-height__mobile: 80px; // header height (mobile) 11 | $header-height__desktop: null; // header height (desktop) 12 | $header-nav--padding-h: 32px; // horizontal padding between header links (desktop) 13 | $header-nav--padding-v__mobile: 24px; // vertical padding between header links (mobile) 14 | $header-hamburger--size: 24px; // hamburger button, width and height 15 | $header-hamburger--thickness: 2px; // hamburger button, stroke width 16 | $header-hamburger--radius: null; // hamburger button, lines radius cap 17 | $header-hamburger--distance: 7px; // hamburger button, top and bottom lines distance from center 18 | 19 | // Don't change line below! 20 | $bg--color: map-push($bg--color, $header--bg); 21 | -------------------------------------------------------------------------------- /src/components/steps/types/AI_GENERAL/View.vue: -------------------------------------------------------------------------------- 1 | 6 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/libs/timeline/GanttElastic.standalone.vue: -------------------------------------------------------------------------------- 1 | 9 | 15 | 33 | -------------------------------------------------------------------------------- /src/tt-core/components/ui/double-click.js: -------------------------------------------------------------------------------- 1 | /* global AFRAME */ 2 | /** 3 | * Checkbox A simple component to listen for two click events in quick succession. 4 | * @namespace aframe-material-collection 5 | * @component ui-double-click 6 | * @author Shane Harris 7 | */ 8 | module.exports = AFRAME.registerComponent('ui-double-click', { 9 | schema: { 10 | timeout: { type: 'int', default: 200 }, 11 | }, 12 | init() { 13 | let last_click = 0; 14 | // Add click event for listening for two clicks within the specified timespan. 15 | this.el.addEventListener('mousedown', (e) => { 16 | const now = new Date().getTime(); 17 | if (now - last_click < this.data.timeout) { 18 | this.el.emit('dblclick', e); 19 | // Reset last click 20 | last_click = 0; 21 | e.preventDefault(); 22 | } 23 | last_click = now; 24 | }); 25 | }, 26 | }); 27 | -------------------------------------------------------------------------------- /src/features/apps/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | queries: { 3 | list: 'ownerAppsByUpdatedAt', 4 | single: 'getApp', 5 | filter: { type: { eq: 'master' } }, 6 | }, 7 | mutations: { 8 | create: 'createApp', 9 | update: 'updateApp', 10 | delete: 'deleteApp', 11 | }, 12 | defaults: { 13 | title: 'Untitled', 14 | }, 15 | idAttribute: 'appId', 16 | 17 | sortKeyAttribute: 'type', 18 | name: '', 19 | appId: null, 20 | thumbnail: '', 21 | selectedEntityId: null, 22 | gizmoMode: 'select', 23 | gizmoSnapTranslation: null, 24 | gizmoSnapRotation: null, 25 | rendering: false, 26 | showAddEntityDialog: false, 27 | isBottomPanelOpen: false, 28 | publishing: false, 29 | saving: false, 30 | scene: null, 31 | snack: null, 32 | fetching: false, 33 | tour: true, 34 | redirectData: null, 35 | appListStatus: 'IDLE', 36 | appList: [], 37 | }; 38 | -------------------------------------------------------------------------------- /src/tt-core/components/ui/icon.js: -------------------------------------------------------------------------------- 1 | /* global AFRAME,THREE */ 2 | /** 3 | * A component to load an icon and set some defaults for positioning and transparency. 4 | * @namespace aframe-material-collection 5 | * @component ui-icon 6 | * @author Shane Harris 7 | */ 8 | module.exports = AFRAME.registerComponent('ui-icon', { 9 | schema: { 10 | src: { default: 'icons/send_white_64dp.png' }, 11 | size: { type: 'vec2', default: { x: 0.1, y: 0.1 } }, 12 | zIndex: { type: 'number', default: 0.003 }, 13 | color: { default: '#fff' }, 14 | }, 15 | init() { 16 | this.icon = new THREE.Mesh(new THREE.PlaneGeometry(this.data.size.x, this.data.size.y), new THREE.MeshBasicMaterial({ 17 | color: this.data.color, alphaTest: 0.4, transparent: true, map: new THREE.TextureLoader().load(this.data.src), 18 | })); 19 | this.icon.position.set(0, 0, this.data.zIndex); 20 | this.el.object3D.add(this.icon); 21 | }, 22 | }); 23 | -------------------------------------------------------------------------------- /src/assets/scss/core/elements/_containers.scss: -------------------------------------------------------------------------------- 1 | .container, 2 | .container-sm, 3 | .container-xs { 4 | width: 100%; 5 | margin: 0 auto; 6 | padding-left: $container--padding__mobile; 7 | padding-right: $container--padding__mobile; 8 | 9 | @include media( '>small' ) { 10 | padding-left: $container--padding__desktop; 11 | padding-right: $container--padding__desktop; 12 | } 13 | } 14 | 15 | .container { 16 | max-width: $container--width + ( $container--padding__desktop * 2 ); 17 | } 18 | 19 | .container-sm { 20 | max-width: $container--width-sm + ( $container--padding__desktop * 2 ); 21 | } 22 | 23 | .container-xs { 24 | max-width: $container--width-xs + ( $container--padding__desktop * 2 ); 25 | } 26 | 27 | [class*=container] { 28 | 29 | [class*=container] { 30 | padding-left: 0; 31 | padding-right: 0; 32 | } 33 | 34 | .container-sm { 35 | max-width: $container--width-sm; 36 | } 37 | 38 | .container-xs { 39 | max-width: $container--width-xs; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/assets/scss/core/sections/_clients.scss: -------------------------------------------------------------------------------- 1 | .clients { 2 | 3 | .section-inner { 4 | padding-top: $clients--padding-t__mobile; 5 | padding-bottom: $clients--padding-b__mobile; 6 | } 7 | 8 | .section-header { 9 | padding-bottom: $clients-header--padding__mobile; 10 | } 11 | } 12 | 13 | .clients-inner { 14 | 15 | ul { 16 | display: flex; 17 | flex-wrap: wrap; 18 | flex-direction: column; 19 | justify-content: center; 20 | align-items: center; 21 | margin: 0; 22 | } 23 | 24 | li { 25 | padding: $clients-items--padding-v $clients-items--padding-h; 26 | } 27 | } 28 | 29 | @include media( '>medium' ) { 30 | 31 | .clients { 32 | 33 | .section-inner { 34 | padding-top: $clients--padding-t__desktop; 35 | padding-bottom: $clients--padding-b__desktop; 36 | } 37 | 38 | .section-header { 39 | padding-bottom: $clients-header--padding__desktop; 40 | } 41 | 42 | .clients-inner { 43 | 44 | ul { 45 | flex-direction: row; 46 | } 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/features/pages/routes.js: -------------------------------------------------------------------------------- 1 | import { requiresAuth } from '@/utils/auth'; 2 | 3 | export const List = { 4 | path: '/pages', 5 | name: 'PagesList', 6 | beforeEnter: requiresAuth, 7 | meta: { title: 'Transfer Thought | Page List' }, 8 | component: () => import(/* webpackChunkName: "PagesList" */ '@/features/pages/views/List.vue'), 9 | }; 10 | 11 | export const View = { 12 | path: '/pages/:pageId', 13 | name: 'PageViewer', 14 | meta: { title: 'Transfer Thought | Page', redirectable: true }, 15 | component: () => import(/* webpackChunkName: "PagesHome" */ '@/features/pages/views/View.vue'), 16 | }; 17 | 18 | export const Edit = { 19 | path: '/pages/:pageId/edit', 20 | name: 'PageEditor', 21 | beforeEnter: requiresAuth, 22 | meta: { title: 'Transfer Thought | Editing Page', redirectable: true }, 23 | component: () => import(/* webpackChunkName: "PagesHome" */ '@/features/pages/views/Edit.vue'), 24 | }; 25 | 26 | export default [List, View, Edit]; 27 | -------------------------------------------------------------------------------- /src/tt-core/components/tt-center-mesh.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | AFRAME.registerComponent('tt-center-mesh', { 4 | schema: { 5 | enabled: { default: true }, 6 | }, 7 | 8 | init() { 9 | this.mesh = this.el.getObject3D('mesh'); 10 | }, 11 | 12 | update() {}, 13 | tick() { 14 | this.centerMesh(); 15 | }, 16 | centerMesh() { 17 | if (this.mesh && this.mesh.geometry) { 18 | if (this.centeredGeometryId !== this.mesh.geometry.uuid) { 19 | this.mesh.geometry.computeBoundingBox(); 20 | const offsetX = -this.mesh.geometry.boundingBox.max.x / 2; 21 | const offsetY = -this.mesh.geometry.boundingBox.max.y / 2; 22 | const offsetZ = -this.mesh.geometry.boundingBox.max.z / 2; 23 | this.mesh.geometry.translate(offsetX, offsetY, offsetZ); 24 | this.centeredGeometryId = this.mesh.geometry.uuid; 25 | } 26 | } 27 | }, 28 | }); 29 | -------------------------------------------------------------------------------- /src/components/editor/component-editors/BaseComponentEditor.vue: -------------------------------------------------------------------------------- 1 | 32 | -------------------------------------------------------------------------------- /src/tt-api/services/openai.js: -------------------------------------------------------------------------------- 1 | class OpenAI { 2 | constructor(chatGPTUrl, dalleUrl) { 3 | this.chatGPTUrl = chatGPTUrl; 4 | this.dalleUrl = dalleUrl; 5 | } 6 | async createChatCompletion(messages) { 7 | try { 8 | const response = await fetch(this.chatGPTUrl, { 9 | method: 'POST', 10 | body: JSON.stringify(messages), 11 | }); 12 | return response.json(); 13 | } catch (err) { 14 | console.log(err); 15 | } 16 | } 17 | async create360Image(prompt, engine = 'dalle') { 18 | try { 19 | const response = await fetch(this.dalleUrl, { 20 | method: 'POST', 21 | body: JSON.stringify({ prompt, engine }), 22 | }); 23 | return response.json(); 24 | } catch (err) { 25 | console.log(err); 26 | } 27 | } 28 | } 29 | 30 | // TODO - make these local to repo 31 | export default new OpenAI('chatGPTURL', 'dallEUrl'); 32 | -------------------------------------------------------------------------------- /src/components/EmptyMessage.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 35 | 36 | -------------------------------------------------------------------------------- /src/components/steps/types/IMAGE_OVERLAY/OptionsEditor.vue: -------------------------------------------------------------------------------- 1 | 8 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/components/editor/input-controllers/ObjectInput.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 40 | -------------------------------------------------------------------------------- /src/components/steps/types/LINK_LAUNCHER/View.vue: -------------------------------------------------------------------------------- 1 | 13 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/features/apps/store/modules/actions/getters.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | import DefaultActions, { DefaultActionsMap } from '@/components/editor/ActionDefinitions'; 3 | 4 | export const getActionById = (state) => (actionId) => { 5 | const customAction = state.actions[actionId]; 6 | if (customAction) { 7 | return customAction; 8 | } 9 | 10 | return DefaultActionsMap[actionId]; 11 | }; 12 | // TODO: this can be dangerous as we do not have any means to ensure names are unique 13 | export const getActionByName = (state) => (actionName) => _.find(_.values(state.actions), (action) => action.name === actionName); 14 | export const actionsList = (state) => _(_.values(state.actions)) 15 | .concat(DefaultActions) 16 | .value(); 17 | export const userActions = (state) => _.values(state.actions); 18 | export const customActionsList = (state) => _.filter(_.values(state.actions), (action) => action.type === 'custom'); 19 | export const timelinesList = (state) => _.filter(_.values(state.actions), (action) => action.type === 'timeline'); 20 | -------------------------------------------------------------------------------- /src/tt-core/scenes/construction_live/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const initialState = { 4 | selectedEnvironment: 'forest', 5 | workerModel: '#Spanner1', 6 | }; 7 | 8 | const handlers = { 9 | selectEnvironment(state, action) { 10 | console.log(action); 11 | state.selectedEnvironment = action.environment; 12 | }, 13 | selectWorker(state, action) { 14 | state.workerModel = '#' + action.worker; 15 | const entity = document.querySelector('#Worker'); 16 | const parent = entity.parentElement; 17 | parent.removeChild(entity); 18 | const entityElement = document.createElement('a-entity'); 19 | entityElement.setAttribute('id', "Worker"); 20 | entityElement.setAttribute('bind__gltf-model', "workerModel"); 21 | entityElement.setAttribute('position', "0 0 -4"); 22 | entityElement.setAttribute('animation-mixer-new', ""); 23 | parent.appendChild(entityElement); 24 | }, 25 | }; 26 | 27 | export { 28 | initialState, 29 | handlers, 30 | }; 31 | -------------------------------------------------------------------------------- /src/apps/paintchat/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import VueApollo from 'vue-apollo'; 3 | import Client from '@/tt-api'; 4 | import Vuetify from '@/plugins/vuetify'; 5 | import App from './App.vue'; 6 | import router from './router'; 7 | import store from './store'; 8 | 9 | const appsyncProvider = new VueApollo({ 10 | defaultClient: Client.Api, 11 | }); 12 | 13 | const vuetify = new Vuetify({ 14 | theme: { 15 | themes: { 16 | light: { 17 | primary: '#3da9fc', 18 | secondary: '#90b4ce', 19 | accent: '#ef4565', 20 | error: '#b71c1c', 21 | }, 22 | }, 23 | }, 24 | }); 25 | 26 | function render(h) { 27 | return h(App); 28 | } 29 | 30 | const apolloProvider = appsyncProvider; 31 | 32 | Vue.use(VueApollo); 33 | Vue.use(vuetify); 34 | 35 | const appOptions = { 36 | App, 37 | router, 38 | store, 39 | render, 40 | apolloProvider, 41 | vuetify, 42 | }; 43 | 44 | window.TT = { ...appOptions }; 45 | 46 | export default appOptions; 47 | -------------------------------------------------------------------------------- /src/apps/timebox/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import VueApollo from 'vue-apollo'; 3 | import Client from '@/tt-api'; 4 | import Vuetify from '@/plugins/vuetify'; 5 | import App from './App.vue'; 6 | import router from './router'; 7 | import store from './store'; 8 | 9 | const appsyncProvider = new VueApollo({ 10 | defaultClient: Client.Api, 11 | }); 12 | 13 | const vuetify = new Vuetify({ 14 | theme: { 15 | themes: { 16 | light: { 17 | primary: '#3da9fc', 18 | secondary: '#90b4ce', 19 | accent: '#ef4565', 20 | error: '#b71c1c', 21 | }, 22 | }, 23 | }, 24 | }); 25 | 26 | function render(h) { 27 | return h(App); 28 | } 29 | 30 | const apolloProvider = appsyncProvider; 31 | 32 | Vue.use(VueApollo); 33 | Vue.use(vuetify); 34 | 35 | const appOptions = { 36 | App, 37 | router, 38 | store, 39 | render, 40 | apolloProvider, 41 | vuetify, 42 | }; 43 | 44 | window.TT = { ...appOptions }; 45 | 46 | export default appOptions; 47 | -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_team.scss: -------------------------------------------------------------------------------- 1 | // Team (core/sections/_team.scss) 2 | $team--padding-t__mobile: null; // team, top padding (mobile) 3 | $team--padding-b__mobile: null; // team, bottom padding (mobile) 4 | $team--padding-t__desktop: null; // team, top padding (desktop) 5 | $team--padding-b__desktop: null; // team, bottom padding (desktop) 6 | $team-header--padding__mobile: null; // team header, bottom padding (mobile) 7 | $team-header--padding__desktop: 80px; // team header, bottom padding (desktop) 8 | $team-items--padding__mobile: 32px; // padding between team items (mobile) 9 | $team-items--padding__desktop: 64px; // padding between team items (desktop) 10 | $team-item--width: 296px; // team item, width 11 | $team-item--inner-padding-v: 0; // team item, inner top and bottom padding (it inherits $tiles-item--inner-padding-v unless you replace null with a new value) 12 | $team-item--inner-padding-h: 0; // team item, inner left and right padding (it inherits $tiles-item--inner-padding-h unless you replace null with a new value) 13 | -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_news.scss: -------------------------------------------------------------------------------- 1 | // News (core/sections/_news.scss) 2 | $news--padding-t__mobile: null; // news, top padding (mobile) 3 | $news--padding-b__mobile: null; // news, bottom padding (mobile) 4 | $news--padding-t__desktop: null; // news, top padding (desktop) 5 | $news--padding-b__desktop: null; // news, bottom padding (desktop) 6 | $news-header--padding__mobile: null; // news header, bottom padding (mobile) 7 | $news-header--padding__desktop: null; // news header, bottom padding (desktop) 8 | $news-items--padding__mobile: null; // padding between news items (mobile) 9 | $news-items--padding__desktop: null; // padding between news items (desktop) 10 | $news-item--width: 344px; // news item, width 11 | $news-item--inner-padding-v: 24px; // news item, inner top and bottom padding (it inherits $tiles-item--inner-padding-v unless you replace null with a new value) 12 | $news-item--inner-padding-h: null; // news item, inner left and right padding (it inherits $tiles-item--inner-padding-h unless you replace null with a new value) 13 | -------------------------------------------------------------------------------- /src/components/editor/input-controllers/PropIdInput.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 31 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); 2 | 3 | module.exports = { 4 | configureWebpack: { 5 | plugins: [new CaseSensitivePathsPlugin()], 6 | output: { 7 | // Ensuring the output file names are distinctly named 8 | filename: 'js/[name].[contenthash].js', 9 | }, 10 | }, 11 | chainWebpack: (config) => { 12 | config.plugins.delete('prefetch'); 13 | // GraphQL Loader 14 | config.module 15 | .rule('html') 16 | .test(/\.(html)$/) 17 | .use('html-loader') 18 | .loader('html-loader') 19 | .end(); 20 | // const svgRule = config.module.rule('svg'); 21 | 22 | // svgRule.uses.clear(); 23 | 24 | // svgRule 25 | // .use('babel-loader') 26 | // .loader('babel-loader') 27 | // .end() 28 | // .use('vue-svg-loader') 29 | // .loader('vue-svg-loader'); 30 | }, 31 | transpileDependencies: ['vuetify'], 32 | }; 33 | -------------------------------------------------------------------------------- /src/assets/scss/theme/elements/_timeline.scss: -------------------------------------------------------------------------------- 1 | @include media( '>medium' ) { 2 | 3 | .has-animations { 4 | 5 | .timeline-item { 6 | 7 | &:nth-child(even) { 8 | 9 | .timeline-item-content { 10 | 11 | &.reveal-from-side { 12 | transform: translateX($scroll-reveal--from-left-amount); 13 | } 14 | } 15 | } 16 | 17 | &:nth-child(odd) { 18 | 19 | .timeline-item-content { 20 | 21 | &.reveal-from-side { 22 | transform: translateX($scroll-reveal--from-right-amount); 23 | } 24 | } 25 | } 26 | } 27 | 28 | &.is-loaded { 29 | 30 | .timeline-item { 31 | 32 | 33 | .timeline-item-content { 34 | 35 | &.is-revealed { 36 | transform: translate(0); 37 | } 38 | } 39 | } 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /src/components/editor/input-controllers/ArrayInput.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 41 | -------------------------------------------------------------------------------- /src/components/steps/types/DEFAULT/Editor.vue: -------------------------------------------------------------------------------- 1 | 14 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/components/steps/types/VIDEO_OVERLAY/OptionsEditor.vue: -------------------------------------------------------------------------------- 1 | 8 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/components/editor/input-controllers/ComponentAttributeInput.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 36 | -------------------------------------------------------------------------------- /src/assets/scss/settings/sections/_features-tabs.scss: -------------------------------------------------------------------------------- 1 | // Features tabs (core/sections/_features-tabs.scss) --------- 2 | $features-tabs--padding-t__mobile: null; // features tabs, top padding (mobile) 3 | $features-tabs--padding-b__mobile: null; // features tabs, bottom padding (mobile) 4 | $features-tabs--padding-t__desktop: null; // features tabs, top padding (desktop) 5 | $features-tabs--padding-b__desktop: null; // features tabs, bottom padding (desktop) 6 | $features-tabs-header--padding__mobile: null; // features tabs header, bottom padding (mobile) 7 | $features-tabs-header--padding__desktop: null; // features tabs header, bottom padding (desktop) 8 | $features-tabs-list--padding-b: 48px; // tabs list, bottom padding 9 | $features-tabs-item--padding-h: 16px; // tabs item, left and right padding 10 | $features-tabs-item--padding-v: 10px; // tabs item, top and bottom padding 11 | $features-tabs-panel--padding-h: 0; // tabs panel, left and right padding 12 | $features-tabs-panel--padding-v: 0; // tabs panel, top and bottom padding -------------------------------------------------------------------------------- /src/components/lms/Student/Viewers/PDFViewer.vue: -------------------------------------------------------------------------------- 1 | 10 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/components/steps/components/StepEditorContainer.vue: -------------------------------------------------------------------------------- 1 | 4 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/components/editor/input-controllers/OptionsInput.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Transfer Thought authors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/views/FriendlyURL.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/components/SplitButton.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/libs/timeline/components/TaskList/TaskListItem.vue: -------------------------------------------------------------------------------- 1 | 9 | 21 | 44 | -------------------------------------------------------------------------------- /src/components/lms/Admin/CourseNav.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 47 | -------------------------------------------------------------------------------- /src/components/steps/types/AI_GENERAL/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | icon: 'mdi-auto-fix', 3 | type: 'AI_GENERAL', 4 | category: 'OTHER', 5 | display: 'AI General', 6 | defaults: { 7 | autoProgressType: 'pause', 8 | timeoutSeconds: 3, 9 | }, 10 | settings: { 11 | showAutoProgressOptions: false, 12 | }, 13 | isEmpty(stepData) { 14 | return !stepData.promptPlaceholder || !stepData.systemMessage; 15 | }, 16 | getTextFromResponseData(stepData, responseData) { 17 | if (responseData && responseData.values && responseData.values[stepData.name]) { 18 | let result = ''; 19 | 20 | responseData.values[stepData.name].forEach((item) => { 21 | if (item.role === 'user') { 22 | result += 'User\n' + item.content + '\n\n'; 23 | } else if (item.role === 'assistant') { 24 | result += 'System\n' + item.content + '\n\n'; 25 | } 26 | }); 27 | // use quotes here to make sure everything is captured on the same column of a csv export 28 | return `"${result}"`; 29 | } 30 | return ''; 31 | }, 32 | }; 33 | -------------------------------------------------------------------------------- /src/views/Remix.vue: -------------------------------------------------------------------------------- 1 | 8 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/stores/ResourceBase/mutations.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export default { 4 | setList: (state, list) => { 5 | state.entityIds = _.map(list, state.idAttribute); 6 | state.entitiesById = _.keyBy(list, state.idAttribute); 7 | }, 8 | setSingle: (state, item) => { 9 | state.entitiesById = { ...state.entitiesById, [item[state.idAttribute]]: item }; 10 | }, 11 | create: (state, item) => { 12 | state.entityIds = [item[state.idAttribute], ...state.entityIds]; 13 | state.entitiesById = { ...state.entitiesById, [item[state.idAttribute]]: item }; 14 | }, 15 | destroy: (state, deletedId) => { 16 | state.entityIds = _.filter(state.entityIds, (id) => { 17 | return id !== deletedId; 18 | }); 19 | delete state.entitiesById[deletedId]; 20 | 21 | state.entitiesById = { ...state.entitiesById }; 22 | }, 23 | setSingleStatus: (state, status) => { 24 | state.singleStatus = status; 25 | }, 26 | setListStatus: (state, status) => { 27 | state.listStatus = status; 28 | }, 29 | setSubscriptionStatus: (state, status) => { 30 | state.subscriptionStatus = status; 31 | }, 32 | }; 33 | --------------------------------------------------------------------------------