├── .config └── example.env ├── .env ├── .firebaserc ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── enhancement.md │ └── help_wanted.md └── pull_request_template.md ├── .gitignore ├── .prettierignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── firebase.json ├── firecors.json ├── firestorage.rules ├── firestore.indexes.json ├── firestore.rules ├── functions ├── .config │ └── example.env ├── .gitignore ├── package-lock.json ├── package.json ├── src │ ├── 0_constants │ │ ├── AuthConstants.js │ │ ├── DatabaseConstants.js │ │ ├── EnvKeyConstants.js │ │ ├── EnvValueConstants.js │ │ ├── FireStorageConstants.js │ │ ├── FunctionConstants.js │ │ ├── InternalErrorConstants.js │ │ ├── UnexpectedErrorConstants.js │ │ └── index.js │ ├── 1_fire_init │ │ ├── core.js │ │ └── index.js │ ├── 1_utils │ │ ├── badWords.js │ │ ├── codeToolings.js │ │ ├── index.js │ │ ├── objects.js │ │ ├── reservedUsername.js │ │ └── validation.js │ ├── 2_fire_storage │ │ ├── index.js │ │ ├── userAvatar.js │ │ └── utils.js │ ├── 2_fire_store │ │ ├── index.js │ │ ├── seller.js │ │ ├── sellerSettings.js │ │ ├── senshiReviews.js │ │ ├── userSettings.js │ │ └── utils.js │ ├── 3_fire_funct │ │ ├── constants.js │ │ ├── getCustomToken.js │ │ ├── index.js │ │ ├── onBillingAlert.js │ │ ├── onCommentCreate.js │ │ ├── onCommentDelete.js │ │ ├── onDocCreate.js │ │ ├── onDocUpdate.js │ │ ├── onFacebookSignIn.js │ │ ├── onSellerSeed.js │ │ ├── onTwitchSignIn.js │ │ ├── onUserCreate.js │ │ └── utils.js │ ├── index.js │ └── resolvers │ │ ├── Mutation.js │ │ ├── Query.js │ │ ├── index.js │ │ └── typeDefs.js └── uploadEnv.js ├── install.js ├── package-lock.json ├── package.json ├── project.json ├── public ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── index.html ├── manifest.json ├── mstile-150x150.png └── safari-pinned-tab.svg └── src ├── 0_apollo_init └── index.js ├── 0_app_flavor └── index.js ├── 0_assets ├── audio │ └── sampleVoice.mp3 ├── css │ ├── App.css │ ├── animate.module.css │ └── nucleo-icons.css ├── demo │ ├── demo.css │ └── react-demo.css ├── fonts │ ├── nucleo.eot │ ├── nucleo.ttf │ ├── nucleo.woff │ └── nucleo.woff2 ├── icons │ ├── games │ │ ├── Apex.ico │ │ ├── Dota2.png │ │ ├── Fortnite.ico │ │ ├── LOL.ico │ │ └── PUBG.ico │ └── gifts │ │ ├── affection.png │ │ ├── bauble.png │ │ ├── building.png │ │ ├── carousel.png │ │ ├── crowns.png │ │ ├── cupid.png │ │ ├── donut.png │ │ ├── flower-bouquet.png │ │ ├── friends.png │ │ ├── handbag.png │ │ ├── kitty.png │ │ ├── lips.png │ │ ├── lollipop.png │ │ ├── love-message.png │ │ ├── microphone.png │ │ ├── positive-vote.png │ │ ├── ring.png │ │ ├── rose.png │ │ ├── sunflower.png │ │ └── top-hat.png ├── img │ ├── braden-collum.jpg │ ├── christian.jpg │ ├── denys.jpg │ ├── dots.png │ ├── fabien-bazanegue.jpg │ ├── favicon-32x32.png │ ├── favicon-soldier.png │ ├── favicon.ico │ ├── gucci.png │ ├── index │ │ ├── dota2.jpg │ │ ├── fornite.jpg │ │ └── lol.jpg │ ├── jacket.png │ ├── james.jpg │ ├── johana.jpg │ ├── kareya-saleh.jpg │ ├── logo-soldier.png │ ├── mark-finn.jpg │ ├── michael.jpg │ ├── mike.jpeg │ ├── mike.jpg │ ├── olivia.jpg │ ├── p10.jpg │ ├── path4.png │ ├── placeholder.jpg │ ├── readme │ │ ├── error.png │ │ ├── index.png │ │ ├── joinChannel.png │ │ ├── policy.png │ │ ├── profile.png │ │ ├── reset.png │ │ ├── settings.png │ │ ├── signIn.png │ │ └── signUp.png │ ├── ryan.png │ ├── shape.png │ ├── square-purple-1.png │ ├── square1.png │ ├── square2.png │ ├── square3.png │ ├── square4.png │ └── square5.png └── scss │ ├── blk-design-system-pro-react.scss │ └── blk-design-system-pro │ ├── _buttons-extend.scss │ ├── _dropdown-extend.scss │ ├── _example-pages.scss │ ├── _footers.scss │ ├── _info-areas.scss │ ├── _media.scss │ ├── _misc-extend.scss │ ├── _mixins.scss │ ├── _modals-extend.scss │ ├── _navbar-extend.scss │ ├── _pills-extend.scss │ ├── _responsive.scss │ ├── _sections-extend.scss │ ├── _social-buttons.scss │ ├── _tables.scss │ ├── _variables.scss │ ├── avatars │ ├── _avatar-group.scss │ └── _avatar.scss │ ├── bootstrap │ ├── _alert.scss │ ├── _badge.scss │ ├── _breadcrumb.scss │ ├── _button-group.scss │ ├── _buttons.scss │ ├── _card.scss │ ├── _carousel.scss │ ├── _close.scss │ ├── _code.scss │ ├── _custom-forms.scss │ ├── _dropdown.scss │ ├── _forms.scss │ ├── _functions.scss │ ├── _grid.scss │ ├── _images.scss │ ├── _input-group.scss │ ├── _jumbotron.scss │ ├── _list-group.scss │ ├── _media.scss │ ├── _mixins.scss │ ├── _modal.scss │ ├── _nav.scss │ ├── _navbar.scss │ ├── _pagination.scss │ ├── _popover.scss │ ├── _print.scss │ ├── _progress.scss │ ├── _reboot.scss │ ├── _root.scss │ ├── _spinners.scss │ ├── _tables.scss │ ├── _toasts.scss │ ├── _tooltip.scss │ ├── _transitions.scss │ ├── _type.scss │ ├── _utilities.scss │ ├── _variables.scss │ ├── bootstrap-grid.scss │ ├── bootstrap-reboot.scss │ ├── bootstrap.scss │ ├── mixins │ │ ├── _alert.scss │ │ ├── _background-variant.scss │ │ ├── _badge.scss │ │ ├── _border-radius.scss │ │ ├── _box-shadow.scss │ │ ├── _breakpoints.scss │ │ ├── _buttons.scss │ │ ├── _caret.scss │ │ ├── _clearfix.scss │ │ ├── _deprecate.scss │ │ ├── _float.scss │ │ ├── _forms.scss │ │ ├── _gradients.scss │ │ ├── _grid-framework.scss │ │ ├── _grid.scss │ │ ├── _hover.scss │ │ ├── _image.scss │ │ ├── _list-group.scss │ │ ├── _lists.scss │ │ ├── _nav-divider.scss │ │ ├── _pagination.scss │ │ ├── _reset-text.scss │ │ ├── _resize.scss │ │ ├── _screen-reader.scss │ │ ├── _size.scss │ │ ├── _table-row.scss │ │ ├── _text-emphasis.scss │ │ ├── _text-hide.scss │ │ ├── _text-truncate.scss │ │ ├── _transition.scss │ │ └── _visibility.scss │ ├── utilities │ │ ├── _align.scss │ │ ├── _background.scss │ │ ├── _borders.scss │ │ ├── _clearfix.scss │ │ ├── _display.scss │ │ ├── _embed.scss │ │ ├── _flex.scss │ │ ├── _float.scss │ │ ├── _overflow.scss │ │ ├── _position.scss │ │ ├── _screenreaders.scss │ │ ├── _shadows.scss │ │ ├── _sizing.scss │ │ ├── _spacing.scss │ │ ├── _stretched-link.scss │ │ ├── _text.scss │ │ └── _visibility.scss │ └── vendor │ │ └── _rfs.scss │ ├── cards │ ├── _card-background.scss │ ├── _card-blog.scss │ ├── _card-contact.scss │ ├── _card-extend.scss │ ├── _card-fashion.scss │ ├── _card-form-horizontal.scss │ ├── _card-login.scss │ ├── _card-no-shadow.scss │ ├── _card-pricing.scss │ ├── _card-product.scss │ ├── _card-profile.scss │ ├── _card-raised.scss │ └── _card-testimonials.scss │ ├── change maded to vendor scss files.txt │ ├── custom │ ├── _alerts.scss │ ├── _badge.scss │ ├── _buttons.scss │ ├── _card.scss │ ├── _checkboxes-radio.scss │ ├── _dropdown.scss │ ├── _example-pages.scss │ ├── _fixed-plugin.scss │ ├── _footer.scss │ ├── _forms.scss │ ├── _functions.scss │ ├── _icons.scss │ ├── _images.scss │ ├── _info-areas.scss │ ├── _input-group.scss │ ├── _misc.scss │ ├── _mixins.scss │ ├── _modal.scss │ ├── _navbar.scss │ ├── _pagination.scss │ ├── _pills.scss │ ├── _progress.scss │ ├── _rtl.scss │ ├── _sections.scss │ ├── _tables.scss │ ├── _tabs.scss │ ├── _type.scss │ ├── _utilities.scss │ ├── _variables.scss │ ├── cards │ │ ├── _card-chart.scss │ │ ├── _card-map.scss │ │ ├── _card-plain.scss │ │ ├── _card-register.scss │ │ ├── _card-stats.scss │ │ ├── _card-task.scss │ │ └── _card-user.scss │ ├── mixins │ │ ├── _alert.scss │ │ ├── _background-variant.scss │ │ ├── _badges.scss │ │ ├── _buttons.scss │ │ ├── _dropdown.scss │ │ ├── _forms.scss │ │ ├── _icon.scss │ │ ├── _inputs.scss │ │ ├── _modals.scss │ │ ├── _page-header.scss │ │ ├── _popovers.scss │ │ ├── _vendor-prefixes.scss │ │ ├── _wizard.scss │ │ └── opacity.scss │ ├── sections │ │ ├── _blogs.scss │ │ ├── _contactus.scss │ │ ├── _features.scss │ │ ├── _headers.scss │ │ ├── _pricing.scss │ │ ├── _projects.scss │ │ ├── _social-subscribe-lines.scss │ │ ├── _team.scss │ │ └── _testimonials.scss │ ├── utilities │ │ ├── _backgrounds.scss │ │ ├── _floating.scss │ │ ├── _helper.scss │ │ ├── _position.scss │ │ ├── _shadows.scss │ │ ├── _sizing.scss │ │ ├── _spacing.scss │ │ ├── _text.scss │ │ └── _transform.scss │ └── vendor │ │ ├── _plugin-animate-bootstrap-notify.scss │ │ ├── _plugin-bootstrap-switch.scss │ │ ├── _plugin-datetimepicker.scss │ │ ├── _plugin-nouislider.scss │ │ └── _plugin-perfect-scrollbar.scss │ ├── mixins │ ├── _social-buttons.scss │ └── _tags.scss │ ├── plugins │ ├── _plugin-bootstrap-select.scss │ ├── _plugin-carousel-slick.scss │ ├── _plugin-datetimepicker.scss │ ├── _plugin-isometricGrids.scss │ ├── _plugin-jasny-fileupload.scss │ └── _plugin-tagsinput.scss │ ├── react │ ├── _dropdown-extend.scss │ ├── _example-pages.scss │ ├── _fileinput.scss │ ├── _footers.scss │ ├── _misc-extend.scss │ ├── _modals-extend.scss │ ├── _navbar-extend.scss │ ├── _responsive.scss │ ├── custom │ │ ├── _alerts.scss │ │ ├── _checkboxes-radio.scss │ │ ├── _example-pages.scss │ │ ├── _footer.scss │ │ ├── _inputs.scss │ │ ├── _navbar.scss │ │ ├── _sections.scss │ │ ├── _tabs.scss │ │ └── _type.scss │ ├── plugins │ │ ├── _plugin-headroomjs.scss │ │ ├── _plugin-react-datetime.scss │ │ ├── _plugin-react-select.scss │ │ ├── _plugin-react-slick.scss │ │ └── _plugin-react-tagsinput.scss │ └── react-differences.scss │ └── sections │ ├── _accordion.scss │ ├── _blogs.scss │ ├── _contactus.scss │ ├── _features.scss │ ├── _headers.scss │ ├── _pricing.scss │ ├── _projects.scss │ ├── _social-subscribe-lines.scss │ ├── _tables.scss │ ├── _team.scss │ └── _testimonials.scss ├── 0_constants ├── AuthConstants.js ├── DatabaseConstants.js ├── EnvKeyConstants.js ├── EnvValueConstants.js ├── FireStorageConstants.js ├── FunctionConstants.js ├── InternalErrorConstants.js ├── UnexpectedErrorConstants.js └── index.js ├── 0_styled ├── index.js ├── justify.js ├── marPad.js └── utils.js ├── 1_fire_init ├── core.js ├── handleDifferentCredential.js └── index.js ├── 1_utils ├── badWords.js ├── codeToolings.js ├── index.js ├── objects.js ├── reservedUsername.js └── validation.js ├── 2_fire_funct ├── cloudFunct.js └── index.js ├── 2_fire_storage ├── index.js ├── userAvatar.js └── utils.js ├── 2_fire_store ├── index.js ├── seller.js ├── sellerReviews.js ├── sellerSettings.js ├── userSettings.js └── utils.js ├── 2_routes ├── constants.js ├── index.js └── utils.js ├── 2_state ├── Alert │ ├── StoreAlert.js │ └── index.js ├── AlertSide │ ├── StoreAlertSide.js │ └── index.js ├── Modal │ ├── StoreModal.js │ └── index.js ├── Progress │ ├── StoreProgress.js │ └── index.js ├── SignIn │ ├── StoreSignIn.js │ └── index.js ├── Sound │ ├── StoreSound.js │ └── index.js ├── StateContainer.jsx ├── User │ ├── StoreUser.js │ └── index.js ├── Wrapper │ ├── StoreWrapper.js │ └── index.js ├── constants.js └── index.js ├── 3_api ├── handleIsEmailAccountNotExist.js ├── handleIsPasswordResetAble.js ├── handlePasswordReset.js ├── handleSignInWithEmailAndPassword.js ├── handleSignInWithSocials.js ├── handleSignUpWithEmailAndPassword.js └── index.js ├── 3_app_event ├── getRedirectResult.js ├── index.js ├── onAuthStateChange.js └── userPresence.js ├── 4_comp_utils └── index.js ├── 5_comp_0 ├── Button │ ├── Button.jsx │ ├── index.js │ └── styles.module.css ├── Helmet │ ├── Helmet.js │ └── index.js ├── Icon │ ├── Icon.jsx │ └── index.js ├── Image │ ├── Image.jsx │ └── index.js ├── Link │ ├── Link.jsx │ └── index.js ├── RowCol │ ├── RowCol.jsx │ └── index.js ├── UncontrolledTooltip │ ├── UncontrolledTooltip.jsx │ └── index.js └── index.js ├── 5_comp_1 ├── Alert │ ├── Alert.jsx │ └── index.js ├── AvatarUser │ ├── AvatarUser.jsx │ └── index.js ├── Badges │ ├── Badges.jsx │ ├── index.js │ ├── styles.module.css │ └── utils.js ├── BrandNavbar │ ├── BrandNavbar.jsx │ └── index.js ├── ButtonSignInUp │ ├── ButtonSignInUp.jsx │ └── index.js ├── ButtonSound │ ├── ButtonSound.jsx │ ├── index.js │ └── styled.js ├── ButtonSubmit │ ├── ButtonSubmit.jsx │ └── index.js ├── ButtonsCommon │ ├── ButtonsCommon.jsx │ ├── index.js │ └── utils.js ├── CardUserSimple │ ├── CardUserSimple.jsx │ └── index.js ├── Carousel │ ├── Carousel.jsx │ ├── index.js │ ├── styled.js │ └── utils.js ├── CheckBox │ ├── CheckBox.jsx │ └── index.js ├── CheckBoxIcon │ ├── CheckBoxIcon.jsx │ ├── index.js │ └── utils.js ├── Comments │ ├── Comments.jsx │ └── index.js ├── DropdownMenuNavbar │ ├── DropdownMenuNavbar.jsx │ ├── index.js │ └── utils.js ├── ErrorBoundary │ ├── ErrorBoundary.jsx │ └── index.js ├── FinalForm │ ├── FinalForm.jsx │ └── index.js ├── Footer │ ├── Footer.jsx │ ├── index.js │ └── styled.js ├── HeaderCollapsed │ ├── HeaderCollapsed.jsx │ └── index.js ├── HeaderLined │ ├── HeaderLined.jsx │ └── index.js ├── IconCard │ ├── IconCard.jsx │ └── index.js ├── IconNotification │ ├── IconNotification.jsx │ └── index.js ├── ImageUpload │ ├── ImageUpload.jsx │ └── index.js ├── ImagesTooltip │ ├── ImagesTooltip.jsx │ ├── index.js │ └── utils.js ├── InputDate │ ├── InputDate.jsx │ └── index.js ├── InputInteger │ ├── InputInteger.jsx │ └── index.js ├── InputSelect │ ├── InputSelect.jsx │ ├── index.js │ └── styles.css ├── InputText │ ├── InputText.jsx │ └── index.js ├── LabelForm │ ├── LabelForm.js │ └── index.js ├── LightBox │ ├── LightBox.jsx │ └── index.js ├── ListNavItem │ ├── ListNavItem.jsx │ ├── index.js │ ├── style.css │ └── utils.js ├── LoaderNavLink │ ├── LoaderNavLink.jsx │ └── index.js ├── MenuHamburger │ ├── MenuHamburger.jsx │ └── index.js ├── Modal │ ├── Modal.jsx │ └── index.js ├── ModalSimple │ ├── ModalSimple.jsx │ └── index.js ├── PageError │ ├── PageError.jsx │ └── index.js ├── Pagination │ ├── Pagination.jsx │ └── index.js ├── Popover │ ├── Popover.jsx │ └── index.js ├── Progress │ ├── Progress.jsx │ └── index.js ├── Section │ ├── Section.jsx │ └── index.js ├── Status │ ├── Status.jsx │ ├── index.js │ ├── styles.module.css │ └── utils.js ├── Tab │ ├── Tab.jsx │ └── index.js ├── TabListVertical │ ├── TabListVertical.jsx │ ├── index.js │ └── utils.js ├── TabPaneContainer │ ├── TabPaneContainer.jsx │ └── index.jsx ├── TextAlert │ ├── TextAlert.jsx │ └── index.js ├── TextIcon │ ├── TextIcon.jsx │ └── index.js ├── Wrapper │ ├── Wrapper.jsx │ └── index.js └── index.js ├── 5_comp_2 ├── ButtonsImage │ ├── ButtonsImage.jsx │ ├── index.js │ ├── styled.js │ └── utils.js ├── CardGift │ ├── CardGift.jsx │ ├── index.js │ └── utils.js ├── CardUser │ ├── CardUser.jsx │ ├── index.js │ └── styled.js ├── CardUserHorizontal │ ├── CardUserHorizontal.jsx │ ├── index.js │ └── styled.js ├── CarouselCardSimple │ ├── CarouselCardSimple.jsx │ ├── index.js │ └── utils.js ├── CarouselLightBox │ ├── CarouselLightBox.jsx │ ├── index.js │ └── utils.js ├── ChatContactList │ ├── ChatContactList.jsx │ ├── index.js │ └── utils.js ├── CommentWithPagination │ ├── CommentWithPagination.jsx │ └── index.js ├── DropdownNavbar │ ├── DropdownNavbar.jsx │ └── index.js ├── FinalInput │ ├── FinalInput.jsx │ └── index.js ├── ModalImageCropper │ ├── ModalImageCropper.jsx │ └── index.js ├── PanelFilterSearch │ ├── PanelFilterSearch.jsx │ └── index.js ├── PanelSortBy │ ├── PanelSortBy.jsx │ └── index.js ├── TabPaneSettingList │ ├── TabPaneSettingList.jsx │ ├── index.js │ └── utils.js ├── TabPanelService │ ├── TabPanelService.jsx │ └── index.js └── index.js ├── 5_comp_3 ├── ChatMessageContainer │ ├── ChatMessageContainer.jsx │ ├── index.js │ └── utils.js ├── FinalDateBirthDate │ ├── FinalDateBirthDate.jsx │ └── index.js ├── FinalSelectCountry │ ├── FinalSelectCountry.jsx │ └── index.js ├── FinalSelectExpiryMonth │ ├── FinalSelectExpiryMonth.jsx │ └── index.js ├── FinalSelectExpiryYear │ ├── FinalSelectExpiryYear.jsx │ └── index.js ├── FinalSelectGame │ ├── FinalSelectGame.jsx │ └── index.js ├── FinalSelectGender │ ├── FinalSelectGender.jsx │ └── index.js ├── FinalSelectLanguages │ ├── FinalSelectLanguages.jsx │ └── index.js ├── FinalTextCardCVC │ ├── FinalTextCardCVC.jsx │ └── index.js ├── FinalTextCardHolderName │ ├── FinalTextCardHolderName.jsx │ └── index.js ├── FinalTextCardNumber │ ├── FinalTextCardNumber.jsx │ └── index.js ├── FinalTextEmail │ ├── FinalTextEmail.jsx │ └── index.js ├── FinalTextName │ ├── FinalTextName.jsx │ └── index.js ├── FinalTextPassword │ ├── FinalTextPassword.jsx │ └── index.js ├── TabServices │ ├── TabServices.jsx │ └── index.js ├── UploaderAvatar │ ├── UploaderAvatar.js │ ├── index.js │ └── utils.js └── index.js ├── 5_comp_4 ├── CheckoutCard │ ├── CheckoutCard.jsx │ ├── index.js │ └── utils.js ├── ContainerSearchResults │ ├── ContainerSearchResults.jsx │ ├── index.js │ └── utils.js ├── FormCard │ ├── FormCard.jsx │ └── index.js ├── FormResetPassword │ ├── FormResetPassword.jsx │ └── index.js ├── FormSignIn │ ├── FormSignIn.jsx │ └── index.js ├── FormSignUp │ ├── FormSignUp.jsx │ ├── index.js │ └── utils.js ├── NavbarIndex │ ├── NavbarIndex.jsx │ └── index.js ├── TabPaneAccountSettings │ ├── TabPaneAccountSettings.jsx │ └── index.js ├── TabPaneGeneralSettings │ ├── TabPaneGeneralSettings.jsx │ └── index.js └── index.js ├── 5_comp_5 ├── TabPanePaymentSettings │ ├── TabPanePaymentSettings.jsx │ └── index.js └── index.js ├── 5_comp_6 ├── PageChat │ ├── PageChat.jsx │ └── index.js ├── PageCheckout │ ├── PageCheckout.jsx │ └── index.js ├── PageFilter │ ├── PageFilter.jsx │ └── index.js ├── PageHelp │ ├── PageHelp.jsx │ └── index.js ├── PageIndex │ ├── PageIndex.jsx │ ├── TabDiscover.js │ └── index.js ├── PagePasswordReset.jsx ├── PagePolicies │ ├── Cookie.js │ ├── PagePolicies.jsx │ ├── Privacy.js │ ├── Terms.js │ └── index.js ├── PageProfile │ ├── PageProfile.jsx │ ├── index.js │ ├── styled.js │ └── utils.js ├── PageSettings.jsx ├── PageSignIn.jsx ├── PageSignUp.jsx └── Router.jsx ├── App.jsx ├── index.js ├── serviceWorker.js ├── sw-build.js └── sw-template.js /.config/example.env: -------------------------------------------------------------------------------- 1 | # currently there is no variables yet 2 | # you need two env file: prod.env and dev.env 3 | REACT_APP_API_KEY='isdhaodowqje9120dj821hd81dwdidsoaik' 4 | REACT_APP_AUTH_DOMAIN='xxx.firebaseapp.com' 5 | REACT_APP_DATABASE_URL='https://xxx.firebaseio.com' 6 | REACT_APP_PROJECT_ID='xxx' 7 | REACT_APP_STORAGE_BUCKET='xxx.appspot.com' 8 | REACT_APP_MESSAGING_SENDER_ID='8949848484848' 9 | REACT_APP_APP_ID='1:8949848484848:web:z27yx73pz7my3e7' 10 | REACT_APP_FOLLOW_CURSOR=1 11 | REACT_APP_TWITCH_CLIENT=dhjshdjsahdsaidhsadjksa 12 | PORT=3000 13 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | 2 | # this environment variable file is safe to expose 3 | # https://itnext.io/configure-absolute-paths-with-create-react-app-and-flow-e4b8922676a2 4 | NODE_PATH=src 5 | BROWSER=none 6 | SKIP_PREFLIGHT_CHECK=true -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "gamessenshi" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Enhancement 3 | about: New feature or request 4 | title: "[Enhancement]" 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/help_wanted.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Help wanted 3 | about: Looking for help 4 | title: "[Help Wanted]" 5 | labels: help wanted 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | What has been changed? 2 | 1. 3 | 2. 4 | 3. 5 | 6 | What has been achieved? 7 | 1. 8 | 2. 9 | 3. 10 | 11 | From which issue(s) or card(s) (link if any)? 12 | 1. 13 | 2. 14 | 3. 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # environments 15 | .config/dev.env 16 | .config/prod.env 17 | .config/devLocal.env 18 | .config/prodLocal.env 19 | .config.zip 20 | 21 | # cache 22 | /.firebase 23 | 24 | # editor 25 | /.vscode 26 | 27 | # misc 28 | .DS_Store 29 | .env.local 30 | .env.development.local 31 | .env.test.local 32 | .env.production.local 33 | 34 | npm-debug.log* 35 | yarn-debug.log* 36 | yarn-error.log* 37 | firebase-debug.log 38 | 39 | test.js -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.scss -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # CONTRIBUTING 2 | 3 | We use Trello for task management, you can join it [here](https://trello.com/invite/b/tAyH3oig/a5374e9eaa1bbe644f3e7367d1e23300/game-senshi)! 4 | 5 | ## Working on Code 6 | 7 | 1. Create a card and describe what you are going to do, skip this if you want to work on existing task. 8 | 2. Pick a new task, edit your name into the card . 9 | 3. If you want to work on a on going task, get permission from person who is already working on it first. 10 | 4. Start a new branch or fork and start hacking. 11 | 5. Always let others in `Discord` know what you are working on. 12 | 13 | ## Adding Library 14 | 15 | If you have any library that you want to use, please discuss it with the team first, as we want to avoid using different library that do the same thing. 16 | 17 | ## Resources 18 | 19 | Please read [wiki](https://github.com/tylim88/GameSenshi/wiki) for details of our code, techs, guides and resources. 20 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "firestore": { 3 | "rules": "/firestore.rules", 4 | "indexes": "/firestore.indexes.json" 5 | }, 6 | "functions": { 7 | "source": "./functions" 8 | }, 9 | "hosting": { 10 | "public": "build", 11 | "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], 12 | "rewrites": [ 13 | { 14 | "source": "**", 15 | "destination": "/index.html" 16 | } 17 | ] 18 | }, 19 | "storage": { 20 | "rules": "/firestorage.rules" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /firecors.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "origin": ["*"], 4 | "method": ["GET"], 5 | "maxAgeSeconds": 3600 6 | } 7 | ] 8 | -------------------------------------------------------------------------------- /firestorage.rules: -------------------------------------------------------------------------------- 1 | service firebase.storage { 2 | match /b/{bucket}/o { 3 | match /{allPaths=**} { 4 | allow read, write: if request.auth!=null; 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /firestore.indexes.json: -------------------------------------------------------------------------------- 1 | { 2 | // Example: 3 | // 4 | // "indexes": [ 5 | // { 6 | // "collectionGroup": "widgets", 7 | // "queryScope": "COLLECTION", 8 | // "fields": [ 9 | // { "fieldPath": "foo", "arrayConfig": "CONTAINS" }, 10 | // { "fieldPath": "bar", "mode": "DESCENDING" } 11 | // ] 12 | // }, 13 | // 14 | // "fieldOverrides": [ 15 | // { 16 | // "collectionGroup": "widgets", 17 | // "fieldPath": "baz", 18 | // "indexes": [ 19 | // { "order": "ASCENDING", "queryScope": "COLLECTION" } 20 | // ] 21 | // }, 22 | // ] 23 | // ] 24 | "indexes": [], 25 | "fieldOverrides": [] 26 | } 27 | -------------------------------------------------------------------------------- /firestore.rules: -------------------------------------------------------------------------------- 1 | rules_version = '2'; 2 | service cloud.firestore { 3 | match /databases/{database}/documents { 4 | match /users/{userId} { 5 | allow get, create: if request.auth !=null && request.auth.uid == userId; 6 | 7 | match /settings/notifications { 8 | allow read, write: if request.auth !=null && request.auth.uid == userId; 9 | } 10 | match /settings/general { 11 | allow read; 12 | allow write: if request.auth !=null && request.auth.uid == userId; 13 | } 14 | match /sellers/{sellerUid}{ 15 | allow read, write: if request.auth !=null && request.auth.uid == userId; 16 | } 17 | } 18 | match /sellers/{sellerUid}{ 19 | allow get; 20 | match /settings/profile{ 21 | allow get; 22 | allow write: if request.auth !=null && request.auth.uid == sellerUid; 23 | } 24 | match /reviews/{commentsUid}{ 25 | allow get; 26 | } 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /functions/.config/example.env: -------------------------------------------------------------------------------- 1 | # you need two env file, prod.env and dev.env 2 | # the name follow front end name for convenience 3 | # name is lowecase because firebase config only allow lower case 4 | env_playground_enabled=true #allow playground or not 5 | env_cors_whitelist=https://yourapp1.com/index,https://yourapp2.com/,http://localhost:3000 6 | # third party service 7 | env_apollo_engine_api_key=4en93e9r5eh76fhqxd3kfnaev2jcxy 8 | env_project_id=gamessenshi 9 | env_twitch_id=sz9dmu9u823euyz83m8eze893ne83 10 | env_twitch_secret=ux38xyn3ixheuiurby37x73y -------------------------------------------------------------------------------- /functions/.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | # environments 5 | /.config/dev.env 6 | /.config/prod.env 7 | 8 | # build 9 | /dist 10 | 11 | # cache 12 | .cache 13 | 14 | # misc 15 | test.js -------------------------------------------------------------------------------- /functions/src/0_constants/AuthConstants.js: -------------------------------------------------------------------------------- 1 | const AUTH_GOOGLE = 'Google' 2 | const AUTH_FACEBOOK = 'Facebook' 3 | const AUTH_TWITCH = 'Twitch' 4 | 5 | export { AUTH_GOOGLE, AUTH_FACEBOOK, AUTH_TWITCH } 6 | -------------------------------------------------------------------------------- /functions/src/0_constants/DatabaseConstants.js: -------------------------------------------------------------------------------- 1 | const DATABASE_STATUS_ONLINE = 'online' 2 | const DATABASE_STATUS_ONLINE_LAST = 'onlineLast' 3 | 4 | const databasePathStatus = uid => '/status/' + uid 5 | 6 | export { 7 | DATABASE_STATUS_ONLINE, 8 | DATABASE_STATUS_ONLINE_LAST, 9 | databasePathStatus, 10 | } 11 | -------------------------------------------------------------------------------- /functions/src/0_constants/EnvKeyConstants.js: -------------------------------------------------------------------------------- 1 | // firebase do not allow to use any capital letter in env var name 2 | // these env only used by backend 3 | const ENV = 'env' 4 | const generateEnv = string => ENV + '_' + string 5 | const ENV_ENABLE_PLAYGROUND = generateEnv('playground_enabled') 6 | const ENV_CORS_WHITELIST = generateEnv('cors_whitelist') 7 | const ENV_VERIFY_EMAIL_API_URL = generateEnv('verify_email_api_url') 8 | const ENV_APOLLO_ENGINE_API_KEY = generateEnv('apollo_engine_api_key') 9 | const ENV_PROJECT_ID = generateEnv('project_id') 10 | const ENV_TWITCH_ID = generateEnv('twitch_id') 11 | const ENV_TWITCH_SECRET = generateEnv('twitch_secret') 12 | 13 | export { 14 | ENV, 15 | ENV_ENABLE_PLAYGROUND, 16 | ENV_VERIFY_EMAIL_API_URL, 17 | ENV_APOLLO_ENGINE_API_KEY, 18 | ENV_CORS_WHITELIST, 19 | ENV_PROJECT_ID, 20 | ENV_TWITCH_ID, 21 | ENV_TWITCH_SECRET, 22 | } 23 | -------------------------------------------------------------------------------- /functions/src/0_constants/EnvValueConstants.js: -------------------------------------------------------------------------------- 1 | const env = process.env 2 | 3 | const ENV_VALUE_FIREBASE_CONFIG = Object.freeze({ 4 | apiKey: env.REACT_APP_API_KEY, 5 | authDomain: env.REACT_APP_AUTH_DOMAIN, 6 | databaseURL: env.REACT_APP_DATABASE_URL, 7 | projectId: env.REACT_APP_PROJECT_ID, 8 | storageBucket: env.REACT_APP_STORAGE_BUCKET, 9 | messagingSenderId: env.REACT_APP_MESSAGING_SENDER_ID, 10 | appId: env.REACT_APP_APP_ID, 11 | }) 12 | 13 | const ENV_VALUE_TWITCH_CLIENT = env.REACT_APP_TWITCH_CLIENT 14 | 15 | let redirect = '' 16 | 17 | try { 18 | redirect = window.location.origin 19 | } catch (err) { 20 | // back end doesnt need this, this is to prevent error in backen because window not defined 21 | } 22 | 23 | const ENV_VALUE_TWITCH_OAUTH_LINK = `https://id.twitch.tv/oauth2/authorize?client_id=${ENV_VALUE_TWITCH_CLIENT}&redirect_uri=${redirect}&response_type=code&scope=openid+user_read+user:read:email&force_verify=true` 24 | 25 | export { ENV_VALUE_FIREBASE_CONFIG, ENV_VALUE_TWITCH_OAUTH_LINK } 26 | -------------------------------------------------------------------------------- /functions/src/0_constants/FunctionConstants.js: -------------------------------------------------------------------------------- 1 | const FUNCTION_DATA = 'data' 2 | const FUNCTION_STATUS = 'status' 3 | const FUNCTION_CODE = 'code' 4 | const FUNCTION_MESSAGE = 'message' 5 | const FUNCTION_INPUT = 'Input' 6 | const FUNCTION_EMAIL = 'email' 7 | const FUNCTION_PASSWORD = 'password' 8 | const FUNCTION_DISPLAY_NAME = 'displayName' 9 | const FUNCTION_OAUTH_CODE = 'oAuthCode' 10 | const FUNCTION_TOKEN_CUSTOM = 'customToken' 11 | const FUNCTION_REDIRECT_URI = 'redirectUri' 12 | const FUNCTION_UID = 'uid' 13 | const FUNCTION_ON_DATA_SEED = 'onSellerSeed' 14 | const FUNCTION_ON_TWITCH_SIGN_IN = 'onTwitchSignIn' 15 | 16 | export { 17 | FUNCTION_DATA, 18 | FUNCTION_STATUS, 19 | FUNCTION_CODE, 20 | FUNCTION_MESSAGE, 21 | FUNCTION_INPUT, 22 | FUNCTION_EMAIL, 23 | FUNCTION_PASSWORD, 24 | FUNCTION_DISPLAY_NAME, 25 | FUNCTION_OAUTH_CODE, 26 | FUNCTION_TOKEN_CUSTOM, 27 | FUNCTION_REDIRECT_URI, 28 | FUNCTION_ON_DATA_SEED, 29 | FUNCTION_ON_TWITCH_SIGN_IN, 30 | FUNCTION_UID, 31 | } 32 | -------------------------------------------------------------------------------- /functions/src/1_fire_init/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | bucketDefault, 3 | firestore, 4 | auth, 5 | onCall, 6 | functions, 7 | pubSub, 8 | CORS_WHITE_LIST, 9 | PLAYGROUND_ENABLED, 10 | APOLLO_ENGINE_API_KEY, 11 | TWITCH_ID, 12 | TWITCH_SECRET, 13 | PROJECT_ID, 14 | } from './core' 15 | 16 | export { 17 | bucketDefault, 18 | firestore, 19 | auth, 20 | onCall, 21 | functions, 22 | pubSub, 23 | CORS_WHITE_LIST, 24 | PLAYGROUND_ENABLED, 25 | APOLLO_ENGINE_API_KEY, 26 | TWITCH_ID, 27 | TWITCH_SECRET, 28 | PROJECT_ID, 29 | } 30 | -------------------------------------------------------------------------------- /functions/src/2_fire_storage/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | storageUserAvatarFile, 3 | storageUserAvatarGet, 4 | storageUserAvatarSet, 5 | storageUserAvatarDelete, 6 | storageUserAvatarWriteStream, 7 | } from './userAvatar' 8 | 9 | import { bucketDefault } from './utils' 10 | 11 | export { 12 | storageUserAvatarFile, 13 | bucketDefault, 14 | storageUserAvatarGet, 15 | storageUserAvatarSet, 16 | storageUserAvatarDelete, 17 | storageUserAvatarWriteStream, 18 | } 19 | -------------------------------------------------------------------------------- /functions/src/2_fire_storage/userAvatar.js: -------------------------------------------------------------------------------- 1 | import { storageSetGenerator } from './utils' 2 | 3 | import { storagePathUserAvatar } from '0_constants' 4 | 5 | const { 6 | file: storageUserAvatarFile, 7 | get: storageUserAvatarGet, 8 | set: storageUserAvatarSet, 9 | del: storageUserAvatarDelete, 10 | writeStream: storageUserAvatarWriteStream, 11 | } = storageSetGenerator(storagePathUserAvatar) 12 | 13 | export { 14 | storageUserAvatarFile, 15 | storageUserAvatarGet, 16 | storageUserAvatarSet, 17 | storageUserAvatarDelete, 18 | storageUserAvatarWriteStream, 19 | } 20 | -------------------------------------------------------------------------------- /functions/src/2_fire_storage/utils.js: -------------------------------------------------------------------------------- 1 | import { bucketDefault } from '1_fire_init' 2 | 3 | const storageSetGenerator = path => { 4 | const file = (...args) => bucketDefault.file(path(...args)) 5 | const get = (...args) => file(...args).get() 6 | const set = (...args) => (content, options) => 7 | file(...args).save(content, options) 8 | const del = (...args) => file(...args).delete() 9 | const writeStream = (...args) => config => 10 | file(...args).createWriteStream(config) 11 | return { get, set, del, writeStream, file } 12 | } 13 | 14 | export { storageSetGenerator, bucketDefault } 15 | -------------------------------------------------------------------------------- /functions/src/2_fire_store/seller.js: -------------------------------------------------------------------------------- 1 | import { docGetSetBatch } from './utils' 2 | 3 | import { fireStorePathSeller } from '0_constants' 4 | 5 | const { 6 | ref: docSellerRef, 7 | set: docSellerSet, 8 | get: docSellerGet, 9 | } = docGetSetBatch(fireStorePathSeller) 10 | 11 | export { docSellerSet, docSellerGet, docSellerRef } 12 | -------------------------------------------------------------------------------- /functions/src/2_fire_store/senshiReviews.js: -------------------------------------------------------------------------------- 1 | import { docGetSetBatch } from './utils' 2 | 3 | import { fireStorePathSellerReviews } from '0_constants' 4 | 5 | const { batch: docSellerReviewsBatch } = docGetSetBatch( 6 | fireStorePathSellerReviews 7 | ) 8 | 9 | export { docSellerReviewsBatch } 10 | -------------------------------------------------------------------------------- /functions/src/3_fire_funct/constants.js: -------------------------------------------------------------------------------- 1 | const allPaths = [ 2 | '{collecId}/{docId}', 3 | '{collecId}/{docId}/{subCollecId}/{subDocId}', 4 | ] 5 | 6 | export { allPaths } 7 | -------------------------------------------------------------------------------- /functions/src/3_fire_funct/index.js: -------------------------------------------------------------------------------- 1 | import { onTwitchSignIn } from './onTwitchSignIn' 2 | import { onUserCreate } from './onUserCreate' 3 | import { onDocCreate, onDocSubCreate } from './onDocCreate' 4 | import { onBillingAlert } from './onBillingAlert' 5 | import { onDocUpdate, onDocSubUpdate } from './onDocUpdate' 6 | import { onSellerSeed } from './onSellerSeed' 7 | import { onCommentCreate } from './onCommentCreate' 8 | import { onCommentDelete } from './onCommentDelete' 9 | 10 | export { 11 | onTwitchSignIn, 12 | onUserCreate, 13 | onDocCreate, 14 | onDocSubCreate, 15 | onBillingAlert, 16 | onDocUpdate, 17 | onDocSubUpdate, 18 | onSellerSeed, 19 | onCommentCreate, 20 | onCommentDelete, 21 | } 22 | -------------------------------------------------------------------------------- /functions/src/3_fire_funct/onDocCreate.js: -------------------------------------------------------------------------------- 1 | import { docOnCreate, getTimestamp } from '2_fire_store' 2 | import { CREATED_AT } from '0_constants' 3 | import { allPaths } from './constants' 4 | 5 | const [onDocCreate, onDocSubCreate] = allPaths.map(path => 6 | docOnCreate(path)(snap => { 7 | const timestamp = getTimestamp() 8 | return snap.ref 9 | .update({ 10 | [CREATED_AT]: timestamp, 11 | }) 12 | .catch(console.log) 13 | }) 14 | ) 15 | 16 | export { onDocCreate, onDocSubCreate } 17 | -------------------------------------------------------------------------------- /functions/src/3_fire_funct/onDocUpdate.js: -------------------------------------------------------------------------------- 1 | import { docOnUpdate, getTimestamp } from '2_fire_store' 2 | import { UPDATED_AT } from '0_constants' 3 | import { allPaths } from './constants' 4 | 5 | const [onDocUpdate, onDocSubUpdate] = allPaths.map(path => 6 | docOnUpdate(path)(change => { 7 | const timestamp = getTimestamp() 8 | //eslint-disable-next-line 9 | const { [UPDATED_AT]: updatedAt, ...newData } = change.after.data() 10 | //eslint-disable-next-line 11 | const { [UPDATED_AT]: updatedAt2, ...oldData } = change.before.data() 12 | 13 | if (JSON.stringify(oldData) !== JSON.stringify(newData)) { 14 | return change.after.ref 15 | .update({ 16 | [UPDATED_AT]: timestamp, 17 | }) 18 | .catch(console.log) 19 | } 20 | }) 21 | ) 22 | 23 | export { onDocUpdate, onDocSubUpdate } 24 | -------------------------------------------------------------------------------- /functions/src/resolvers/Mutation.js: -------------------------------------------------------------------------------- 1 | import { FUNCTION_SIGN_IN } from '0_constants' 2 | 3 | const Mutation = { 4 | [FUNCTION_SIGN_IN]: () => {}, 5 | } 6 | 7 | export { Mutation } 8 | -------------------------------------------------------------------------------- /functions/src/resolvers/Query.js: -------------------------------------------------------------------------------- 1 | const Query = { 2 | test: () => 'test', 3 | } 4 | 5 | export { Query } 6 | -------------------------------------------------------------------------------- /functions/src/resolvers/index.js: -------------------------------------------------------------------------------- 1 | import { Mutation } from './Mutation' 2 | import { Query } from './Query' 3 | import { typeDefs } from './typeDefs' 4 | 5 | const resolvers = { Mutation, Query } 6 | 7 | export { typeDefs, resolvers } 8 | -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | #da532c 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/public/favicon.ico -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Game Senshi", 3 | "name": "Game Senshi", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "start_url": "/index.html", 17 | "scope": ".", 18 | "display": "standalone", 19 | "orientation": "portrait-primary", 20 | "background-color": "#fff", 21 | "theme-color": "#3f51b5", 22 | "description": "A platform for gamers to provide their casual services", 23 | "dir": "ltr", 24 | "lang": "en-US" 25 | } 26 | -------------------------------------------------------------------------------- /public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/public/mstile-150x150.png -------------------------------------------------------------------------------- /src/0_app_flavor/index.js: -------------------------------------------------------------------------------- 1 | import AVATAR_DEFAULT from '0_assets/img/placeholder.jpg' 2 | 3 | const BRAND = 'Game Senshi' 4 | const SELLER = 'Senshi' 5 | 6 | export { AVATAR_DEFAULT, BRAND, SELLER } 7 | -------------------------------------------------------------------------------- /src/0_assets/audio/sampleVoice.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/audio/sampleVoice.mp3 -------------------------------------------------------------------------------- /src/0_assets/demo/react-demo.css: -------------------------------------------------------------------------------- 1 | @keyframes Floatingy { 2 | from { 3 | -webkit-transform: translate(0, 0px); 4 | } 5 | 65% { 6 | -webkit-transform: translate(50px, 0); 7 | } 8 | to { 9 | -webkit-transform: translate(0, 0px); 10 | } 11 | } 12 | 13 | @keyframes Floatingx { 14 | from { 15 | -webkit-transform: translate(50px, 0px); 16 | } 17 | 65% { 18 | -webkit-transform: translate(0, 0); 19 | } 20 | to { 21 | -webkit-transform: translate(50px, 0px); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/0_assets/fonts/nucleo.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/fonts/nucleo.eot -------------------------------------------------------------------------------- /src/0_assets/fonts/nucleo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/fonts/nucleo.ttf -------------------------------------------------------------------------------- /src/0_assets/fonts/nucleo.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/fonts/nucleo.woff -------------------------------------------------------------------------------- /src/0_assets/fonts/nucleo.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/fonts/nucleo.woff2 -------------------------------------------------------------------------------- /src/0_assets/icons/games/Apex.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/games/Apex.ico -------------------------------------------------------------------------------- /src/0_assets/icons/games/Dota2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/games/Dota2.png -------------------------------------------------------------------------------- /src/0_assets/icons/games/Fortnite.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/games/Fortnite.ico -------------------------------------------------------------------------------- /src/0_assets/icons/games/LOL.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/games/LOL.ico -------------------------------------------------------------------------------- /src/0_assets/icons/games/PUBG.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/games/PUBG.ico -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/affection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/affection.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/bauble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/bauble.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/building.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/building.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/carousel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/carousel.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/crowns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/crowns.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/cupid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/cupid.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/donut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/donut.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/flower-bouquet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/flower-bouquet.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/friends.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/friends.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/handbag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/handbag.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/kitty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/kitty.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/lips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/lips.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/lollipop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/lollipop.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/love-message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/love-message.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/microphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/microphone.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/positive-vote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/positive-vote.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/ring.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/rose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/rose.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/sunflower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/sunflower.png -------------------------------------------------------------------------------- /src/0_assets/icons/gifts/top-hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/icons/gifts/top-hat.png -------------------------------------------------------------------------------- /src/0_assets/img/braden-collum.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/braden-collum.jpg -------------------------------------------------------------------------------- /src/0_assets/img/christian.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/christian.jpg -------------------------------------------------------------------------------- /src/0_assets/img/denys.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/denys.jpg -------------------------------------------------------------------------------- /src/0_assets/img/dots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/dots.png -------------------------------------------------------------------------------- /src/0_assets/img/fabien-bazanegue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/fabien-bazanegue.jpg -------------------------------------------------------------------------------- /src/0_assets/img/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/favicon-32x32.png -------------------------------------------------------------------------------- /src/0_assets/img/favicon-soldier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/favicon-soldier.png -------------------------------------------------------------------------------- /src/0_assets/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/favicon.ico -------------------------------------------------------------------------------- /src/0_assets/img/gucci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/gucci.png -------------------------------------------------------------------------------- /src/0_assets/img/index/dota2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/index/dota2.jpg -------------------------------------------------------------------------------- /src/0_assets/img/index/fornite.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/index/fornite.jpg -------------------------------------------------------------------------------- /src/0_assets/img/index/lol.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/index/lol.jpg -------------------------------------------------------------------------------- /src/0_assets/img/jacket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/jacket.png -------------------------------------------------------------------------------- /src/0_assets/img/james.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/james.jpg -------------------------------------------------------------------------------- /src/0_assets/img/johana.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/johana.jpg -------------------------------------------------------------------------------- /src/0_assets/img/kareya-saleh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/kareya-saleh.jpg -------------------------------------------------------------------------------- /src/0_assets/img/logo-soldier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/logo-soldier.png -------------------------------------------------------------------------------- /src/0_assets/img/mark-finn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/mark-finn.jpg -------------------------------------------------------------------------------- /src/0_assets/img/michael.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/michael.jpg -------------------------------------------------------------------------------- /src/0_assets/img/mike.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/mike.jpeg -------------------------------------------------------------------------------- /src/0_assets/img/mike.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/mike.jpg -------------------------------------------------------------------------------- /src/0_assets/img/olivia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/olivia.jpg -------------------------------------------------------------------------------- /src/0_assets/img/p10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/p10.jpg -------------------------------------------------------------------------------- /src/0_assets/img/path4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/path4.png -------------------------------------------------------------------------------- /src/0_assets/img/placeholder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/placeholder.jpg -------------------------------------------------------------------------------- /src/0_assets/img/readme/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/error.png -------------------------------------------------------------------------------- /src/0_assets/img/readme/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/index.png -------------------------------------------------------------------------------- /src/0_assets/img/readme/joinChannel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/joinChannel.png -------------------------------------------------------------------------------- /src/0_assets/img/readme/policy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/policy.png -------------------------------------------------------------------------------- /src/0_assets/img/readme/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/profile.png -------------------------------------------------------------------------------- /src/0_assets/img/readme/reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/reset.png -------------------------------------------------------------------------------- /src/0_assets/img/readme/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/settings.png -------------------------------------------------------------------------------- /src/0_assets/img/readme/signIn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/signIn.png -------------------------------------------------------------------------------- /src/0_assets/img/readme/signUp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/readme/signUp.png -------------------------------------------------------------------------------- /src/0_assets/img/ryan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/ryan.png -------------------------------------------------------------------------------- /src/0_assets/img/shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/shape.png -------------------------------------------------------------------------------- /src/0_assets/img/square-purple-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/square-purple-1.png -------------------------------------------------------------------------------- /src/0_assets/img/square1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/square1.png -------------------------------------------------------------------------------- /src/0_assets/img/square2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/square2.png -------------------------------------------------------------------------------- /src/0_assets/img/square3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/square3.png -------------------------------------------------------------------------------- /src/0_assets/img/square4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/square4.png -------------------------------------------------------------------------------- /src/0_assets/img/square5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zero-to-mastery/GameSenshi/869f6ad4c4efc5e4d746ee0bb40689284a4120cb/src/0_assets/img/square5.png -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/_mixins.scss: -------------------------------------------------------------------------------- 1 | //Utilities 2 | @import "mixins/transparency"; 3 | 4 | //Components 5 | @import "mixins/buttons"; 6 | @import "mixins/vendor-prefixes"; 7 | @import "mixins/inputs"; 8 | @import "mixins/cards"; 9 | @import "mixins/dropdown"; 10 | @import "mixins/badges"; 11 | @import "mixins/popovers"; 12 | @import "mixins/modals"; 13 | @import "mixins/pages"; 14 | @import "mixins/datepicker"; 15 | @import "mixins/navbar"; 16 | 17 | @import "mixins/tags"; 18 | @import "mixins/social-buttons"; 19 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/_modals-extend.scss: -------------------------------------------------------------------------------- 1 | .modal{ 2 | .modal-login{ 3 | max-width: 320px; 4 | background: $card-black-background; 5 | .card-login{ 6 | .logo-container{ 7 | width: 65px; 8 | margin-bottom: 38px; 9 | margin-top: 27px; 10 | } 11 | } 12 | } 13 | 14 | .card { 15 | margin-bottom: 0; 16 | 17 | .card-header .close{ 18 | position: absolute; 19 | right: 5px; 20 | color: white; 21 | top: 5px; 22 | font-size: 14px; 23 | cursor: pointer; 24 | z-index: 9; 25 | } 26 | } 27 | 28 | &.modal-mini.show { 29 | .modal-dialog { 30 | transform: translate(0, 100%) !important; 31 | } 32 | } 33 | } 34 | 35 | @include media-breakpoint-down(xs){ 36 | .modal .modal-dialog.modal-login{ 37 | margin: 0.5rem auto; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/_pills-extend.scss: -------------------------------------------------------------------------------- 1 | .nav-pills{ 2 | &.flex-column li > a{ 3 | margin-bottom: 15px; 4 | } 5 | 6 | &:not(.nav-pills-icons):not(.nav-pills-just-icons) .nav-item .nav-link{ 7 | border-radius: $btn-round-radius; 8 | } 9 | 10 | &.nav-pills-icons{ 11 | .nav-item { 12 | i{ 13 | font-size: 20px; 14 | } 15 | } 16 | } 17 | 18 | &.nav-pills-lg{ 19 | .nav-item{ 20 | .nav-link{ 21 | padding: 11px 60px; 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/_sections-extend.scss: -------------------------------------------------------------------------------- 1 | .parallax-s{ 2 | overflow: hidden; 3 | height: 500px; 4 | width: 100%; 5 | } 6 | 7 | [class*="features-"], 8 | [class*="team-"], 9 | [class*="projects-"], 10 | [class*="pricing-"], 11 | [class*="testimonials-"], 12 | [class*="contactus-"]{ 13 | padding: 80px 0; 14 | } 15 | 16 | @import 'sections/_accordion'; 17 | @import 'sections/_tables'; 18 | @import 'sections/_headers'; 19 | @import 'sections/_features'; 20 | @import 'sections/_blogs'; 21 | @import 'sections/_team'; 22 | @import 'sections/_projects'; 23 | @import 'sections/_pricing'; 24 | @import 'sections/_testimonials'; 25 | @import 'sections/_contactus'; 26 | 27 | @import 'sections/_social-subscribe-lines'; 28 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/avatars/_avatar-group.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Avatar group 3 | // 4 | 5 | // General styles 6 | 7 | .avatar-group { 8 | .avatar { 9 | position: relative; 10 | z-index: 2; 11 | border: 2px solid $card-black-background; 12 | 13 | &:hover { 14 | z-index: 3; 15 | } 16 | } 17 | 18 | .avatar + .avatar { 19 | margin-left: -1rem; 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/avatars/_avatar.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Avatar 3 | // 4 | 5 | // General styles 6 | 7 | .avatar { 8 | color: $white; 9 | background-color: $gray-500; 10 | display: inline-flex; 11 | align-items: center; 12 | justify-content: center; 13 | font-size: 1rem; 14 | border-radius: 50%; 15 | height: 48px; 16 | width: 48px; 17 | 18 | img { 19 | width: 100%; 20 | border-radius: 50%; 21 | } 22 | 23 | + .avatar-content { 24 | display: inline-block; 25 | margin-left: .75rem; 26 | } 27 | } 28 | 29 | 30 | // Avatar size variations 31 | 32 | .avatar-lg { 33 | width: 58px; 34 | height: 58px; 35 | font-size: $font-size-sm; 36 | } 37 | 38 | .avatar-sm { 39 | width: 36px; 40 | height: 36px; 41 | font-size: $font-size-sm; 42 | } 43 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/_jumbotron.scss: -------------------------------------------------------------------------------- 1 | .jumbotron { 2 | padding: $jumbotron-padding ($jumbotron-padding / 2); 3 | margin-bottom: $jumbotron-padding; 4 | color: $jumbotron-color; 5 | background-color: $jumbotron-bg; 6 | @include border-radius($border-radius-lg); 7 | 8 | @include media-breakpoint-up(sm) { 9 | padding: ($jumbotron-padding * 2) $jumbotron-padding; 10 | } 11 | } 12 | 13 | .jumbotron-fluid { 14 | padding-right: 0; 15 | padding-left: 0; 16 | @include border-radius(0); 17 | } 18 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/_media.scss: -------------------------------------------------------------------------------- 1 | .media { 2 | display: flex; 3 | align-items: flex-start; 4 | } 5 | 6 | .media-body { 7 | flex: 1; 8 | } 9 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/_root.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | // Custom variable values only support SassScript inside `#{}`. 3 | @each $color, $value in $colors { 4 | --#{$color}: #{$value}; 5 | } 6 | 7 | @each $color, $value in $theme-colors { 8 | --#{$color}: #{$value}; 9 | } 10 | 11 | @each $bp, $value in $grid-breakpoints { 12 | --breakpoint-#{$bp}: #{$value}; 13 | } 14 | 15 | // Use `inspect` for lists so that quoted items keep the quotes. 16 | // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 17 | --font-family-sans-serif: #{inspect($font-family-sans-serif)}; 18 | --font-family-monospace: #{inspect($font-family-monospace)}; 19 | } 20 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/_transitions.scss: -------------------------------------------------------------------------------- 1 | .fade { 2 | @include transition($transition-fade); 3 | 4 | &:not(.show) { 5 | opacity: 0; 6 | } 7 | } 8 | 9 | .collapse { 10 | &:not(.show) { 11 | display: none; 12 | } 13 | } 14 | 15 | .collapsing { 16 | position: relative; 17 | height: 0; 18 | overflow: hidden; 19 | @include transition($transition-collapse); 20 | } 21 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/_utilities.scss: -------------------------------------------------------------------------------- 1 | @import "utilities/align"; 2 | @import "utilities/background"; 3 | @import "utilities/borders"; 4 | @import "utilities/clearfix"; 5 | @import "utilities/display"; 6 | @import "utilities/embed"; 7 | @import "utilities/flex"; 8 | @import "utilities/float"; 9 | @import "utilities/overflow"; 10 | @import "utilities/position"; 11 | @import "utilities/screenreaders"; 12 | @import "utilities/shadows"; 13 | @import "utilities/sizing"; 14 | @import "utilities/stretched-link"; 15 | @import "utilities/spacing"; 16 | @import "utilities/text"; 17 | @import "utilities/visibility"; 18 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/bootstrap-grid.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grid v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */ 7 | 8 | html { 9 | box-sizing: border-box; 10 | -ms-overflow-style: scrollbar; 11 | } 12 | 13 | *, 14 | *::before, 15 | *::after { 16 | box-sizing: inherit; 17 | } 18 | 19 | @import "functions"; 20 | @import "variables"; 21 | 22 | @import "mixins/breakpoints"; 23 | @import "mixins/grid-framework"; 24 | @import "mixins/grid"; 25 | 26 | @import "grid"; 27 | @import "utilities/display"; 28 | @import "utilities/flex"; 29 | @import "utilities/spacing"; 30 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/bootstrap-reboot.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | 9 | @import "functions"; 10 | @import "variables"; 11 | @import "mixins"; 12 | @import "reboot"; 13 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_alert.scss: -------------------------------------------------------------------------------- 1 | @mixin alert-variant($background, $border, $color) { 2 | color: $color; 3 | @include gradient-bg($background); 4 | border-color: $border; 5 | 6 | hr { 7 | border-top-color: darken($border, 5%); 8 | } 9 | 10 | .alert-link { 11 | color: darken($color, 10%); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_background-variant.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Contextual backgrounds 4 | 5 | @mixin bg-variant($parent, $color) { 6 | #{$parent} { 7 | background-color: $color !important; 8 | } 9 | a#{$parent}, 10 | button#{$parent} { 11 | @include hover-focus { 12 | background-color: darken($color, 10%) !important; 13 | } 14 | } 15 | } 16 | 17 | @mixin bg-gradient-variant($parent, $color) { 18 | #{$parent} { 19 | background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_badge.scss: -------------------------------------------------------------------------------- 1 | @mixin badge-variant($bg) { 2 | color: color-yiq($bg); 3 | background-color: $bg; 4 | 5 | @at-root a#{&} { 6 | @include hover-focus { 7 | color: color-yiq($bg); 8 | background-color: darken($bg, 10%); 9 | } 10 | 11 | &:focus, 12 | &.focus { 13 | outline: 0; 14 | box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_box-shadow.scss: -------------------------------------------------------------------------------- 1 | @mixin box-shadow($shadow...) { 2 | @if $enable-shadows { 3 | $result: (); 4 | 5 | @if (length($shadow) == 1) { 6 | // We can pass `@include box-shadow(none);` 7 | $result: $shadow; 8 | } @else { 9 | // Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;` 10 | @for $i from 1 through length($shadow) { 11 | @if nth($shadow, $i) != "none" { 12 | $result: append($result, nth($shadow, $i), "comma"); 13 | } 14 | } 15 | } 16 | @if (length($result) > 0) { 17 | box-shadow: $result; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_clearfix.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix() { 2 | &::after { 3 | display: block; 4 | clear: both; 5 | content: ""; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_deprecate.scss: -------------------------------------------------------------------------------- 1 | // Deprecate mixin 2 | // 3 | // This mixin can be used to deprecate mixins or functions. 4 | // `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to 5 | // some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap) 6 | @mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) { 7 | @if ($enable-deprecation-messages != false and $ignore-warning != true) { 8 | @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}."; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @mixin float-left { 4 | float: left !important; 5 | @include deprecate("The `float-left` mixin", "v4.3.0", "v5"); 6 | } 7 | @mixin float-right { 8 | float: right !important; 9 | @include deprecate("The `float-right` mixin", "v4.3.0", "v5"); 10 | } 11 | @mixin float-none { 12 | float: none !important; 13 | @include deprecate("The `float-none` mixin", "v4.3.0", "v5"); 14 | } 15 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_hover.scss: -------------------------------------------------------------------------------- 1 | // Hover mixin and `$enable-hover-media-query` are deprecated. 2 | // 3 | // Originally added during our alphas and maintained during betas, this mixin was 4 | // designed to prevent `:hover` stickiness on iOS-an issue where hover styles 5 | // would persist after initial touch. 6 | // 7 | // For backward compatibility, we've kept these mixins and updated them to 8 | // always return their regular pseudo-classes instead of a shimmed media query. 9 | // 10 | // Issue: https://github.com/twbs/bootstrap/issues/25195 11 | 12 | @mixin hover { 13 | &:hover { @content; } 14 | } 15 | 16 | @mixin hover-focus { 17 | &:hover, 18 | &:focus { 19 | @content; 20 | } 21 | } 22 | 23 | @mixin plain-hover-focus { 24 | &, 25 | &:hover, 26 | &:focus { 27 | @content; 28 | } 29 | } 30 | 31 | @mixin hover-focus-active { 32 | &:hover, 33 | &:focus, 34 | &:active { 35 | @content; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_list-group.scss: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | @mixin list-group-item-variant($state, $background, $color) { 4 | .list-group-item-#{$state} { 5 | color: $color; 6 | background-color: $background; 7 | 8 | &.list-group-item-action { 9 | @include hover-focus { 10 | color: $color; 11 | background-color: darken($background, 5%); 12 | } 13 | 14 | &.active { 15 | color: $white; 16 | background-color: $color; 17 | border-color: $color; 18 | } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_lists.scss: -------------------------------------------------------------------------------- 1 | // Lists 2 | 3 | // Unstyled keeps list items block level, just removes default browser padding and list-style 4 | @mixin list-unstyled { 5 | padding-left: 0; 6 | list-style: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_nav-divider.scss: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) { 6 | height: 0; 7 | margin: $margin-y 0; 8 | overflow: hidden; 9 | border-top: 1px solid $color; 10 | } 11 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | @mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) { 4 | .page-link { 5 | padding: $padding-y $padding-x; 6 | @include font-size($font-size); 7 | line-height: $line-height; 8 | } 9 | 10 | .page-item { 11 | &:first-child { 12 | .page-link { 13 | @include border-left-radius($border-radius); 14 | } 15 | } 16 | &:last-child { 17 | .page-link { 18 | @include border-right-radius($border-radius); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_reset-text.scss: -------------------------------------------------------------------------------- 1 | @mixin reset-text { 2 | font-family: $font-family-base; 3 | // We deliberately do NOT reset font-size or word-wrap. 4 | font-style: normal; 5 | font-weight: $font-weight-normal; 6 | line-height: $line-height-base; 7 | text-align: left; // Fallback for where `start` is not supported 8 | text-align: start; 9 | text-decoration: none; 10 | text-shadow: none; 11 | text-transform: none; 12 | letter-spacing: normal; 13 | word-break: normal; 14 | word-spacing: normal; 15 | white-space: normal; 16 | line-break: auto; 17 | } 18 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_resize.scss: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | @mixin resizable($direction) { 4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 5 | resize: $direction; // Options: horizontal, vertical, both 6 | } 7 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Only display content to screen readers 2 | // 3 | // See: https://a11yproject.com/posts/how-to-hide-content/ 4 | // See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/ 5 | 6 | @mixin sr-only { 7 | position: absolute; 8 | width: 1px; 9 | height: 1px; 10 | padding: 0; 11 | overflow: hidden; 12 | clip: rect(0, 0, 0, 0); 13 | white-space: nowrap; 14 | border: 0; 15 | } 16 | 17 | // Use in conjunction with .sr-only to only display content when it's focused. 18 | // 19 | // Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 20 | // 21 | // Credit: HTML5 Boilerplate 22 | 23 | @mixin sr-only-focusable { 24 | &:active, 25 | &:focus { 26 | position: static; 27 | width: auto; 28 | height: auto; 29 | overflow: visible; 30 | clip: auto; 31 | white-space: normal; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_size.scss: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | @mixin size($width, $height: $width) { 4 | width: $width; 5 | height: $height; 6 | @include deprecate("`size()`", "v4.3.0", "v5"); 7 | } 8 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_table-row.scss: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | @mixin table-row-variant($state, $background, $border: null) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table-#{$state} { 7 | &, 8 | > th, 9 | > td { 10 | background-color: $background; 11 | } 12 | 13 | @if $border != null { 14 | th, 15 | td, 16 | thead th, 17 | tbody + tbody { 18 | border-color: $border; 19 | } 20 | } 21 | } 22 | 23 | // Hover states for `.table-hover` 24 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 25 | .table-hover { 26 | $hover-background: darken($background, 5%); 27 | 28 | .table-#{$state} { 29 | @include hover { 30 | background-color: $hover-background; 31 | 32 | > td, 33 | > th { 34 | background-color: $hover-background; 35 | } 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_text-emphasis.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Typography 4 | 5 | @mixin text-emphasis-variant($parent, $color) { 6 | #{$parent} { 7 | color: $color !important; 8 | } 9 | @if $emphasized-link-hover-darken-percentage != 0 { 10 | a#{$parent} { 11 | @include hover-focus { 12 | color: darken($color, $emphasized-link-hover-darken-percentage) !important; 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_text-hide.scss: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | @mixin text-hide($ignore-warning: false) { 3 | // stylelint-disable-next-line font-family-no-missing-generic-family-keyword 4 | font: 0/0 a; 5 | color: transparent; 6 | text-shadow: none; 7 | background-color: transparent; 8 | border: 0; 9 | 10 | @include deprecate("`text-hide()`", "v4.1.0", "v5", $ignore-warning); 11 | } 12 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_text-truncate.scss: -------------------------------------------------------------------------------- 1 | // Text truncate 2 | // Requires inline-block or block for proper styling 3 | 4 | @mixin text-truncate() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_transition.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable property-blacklist 2 | @mixin transition($transition...) { 3 | @if $enable-transitions { 4 | @if length($transition) == 0 { 5 | transition: $transition-base; 6 | } @else { 7 | transition: $transition; 8 | } 9 | } 10 | 11 | @if $enable-prefers-reduced-motion-media-query { 12 | @media (prefers-reduced-motion: reduce) { 13 | transition: none; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/mixins/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Visibility 4 | 5 | @mixin invisible($visibility) { 6 | visibility: $visibility !important; 7 | @include deprecate("`invisible()`", "v4.3.0", "v5"); 8 | } 9 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_align.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .align-baseline { vertical-align: baseline !important; } // Browser default 4 | .align-top { vertical-align: top !important; } 5 | .align-middle { vertical-align: middle !important; } 6 | .align-bottom { vertical-align: bottom !important; } 7 | .align-text-bottom { vertical-align: text-bottom !important; } 8 | .align-text-top { vertical-align: text-top !important; } 9 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_background.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $color, $value in $theme-colors { 4 | @include bg-variant(".bg-#{$color}", $value); 5 | } 6 | 7 | @if $enable-gradients { 8 | @each $color, $value in $theme-colors { 9 | @include bg-gradient-variant(".bg-gradient-#{$color}", $value); 10 | } 11 | } 12 | 13 | .bg-white { 14 | background-color: $white !important; 15 | } 16 | 17 | .bg-transparent { 18 | background-color: transparent !important; 19 | } 20 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_clearfix.scss: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | @include clearfix(); 3 | } 4 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_display.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // 4 | // Utilities for common `display` values 5 | // 6 | 7 | @each $breakpoint in map-keys($grid-breakpoints) { 8 | @include media-breakpoint-up($breakpoint) { 9 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 10 | 11 | @each $value in $displays { 12 | .d#{$infix}-#{$value} { display: $value !important; } 13 | } 14 | } 15 | } 16 | 17 | 18 | // 19 | // Utilities for toggling `display` in print 20 | // 21 | 22 | @media print { 23 | @each $value in $displays { 24 | .d-print-#{$value} { display: $value !important; } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_embed.scss: -------------------------------------------------------------------------------- 1 | // Credit: Nicolas Gallagher and SUIT CSS. 2 | 3 | .embed-responsive { 4 | position: relative; 5 | display: block; 6 | width: 100%; 7 | padding: 0; 8 | overflow: hidden; 9 | 10 | &::before { 11 | display: block; 12 | content: ""; 13 | } 14 | 15 | .embed-responsive-item, 16 | iframe, 17 | embed, 18 | object, 19 | video { 20 | position: absolute; 21 | top: 0; 22 | bottom: 0; 23 | left: 0; 24 | width: 100%; 25 | height: 100%; 26 | border: 0; 27 | } 28 | } 29 | 30 | @each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios { 31 | $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1); 32 | $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2); 33 | 34 | .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} { 35 | &::before { 36 | padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $breakpoint in map-keys($grid-breakpoints) { 4 | @include media-breakpoint-up($breakpoint) { 5 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 6 | 7 | .float#{$infix}-left { float: left !important; } 8 | .float#{$infix}-right { float: right !important; } 9 | .float#{$infix}-none { float: none !important; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_overflow.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $value in $overflows { 4 | .overflow-#{$value} { overflow: $value !important; } 5 | } 6 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_position.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Common values 4 | @each $position in $positions { 5 | .position-#{$position} { position: $position !important; } 6 | } 7 | 8 | // Shorthand 9 | 10 | .fixed-top { 11 | position: fixed; 12 | top: 0; 13 | right: 0; 14 | left: 0; 15 | z-index: $zindex-fixed; 16 | } 17 | 18 | .fixed-bottom { 19 | position: fixed; 20 | right: 0; 21 | bottom: 0; 22 | left: 0; 23 | z-index: $zindex-fixed; 24 | } 25 | 26 | .sticky-top { 27 | @supports (position: sticky) { 28 | position: sticky; 29 | top: 0; 30 | z-index: $zindex-sticky; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_screenreaders.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Screenreaders 3 | // 4 | 5 | .sr-only { 6 | @include sr-only(); 7 | } 8 | 9 | .sr-only-focusable { 10 | @include sr-only-focusable(); 11 | } 12 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_shadows.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .shadow-sm { box-shadow: $box-shadow-sm !important; } 4 | .shadow { box-shadow: $box-shadow !important; } 5 | .shadow-lg { box-shadow: $box-shadow-lg !important; } 6 | .shadow-none { box-shadow: none !important; } 7 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_sizing.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Width and height 4 | 5 | @each $prop, $abbrev in (width: w, height: h) { 6 | @each $size, $length in $sizes { 7 | .#{$abbrev}-#{$size} { #{$prop}: $length !important; } 8 | } 9 | } 10 | 11 | .mw-100 { max-width: 100% !important; } 12 | .mh-100 { max-height: 100% !important; } 13 | 14 | // Viewport additional helpers 15 | 16 | .min-vw-100 { min-width: 100vw !important; } 17 | .min-vh-100 { min-height: 100vh !important; } 18 | 19 | .vw-100 { width: 100vw !important; } 20 | .vh-100 { height: 100vh !important; } 21 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_stretched-link.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Stretched link 3 | // 4 | 5 | .stretched-link { 6 | &::after { 7 | position: absolute; 8 | top: 0; 9 | right: 0; 10 | bottom: 0; 11 | left: 0; 12 | z-index: 1; 13 | // Just in case `pointer-events: none` is set on a parent 14 | pointer-events: auto; 15 | content: ""; 16 | // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color 17 | background-color: rgba(0, 0, 0, 0); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/bootstrap/utilities/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // 4 | // Visibility utilities 5 | // 6 | 7 | .visible { 8 | visibility: visible !important; 9 | } 10 | 11 | .invisible { 12 | visibility: hidden !important; 13 | } 14 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/cards/_card-contact.scss: -------------------------------------------------------------------------------- 1 | .card-contact{ 2 | .header{ 3 | .title{ 4 | margin: 10px 0 10px; 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/cards/_card-form-horizontal.scss: -------------------------------------------------------------------------------- 1 | .card-form-horizontal{ 2 | .card-body{ 3 | padding-left: 15px; 4 | padding-right: 15px; 5 | } 6 | .form-group{ 7 | padding-bottom: 0px; 8 | margin: 3px 0 0 0; 9 | 10 | .form-control{ 11 | margin-bottom: 0; 12 | } 13 | } 14 | .btn{ 15 | margin: 0; 16 | } 17 | .input-group, 18 | .form-group{ 19 | margin: 0; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/cards/_card-login.scss: -------------------------------------------------------------------------------- 1 | .card-login { 2 | overflow: hidden; 3 | text-align: left; 4 | z-index: 2; 5 | 6 | .card-header{ 7 | padding: 0 0 50px; 8 | overflow: hidden; 9 | img { 10 | position: absolute; 11 | margin-left: -50px; 12 | margin-top: -220px; 13 | border-radius: 20%; 14 | width: 350px; 15 | } 16 | 17 | .card-title { 18 | position: relative; 19 | font-size: 5em; 20 | font-weight: 900; 21 | color: $black; 22 | text-transform: lowercase; 23 | margin-left: -5px; 24 | z-index: 1; 25 | } 26 | } 27 | 28 | .card-footer{ 29 | padding: 15px; 30 | } 31 | } 32 | 33 | @include media-breakpoint-down(md){ 34 | .card.card-login .card-img { 35 | margin-left: -45px; 36 | } 37 | } 38 | 39 | @include media-breakpoint-down(xs){ 40 | .card.card-login { 41 | margin-top: 50px; 42 | } 43 | 44 | .modal-content .card.card-login{ 45 | margin-top: 0; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/cards/_card-no-shadow.scss: -------------------------------------------------------------------------------- 1 | .card-no-shadow{ 2 | box-shadow: none; 3 | border-radius: 0; 4 | margin: 0; 5 | 6 | &:after{ 7 | border-radius: 0; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/cards/_card-raised.scss: -------------------------------------------------------------------------------- 1 | 2 | .card-raised{ 3 | box-shadow: 0px 20px 50px 0px rgba(0, 0, 0, 0.3); 4 | } 5 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/change maded to vendor scss files.txt: -------------------------------------------------------------------------------- 1 | 1. twicth button 2 | https://github.com/zero-to-mastery/GameSenshi/commit/02420118590f4d4dcec052c3c01b949701b756e7 -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/_badge.scss: -------------------------------------------------------------------------------- 1 | /* badges */ 2 | .badge{ 3 | text-transform: uppercase; 4 | line-height: 12px; 5 | border: none; 6 | text-decoration: none; 7 | margin-bottom: 5px; 8 | 9 | &:hover, 10 | &:focus{ 11 | text-decoration: none; 12 | } 13 | } 14 | 15 | .badge-icon{ 16 | padding: 0.4em 0.55em; 17 | 18 | i { 19 | font-size: 0.8em; 20 | } 21 | } 22 | 23 | .badge-success{ 24 | @include badge-variant(darken($success,10%)); 25 | } 26 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/_functions.scss: -------------------------------------------------------------------------------- 1 | // Retrieve color Sass maps 2 | 3 | @function section-color($key: "primary") { 4 | @return map-get($section-colors, $key); 5 | } 6 | 7 | // Lines colors 8 | 9 | @function shapes-primary-color($key: "step-1-gradient-bg") { 10 | @return map-get($shapes-primary-colors, $key); 11 | } 12 | 13 | @function shapes-default-color($key: "step-1-gradient-bg") { 14 | @return map-get($shapes-default-colors, $key); 15 | } 16 | 17 | @function lines-light-color($key: "step-1-gradient-bg") { 18 | @return map-get($shapes-light-colors, $key); 19 | } 20 | 21 | @function shapes-dark-color($key: "step-1-gradient-bg") { 22 | @return map-get($shapes-dark-colors, $key); 23 | } -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/_images.scss: -------------------------------------------------------------------------------- 1 | img{ 2 | max-width: 100%; 3 | border-radius: $border-radius-sm; 4 | } 5 | .img-raised{ 6 | box-shadow: $box-shadow-raised; 7 | } 8 | 9 | .img-center { 10 | display: block; 11 | margin-right: auto; 12 | margin-left: auto; 13 | } 14 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/_mixins.scss: -------------------------------------------------------------------------------- 1 | @import "mixins/alert.scss"; 2 | @import "mixins/badges.scss"; 3 | @import "mixins/background-variant.scss"; 4 | @import "mixins/buttons.scss"; 5 | @import "mixins/forms.scss"; 6 | @import "mixins/icon.scss"; 7 | @import "mixins/modals.scss"; 8 | @import "mixins/popovers.scss"; 9 | @import "mixins/page-header.scss"; 10 | @import "mixins/vendor-prefixes.scss"; 11 | @import "mixins/opacity.scss"; 12 | @import "mixins/modals.scss"; 13 | @import "mixins/inputs.scss"; 14 | @import "mixins/dropdown.scss"; 15 | @import "mixins/wizard.scss"; 16 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/_utilities.scss: -------------------------------------------------------------------------------- 1 | @import "utilities/backgrounds.scss"; 2 | @import "utilities/floating.scss"; 3 | @import "utilities/helper.scss"; 4 | @import "utilities/position.scss"; 5 | @import "utilities/sizing.scss"; 6 | @import "utilities/spacing.scss"; 7 | @import "utilities/shadows.scss"; 8 | @import "utilities/text.scss"; 9 | @import "utilities/transform.scss"; 10 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/cards/_card-map.scss: -------------------------------------------------------------------------------- 1 | .map { 2 | height: 500px; 3 | } 4 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/cards/_card-plain.scss: -------------------------------------------------------------------------------- 1 | .card-plain { 2 | background: transparent; 3 | box-shadow: none; 4 | 5 | .card-header, 6 | .card-footer { 7 | margin-left: 0; 8 | margin-right: 0; 9 | background-color: transparent; 10 | } 11 | 12 | &:not(.card-subcategories).card-body { 13 | padding-left: 0; 14 | padding-right: 0; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/cards/_card-task.scss: -------------------------------------------------------------------------------- 1 | .card-tasks { 2 | height: 473px; 3 | 4 | .table-full-width { 5 | max-height: 410px; 6 | position: relative; 7 | } 8 | 9 | .card-header { 10 | .title { 11 | margin-right: 20px; 12 | font-weight: $font-weight-normal; 13 | } 14 | 15 | .dropdown { 16 | float: right; 17 | color: darken($white, 20%); 18 | } 19 | } 20 | 21 | .card-body { 22 | i { 23 | color: $dark-gray; 24 | font-size: 1.4em; 25 | &:hover { 26 | color: $white; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_alert.scss: -------------------------------------------------------------------------------- 1 | @mixin alert-variant($background, $border, $color) { 2 | color: color-yiq($background); 3 | // @include gradient-bg($background); 4 | background-color: lighten($background, 5%); 5 | border-color: $border; 6 | 7 | hr { 8 | border-top-color: darken($border, 5%); 9 | } 10 | 11 | .alert-link { 12 | color: darken($color, 10%); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_background-variant.scss: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | @mixin bg-variant($parent, $color) { 3 | #{$parent} { 4 | background-color: $color !important; 5 | } 6 | a#{$parent}, 7 | button#{$parent} { 8 | @include hover-focus { 9 | background-color: darken($color, 10%) !important; 10 | } 11 | } 12 | } 13 | 14 | @mixin bg-gradient-variant($parent, $color) { 15 | #{$parent} { 16 | background: linear-gradient(87deg, $color 0, adjust-hue($color, 25%) 100%) !important; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_badges.scss: -------------------------------------------------------------------------------- 1 | @mixin badge-variant($bg) { 2 | color: color-yiq($bg); 3 | background-color: $bg; 4 | 5 | &[href] { 6 | @include hover-focus { 7 | color: color-yiq($bg); 8 | text-decoration: none; 9 | background-color: darken($bg, 3%); 10 | } 11 | } 12 | .tagsinput-remove-link{ 13 | color: $white; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_dropdown.scss: -------------------------------------------------------------------------------- 1 | @mixin dropdown-colors($brand-color, $dropdown-header-color, $dropdown-color, $background-color ) { 2 | background-color: $brand-color; 3 | 4 | &:before{ 5 | color: $brand-color; 6 | } 7 | 8 | .dropdown-header:not([href]):not([tabindex]){ 9 | color: $dropdown-header-color; 10 | } 11 | 12 | .dropdown-item{ 13 | color: $dropdown-color; 14 | 15 | &:hover, 16 | &:focus{ 17 | background-color: $background-color; 18 | } 19 | } 20 | 21 | .dropdown-divider{ 22 | background-color: $background-color; 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_icon.scss: -------------------------------------------------------------------------------- 1 | @mixin icon-shape-variant($color) { 2 | color: saturate(darken($color, 10%), 10); 3 | background-color: transparentize(lighten($color, 10%), .5); 4 | } 5 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_modals.scss: -------------------------------------------------------------------------------- 1 | @mixin modal-colors($bg-color, $color) { 2 | .modal-content{ 3 | background-color: $bg-color; 4 | color: $color; 5 | } 6 | 7 | .modal-body p{ 8 | color: rgba($white, 0.8); 9 | } 10 | 11 | //inputs 12 | @include input-coloured-bg($opacity-5, $white, $white, $transparent-bg, $opacity-1, $opacity-2); 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_page-header.scss: -------------------------------------------------------------------------------- 1 | @mixin linear-gradient($color1, $color2){ 2 | background: $color1; /* For browsers that do not support gradients */ 3 | background: -webkit-linear-gradient(90deg, $color1 , $color2); /* For Safari 5.1 to 6.0 */ 4 | background: -o-linear-gradient(90deg, $color1, $color2); /* For Opera 11.1 to 12.0 */ 5 | background: -moz-linear-gradient(90deg, $color1, $color2); /* For Firefox 3.6 to 15 */ 6 | background: linear-gradient(0deg, $color1 , $color2); /* Standard syntax */ 7 | } 8 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_popovers.scss: -------------------------------------------------------------------------------- 1 | @mixin popover-variant($background) { 2 | background-color: $background; 3 | 4 | .popover-header { 5 | background-color: $background; 6 | color: color-yiq($background); 7 | opacity: .6; 8 | } 9 | 10 | .popover-body { 11 | color: color-yiq($background); 12 | } 13 | 14 | .popover-header{ 15 | border-color: rgba(color-yiq($background), .2); 16 | } 17 | 18 | &.bs-popover-top { 19 | .arrow::after { 20 | border-top-color: $background; 21 | } 22 | } 23 | 24 | &.bs-popover-right { 25 | .arrow::after { 26 | border-right-color: $background; 27 | } 28 | } 29 | 30 | &.bs-popover-bottom { 31 | .arrow::after { 32 | border-bottom-color: $background; 33 | } 34 | } 35 | 36 | &.bs-popover-left { 37 | .arrow::after { 38 | border-left-color: $background; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/_wizard.scss: -------------------------------------------------------------------------------- 1 | @mixin set-wizard-color($color) { 2 | .progress-with-circle .progress-bar{ 3 | background: $color; 4 | } 5 | 6 | .nav-pills .nav-item .nav-link{ 7 | color: $color; 8 | 9 | &.checked, &.active{ 10 | background: $color; 11 | color: white; 12 | } 13 | &:hover{ 14 | background: $white; 15 | } 16 | } 17 | 18 | .nav-pills .nav-item .nav-link.active, 19 | .nav-pills .nav-item .nav-link.checked:focus, 20 | .nav-pills .nav-item .nav-link.checked:hover, 21 | .nav-pills .nav-item .nav-link.active:focus, 22 | .nav-pills .nav-item .nav-link.active:hover{ 23 | background: $color; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/mixins/opacity.scss: -------------------------------------------------------------------------------- 1 | // Opacity 2 | 3 | @mixin opacity($opacity) { 4 | opacity: $opacity; 5 | // IE8 filter 6 | $opacity-ie: ($opacity * 100); 7 | filter: #{alpha(opacity=$opacity-ie)}; 8 | } 9 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/sections/_blogs.scss: -------------------------------------------------------------------------------- 1 | [class*="blogs-"]{ 2 | padding: 50px 0; 3 | } 4 | 5 | 6 | .blogs-1{ 7 | .card{ 8 | margin-bottom: 80px; 9 | } 10 | } 11 | 12 | .blogs-4{ 13 | .card{ 14 | margin-bottom: 60px; 15 | text-align: center; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/sections/_pricing.scss: -------------------------------------------------------------------------------- 1 | .pricing-1{ 2 | h2.title{ 3 | margin-bottom: 10px; 4 | } 5 | 6 | .card-separator{ 7 | width: 1px; 8 | display: block; 9 | height: 100%; 10 | background-color: rgba($default-color, .2); 11 | position: absolute; 12 | left: 0; 13 | top: 0; 14 | } 15 | // &.section-image:after{ 16 | // background-color: rgba(0, 0, 0, 0.8); 17 | // } 18 | } 19 | 20 | .pricing-2{ 21 | .nav-pills{ 22 | margin-bottom: 50px; 23 | } 24 | 25 | } 26 | 27 | .pricing-5{ 28 | .nav-pills{ 29 | margin-top: 50px; 30 | margin-bottom: 50px; 31 | } 32 | } 33 | 34 | .pricing-3, 35 | .pricing-4{ 36 | .title{ 37 | margin-bottom: 10px; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/utilities/_backgrounds.scss: -------------------------------------------------------------------------------- 1 | @each $color, $value in $colors { 2 | @include bg-variant(".bg-#{$color}", $value); 3 | } 4 | 5 | @each $color, $value in $theme-colors { 6 | @include bg-gradient-variant(".bg-gradient-#{$color}", $value); 7 | } 8 | 9 | @each $color, $value in $colors { 10 | @include bg-gradient-variant(".bg-gradient-#{$color}", $value); 11 | } 12 | 13 | 14 | // Sections 15 | 16 | section { 17 | //background-color: section-color("primary"); 18 | } 19 | 20 | @each $color, $value in $section-colors { 21 | @include bg-variant(".section-#{$color}", $value); 22 | } 23 | 24 | @each $color, $value in $theme-colors { 25 | @include bg-gradient-variant(".bg-gradient-#{$color}", $value); 26 | } 27 | 28 | 29 | // Shape (svg) fill colors 30 | @each $color, $value in $theme-colors { 31 | .fill-#{$color} { 32 | fill: $value; 33 | } 34 | 35 | .stroke-#{$color} { 36 | stroke: $value; 37 | } 38 | } 39 | 40 | .fill-opacity-8 { 41 | fill-opacity: .8; 42 | } -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/utilities/_position.scss: -------------------------------------------------------------------------------- 1 | @each $size, $value in $spacers { 2 | .top-#{$size} { 3 | top: $value; 4 | } 5 | .right-#{$size} { 6 | right: $value; 7 | } 8 | .bottom-#{$size} { 9 | bottom: $value; 10 | } 11 | .left-#{$size} { 12 | left: $value; 13 | } 14 | } 15 | 16 | .center { 17 | left: 50%; 18 | transform: translateX(-50%); 19 | } -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/utilities/_shadows.scss: -------------------------------------------------------------------------------- 1 | [class*="shadow"] { 2 | @if $enable-transitions { 3 | transition: $transition-base; 4 | } 5 | } 6 | 7 | .shadow-sm--hover:hover { box-shadow: $box-shadow-sm !important; } 8 | .shadow--hover:hover { box-shadow: $box-shadow !important; } 9 | .shadow-lg--hover:hover { box-shadow: $box-shadow-lg !important; } 10 | .shadow-none--hover:hover { box-shadow: none !important; } 11 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/utilities/_sizing.scss: -------------------------------------------------------------------------------- 1 | // Height values in vh 2 | 3 | .h-100vh { 4 | height: 100vh !important; 5 | } 6 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/custom/utilities/_transform.scss: -------------------------------------------------------------------------------- 1 | @include media-breakpoint-up(lg) { 2 | .transform-perspective-right { 3 | transform: scale(1) perspective(1040px) rotateY(-11deg) rotateX(2deg) rotate(2deg); 4 | } 5 | .transform-perspective-left{ 6 | transform: scale(1) perspective(2000px) rotateY(11deg) rotateX(2deg) rotate(-2deg) 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/mixins/_tags.scss: -------------------------------------------------------------------------------- 1 | @mixin tag-color ($color){ 2 | background-color: $color; 3 | color: $white; 4 | border:none; 5 | .tagsinput-remove-link{ 6 | color: $white; 7 | } 8 | .tagsinput-add{ 9 | color: $color; 10 | } 11 | } 12 | 13 | @mixin create-colored-tags(){ 14 | &.tag-primary{ 15 | @include tag-color($brand-primary); 16 | } 17 | &.tag-info { 18 | @include tag-color($brand-info); 19 | } 20 | &.tag-success{ 21 | @include tag-color($brand-success); 22 | } 23 | &.tag-warning{ 24 | @include tag-color($brand-warning); 25 | } 26 | &.tag-danger{ 27 | @include tag-color($brand-danger); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/_dropdown-extend.scss: -------------------------------------------------------------------------------- 1 | .navbar .dropdown.show .dropdown-menu .dropdown-menu{ 2 | height: 200px; 3 | top: -100px !important; 4 | } 5 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/_example-pages.scss: -------------------------------------------------------------------------------- 1 | .presentation-page { 2 | .section-pricing{ 3 | .card-pricing ul.b-left{ 4 | &:after{ 5 | background: $info; 6 | } 7 | li{ 8 | &:after{ 9 | border-color: $info; 10 | } 11 | } 12 | } 13 | } 14 | } 15 | 16 | .landing-page .section-lg{ 17 | overflow: unset; 18 | } 19 | .profile-page .page-header .container{ 20 | z-index: 2; 21 | } 22 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/_fileinput.scss: -------------------------------------------------------------------------------- 1 | .fileinput > input[type="file"] { 2 | display: none; 3 | } 4 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/_footers.scss: -------------------------------------------------------------------------------- 1 | .footer { 2 | border-color: $info; 3 | } 4 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/_misc-extend.scss: -------------------------------------------------------------------------------- 1 | button,*{ 2 | &:focus { 3 | outline: none; 4 | } 5 | } 6 | .navbar .navbar-collapse .nav-item.dropdown.show .dropdown.show .dropdown-menu.show{ 7 | opacity: 1 !important; 8 | pointer-events: auto !important; 9 | } 10 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/_modals-extend.scss: -------------------------------------------------------------------------------- 1 | .modal{ 2 | &.modal-login .modal-dialog{ 3 | max-width: 320px; 4 | background: $card-black-background; 5 | .card-login{ 6 | .logo-container{ 7 | width: 65px; 8 | margin-bottom: 38px; 9 | margin-top: 27px; 10 | } 11 | } 12 | } 13 | } 14 | 15 | @include media-breakpoint-down(xs){ 16 | .modal.modal-login .modal-dialog{ 17 | margin: 0.5rem auto; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/_navbar-extend.scss: -------------------------------------------------------------------------------- 1 | @media screen and (max-width: 350px){ 2 | .navbar .navbar-brand { 3 | margin: 0; 4 | } 5 | } 6 | @media screen and (max-width: 991px){ 7 | .navbar .navbar-collapse { 8 | max-height: calc(100vh - 1.4rem); 9 | overflow: scroll; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/_responsive.scss: -------------------------------------------------------------------------------- 1 | @media screen and (max-width: 576px){ 2 | .page-header .content-center.brand{ 3 | width: 100%; 4 | } 5 | .header.header-6 .page-header .content-center{ 6 | padding-top: 74px; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/custom/_alerts.scss: -------------------------------------------------------------------------------- 1 | .alert { 2 | button.close { 3 | margin-top: -1px; 4 | color: $white; 5 | opacity: 0.9; 6 | text-shadow: none; 7 | line-height: 0; 8 | outline: 0; 9 | &::after { 10 | display: inline-block; 11 | font: normal normal normal 1em/1 "Nucleo"; 12 | vertical-align: middle; 13 | speak: none; 14 | text-transform: none; 15 | -webkit-font-smoothing: antialiased; 16 | font-size: 1rem; 17 | content: "\ea48"; 18 | } 19 | span { 20 | display: none !important; 21 | } 22 | } 23 | &.alert-dismissible { 24 | padding-right: 1.25rem; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/custom/_checkboxes-radio.scss: -------------------------------------------------------------------------------- 1 | .form-check input[type="checkbox"]:checked + .form-check-sign::before, 2 | .form-check input[type="checkbox"]:checked + .form-check-sign::before, 3 | .form-check-radio input[type="radio"]:checked + .form-check-sign::after{ 4 | background-color: $info; 5 | } 6 | .form-check-radio input[type="radio"]:checked + .form-check-sign::after, 7 | .form-check-radio input[type="radio"]:checked + .form-check-sign::before{ 8 | border-color: $info; 9 | } 10 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/custom/_example-pages.scss: -------------------------------------------------------------------------------- 1 | // style for the landing page 2 | .index-page .squares{ 3 | @include linear-gradient($info-states, $info); 4 | } 5 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/custom/_footer.scss: -------------------------------------------------------------------------------- 1 | .footer { 2 | border-color: #8c3db9; 3 | } 4 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/custom/_inputs.scss: -------------------------------------------------------------------------------- 1 | .form-control:focus, 2 | .form-control:focus + .input-group-append .input-group-text, 3 | .form-control:focus ~ .input-group-append .input-group-text, 4 | .form-control:focus + .input-group-prepend .input-group-text, 5 | .form-control:focus ~ .input-group-prepend .input-group-text, 6 | .input-group-focus .input-group-prepend .input-group-text, 7 | .input-group-focus .input-group-append .input-group-text { 8 | border-color: $info; 9 | } 10 | .has-danger .form-control:focus { 11 | border-color: lighten($danger-states,5%); 12 | } 13 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/custom/_navbar.scss: -------------------------------------------------------------------------------- 1 | @media screen and (max-width: 991px){ 2 | .navbar-nav .dropdown-menu { 3 | position: static !important; 4 | float: none; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/custom/_sections.scss: -------------------------------------------------------------------------------- 1 | .section-examples .container .col-sm-6 img{ 2 | border-color: $info; 3 | } 4 | @include media-breakpoint-down(xs) { 5 | .page-header{ 6 | .content-center { 7 | &.brand { 8 | width: unset; 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/custom/_type.scss: -------------------------------------------------------------------------------- 1 | .blockquote{ 2 | &.blockquote-info{ 3 | border-color: $info; 4 | color: $info; 5 | small{ 6 | color: $info; 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/plugins/_plugin-headroomjs.scss: -------------------------------------------------------------------------------- 1 | .headroom { 2 | will-change: transform; 3 | background-color: inherit; 4 | @include transition($transition-base); 5 | } 6 | .headroom--pinned { 7 | @extend .position-fixed; 8 | transform: translateY(0%); 9 | } 10 | .headroom--unpinned { 11 | @extend .position-fixed; 12 | transform: translateY(-100%); 13 | } 14 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/plugins/_plugin-react-slick.scss: -------------------------------------------------------------------------------- 1 | .slick-slide { 2 | float: none; 3 | } 4 | .slick-track { 5 | display: flex; 6 | } 7 | .slick-prev, .slick-next { 8 | z-index: 1; 9 | } 10 | .slick-buttons-under { 11 | .slick-arrow { 12 | position: absolute; 13 | top: 100%; 14 | right: 48%; 15 | &.slick-prev { 16 | margin-right: 50px; 17 | } 18 | } 19 | } 20 | .testimonials-4 .slick-arrow{ 21 | &.slick-prev{ 22 | left: calc(100% - 65% - #{$icon-size-regular}); 23 | margin-left: 0; 24 | } 25 | &.slick-next{ 26 | left: calc(100% - 65% + #{$icon-size-regular} / 2); 27 | } 28 | } 29 | 30 | .testimonials-4 .slick-arrow.slick-prev{ 31 | position: absolute; 32 | bottom: 0; 33 | } 34 | 35 | .blog-post .slick-arrow.slick-prev{ 36 | position: absolute; 37 | bottom: 0; 38 | } 39 | 40 | .blog-post .slick-arrow.slick-next{ 41 | margin-left: 50px; 42 | } 43 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/react/react-differences.scss: -------------------------------------------------------------------------------- 1 | // Differences from the HTML to the React product 2 | 3 | // React plugins 4 | @import "plugins/plugin-headroomjs"; 5 | @import "plugins/plugin-react-datetime"; 6 | @import "plugins/plugin-react-select"; 7 | @import "plugins/plugin-react-slick"; 8 | @import "plugins/plugin-react-tagsinput"; 9 | 10 | // Custom components 11 | 12 | @import "custom/alerts"; 13 | @import "custom/checkboxes-radio"; 14 | @import "custom/example-pages"; 15 | @import "custom/footer"; 16 | @import "custom/inputs"; 17 | @import "custom/navbar"; 18 | @import "custom/sections"; 19 | @import "custom/tabs"; 20 | @import "custom/type"; 21 | 22 | // Fancy stuff 23 | @import "dropdown-extend"; 24 | @import "example-pages"; 25 | @import "fileinput"; 26 | @import "footers"; 27 | @import "misc-extend"; 28 | @import "modals-extend"; 29 | @import "navbar-extend"; 30 | @import "responsive"; 31 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/sections/_accordion.scss: -------------------------------------------------------------------------------- 1 | .accordion-1{ 2 | .accordion{ 3 | margin-top: 80px; 4 | margin-bottom: 100px; 5 | .card{ 6 | margin-top: 0; 7 | box-shadow: none; 8 | border-bottom: 1px solid !important; 9 | &:last-child{ 10 | border-bottom: none !important; 11 | } 12 | .card-header{ 13 | padding: 10px 15px; 14 | .btn[aria-expanded="true"]{ 15 | .tim-icons{ 16 | transform: rotate(180deg); 17 | } 18 | } 19 | 20 | .tim-icons{ 21 | transition: 0.1s ease; 22 | } 23 | } 24 | 25 | .card-body{ 26 | padding: 10px 30px 30px; 27 | } 28 | 29 | .btn.btn-link{ 30 | color: rgba($white, 0.7); 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/0_assets/scss/blk-design-system-pro/sections/_blogs.scss: -------------------------------------------------------------------------------- 1 | [class*="blogs-"]{ 2 | padding: 50px 0; 3 | 4 | .title { 5 | margin-bottom: 70px; 6 | } 7 | } 8 | 9 | .blogs-1 { 10 | .card { 11 | &.card-background { 12 | .card-title, 13 | .card-category { 14 | bottom: 0; 15 | } 16 | } 17 | } 18 | } 19 | 20 | .blogs-4 { 21 | .card { 22 | margin-bottom: 60px; 23 | text-align: center; 24 | } 25 | 26 | [class^=col-] { 27 | padding: 0; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/0_constants/AuthConstants.js: -------------------------------------------------------------------------------- 1 | const AUTH_GOOGLE = 'Google' 2 | const AUTH_FACEBOOK = 'Facebook' 3 | const AUTH_TWITCH = 'Twitch' 4 | 5 | export { AUTH_GOOGLE, AUTH_FACEBOOK, AUTH_TWITCH } 6 | -------------------------------------------------------------------------------- /src/0_constants/DatabaseConstants.js: -------------------------------------------------------------------------------- 1 | const DATABASE_STATUS_ONLINE = 'online' 2 | const DATABASE_STATUS_ONLINE_LAST = 'onlineLast' 3 | 4 | const databasePathStatus = uid => '/status/' + uid 5 | 6 | export { 7 | DATABASE_STATUS_ONLINE, 8 | DATABASE_STATUS_ONLINE_LAST, 9 | databasePathStatus, 10 | } 11 | -------------------------------------------------------------------------------- /src/0_constants/EnvKeyConstants.js: -------------------------------------------------------------------------------- 1 | // firebase do not allow to use any capital letter in env var name 2 | // these env only used by backend 3 | const ENV = 'env' 4 | const generateEnv = string => ENV + '_' + string 5 | const ENV_ENABLE_PLAYGROUND = generateEnv('playground_enabled') 6 | const ENV_CORS_WHITELIST = generateEnv('cors_whitelist') 7 | const ENV_VERIFY_EMAIL_API_URL = generateEnv('verify_email_api_url') 8 | const ENV_APOLLO_ENGINE_API_KEY = generateEnv('apollo_engine_api_key') 9 | const ENV_PROJECT_ID = generateEnv('project_id') 10 | const ENV_TWITCH_ID = generateEnv('twitch_id') 11 | const ENV_TWITCH_SECRET = generateEnv('twitch_secret') 12 | 13 | export { 14 | ENV, 15 | ENV_ENABLE_PLAYGROUND, 16 | ENV_VERIFY_EMAIL_API_URL, 17 | ENV_APOLLO_ENGINE_API_KEY, 18 | ENV_CORS_WHITELIST, 19 | ENV_PROJECT_ID, 20 | ENV_TWITCH_ID, 21 | ENV_TWITCH_SECRET, 22 | } 23 | -------------------------------------------------------------------------------- /src/0_constants/EnvValueConstants.js: -------------------------------------------------------------------------------- 1 | const env = process.env 2 | 3 | const ENV_VALUE_FIREBASE_CONFIG = Object.freeze({ 4 | apiKey: env.REACT_APP_API_KEY, 5 | authDomain: env.REACT_APP_AUTH_DOMAIN, 6 | databaseURL: env.REACT_APP_DATABASE_URL, 7 | projectId: env.REACT_APP_PROJECT_ID, 8 | storageBucket: env.REACT_APP_STORAGE_BUCKET, 9 | messagingSenderId: env.REACT_APP_MESSAGING_SENDER_ID, 10 | appId: env.REACT_APP_APP_ID, 11 | }) 12 | 13 | const ENV_VALUE_TWITCH_CLIENT = env.REACT_APP_TWITCH_CLIENT 14 | 15 | let redirect = '' 16 | 17 | try { 18 | redirect = window.location.origin 19 | } catch (err) { 20 | // back end doesnt need this, this is to prevent error in backen because window not defined 21 | } 22 | 23 | const ENV_VALUE_TWITCH_OAUTH_LINK = `https://id.twitch.tv/oauth2/authorize?client_id=${ENV_VALUE_TWITCH_CLIENT}&redirect_uri=${redirect}&response_type=code&scope=openid+user_read+user:read:email&force_verify=true` 24 | 25 | export { ENV_VALUE_FIREBASE_CONFIG, ENV_VALUE_TWITCH_OAUTH_LINK } 26 | -------------------------------------------------------------------------------- /src/0_constants/FunctionConstants.js: -------------------------------------------------------------------------------- 1 | const FUNCTION_DATA = 'data' 2 | const FUNCTION_STATUS = 'status' 3 | const FUNCTION_CODE = 'code' 4 | const FUNCTION_MESSAGE = 'message' 5 | const FUNCTION_INPUT = 'Input' 6 | const FUNCTION_EMAIL = 'email' 7 | const FUNCTION_PASSWORD = 'password' 8 | const FUNCTION_DISPLAY_NAME = 'displayName' 9 | const FUNCTION_OAUTH_CODE = 'oAuthCode' 10 | const FUNCTION_TOKEN_CUSTOM = 'customToken' 11 | const FUNCTION_REDIRECT_URI = 'redirectUri' 12 | const FUNCTION_UID = 'uid' 13 | const FUNCTION_ON_DATA_SEED = 'onSellerSeed' 14 | const FUNCTION_ON_TWITCH_SIGN_IN = 'onTwitchSignIn' 15 | 16 | export { 17 | FUNCTION_DATA, 18 | FUNCTION_STATUS, 19 | FUNCTION_CODE, 20 | FUNCTION_MESSAGE, 21 | FUNCTION_INPUT, 22 | FUNCTION_EMAIL, 23 | FUNCTION_PASSWORD, 24 | FUNCTION_DISPLAY_NAME, 25 | FUNCTION_OAUTH_CODE, 26 | FUNCTION_TOKEN_CUSTOM, 27 | FUNCTION_REDIRECT_URI, 28 | FUNCTION_ON_DATA_SEED, 29 | FUNCTION_ON_TWITCH_SIGN_IN, 30 | FUNCTION_UID, 31 | } 32 | -------------------------------------------------------------------------------- /src/0_styled/justify.js: -------------------------------------------------------------------------------- 1 | const NAME = 'name' 2 | const ABB = 'abb' 3 | 4 | export const { 5 | justify_content_start, 6 | justify_content_end, 7 | justify_content_center, 8 | justify_content_between, 9 | justify_content_around, 10 | } = [ 11 | { [ABB]: 'start', [NAME]: 'flex-start' }, 12 | { [ABB]: 'end', [NAME]: 'flex-end' }, 13 | { [ABB]: 'center', [NAME]: 'center' }, 14 | { [ABB]: 'between', [NAME]: 'space-between' }, 15 | { [ABB]: 'around', [NAME]: 'space-around' }, 16 | ].reduce((acc, positioning) => { 17 | acc['justify_content_' + positioning[ABB]] = 18 | 'justify-content:' + positioning[NAME] + ';' 19 | return acc 20 | }, {}) 21 | -------------------------------------------------------------------------------- /src/0_styled/utils.js: -------------------------------------------------------------------------------- 1 | import { css } from 'styled-components' 2 | import styledBreak from 'styled-break' 3 | 4 | const config = { 5 | breakpoints: { 6 | xs: 0, 7 | sx: 500, 8 | sm: 576, 9 | md: 768, 10 | lg: 992, 11 | xl: 1200, 12 | }, 13 | sLevel: 3, 14 | } 15 | 16 | const { cssR, styledR, styledHOC } = styledBreak(config) 17 | 18 | export { cssR, styledR, styledHOC, css } 19 | -------------------------------------------------------------------------------- /src/1_fire_init/core.js: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app' 2 | import 'firebase/auth' // https://stackoverflow.com/questions/48592656/firebase-auth-is-not-a-function/56280110#56280110 3 | import 'firebase/functions' 4 | import 'firebase/storage' 5 | import 'firebase/firestore' 6 | import 'firebase/database' 7 | import { ENV_VALUE_FIREBASE_CONFIG } from '0_constants' 8 | 9 | firebase.initializeApp(ENV_VALUE_FIREBASE_CONFIG) 10 | 11 | const fireFunct = firebase.functions 12 | 13 | const firestore = firebase.firestore 14 | 15 | const auth = firebase.auth 16 | 17 | const fbStorage = firebase.storage 18 | 19 | const database = firebase.database 20 | 21 | // use device default language 22 | auth().useDeviceLanguage() 23 | 24 | export { fireFunct, firestore, auth, fbStorage, database } 25 | -------------------------------------------------------------------------------- /src/1_fire_init/index.js: -------------------------------------------------------------------------------- 1 | import { auth, firestore, database, fireFunct, fbStorage } from './core' 2 | 3 | import { 4 | handleDifferentCredential, 5 | linkedThen, 6 | } from './handleDifferentCredential' 7 | 8 | export { 9 | fbStorage, 10 | auth, 11 | firestore, 12 | database, 13 | handleDifferentCredential, 14 | linkedThen, 15 | fireFunct, 16 | } 17 | -------------------------------------------------------------------------------- /src/2_fire_funct/cloudFunct.js: -------------------------------------------------------------------------------- 1 | import { fireFunct } from '1_fire_init' 2 | import { 3 | FUNCTION_ON_TWITCH_SIGN_IN, 4 | FUNCTION_ON_DATA_SEED, 5 | FUNCTION_OAUTH_CODE, 6 | FUNCTION_REDIRECT_URI, 7 | FUNCTION_UID, 8 | } from '0_constants' 9 | 10 | //! why this cannot use 11 | // const httpsCallable =fireFunct().httpsCallable 12 | 13 | const functSignInTwicth = oAuthCode => 14 | fireFunct().httpsCallable(FUNCTION_ON_TWITCH_SIGN_IN)({ 15 | [FUNCTION_OAUTH_CODE]: oAuthCode, 16 | [FUNCTION_REDIRECT_URI]: window.location.origin, 17 | }) 18 | const functOnSeedData = uid => 19 | fireFunct() 20 | .httpsCallable(FUNCTION_ON_DATA_SEED)({ [FUNCTION_UID]: uid }) 21 | .catch(e => console.log(e)) 22 | 23 | export { functSignInTwicth, functOnSeedData } 24 | -------------------------------------------------------------------------------- /src/2_fire_funct/index.js: -------------------------------------------------------------------------------- 1 | import { functSignInTwicth, functOnSeedData } from './cloudFunct' 2 | 3 | export { functSignInTwicth, functOnSeedData } 4 | -------------------------------------------------------------------------------- /src/2_fire_storage/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | storageUserAvatarGet, 3 | storageUserAvatarSet, 4 | storageUserAvatarRemove, 5 | storageUserAvatarOn, 6 | } from './userAvatar' 7 | 8 | export { 9 | storageUserAvatarGet, 10 | storageUserAvatarSet, 11 | storageUserAvatarRemove, 12 | storageUserAvatarOn, 13 | } 14 | -------------------------------------------------------------------------------- /src/2_fire_storage/userAvatar.js: -------------------------------------------------------------------------------- 1 | import { storageSetGenerator } from './utils' 2 | 3 | import { storagePathUserAvatar } from '0_constants' 4 | 5 | const [ 6 | storageUserAvatarGet, 7 | storageUserAvatarSet, 8 | storageUserAvatarRemove, 9 | storageUserAvatarOn, 10 | ] = storageSetGenerator(storagePathUserAvatar) 11 | 12 | export { 13 | storageUserAvatarGet, 14 | storageUserAvatarSet, 15 | storageUserAvatarRemove, 16 | storageUserAvatarOn, 17 | } 18 | -------------------------------------------------------------------------------- /src/2_fire_storage/utils.js: -------------------------------------------------------------------------------- 1 | import { fbStorage, auth } from '1_fire_init' 2 | 3 | const taskEvent = fbStorage.TaskEvent 4 | 5 | const storageSetGenerator = path => { 6 | const ref = (uid = auth().currentUser.uid, ...otherArgs) => 7 | fbStorage().ref(path(uid, ...otherArgs)) 8 | const get = (...args) => ref(...args).getDownloadURL() 9 | const set = (...args) => (dataUrl = '') => 10 | ref(...args).putString(dataUrl, 'data_url') 11 | const remove = (...args) => ref(...args).delete() 12 | const onSnapShot = (...args) => (dataUrl = '', task = {}) => 13 | set(...args)(dataUrl).on(taskEvent.STATE_CHANGED, task) 14 | return [get, set, remove, onSnapShot] 15 | } 16 | 17 | export { storageSetGenerator } 18 | -------------------------------------------------------------------------------- /src/2_fire_store/seller.js: -------------------------------------------------------------------------------- 1 | import { docGetSetBatch } from './utils' 2 | 3 | import { fireStorePathSeller } from '0_constants' 4 | 5 | const { on: docSellereOnSnapShot } = docGetSetBatch(fireStorePathSeller) 6 | 7 | export { docSellereOnSnapShot } 8 | -------------------------------------------------------------------------------- /src/2_fire_store/sellerReviews.js: -------------------------------------------------------------------------------- 1 | import { docGetSetBatch } from './utils' 2 | 3 | import { fireStorePathSellerReviews } from '0_constants' 4 | 5 | const { on: docSellereReviewsOnSnapShot } = docGetSetBatch( 6 | fireStorePathSellerReviews 7 | ) 8 | 9 | export { docSellereReviewsOnSnapShot } 10 | -------------------------------------------------------------------------------- /src/2_state/Alert/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | StoreAlert, 3 | STORE_ALERT_STATE_BODY, 4 | STORE_ALERT_STATE_IS_OPEN, 5 | STORE_ALERT_STATE_STATUS, 6 | SHOW, 7 | TOGGLE, 8 | SET_STATE, 9 | RESET_STATE, 10 | STATE, 11 | SIMPLE_ERROR, 12 | } from './StoreAlert' 13 | 14 | const storeAlert = new StoreAlert() 15 | const storeAlertShow = storeAlert[SHOW] 16 | const storeAlertToggle = storeAlert[TOGGLE] 17 | const storeAlertSetState = storeAlert[SET_STATE] 18 | const storeAlertResetState = storeAlert[RESET_STATE] 19 | const storeAlertSimpleError = storeAlert[SIMPLE_ERROR] 20 | const storeAlertGet = state => storeAlert[STATE][state] 21 | 22 | // why no export state? Because it lose reference 23 | // no need to output method constant as they are now variable name 24 | export { 25 | storeAlert, 26 | storeAlertShow, 27 | storeAlertToggle, 28 | storeAlertSetState, 29 | storeAlertResetState, 30 | storeAlertSimpleError, 31 | STORE_ALERT_STATE_BODY, 32 | STORE_ALERT_STATE_IS_OPEN, 33 | STORE_ALERT_STATE_STATUS, 34 | storeAlertGet, 35 | } 36 | -------------------------------------------------------------------------------- /src/2_state/AlertSide/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | StoreAlertSide, 3 | STORE_ALERT_SIDE_STATE_BODY, 4 | STORE_ALERT_SIDE_STATE_IS_OPEN, 5 | STORE_ALERT_SIDE_STATE_STATUS, 6 | SHOW, 7 | TOGGLE, 8 | SET_STATE, 9 | RESET_STATE, 10 | STATE, 11 | SIMPLE_ERROR, 12 | } from './StoreAlertSide' 13 | 14 | const storeAlertSide = new StoreAlertSide() 15 | const storeAlertSideShow = storeAlertSide[SHOW] 16 | const storeAlertSideToggle = storeAlertSide[TOGGLE] 17 | const storeAlertSideSetState = storeAlertSide[SET_STATE] 18 | const storeAlertSideResetState = storeAlertSide[RESET_STATE] 19 | const storeAlertSideSimpleError = storeAlertSide[SIMPLE_ERROR] 20 | const storeAlertSideGet = state => storeAlertSide[STATE][state] 21 | 22 | export { 23 | storeAlertSide, 24 | storeAlertSideShow, 25 | storeAlertSideToggle, 26 | storeAlertSideSetState, 27 | storeAlertSideResetState, 28 | storeAlertSideSimpleError, 29 | STORE_ALERT_SIDE_STATE_BODY, 30 | STORE_ALERT_SIDE_STATE_IS_OPEN, 31 | STORE_ALERT_SIDE_STATE_STATUS, 32 | storeAlertSideGet, 33 | } 34 | -------------------------------------------------------------------------------- /src/2_state/Progress/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | StoreProgress, 3 | STORE_PROGRESS_STATE_VALUE, 4 | STORE_PROGRESS_STATE_COLOR, 5 | STORE_PROGRESS_STATE_IS_OPEN, 6 | SHOW, 7 | CLOSE, 8 | SET_STATE, 9 | RESET_STATE, 10 | STATE, 11 | } from './StoreProgress' 12 | 13 | const storeProgress = new StoreProgress() 14 | const storeProgressShow = storeProgress[SHOW] 15 | const storeProgressClose = storeProgress[CLOSE] 16 | const storeProgressSetState = storeProgress[SET_STATE] 17 | const storeProgressResetState = storeProgress[RESET_STATE] 18 | const storeProgressGet = state => storeProgress[STATE][state] 19 | 20 | export { 21 | storeProgress, 22 | storeProgressShow, 23 | storeProgressClose, 24 | storeProgressSetState, 25 | storeProgressResetState, 26 | STORE_PROGRESS_STATE_VALUE, 27 | STORE_PROGRESS_STATE_COLOR, 28 | STORE_PROGRESS_STATE_IS_OPEN, 29 | storeProgressGet, 30 | } 31 | -------------------------------------------------------------------------------- /src/2_state/SignIn/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | StoreSignIn, 3 | STORE_SIGN_IN_STATE_EMAIL, 4 | STORE_SIGN_IN_STATE_IS_OPEN, 5 | STORE_SIGN_IN_STATE_SUBMITTED_CALLBACK, 6 | SHOW, 7 | CLOSE, 8 | TOGGLE, 9 | ON_SUCCESSFUL_SUBMISSION, 10 | SET_STATE, 11 | RESET_STATE, 12 | STATE, 13 | } from './StoreSignIn' 14 | 15 | const storeSignIn = new StoreSignIn() 16 | const storeSignInShow = storeSignIn[SHOW] 17 | const storeSignInClose = storeSignIn[CLOSE] 18 | const storeSignInToggle = storeSignIn[TOGGLE] 19 | const storeSignInSetState = storeSignIn[SET_STATE] 20 | const storeSignInResetState = storeSignIn[RESET_STATE] 21 | const storeSignInOnSuccessfulSubmission = storeSignIn[ON_SUCCESSFUL_SUBMISSION] 22 | const storeSignInGet = state => storeSignIn[STATE][state] 23 | 24 | export { 25 | storeSignIn, 26 | storeSignInShow, 27 | storeSignInClose, 28 | storeSignInToggle, 29 | storeSignInSetState, 30 | storeSignInResetState, 31 | storeSignInOnSuccessfulSubmission, 32 | STORE_SIGN_IN_STATE_EMAIL, 33 | STORE_SIGN_IN_STATE_IS_OPEN, 34 | STORE_SIGN_IN_STATE_SUBMITTED_CALLBACK, 35 | storeSignInGet, 36 | } 37 | -------------------------------------------------------------------------------- /src/2_state/Sound/StoreSound.js: -------------------------------------------------------------------------------- 1 | import { Container } from 'unstated' 2 | import { STATE, SET_STATE, RESET_STATE } from '2_state/constants' 3 | 4 | const STORE_SOUND_STATE_UUID = 'uuid' 5 | const SET_UUID = 'setUuid' 6 | 7 | const defaultValues = () => ({ 8 | [STORE_SOUND_STATE_UUID]: null, 9 | }) 10 | 11 | // the prupose of this store is to automatically stop other sound playing when the latest sound is playing 12 | class StoreSound extends Container { 13 | constructor() { 14 | super() 15 | this[STATE] = defaultValues() 16 | this[SET_STATE] = this[SET_STATE].bind(this) 17 | } 18 | 19 | [RESET_STATE] = () => { 20 | this[SET_STATE](defaultValues()) 21 | return this 22 | }; 23 | 24 | [SET_UUID] = bool => { 25 | this[SET_STATE]({ [STORE_SOUND_STATE_UUID]: bool }) 26 | return this 27 | } 28 | } 29 | 30 | export { 31 | StoreSound, 32 | STATE, 33 | SET_STATE, 34 | RESET_STATE, 35 | SET_UUID, 36 | STORE_SOUND_STATE_UUID, 37 | } 38 | -------------------------------------------------------------------------------- /src/2_state/Sound/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | StoreSound, 3 | SET_STATE, 4 | RESET_STATE, 5 | SET_UUID, 6 | STORE_SOUND_STATE_UUID, 7 | STATE, 8 | } from './StoreSound' 9 | 10 | const storeSound = new StoreSound() 11 | const storeSoundSetUuid = storeSound[SET_UUID] 12 | const storeSoundSetState = storeSound[SET_STATE] 13 | const storeSoundResetState = storeSound[RESET_STATE] 14 | const storeSoundGet = state => storeSound[STATE][state] 15 | 16 | export { 17 | storeSound, 18 | storeSoundSetState, 19 | storeSoundResetState, 20 | storeSoundSetUuid, 21 | STORE_SOUND_STATE_UUID, 22 | storeSoundGet, 23 | } 24 | -------------------------------------------------------------------------------- /src/2_state/Wrapper/StoreWrapper.js: -------------------------------------------------------------------------------- 1 | import { Container } from 'unstated' 2 | import { STATE, SET_STATE, RESET_STATE } from '2_state/constants' 3 | 4 | const STORE_WRAPPER_STATE_OFFSET_TOP = 'offsetTop' 5 | const SET_OFFSET_TOP = 'setOffsetTop' 6 | 7 | const defaultValues = () => ({ 8 | [STORE_WRAPPER_STATE_OFFSET_TOP]: 80, 9 | }) 10 | 11 | class StoreWrapper extends Container { 12 | constructor() { 13 | super() 14 | this[STATE] = defaultValues() 15 | this[SET_STATE] = this[SET_STATE].bind(this) 16 | } 17 | 18 | [RESET_STATE] = () => { 19 | this[SET_STATE](defaultValues()) 20 | return this 21 | }; 22 | 23 | [SET_OFFSET_TOP] = height => { 24 | this[SET_STATE]({ [STORE_WRAPPER_STATE_OFFSET_TOP]: height }) 25 | return this 26 | } 27 | } 28 | 29 | export { 30 | StoreWrapper, 31 | STATE, 32 | SET_STATE, 33 | RESET_STATE, 34 | SET_OFFSET_TOP, 35 | STORE_WRAPPER_STATE_OFFSET_TOP, 36 | } 37 | -------------------------------------------------------------------------------- /src/2_state/Wrapper/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | StoreWrapper, 3 | SET_STATE, 4 | RESET_STATE, 5 | SET_OFFSET_TOP, 6 | STORE_WRAPPER_STATE_OFFSET_TOP, 7 | STATE, 8 | } from './StoreWrapper' 9 | 10 | const storeWrapper = new StoreWrapper() 11 | const storeWrapperSetOffsetTop = storeWrapper[SET_OFFSET_TOP] 12 | const storeWrapperSetState = storeWrapper[SET_STATE] 13 | const storeWrapperResetState = storeWrapper[RESET_STATE] 14 | const storeWrapperGet = state => storeWrapper[STATE][state] 15 | 16 | export { 17 | storeWrapper, 18 | storeWrapperSetState, 19 | storeWrapperResetState, 20 | storeWrapperSetOffsetTop, 21 | STORE_WRAPPER_STATE_OFFSET_TOP, 22 | storeWrapperGet, 23 | } 24 | -------------------------------------------------------------------------------- /src/2_state/constants.js: -------------------------------------------------------------------------------- 1 | const STATE = 'state' 2 | const SET_STATE = 'setState' 3 | const RESET_STATE = 'resetState' 4 | 5 | export { STATE, SET_STATE, RESET_STATE } 6 | -------------------------------------------------------------------------------- /src/3_api/handleIsEmailAccountNotExist.js: -------------------------------------------------------------------------------- 1 | import { auth } from '1_fire_init' 2 | import { simplerResponseHandling } from '1_utils' 3 | import { UNEXPECTED_ERROR_CODE_2 } from '0_constants' 4 | 5 | const handleIsEmailAccountNotExist = email => { 6 | return auth() 7 | .fetchSignInMethodsForEmail(email) 8 | .then(methods => { 9 | if (methods.includes('password')) { 10 | return simplerResponseHandling( 11 | false, 12 | 'this email is already registered!' 13 | ) 14 | } else { 15 | return simplerResponseHandling( 16 | true, 17 | 'This email is available for registration!' 18 | ) 19 | } 20 | }) 21 | .catch(err => { 22 | return simplerResponseHandling(false, UNEXPECTED_ERROR_CODE_2, err) 23 | }) 24 | } 25 | 26 | export { handleIsEmailAccountNotExist } 27 | -------------------------------------------------------------------------------- /src/3_api/handleIsPasswordResetAble.js: -------------------------------------------------------------------------------- 1 | import { auth } from '1_fire_init' 2 | import { UNEXPECTED_ERROR_CODE_1 } from '0_constants' 3 | import { simplerResponseHandling } from '1_utils' 4 | 5 | const handleIsPasswordResetAble = email => { 6 | return auth() 7 | .fetchSignInMethodsForEmail(email) 8 | .then(methods => { 9 | if (methods.includes('password')) { 10 | return simplerResponseHandling( 11 | true, 12 | 'this account password is reset-able' 13 | ) 14 | } else { 15 | return simplerResponseHandling( 16 | false, 17 | 'this email does not have password account.' 18 | ) 19 | } 20 | }) 21 | .catch(err => { 22 | return simplerResponseHandling(false, UNEXPECTED_ERROR_CODE_1, err) 23 | }) 24 | } 25 | 26 | export { handleIsPasswordResetAble } 27 | -------------------------------------------------------------------------------- /src/3_api/handlePasswordReset.js: -------------------------------------------------------------------------------- 1 | import { auth } from '1_fire_init' 2 | import { UNEXPECTED_ERROR_CODE_3 } from '0_constants' 3 | import { simplerResponseHandling } from '1_utils' 4 | 5 | const handlePasswordReset = email => { 6 | return auth() 7 | .sendPasswordResetEmail(email) 8 | .then(() => { 9 | return simplerResponseHandling(true) 10 | }) 11 | .catch(err => { 12 | return simplerResponseHandling(false, UNEXPECTED_ERROR_CODE_3, err) 13 | }) 14 | } 15 | 16 | export { handlePasswordReset } 17 | -------------------------------------------------------------------------------- /src/3_api/handleSignInWithEmailAndPassword.js: -------------------------------------------------------------------------------- 1 | import { auth } from '1_fire_init' 2 | import { UNEXPECTED_ERROR_CODE_4 } from '0_constants' 3 | import { simplerResponseHandling } from '1_utils' 4 | 5 | const handleSignInWithEmailAndPassword = async (email, password) => { 6 | // sign in set local persistence by default, allowing user to auto sign in 7 | // https://firebase.google.com/docs/auth/web/auth-state-persistence?authuser=0 8 | 9 | return auth() 10 | .signInWithEmailAndPassword(email, password) 11 | .then(() => simplerResponseHandling(true)) 12 | .catch(err => { 13 | // Handle Errors here. 14 | switch (err.code) { 15 | case 'auth/invalid-email': 16 | case 'auth/user-disabled': 17 | case 'auth/user-not-found': 18 | case 'auth/wrong-password': 19 | return simplerResponseHandling( 20 | false, 21 | 'Invalid Email or Password', 22 | err 23 | ) 24 | default: 25 | return simplerResponseHandling(false, UNEXPECTED_ERROR_CODE_4, err) 26 | } 27 | }) 28 | } 29 | 30 | export { handleSignInWithEmailAndPassword } 31 | -------------------------------------------------------------------------------- /src/3_api/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | handleSignUpWithEmailAndPassword, 3 | FUNCTION_EMAIL, 4 | FUNCTION_PASSWORD, 5 | } from './handleSignUpWithEmailAndPassword' 6 | import { handleIsEmailAccountNotExist } from './handleIsEmailAccountNotExist' 7 | import { handleIsPasswordResetAble } from './handleIsPasswordResetAble' 8 | import { handleSignInWithEmailAndPassword } from './handleSignInWithEmailAndPassword' 9 | import { handleSignInWithSocials } from './handleSignInWithSocials' 10 | import { handlePasswordReset } from './handlePasswordReset' 11 | 12 | export { 13 | handleSignUpWithEmailAndPassword, 14 | FUNCTION_EMAIL, 15 | FUNCTION_PASSWORD, 16 | handleIsEmailAccountNotExist, 17 | handleIsPasswordResetAble, 18 | handleSignInWithSocials, 19 | handleSignInWithEmailAndPassword, 20 | handlePasswordReset, 21 | } 22 | -------------------------------------------------------------------------------- /src/3_app_event/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | databaseUserPresenceSetOffline, 3 | databaseUserPresenceOnSnapshot, 4 | } from './userPresence' 5 | 6 | import { getRedirectResult } from './getRedirectResult' 7 | 8 | import { 9 | onAuthStateChange, 10 | setNonLoginUserLastIntendedAction, 11 | } from './onAuthStateChange' 12 | 13 | export { 14 | databaseUserPresenceSetOffline, 15 | onAuthStateChange, 16 | setNonLoginUserLastIntendedAction, 17 | databaseUserPresenceOnSnapshot, 18 | getRedirectResult, 19 | } 20 | -------------------------------------------------------------------------------- /src/5_comp_0/Button/Button.jsx: -------------------------------------------------------------------------------- 1 | import React, { forwardRef, Fragment } from 'react' 2 | import { Button as ButtonRS } from 'reactstrap' 3 | import { ButtonBase } from '@material-ui/core' 4 | import clsx from 'clsx' 5 | import styles from './styles.module.css' 6 | 7 | const Button = forwardRef((props, ref) => { 8 | const { 9 | baseClass, 10 | baseStyle, 11 | className, 12 | tag, 13 | // eslint-disable-next-line 14 | staticContext, 15 | ...otherProps 16 | } = props 17 | const Enclosure = tag ? Fragment : ButtonBase 18 | const className_ = className || '' 19 | 20 | return ( 21 | 31 | 38 | 39 | ) 40 | }) 41 | 42 | export { Button } 43 | -------------------------------------------------------------------------------- /src/5_comp_0/Button/index.js: -------------------------------------------------------------------------------- 1 | import { Button } from './Button' 2 | 3 | export { Button } 4 | -------------------------------------------------------------------------------- /src/5_comp_0/Button/styles.module.css: -------------------------------------------------------------------------------- 1 | .btn-round.btn-round { 2 | border-width: 1px; 3 | border-radius: 30px; 4 | } 5 | 6 | .btn.btn { 7 | border-width: 2px; 8 | border-radius: 0.4285rem; 9 | } 10 | -------------------------------------------------------------------------------- /src/5_comp_0/Helmet/Helmet.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Helmet as HelmetRH } from 'react-helmet' 3 | import { BRAND } from '0_app_flavor' 4 | 5 | const Helmet = props => { 6 | const { title, descr } = props 7 | return ( 8 | 9 | {title && ( 10 | {`${title !== BRAND ? title + ' | ' : ''}${BRAND}`} 11 | )} 12 | {descr && } 13 | 14 | ) 15 | } 16 | 17 | export { Helmet } 18 | -------------------------------------------------------------------------------- /src/5_comp_0/Helmet/index.js: -------------------------------------------------------------------------------- 1 | import { Helmet } from './Helmet' 2 | 3 | export { Helmet } 4 | -------------------------------------------------------------------------------- /src/5_comp_0/Icon/Icon.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useCallback } from 'react' 2 | import Image from 'material-ui-image' 3 | import clsx from 'clsx' 4 | 5 | const Icon = props => { 6 | const [error, setError] = useState(false) 7 | 8 | const { image, emoji, icon, 'aria-label': aria, className, style } = props 9 | 10 | const onError = useCallback(() => { 11 | setError(true) 12 | }, []) 13 | 14 | return ( 15 | (image || emoji || icon) && ( 16 | <> 17 | {image && !error && ( 18 | 25 | )} 26 | {(!image || (emoji && error)) && ( 27 | 28 | {emoji} 29 | 30 | )} 31 | {(!image || (icon && error)) && icon && icon()} 32 | 33 | ) 34 | ) 35 | } 36 | 37 | export { Icon } 38 | -------------------------------------------------------------------------------- /src/5_comp_0/Icon/index.js: -------------------------------------------------------------------------------- 1 | import { Icon } from './Icon' 2 | 3 | export { Icon } 4 | -------------------------------------------------------------------------------- /src/5_comp_0/Image/Image.jsx: -------------------------------------------------------------------------------- 1 | import React, { memo } from 'react' 2 | import ImageMU from 'material-ui-image' 3 | import clsx from 'clsx' 4 | 5 | const Image = memo(props => { 6 | const { className, style, ...otherProp } = props 7 | return ( 8 | 14 | ) 15 | }) 16 | 17 | export { Image } 18 | -------------------------------------------------------------------------------- /src/5_comp_0/Image/index.js: -------------------------------------------------------------------------------- 1 | import { Image } from './Image' 2 | 3 | export { Image } 4 | -------------------------------------------------------------------------------- /src/5_comp_0/Link/Link.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import LinkNoStack from 'react-router-link-nostack' 3 | import ButtonBase from '@material-ui/core/ButtonBase' 4 | import clsx from 'clsx' 5 | 6 | const Link = props => { 7 | const { 8 | baseClass, 9 | baseStyle, 10 | to, 11 | href, 12 | children, 13 | className, 14 | ...otherProps 15 | } = props 16 | return ( 17 | 18 | {to && ( 19 | 24 | {children} 25 | 26 | )} 27 | {!to && href && ( 28 | 35 | {children} 36 | 37 | )} 38 | 39 | ) 40 | } 41 | 42 | export { Link, LinkNoStack } 43 | -------------------------------------------------------------------------------- /src/5_comp_0/Link/index.js: -------------------------------------------------------------------------------- 1 | import { Link, LinkNoStack } from './Link' 2 | 3 | export { Link, LinkNoStack } 4 | -------------------------------------------------------------------------------- /src/5_comp_0/RowCol/index.js: -------------------------------------------------------------------------------- 1 | import { Row, Col, Container } from './RowCol' 2 | 3 | export { Row, Col, Container } 4 | -------------------------------------------------------------------------------- /src/5_comp_0/UncontrolledTooltip/UncontrolledTooltip.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { UncontrolledTooltip as UncontrolledTooltip1 } from 'reactstrap' 3 | 4 | const UncontrolledTooltip = props => { 5 | const { children } = props 6 | return children ? : null 7 | } 8 | 9 | export { UncontrolledTooltip } 10 | -------------------------------------------------------------------------------- /src/5_comp_0/UncontrolledTooltip/index.js: -------------------------------------------------------------------------------- 1 | import { UncontrolledTooltip } from './UncontrolledTooltip' 2 | 3 | export { UncontrolledTooltip } 4 | -------------------------------------------------------------------------------- /src/5_comp_0/index.js: -------------------------------------------------------------------------------- 1 | import { Link, LinkNoStack } from './Link' 2 | import { Button } from './Button' 3 | import { UncontrolledTooltip } from './UncontrolledTooltip' 4 | import { Icon } from './Icon' 5 | import { Row, Col, Container } from './RowCol' 6 | import { Helmet } from './Helmet' 7 | import { Image } from './Image' 8 | 9 | export const Exports = { 10 | Link, 11 | LinkNoStack, 12 | Button, 13 | UncontrolledTooltip, 14 | Icon, 15 | Row, 16 | Col, 17 | Container, 18 | Helmet, 19 | Image, 20 | } 21 | -------------------------------------------------------------------------------- /src/5_comp_1/Alert/Alert.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | // reactstrap components 3 | import { Container, Alert as AlertRS } from 'reactstrap' 4 | 5 | const ALERT_STATE_BODY = 'body' 6 | const ALERT_STATE_IS_OPEN = 'isOpen' 7 | const ALERT_STATE_STATUS = 'status' 8 | const ALERT_TOGGLE = 'toggle' 9 | 10 | const Alert = props => { 11 | const { 12 | [ALERT_STATE_BODY]: body, 13 | [ALERT_STATE_IS_OPEN]: isOpen, 14 | [ALERT_STATE_STATUS]: status, 15 | [ALERT_TOGGLE]: toggle, 16 | } = props 17 | return ( 18 | 24 | 25 | 32 | {body} 33 | 34 | 35 | ) 36 | } 37 | 38 | export { 39 | Alert, 40 | ALERT_STATE_BODY, 41 | ALERT_STATE_IS_OPEN, 42 | ALERT_STATE_STATUS, 43 | ALERT_TOGGLE, 44 | } 45 | -------------------------------------------------------------------------------- /src/5_comp_1/Alert/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | Alert, 3 | ALERT_STATE_BODY, 4 | ALERT_STATE_STATUS, 5 | ALERT_STATE_IS_OPEN, 6 | ALERT_TOGGLE, 7 | } from './Alert' 8 | 9 | import { 10 | StateContainer, 11 | storeAlert, 12 | STORE_ALERT_STATE_BODY, 13 | STORE_ALERT_STATE_STATUS, 14 | STORE_ALERT_STATE_IS_OPEN, 15 | storeAlertToggle, 16 | } from '2_state' 17 | 18 | const mapStoreAlertStateToProp = { 19 | [ALERT_STATE_BODY]: STORE_ALERT_STATE_BODY, 20 | [ALERT_STATE_STATUS]: STORE_ALERT_STATE_STATUS, 21 | [ALERT_STATE_IS_OPEN]: STORE_ALERT_STATE_IS_OPEN, 22 | } 23 | 24 | const mapStoreAlertMethodToProp = { 25 | [ALERT_TOGGLE]: storeAlertToggle, 26 | } 27 | 28 | const AlertStoreAlert = StateContainer( 29 | Alert, 30 | [storeAlert], 31 | [mapStoreAlertStateToProp], 32 | [mapStoreAlertMethodToProp] 33 | ) 34 | 35 | export { Alert, AlertStoreAlert } 36 | -------------------------------------------------------------------------------- /src/5_comp_1/AvatarUser/AvatarUser.jsx: -------------------------------------------------------------------------------- 1 | import React, { memo } from 'react' 2 | import { Exports } from '5_comp_0' 3 | import { stopUndefined } from '1_utils' 4 | const { Image } = stopUndefined(Exports) 5 | 6 | const AVATAR_USER_STATE_SRC = 'src' 7 | 8 | const AvatarUser = memo(props => { 9 | const { [AVATAR_USER_STATE_SRC]: src, height, width } = props 10 | const size = { height: height || 36, width: width || 36 } 11 | return ( 12 | user avatar 19 | ) 20 | }) 21 | 22 | export { AvatarUser, AVATAR_USER_STATE_SRC } 23 | -------------------------------------------------------------------------------- /src/5_comp_1/AvatarUser/index.js: -------------------------------------------------------------------------------- 1 | import { AvatarUser, AVATAR_USER_STATE_SRC } from './AvatarUser' 2 | 3 | import { StateContainer, storeUser, STORE_USER_STATE_AVATAR } from '2_state' 4 | 5 | const mapStoreUserStateToProps = { 6 | [AVATAR_USER_STATE_SRC]: STORE_USER_STATE_AVATAR, 7 | } 8 | 9 | const AvatarUserStoreUser = StateContainer( 10 | AvatarUser, 11 | [storeUser], 12 | [mapStoreUserStateToProps], 13 | [] 14 | ) 15 | 16 | export { AvatarUserStoreUser, AvatarUser } 17 | -------------------------------------------------------------------------------- /src/5_comp_1/Badges/index.js: -------------------------------------------------------------------------------- 1 | import React, { useMemo } from 'react' 2 | import { Badges } from './Badges' 3 | import { getOptions } from './utils' 4 | import styles from './styles.module.css' 5 | 6 | const BadgesOptioned = props => { 7 | const { badges, ...otherProps } = props 8 | const badges_ = useMemo(() => getOptions(badges), [badges]) 9 | return 10 | } 11 | 12 | const BadgesPropedSenshi = props => { 13 | return ( 14 | 19 | ) 20 | } 21 | 22 | export { BadgesOptioned, BadgesPropedSenshi, Badges } 23 | -------------------------------------------------------------------------------- /src/5_comp_1/Badges/styles.module.css: -------------------------------------------------------------------------------- 1 | .online.online { 2 | background-color: #10b93c; 3 | } 4 | 5 | .padding-y { 6 | padding-left: 15px; 7 | padding-right: 15px; 8 | } 9 | -------------------------------------------------------------------------------- /src/5_comp_1/Badges/utils.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { FIRESTORE_SELLER_SETTINGS_PROFILE_GENDER_FEMALE } from '0_constants' 3 | import { BADGES_COLOR, BADGES_BODY, BADGES_ID, BADGES_CLASS } from './Badges' 4 | import { createGetOptions } from '1_utils' 5 | import styles from './styles.module.css' 6 | 7 | const options = [ 8 | { 9 | [BADGES_ID]: FIRESTORE_SELLER_SETTINGS_PROFILE_GENDER_FEMALE, 10 | [BADGES_COLOR]: 'primary', 11 | [BADGES_BODY]: ( 12 | <> 13 | Female 14 | 15 | ), 16 | }, 17 | { 18 | [BADGES_ID]: 'online', 19 | [BADGES_BODY]: , 20 | [BADGES_CLASS]: `${styles.online} text-white`, 21 | }, 22 | ] 23 | 24 | const getOptions = createGetOptions(options, BADGES_ID) 25 | 26 | export { getOptions } 27 | -------------------------------------------------------------------------------- /src/5_comp_1/BrandNavbar/index.js: -------------------------------------------------------------------------------- 1 | import React, { memo } from 'react' 2 | import { ROUTE_PAGE_INDEX } from '2_routes' 3 | import { BrandNavbar, NAVBAR_BRAND_ON_ERROR } from './BrandNavbar' 4 | import logo from '0_assets/img/favicon.ico' 5 | import { StateContainer, storeUser, storeUserResetAvatar } from '2_state' 6 | 7 | const BrandNavbarStoreUserPropedNavbar = memo(props => { 8 | return ( 9 | 10 | GAME SENSHI 11 | 12 | ) 13 | }) 14 | 15 | const mapStoreUserMethodToProp = { 16 | [NAVBAR_BRAND_ON_ERROR]: storeUserResetAvatar, 17 | } 18 | 19 | const BrandNavbarStoreUser = StateContainer( 20 | BrandNavbar, 21 | [storeUser], 22 | [], 23 | [mapStoreUserMethodToProp] 24 | ) 25 | 26 | export { BrandNavbarStoreUserPropedNavbar } 27 | -------------------------------------------------------------------------------- /src/5_comp_1/ButtonSound/styled.js: -------------------------------------------------------------------------------- 1 | import { Col } from 'reactstrap' 2 | import { styledR } from '0_styled' 3 | 4 | const ColStyledPlay = styledR(Col)( 5 | { 6 | xs: `justify-content: center;`, 7 | sm: `display: none;`, 8 | }, 9 | 3 10 | ) 11 | 12 | export { ColStyledPlay } 13 | -------------------------------------------------------------------------------- /src/5_comp_1/ButtonSubmit/ButtonSubmit.jsx: -------------------------------------------------------------------------------- 1 | import React, { forwardRef } from 'react' 2 | import Loader from 'react-loader-spinner' 3 | import { Exports } from '5_comp_0' 4 | import { stopUndefined } from '1_utils' 5 | const { Button } = stopUndefined(Exports) 6 | 7 | const ButtonSubmit = forwardRef((props, ref) => { 8 | const { submitting, children, ...otherProps } = props 9 | return ( 10 | 20 | ) 21 | }) 22 | 23 | export { ButtonSubmit } 24 | -------------------------------------------------------------------------------- /src/5_comp_1/ButtonSubmit/index.js: -------------------------------------------------------------------------------- 1 | import { ButtonSubmit } from './ButtonSubmit' 2 | 3 | export { ButtonSubmit } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/CardUserSimple/CardUserSimple.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Card, CardFooter } from 'reactstrap' 3 | import { Exports } from '5_comp_0' 4 | import { stopUndefined } from '1_utils' 5 | const { Link, Image } = stopUndefined(Exports) 6 | 7 | const CardUserSimple = props => { 8 | const { src, name } = props 9 | return ( 10 | 17 | 18 | {name} 27 | 28 |

{name}

29 |
30 |
31 | 32 | ) 33 | } 34 | 35 | export { CardUserSimple } 36 | -------------------------------------------------------------------------------- /src/5_comp_1/CardUserSimple/index.js: -------------------------------------------------------------------------------- 1 | import { CardUserSimple } from './CardUserSimple' 2 | export { CardUserSimple } 3 | -------------------------------------------------------------------------------- /src/5_comp_1/Carousel/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Carousel } from './Carousel' 3 | import { itemsIndex } from './utils' 4 | 5 | const CarouselPropedIndex = props => { 6 | return ( 7 | 14 | ) 15 | } 16 | 17 | export { Carousel, CarouselPropedIndex } 18 | -------------------------------------------------------------------------------- /src/5_comp_1/Carousel/styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import Image from 'material-ui-image' 3 | 4 | const ImageStyled = styled(Image)` 5 | cursor: pointer; 6 | ` 7 | export { ImageStyled } 8 | -------------------------------------------------------------------------------- /src/5_comp_1/Carousel/utils.js: -------------------------------------------------------------------------------- 1 | // temp data array 2 | import { FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_IMAGE } from '0_constants' 3 | 4 | const getIndexImage = name => require(`0_assets/img/index/${name}.jpg`) 5 | 6 | const itemsIndex = [ 7 | { 8 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_IMAGE]: getIndexImage('dota2'), 9 | }, 10 | { 11 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_IMAGE]: getIndexImage('lol'), 12 | }, 13 | { 14 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_IMAGE]: getIndexImage( 15 | 'fornite' 16 | ), 17 | }, 18 | ] 19 | 20 | export { itemsIndex } 21 | -------------------------------------------------------------------------------- /src/5_comp_1/CheckBox/index.js: -------------------------------------------------------------------------------- 1 | import { CheckBox } from './CheckBox' 2 | 3 | export { CheckBox } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/Comments/index.js: -------------------------------------------------------------------------------- 1 | import { Comments } from './Comments' 2 | 3 | export { Comments } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/DropdownMenuNavbar/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { DropdownMenuNavbar } from './DropdownMenuNavbar' 3 | import { StateContainer, storeUser } from '2_state' 4 | import { NavbarIndexItems } from './utils' 5 | 6 | const DropdownMenuNavbarStoreUser = StateContainer( 7 | DropdownMenuNavbar, 8 | [storeUser], 9 | [], 10 | [] 11 | ) 12 | 13 | const DropdownMenuNavbarStoreUserPropedNavbar = props => { 14 | return 15 | } 16 | 17 | export { DropdownMenuNavbarStoreUserPropedNavbar } 18 | -------------------------------------------------------------------------------- /src/5_comp_1/ErrorBoundary/ErrorBoundary.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | class ErrorBoundary extends React.Component { 4 | constructor(props) { 5 | super(props) 6 | this.state = { hasError: false } 7 | } 8 | 9 | static getDerivedStateFromError(error) { 10 | // Update state so the next render will show the fallback UI. 11 | return { hasError: true } 12 | } 13 | 14 | componentDidCatch(error, info) { 15 | // You can also log the error to an error reporting service 16 | //logErrorToMyService(error, info) 17 | } 18 | 19 | render() { 20 | if (this.state.hasError) { 21 | // You can render any custom fallback UI 22 | return Something went wrong. 23 | } 24 | 25 | return this.props.children 26 | } 27 | } 28 | 29 | export { ErrorBoundary } 30 | -------------------------------------------------------------------------------- /src/5_comp_1/ErrorBoundary/index.js: -------------------------------------------------------------------------------- 1 | import { ErroBoundary } from './ErroBoundary' 2 | 3 | export { ErroBoundary } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/FinalForm/index.js: -------------------------------------------------------------------------------- 1 | import { FinalForm } from './FinalForm' 2 | 3 | export { FinalForm } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/Footer/index.js: -------------------------------------------------------------------------------- 1 | import { Footer } from './Footer' 2 | 3 | export { Footer } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/Footer/styled.js: -------------------------------------------------------------------------------- 1 | import { styledR } from '0_styled' 2 | 3 | const titleCss = { 4 | xl: 'text-align: left !important;', 5 | xs: 'text-align: center !important;', 6 | } 7 | 8 | const H1Styled = styledR('h1')(titleCss, 3) 9 | 10 | const H3Styled = styledR('h3')(titleCss, 3) 11 | 12 | export { H1Styled, H3Styled } 13 | -------------------------------------------------------------------------------- /src/5_comp_1/HeaderCollapsed/HeaderCollapsed.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Row, Col } from 'reactstrap' 3 | 4 | import { Exports } from '5_comp_0' 5 | import { stopUndefined } from '1_utils' 6 | 7 | const { Link } = stopUndefined(Exports) 8 | 9 | const HeaderCollapsed = props => { 10 | const { isOpen, toggle, children, to } = props 11 | return ( 12 |
13 | 14 | 15 | {children} 16 | 17 | 18 | 24 | 25 | 26 |
27 | ) 28 | } 29 | 30 | export { HeaderCollapsed } 31 | -------------------------------------------------------------------------------- /src/5_comp_1/HeaderCollapsed/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { HeaderCollapsed } from './HeaderCollapsed' 3 | import { ROUTE_PAGE_INDEX } from '2_routes' 4 | 5 | const HeaderCollapsedPropedNavbarIndex = props => { 6 | return ( 7 | 8 | GAME SENSHI 9 | 10 | ) 11 | } 12 | 13 | export { HeaderCollapsedPropedNavbarIndex } 14 | -------------------------------------------------------------------------------- /src/5_comp_1/HeaderLined/HeaderLined.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const HeaderLined = props => { 4 | const { children } = props 5 | return ( 6 | <> 7 |
8 |

9 | {children} 10 |

11 |
12 |
13 | 14 | ) 15 | } 16 | 17 | export { HeaderLined } 18 | -------------------------------------------------------------------------------- /src/5_comp_1/HeaderLined/index.js: -------------------------------------------------------------------------------- 1 | import { HeaderLined } from './HeaderLined' 2 | 3 | export { HeaderLined } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/IconCard/index.js: -------------------------------------------------------------------------------- 1 | import { IconCard } from './IconCard' 2 | 3 | export { IconCard } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/IconNotification/IconNotification.jsx: -------------------------------------------------------------------------------- 1 | import React, { memo } from 'react' 2 | import { NavItem, NavLink } from 'reactstrap' 3 | 4 | import { Exports } from '5_comp_0' 5 | import { stopUndefined } from '1_utils' 6 | 7 | const { Link } = stopUndefined(Exports) 8 | 9 | const ICON_NOTIFICATION_STATE_SIGNED_IN = 'signedIn' 10 | 11 | const IconNotification = memo(props => { 12 | const { 13 | [ICON_NOTIFICATION_STATE_SIGNED_IN]: signedIn, 14 | small, 15 | to, 16 | className, 17 | } = props 18 | return ( 19 | signedIn && ( 20 | 21 | 22 | 23 | 24 | 25 | ) 26 | ) 27 | }) 28 | 29 | export { IconNotification, ICON_NOTIFICATION_STATE_SIGNED_IN } 30 | -------------------------------------------------------------------------------- /src/5_comp_1/IconNotification/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | IconNotification, 4 | ICON_NOTIFICATION_STATE_SIGNED_IN, 5 | } from './IconNotification' 6 | import { StateContainer, storeUser, STORE_USER_STATE_SIGNED_IN } from '2_state' 7 | import { ROUTE_PAGE_NOTIFICATIONS } from '2_routes' 8 | 9 | const mapStoreUserStateToProp = { 10 | [ICON_NOTIFICATION_STATE_SIGNED_IN]: STORE_USER_STATE_SIGNED_IN, 11 | } 12 | 13 | const IconNotificationStoreUser = StateContainer( 14 | IconNotification, 15 | [storeUser], 16 | [mapStoreUserStateToProp], 17 | [] 18 | ) 19 | 20 | const IconNotificationStoreUserPropedNavbar = props => { 21 | return 22 | } 23 | 24 | export { IconNotificationStoreUserPropedNavbar } 25 | -------------------------------------------------------------------------------- /src/5_comp_1/ImageUpload/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { ImageUpload } from './ImageUpload' 3 | import { AVATAR_DEFAULT } from '0_app_flavor' 4 | 5 | const ImageUploadPropedDefaultAvatar = props => { 6 | return 7 | } 8 | 9 | export { ImageUploadPropedDefaultAvatar } 10 | -------------------------------------------------------------------------------- /src/5_comp_1/ImagesTooltip/index.js: -------------------------------------------------------------------------------- 1 | import React, { useMemo } from 'react' 2 | import { ImagesTooltip } from './ImagesTooltip' 3 | import { getImagesTooltip } from './utils' 4 | 5 | const ImagesTooltipOptioned = props => { 6 | const { icons, ...otherProps } = props 7 | const icons_ = useMemo(() => getImagesTooltip(icons), [icons]) 8 | return 9 | } 10 | 11 | export { ImagesTooltipOptioned } 12 | -------------------------------------------------------------------------------- /src/5_comp_1/InputDate/InputDate.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import clsx from 'clsx' 3 | import { FormGroup } from 'reactstrap' 4 | import ReactDatetime from 'react-datetime' 5 | 6 | const InputDate = props => { 7 | const { 8 | className, 9 | hasFocus, 10 | hasDanger, 11 | hasSuccess, 12 | children, 13 | placeholder, 14 | ...restProps 15 | } = props 16 | 17 | return ( 18 | 19 | 32 | {children} 33 | 34 | ) 35 | } 36 | 37 | export { InputDate } 38 | -------------------------------------------------------------------------------- /src/5_comp_1/InputDate/index.js: -------------------------------------------------------------------------------- 1 | import { InputDate } from './InputDate' 2 | 3 | export { InputDate } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/InputInteger/index.js: -------------------------------------------------------------------------------- 1 | import { InputInteger } from './InputInteger' 2 | 3 | export { InputInteger } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/InputSelect/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | InputSelect, 3 | INPUT_SELECT_VALUE, 4 | INPUT_SELECT_LABEL, 5 | INPUT_SELECT_DISABLED, 6 | COLOR, 7 | } from './InputSelect' 8 | 9 | export { 10 | InputSelect, 11 | INPUT_SELECT_VALUE, 12 | INPUT_SELECT_LABEL, 13 | INPUT_SELECT_DISABLED, 14 | COLOR, 15 | } 16 | -------------------------------------------------------------------------------- /src/5_comp_1/InputSelect/styles.css: -------------------------------------------------------------------------------- 1 | .react-select 2 | .react-select__control 3 | .react-select__value-container--has-value 4 | .react-select__single-value { 5 | top: 48%; 6 | color: #cad1d7; 7 | } 8 | -------------------------------------------------------------------------------- /src/5_comp_1/InputText/index.js: -------------------------------------------------------------------------------- 1 | import { InputText } from './InputText' 2 | 3 | export { InputText } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/LabelForm/LabelForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Col, Row } from 'reactstrap' 3 | 4 | const LabelForm = props => { 5 | const { htmlFor, label, children, Inputmd } = props 6 | return ( 7 | 8 | 9 | 12 | 13 | 14 | {children} 15 | 16 | 17 | ) 18 | } 19 | 20 | export { LabelForm } 21 | -------------------------------------------------------------------------------- /src/5_comp_1/LabelForm/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { LabelForm } from './LabelForm' 3 | // reactstrap components 4 | import { FormGroup } from 'reactstrap' 5 | 6 | const LabelFormSimple = props => { 7 | const { htmlFor, children, ...restProps } = props 8 | return ( 9 | 10 | 11 | 14 | 15 | 16 | ) 17 | } 18 | 19 | export { LabelForm, LabelFormSimple } 20 | -------------------------------------------------------------------------------- /src/5_comp_1/LightBox/index.js: -------------------------------------------------------------------------------- 1 | import { LightBox } from './LightBox' 2 | 3 | export { LightBox } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/ListNavItem/style.css: -------------------------------------------------------------------------------- 1 | .avatarLink { 2 | padding-left: 12; 3 | padding-right: 18; 4 | } 5 | -------------------------------------------------------------------------------- /src/5_comp_1/LoaderNavLink/LoaderNavLink.jsx: -------------------------------------------------------------------------------- 1 | import React, { memo } from 'react' 2 | import { NavItem, NavLink } from 'reactstrap' 3 | import Loader from 'react-loader-spinner' 4 | 5 | const LOADER_NAV_LINK_STATE_IS_LOADING = 'loading' 6 | 7 | const LoaderNavLink = memo(props => { 8 | const { 9 | [LOADER_NAV_LINK_STATE_IS_LOADING]: isLoading, 10 | body, 11 | children, 12 | small, 13 | } = props 14 | return isLoading ? ( 15 | 16 | 21 | 22 |   {body} 23 | 24 | 25 | ) : ( 26 | children 27 | ) 28 | }) 29 | 30 | export { LoaderNavLink, LOADER_NAV_LINK_STATE_IS_LOADING } 31 | -------------------------------------------------------------------------------- /src/5_comp_1/LoaderNavLink/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | LoaderNavLink, 4 | LOADER_NAV_LINK_STATE_IS_LOADING, 5 | } from './LoaderNavLink' 6 | import { StateContainer, storeUser, STORE_USER_STATE_SIGNING_IN } from '2_state' 7 | 8 | const mapStoreUserStateToProp = { 9 | [LOADER_NAV_LINK_STATE_IS_LOADING]: STORE_USER_STATE_SIGNING_IN, 10 | } 11 | 12 | const LoaderNavLinkStoreUser = StateContainer( 13 | LoaderNavLink, 14 | [storeUser], 15 | [mapStoreUserStateToProp], 16 | [] 17 | ) 18 | 19 | const LoaderNavLinkStoreUserPropedNavbar = props => { 20 | return 21 | } 22 | 23 | export { LoaderNavLinkStoreUserPropedNavbar } 24 | -------------------------------------------------------------------------------- /src/5_comp_1/MenuHamburger/MenuHamburger.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { NavItem } from 'reactstrap' 3 | 4 | const MenuHamburger = props => { 5 | const { isOpen, toggle } = props 6 | return ( 7 | 8 | 16 | 17 | ) 18 | } 19 | 20 | export { MenuHamburger } 21 | -------------------------------------------------------------------------------- /src/5_comp_1/MenuHamburger/index.js: -------------------------------------------------------------------------------- 1 | import { MenuHamburger } from './MenuHamburger' 2 | 3 | export { MenuHamburger } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/ModalSimple/ModalSimple.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Modal } from 'reactstrap' 3 | 4 | const ModalSimple = props => { 5 | const { isOpen, toggle, children } = props 6 | return ( 7 | 14 |
15 | 24 |
25 | {children} 26 |
27 | ) 28 | } 29 | 30 | export { ModalSimple } 31 | -------------------------------------------------------------------------------- /src/5_comp_1/ModalSimple/index.js: -------------------------------------------------------------------------------- 1 | import { ModalSimple } from './ModalSimple' 2 | 3 | export { ModalSimple } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/PageError/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | PageError, 3 | PAGE_ERROR_CODE_NOT_FOUND, 4 | PAGE_ERROR_CODE_UNAUTHORIZED, 5 | PAGE_ERROR_CODE_NOT_A_SELLER, 6 | } from './PageError' 7 | 8 | export { 9 | PageError, 10 | PAGE_ERROR_CODE_NOT_FOUND, 11 | PAGE_ERROR_CODE_UNAUTHORIZED, 12 | PAGE_ERROR_CODE_NOT_A_SELLER, 13 | } 14 | -------------------------------------------------------------------------------- /src/5_comp_1/Pagination/index.js: -------------------------------------------------------------------------------- 1 | import { Pagination } from './Pagination' 2 | 3 | export { Pagination } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/Popover/Popover.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Loader from 'react-loader-spinner' 3 | import { 4 | Popover as PopoverRS, 5 | PopoverHeader, 6 | PopoverBody, 7 | Row, 8 | Col, 9 | } from 'reactstrap' 10 | 11 | const Popover = props => { 12 | const { isOpen, target, spinner, header, children } = props 13 | 14 | return ( 15 | 21 | 22 | 23 | 24 | {spinner && ( 25 | 31 | )} 32 | 33 | {header} 34 | 35 | 36 | {children} 37 | 38 | ) 39 | } 40 | 41 | export { Popover } 42 | -------------------------------------------------------------------------------- /src/5_comp_1/Popover/index.js: -------------------------------------------------------------------------------- 1 | import { Popover } from './Popover' 2 | 3 | export { Popover } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/Progress/Progress.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | // reactstrap components 3 | import { Progress as ProgressRS } from 'reactstrap' 4 | 5 | const PROGRESS_STATE_IS_OPEN = 'isOpen' 6 | const PROGRESS_STATE_COLOR = 'color' 7 | const PROGRESS_STATE_VALUE = 'value' 8 | 9 | const Progress = props => { 10 | const { 11 | [PROGRESS_STATE_IS_OPEN]: isOpen, 12 | [PROGRESS_STATE_COLOR]: color, 13 | [PROGRESS_STATE_VALUE]: value, 14 | } = props 15 | return isOpen ? ( 16 |
17 | 18 | {value}% 19 | 20 |
21 | ) : null 22 | } 23 | 24 | export { 25 | Progress, 26 | PROGRESS_STATE_IS_OPEN, 27 | PROGRESS_STATE_COLOR, 28 | PROGRESS_STATE_VALUE, 29 | } 30 | -------------------------------------------------------------------------------- /src/5_comp_1/Progress/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | Progress, 3 | PROGRESS_STATE_IS_OPEN, 4 | PROGRESS_STATE_COLOR, 5 | PROGRESS_STATE_VALUE, 6 | } from './Progress' 7 | 8 | import { 9 | StateContainer, 10 | storeProgress, 11 | STORE_PROGRESS_STATE_IS_OPEN, 12 | STORE_PROGRESS_STATE_COLOR, 13 | STORE_PROGRESS_STATE_VALUE, 14 | } from '2_state' 15 | 16 | const mapStoreProgressStateToProp = { 17 | [PROGRESS_STATE_IS_OPEN]: STORE_PROGRESS_STATE_IS_OPEN, 18 | [PROGRESS_STATE_COLOR]: STORE_PROGRESS_STATE_COLOR, 19 | [PROGRESS_STATE_VALUE]: STORE_PROGRESS_STATE_VALUE, 20 | } 21 | 22 | const ProgressStoreProgress = StateContainer( 23 | Progress, 24 | [storeProgress], 25 | [mapStoreProgressStateToProp] 26 | ) 27 | 28 | export { Progress, ProgressStoreProgress } 29 | -------------------------------------------------------------------------------- /src/5_comp_1/Section/Section.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import clsx from 'clsx' 3 | 4 | const Section = props => { 5 | const { className, ...otherProps } = props 6 | return ( 7 |
8 | ) 9 | } 10 | 11 | export { Section } 12 | -------------------------------------------------------------------------------- /src/5_comp_1/Section/index.js: -------------------------------------------------------------------------------- 1 | import { Section } from './Section' 2 | 3 | export { Section } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/Status/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Status } from './Status' 3 | import { useOnline } from './utils' 4 | 5 | const StatusPropedOnline = props => { 6 | const { uid, ...otherPops } = props 7 | const [loading, online] = useOnline(uid) 8 | return ( 9 | 16 | ) 17 | } 18 | 19 | export { StatusPropedOnline } 20 | -------------------------------------------------------------------------------- /src/5_comp_1/Status/styles.module.css: -------------------------------------------------------------------------------- 1 | .dot { 2 | height: 0.75rem; 3 | width: 0.75rem; 4 | border-radius: 50%; 5 | } 6 | 7 | .on { 8 | background-color: #66ff00; 9 | } 10 | 11 | .off { 12 | background-color: #6c757d; 13 | } 14 | -------------------------------------------------------------------------------- /src/5_comp_1/Status/utils.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react' 2 | import { databaseUserPresenceOnSnapshot } from '3_app_event' 3 | 4 | const useOnline = uid => { 5 | const [loading, setLoading] = useState(true) 6 | const [online, setOnline] = useState(false) 7 | 8 | useEffect(() => { 9 | const unsubscribe = databaseUserPresenceOnSnapshot(uid)(state => { 10 | setLoading(false) 11 | setOnline(state) 12 | }) 13 | return unsubscribe 14 | }, [uid]) 15 | 16 | return [loading, online] 17 | } 18 | 19 | export { useOnline } 20 | -------------------------------------------------------------------------------- /src/5_comp_1/Tab/index.js: -------------------------------------------------------------------------------- 1 | import { Tab, TAB_NAME, TAB_CONTENT } from './Tab' 2 | 3 | export { Tab, TAB_NAME, TAB_CONTENT } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/TabListVertical/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | TabListVertical, 4 | TAB_LIST_VERTICAL_NAME, 5 | TAB_LIST_VERTICAL_TO, 6 | TAB_LIST_VERTICAL_ICON, 7 | } from './TabListVertical' 8 | import { useLocation } from '2_routes' 9 | 10 | const TabListVerticalPropedWithRouter = props => { 11 | const { pathname } = useLocation() 12 | const { tablist } = props 13 | return 14 | } 15 | 16 | export { 17 | TabListVerticalPropedWithRouter, 18 | TAB_LIST_VERTICAL_NAME, 19 | TAB_LIST_VERTICAL_TO, 20 | TAB_LIST_VERTICAL_ICON, 21 | } 22 | -------------------------------------------------------------------------------- /src/5_comp_1/TabListVertical/utils.js: -------------------------------------------------------------------------------- 1 | // routing 2 | import { 3 | ROUTE_PAGE_SETTINGS_GENERAL, 4 | ROUTE_PAGE_SETTINGS_PAYMENT, 5 | ROUTE_PAGE_SETTINGS_ACCOUNT, 6 | ROUTE_PAGE_SETTINGS_NOTIFICATION, 7 | } from '2_routes' 8 | 9 | const settingPageTabList = [ 10 | { 11 | navLink: 'General', 12 | icon: 'icon-single-02', 13 | to: ROUTE_PAGE_SETTINGS_GENERAL, 14 | }, 15 | { 16 | navLink: 'Payment', 17 | icon: 'icon-credit-card', 18 | to: ROUTE_PAGE_SETTINGS_PAYMENT, 19 | }, 20 | { 21 | navLink: 'Account', 22 | icon: 'icon-lock-circle', 23 | to: ROUTE_PAGE_SETTINGS_ACCOUNT, 24 | }, 25 | { 26 | navLink: 'Notification', 27 | icon: 'icon-volume-98', 28 | to: ROUTE_PAGE_SETTINGS_NOTIFICATION, 29 | }, 30 | ] 31 | 32 | export { settingPageTabList } 33 | -------------------------------------------------------------------------------- /src/5_comp_1/TabPaneContainer/TabPaneContainer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const TabPaneContainer = props => { 4 | const { children } = props 5 | 6 | return ( 7 |
8 | {children} 9 |
10 | ) 11 | } 12 | 13 | export { TabPaneContainer } 14 | -------------------------------------------------------------------------------- /src/5_comp_1/TabPaneContainer/index.jsx: -------------------------------------------------------------------------------- 1 | import { TabPaneContainer } from './TabPaneContainer' 2 | 3 | export { TabPaneContainer } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/TextAlert/TextAlert.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import clsx from 'clsx' 3 | import { Row, Col, Alert } from 'reactstrap' 4 | 5 | const TextAlert = props => { 6 | const { messages, icon, isOpen, timeout } = props 7 | let messages_ = messages 8 | ? Array.isArray(messages) 9 | ? messages 10 | : [messages] 11 | : [] 12 | 13 | return messages_.map(message => { 14 | return ( 15 | 26 | 27 | 28 | 29 | 30 | 31 | {message} 32 | 33 | 34 | 35 | ) 36 | }) 37 | } 38 | 39 | export { TextAlert } 40 | -------------------------------------------------------------------------------- /src/5_comp_1/TextAlert/index.js: -------------------------------------------------------------------------------- 1 | import { TextAlert } from './TextAlert' 2 | 3 | export { TextAlert } 4 | -------------------------------------------------------------------------------- /src/5_comp_1/TextIcon/TextIcon.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import clsx from 'clsx' 3 | import { Exports } from '5_comp_0' 4 | import { stopUndefined } from '1_utils' 5 | const { Icon } = stopUndefined(Exports) 6 | 7 | const TextIcon = props => { 8 | const { 9 | h: H, 10 | className, 11 | children, 12 | image, 13 | icon, 14 | emoji, 15 | aria, 16 | ...otherProps 17 | } = props 18 | 19 | return ( 20 | 21 | 22 | {children} 23 | 24 | ) 25 | } 26 | 27 | export { TextIcon } 28 | -------------------------------------------------------------------------------- /src/5_comp_1/Wrapper/Wrapper.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef } from 'react' 2 | import clsx from 'clsx' 3 | 4 | const WRAPPER_STATE_OFFSET_TOP = 'offsetTop' 5 | 6 | const Wrapper = props => { 7 | const wrapper = useRef(null) 8 | 9 | const { 10 | bodyClassName, 11 | className, 12 | children, 13 | [WRAPPER_STATE_OFFSET_TOP]: offsetTop, 14 | ...otherProps 15 | } = props 16 | 17 | useEffect(() => { 18 | document.body.classList.add(bodyClassName) 19 | document.documentElement.scrollTop = 0 20 | document.scrollingElement.scrollTop = 0 21 | wrapper.current.scrollTop = 0 22 | return () => { 23 | document.body.classList.remove(bodyClassName) 24 | } 25 | }, []) 26 | 27 | return ( 28 |
33 |
34 | {children} 35 |
36 | ) 37 | } 38 | 39 | export { Wrapper, WRAPPER_STATE_OFFSET_TOP } 40 | -------------------------------------------------------------------------------- /src/5_comp_2/ButtonsImage/index.js: -------------------------------------------------------------------------------- 1 | import React, { useMemo } from 'react' 2 | import { 3 | ButtonsImage, 4 | BUTTONS_COMMON_IMAGE_ID, 5 | BUTTONS_COMMON_IMAGE_TEXT, 6 | } from './ButtonsImage' 7 | import { buttonsIndex, getButtonsImage } from './utils' 8 | 9 | const ButtonsImageOptioned = props => { 10 | const { buttons, ...otherProps } = props 11 | const buttons_ = useMemo(() => getButtonsImage(buttons), [buttons]) 12 | return 13 | } 14 | 15 | const ButtonsImagePropedIndex = props => { 16 | return ( 17 | 26 | ) 27 | } 28 | 29 | export { 30 | ButtonsImagePropedIndex, 31 | BUTTONS_COMMON_IMAGE_ID, 32 | BUTTONS_COMMON_IMAGE_TEXT, 33 | } 34 | -------------------------------------------------------------------------------- /src/5_comp_2/ButtonsImage/styled.js: -------------------------------------------------------------------------------- 1 | import { styledR, p_0, p_1, p_2, p_3 } from '0_styled' 2 | import { Exports } from '5_comp_1' 3 | import { stopUndefined } from '1_utils' 4 | const { Button, Col } = stopUndefined(Exports) 5 | 6 | const ButtonStyled = styledR(Button)( 7 | { 8 | xs: p_1, 9 | sm: p_2, 10 | lg: p_3, 11 | }, 12 | 3 13 | ) 14 | 15 | const ColStyled = styledR(Col)( 16 | { 17 | xs: p_0, 18 | sm: p_1, 19 | md: p_2, 20 | lg: p_3, 21 | }, 22 | 3 23 | ) 24 | 25 | export { ButtonStyled, ColStyled } 26 | -------------------------------------------------------------------------------- /src/5_comp_2/CardGift/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { CardGift } from './CardGift' 3 | import { gifts } from './utils' 4 | 5 | const CardGiftPropedProfile = props => { 6 | return 7 | } 8 | export { CardGiftPropedProfile } 9 | -------------------------------------------------------------------------------- /src/5_comp_2/CardUser/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { CardUser } from './CardUser' 3 | 4 | const CardProfileOptioned = props => { 5 | return 6 | } 7 | 8 | const CardUserPropedDiscover = props => { 9 | return 10 | } 11 | 12 | const CardProfilePropedSearch = props => { 13 | return 14 | } 15 | 16 | export { CardUserPropedDiscover, CardProfilePropedSearch } 17 | -------------------------------------------------------------------------------- /src/5_comp_2/CardUserHorizontal/index.js: -------------------------------------------------------------------------------- 1 | import { CardUserHorizontal } from './CardUserHorizontal' 2 | 3 | export { CardUserHorizontal } 4 | -------------------------------------------------------------------------------- /src/5_comp_2/CardUserHorizontal/styled.js: -------------------------------------------------------------------------------- 1 | import { styledR, mt_3, mt_4 } from '0_styled' 2 | import { Exports } from '5_comp_1' 3 | import { stopUndefined } from '1_utils' 4 | const { Container, Col, Row } = stopUndefined(Exports) 5 | 6 | const ContainerStyled = styledR(Container)({ 7 | xs: `border: 2px solid #344675; 8 | z-index: 3; 9 | border-radius: 0.4285rem; // rounded-lg`, 10 | lg: `border-radius: 50rem; // rounded-pill`, 11 | }) 12 | 13 | const RowStyledUsername = styledR(Row)({ 14 | xs: `text-align: center; 15 | ${mt_3};`, 16 | lg: `text-align: left; 17 | ${mt_4};`, 18 | }) 19 | 20 | const ColStyledBadges = styledR(Col)({ 21 | xs: `text-align: center;`, 22 | }) 23 | 24 | const TextStyledSubscribe = styledR('p')({ 25 | xs: mt_3, 26 | lg: mt_4, 27 | }) 28 | 29 | export { 30 | ContainerStyled, 31 | RowStyledUsername, 32 | ColStyledBadges, 33 | TextStyledSubscribe, 34 | } 35 | -------------------------------------------------------------------------------- /src/5_comp_2/CarouselCardSimple/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { CarouselCardSimple } from './CarouselCardSimple' 3 | import { cardPlayers } from './utils' 4 | 5 | const CarouselCardSimplePropedNew = props => { 6 | const { ...otherProps } = props 7 | return 8 | } 9 | export { CarouselCardSimplePropedNew } 10 | -------------------------------------------------------------------------------- /src/5_comp_2/CarouselLightBox/CarouselLightBox.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useCallback } from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_1' 4 | const { Carousel, LightBox } = stopUndefined(Exports) 5 | 6 | const CarouselLightBox = props => { 7 | const [slide, setSlide] = useState(0) 8 | const [toggle, setToggle] = useState(false) 9 | const { items, aspectRatio } = props 10 | 11 | const onSlide = useCallback(currentIndex => { 12 | setSlide(currentIndex) 13 | }, []) 14 | 15 | const onImageClick = useCallback(() => { 16 | setToggle(state => !state) 17 | }, []) 18 | return ( 19 | <> 20 | 21 | 30 | 31 | ) 32 | } 33 | 34 | export { CarouselLightBox } 35 | -------------------------------------------------------------------------------- /src/5_comp_2/CarouselLightBox/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { CarouselLightBox } from './CarouselLightBox' 3 | import { itemsProfile } from './utils' 4 | 5 | const CarouselLightBoxPropedProfile = props => { 6 | return 7 | } 8 | 9 | export { CarouselLightBoxPropedProfile } 10 | -------------------------------------------------------------------------------- /src/5_comp_2/CarouselLightBox/utils.js: -------------------------------------------------------------------------------- 1 | // temp data array 2 | import { 3 | FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_IMAGE, 4 | FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_YOUTUBE, 5 | } from '0_constants' 6 | 7 | const getProfileImage = name => require(`0_assets/img/${name}.jpg`) 8 | 9 | const itemsProfile = [ 10 | { 11 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_IMAGE]: getProfileImage( 12 | 'denys' 13 | ), 14 | }, 15 | { 16 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_YOUTUBE]: 'bdgTa9ni4S8', 17 | }, 18 | { 19 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_IMAGE]: getProfileImage( 20 | 'mark-finn' 21 | ), 22 | }, 23 | { 24 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_YOUTUBE]: 'vZX8WJJyXvM', 25 | }, 26 | { 27 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_IMAGE]: getProfileImage( 28 | 'fabien-bazanegue' 29 | ), 30 | }, 31 | { 32 | [FIRESTORE_SELLER_SETTINGS_PROFILE_CAROUSEL_YOUTUBE]: 'vtjorh21b8Q', 33 | }, 34 | ] 35 | 36 | export { itemsProfile } 37 | -------------------------------------------------------------------------------- /src/5_comp_2/ChatContactList/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { ChatContactList } from './ChatContactList' 4 | import { contactList } from './utils' 5 | 6 | const ChatContactListWithProps = props => { 7 | const { otherProps } = props 8 | return 9 | } 10 | export { ChatContactListWithProps } 11 | -------------------------------------------------------------------------------- /src/5_comp_2/CommentWithPagination/index.js: -------------------------------------------------------------------------------- 1 | import { CommentWithPagination } from './CommentWithPagination' 2 | 3 | export { CommentWithPagination } 4 | -------------------------------------------------------------------------------- /src/5_comp_2/DropdownNavbar/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | DropdownNavbar, 3 | DROPDOWN_NAVBAR_STATE_SHOW, 4 | DROPDOWN_NAVBAR_STATE_AVATAR, 5 | } from './DropdownNavbar' 6 | import { 7 | StateContainer, 8 | storeUser, 9 | STORE_USER_STATE_SIGNED_IN, 10 | STORE_USER_STATE_AVATAR, 11 | } from '2_state' 12 | 13 | const mapStoreUserStateToProp = { 14 | [DROPDOWN_NAVBAR_STATE_SHOW]: STORE_USER_STATE_SIGNED_IN, 15 | [DROPDOWN_NAVBAR_STATE_AVATAR]: STORE_USER_STATE_AVATAR, 16 | } 17 | 18 | const DropdownNavbarStoreUser = StateContainer( 19 | DropdownNavbar, 20 | [storeUser], 21 | [mapStoreUserStateToProp], 22 | [] 23 | ) 24 | 25 | export { DropdownNavbarStoreUser } 26 | -------------------------------------------------------------------------------- /src/5_comp_2/ModalImageCropper/index.js: -------------------------------------------------------------------------------- 1 | import { ModalImageCropper } from './ModalImageCropper' 2 | 3 | export { ModalImageCropper } 4 | -------------------------------------------------------------------------------- /src/5_comp_2/PanelFilterSearch/index.js: -------------------------------------------------------------------------------- 1 | import { PanelFilterSearch } from './PanelFilterSearch' 2 | export { PanelFilterSearch } 3 | -------------------------------------------------------------------------------- /src/5_comp_2/PanelSortBy/index.js: -------------------------------------------------------------------------------- 1 | import { PanelSortBy } from './PanelSortBy' 2 | export { PanelSortBy } 3 | -------------------------------------------------------------------------------- /src/5_comp_2/TabPanelService/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | TabPanelService, 3 | TAB_PRODUCT_DESCRIPTION, 4 | TAB_PRODUCT_NUM_ORDERS, 5 | TAB_PRODUCT_PRICE, 6 | } from './TabPanelService' 7 | 8 | export { 9 | TAB_PRODUCT_DESCRIPTION, 10 | TAB_PRODUCT_NUM_ORDERS, 11 | TAB_PRODUCT_PRICE, 12 | TabPanelService, 13 | } 14 | -------------------------------------------------------------------------------- /src/5_comp_3/ChatMessageContainer/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { ChatMessageContainer } from './ChatMessageContainer' 3 | import { messages } from './utils' 4 | 5 | const ChatMessageContainerWithProps = props => { 6 | const { otherProps } = props 7 | return 8 | } 9 | 10 | export { ChatMessageContainerWithProps } 11 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalDateBirthDate/FinalDateBirthDate.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import moment from 'moment' 3 | import { stopUndefined } from '1_utils' 4 | import { Exports } from '5_comp_2' 5 | 6 | const { FinalInputDate } = stopUndefined(Exports) 7 | 8 | const FINAL_DATE_BIRTH_DATE = 'birthDate' 9 | 10 | const upperLimit = moment().subtract(7, 'y') 11 | const lowerLimit = moment().subtract(90, 'y') 12 | 13 | const valid = current => { 14 | return current.isAfter(lowerLimit) && current.isBefore(upperLimit) 15 | } 16 | 17 | const defaultValue = moment() 18 | .subtract(20, 'y') 19 | .month(0) 20 | .date(1) 21 | 22 | const FinalDateBirthDate = props => { 23 | const { value, ...restProps } = props 24 | return ( 25 | 34 | ) 35 | } 36 | 37 | export { FinalDateBirthDate, FINAL_DATE_BIRTH_DATE } 38 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalDateBirthDate/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { FinalDateBirthDate, FINAL_DATE_BIRTH_DATE } from './FinalDateBirthDate' 3 | 4 | import { stopUndefined } from '1_utils' 5 | 6 | // components 7 | import { Exports } from '5_comp_2' 8 | 9 | const { LabelForm } = stopUndefined(Exports) 10 | 11 | const FinalDateBirthDatePropedGeneraL = props => { 12 | return ( 13 | 14 | 15 | 16 | ) 17 | } 18 | 19 | export { FinalDateBirthDatePropedGeneraL, FINAL_DATE_BIRTH_DATE } 20 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalSelectCountry/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { FinalSelectCountry, FINAL_SELECT_COUNTRY } from './FinalSelectCountry' 4 | 5 | // components 6 | import { stopUndefined } from '1_utils' 7 | import { Exports } from '5_comp_2' 8 | 9 | const { LabelForm } = stopUndefined(Exports) 10 | 11 | const FinalSelectCountryPropedGeneraL = props => { 12 | return ( 13 | 14 | 15 | 16 | ) 17 | } 18 | 19 | export { FinalSelectCountryPropedGeneraL, FINAL_SELECT_COUNTRY } 20 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalSelectExpiryMonth/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | FinalSelectExpiryMonth, 4 | FINAL_SELECT_EXPIRY_MONTH, 5 | } from './FinalSelectExpiryMonth' 6 | import { cardExpiryValidation } from '1_utils' 7 | import { Col } from 'reactstrap' 8 | 9 | const FinalSelectExpiryMonthPropedDefault = props => { 10 | return ( 11 | 12 | 13 | 14 | ) 15 | } 16 | 17 | export { FinalSelectExpiryMonthPropedDefault, FINAL_SELECT_EXPIRY_MONTH } 18 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalSelectExpiryYear/FinalSelectExpiryYear.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_2' 4 | 5 | const { 6 | FinalInputSelect, 7 | INPUT_SELECT_VALUE, 8 | INPUT_SELECT_LABEL, 9 | INPUT_SELECT_DISABLED, 10 | } = stopUndefined(Exports) 11 | 12 | const FINAL_SELECT_EXPIRY_YEAR = 'expiryYear' 13 | 14 | const year = new Date().getFullYear() 15 | 16 | const yearOptions = Array.from(new Array(30), (e, i) => { 17 | const yearString = (year + i).toString() 18 | return { [INPUT_SELECT_VALUE]: yearString, [INPUT_SELECT_LABEL]: yearString } 19 | }) 20 | 21 | yearOptions.unshift({ 22 | [INPUT_SELECT_VALUE]: '', 23 | [INPUT_SELECT_LABEL]: 'Year', 24 | [INPUT_SELECT_DISABLED]: true, 25 | }) 26 | 27 | const FinalSelectExpiryYear = props => { 28 | return ( 29 | 35 | ) 36 | } 37 | 38 | export { FinalSelectExpiryYear, FINAL_SELECT_EXPIRY_YEAR } 39 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalSelectExpiryYear/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | FinalSelectExpiryYear, 4 | FINAL_SELECT_EXPIRY_YEAR, 5 | } from './FinalSelectExpiryYear' 6 | import { cardExpiryValidation } from '1_utils' 7 | import { Col } from 'reactstrap' 8 | 9 | const FinalSelectExpiryYearPropedDefault = props => { 10 | return ( 11 | 12 | 13 | 14 | ) 15 | } 16 | 17 | export { FinalSelectExpiryYearPropedDefault, FINAL_SELECT_EXPIRY_YEAR } 18 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalSelectGame/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { FinalSelectGame, FINAL_SELECT_GAME } from './FinalSelectGame' 3 | 4 | // components 5 | import { stopUndefined } from '1_utils' 6 | import { Exports } from '5_comp_2' 7 | 8 | const { LabelForm } = stopUndefined(Exports) 9 | 10 | const FinalSelectGamePropedGeneraL = props => { 11 | return ( 12 | 13 | 14 | 15 | ) 16 | } 17 | 18 | export { FinalSelectGamePropedGeneraL, FINAL_SELECT_GAME } 19 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalSelectGender/FinalSelectGender.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_2' 4 | 5 | const { 6 | FinalInputSelect, 7 | INPUT_SELECT_VALUE, 8 | INPUT_SELECT_LABEL, 9 | INPUT_SELECT_DISABLED, 10 | } = stopUndefined(Exports) 11 | 12 | const genderOptions = [ 13 | { 14 | [INPUT_SELECT_VALUE]: '', 15 | [INPUT_SELECT_LABEL]: 'Gender', 16 | [INPUT_SELECT_DISABLED]: true, 17 | }, 18 | { [INPUT_SELECT_VALUE]: '0', [INPUT_SELECT_LABEL]: 'Male' }, 19 | { [INPUT_SELECT_VALUE]: '1', [INPUT_SELECT_LABEL]: 'Female' }, 20 | { 21 | [INPUT_SELECT_VALUE]: '2', 22 | [INPUT_SELECT_LABEL]: 'Feeling Lucky', 23 | }, 24 | ] 25 | 26 | const FINAL_SELECT_GENDER = 'Gender' 27 | 28 | const FinalSelectGender = props => { 29 | return ( 30 | 36 | ) 37 | } 38 | 39 | export { FinalSelectGender, FINAL_SELECT_GENDER } 40 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalSelectGender/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { FinalSelectGender, FINAL_SELECT_GENDER } from './FinalSelectGender' 3 | 4 | // components 5 | import { stopUndefined } from '1_utils' 6 | import { Exports } from '5_comp_2' 7 | 8 | const { LabelForm } = stopUndefined(Exports) 9 | 10 | const FinalSelectGenderPropedGeneraL = props => { 11 | return ( 12 | 13 | 14 | 15 | ) 16 | } 17 | 18 | export { FinalSelectGenderPropedGeneraL, FINAL_SELECT_GENDER } 19 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalSelectLanguages/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | FinalSelectLanguages, 4 | FINAL_SELECT_LANGUAGES, 5 | } from './FinalSelectLanguages' 6 | 7 | // components 8 | import { stopUndefined } from '1_utils' 9 | import { Exports } from '5_comp_2' 10 | 11 | const { LabelForm } = stopUndefined(Exports) 12 | 13 | const FinalSelectLanguagesPropedGeneraL = props => { 14 | return ( 15 | 16 | 17 | 18 | ) 19 | } 20 | 21 | export { FinalSelectLanguagesPropedGeneraL, FINAL_SELECT_LANGUAGES } 22 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextCardCVC/FinalTextCardCVC.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_2' 4 | 5 | const { FinalInputText } = stopUndefined(Exports) 6 | 7 | const FINAL_TEXT_CARD_CVC = 'cvc' 8 | 9 | const onChange = (e, onValueChange = () => {}) => { 10 | const { 11 | target: { value }, 12 | } = e 13 | if (!isNaN(value) && value.length < 5) { 14 | onValueChange(value) 15 | return e.target.value 16 | } 17 | return false 18 | } 19 | 20 | const FinalTextCardCVC = props => { 21 | return ( 22 | 31 | ) 32 | } 33 | 34 | export { FinalTextCardCVC, FINAL_TEXT_CARD_CVC } 35 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextCardCVC/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { FinalTextCardCVC, FINAL_TEXT_CARD_CVC } from './FinalTextCardCVC' 3 | import { cardCvcValidation } from '1_utils' 4 | import { Col } from 'reactstrap' 5 | 6 | const FinalTextCardCVCPropedDefault = props => { 7 | return ( 8 | 9 | 10 | 11 | ) 12 | } 13 | 14 | export { FinalTextCardCVCPropedDefault, FINAL_TEXT_CARD_CVC } 15 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextCardHolderName/FinalTextCardHolderName.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_2' 4 | 5 | const { FinalInputText } = stopUndefined(Exports) 6 | 7 | const onChange = (e, onValueChange = () => {}) => { 8 | const { 9 | target: { value }, 10 | } = e 11 | if (value.length < 100) { 12 | onValueChange(value) 13 | return e.target.value 14 | } 15 | return false 16 | } 17 | 18 | const FINAL_TEXT_CARD_HOLDER_NAME = 'ccname' 19 | 20 | const FinalTextCardHolderName = props => { 21 | return ( 22 | 31 | ) 32 | } 33 | 34 | export { FinalTextCardHolderName, FINAL_TEXT_CARD_HOLDER_NAME } 35 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextCardHolderName/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | FinalTextCardHolderName, 4 | FINAL_TEXT_CARD_HOLDER_NAME, 5 | } from './FinalTextCardHolderName' 6 | import { cardNameValidation } from '1_utils' 7 | import { Row, Col } from 'reactstrap' 8 | 9 | const FinalTextCardHolderNamePropedDefault = props => { 10 | return ( 11 | 12 | 13 | 14 | 15 | 16 | ) 17 | } 18 | 19 | export { FinalTextCardHolderNamePropedDefault, FINAL_TEXT_CARD_HOLDER_NAME } 20 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextCardNumber/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | FinalTextCardNumber, 4 | FINAL_TEXT_CARD_NUMBER, 5 | } from './FinalTextCardNumber' 6 | import { cardNumberValidation } from '1_utils' 7 | import { Col, Row } from 'reactstrap' 8 | 9 | const FinalTextCardNumberPropedDefault = props => { 10 | return ( 11 | 12 | 13 | 14 | 15 | 16 | ) 17 | } 18 | 19 | export { FinalTextCardNumberPropedDefault, FINAL_TEXT_CARD_NUMBER } 20 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextEmail/FinalTextEmail.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_2' 4 | 5 | const { FinalInputText } = stopUndefined(Exports) 6 | 7 | const FINAL_TEXT_EMAIL = 'email' 8 | 9 | const FinalTextEmail = props => { 10 | return ( 11 | 19 | ) 20 | } 21 | 22 | export { FinalTextEmail, FINAL_TEXT_EMAIL } 23 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextName/FinalTextName.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_2' 4 | 5 | const { FinalInputText } = stopUndefined(Exports) 6 | 7 | const FINAL_TEXT_NAME = 'name' 8 | 9 | const FinalTextName = props => { 10 | return ( 11 | 18 | ) 19 | } 20 | 21 | export { FinalTextName, FINAL_TEXT_NAME } 22 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextName/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { FinalTextName, FINAL_TEXT_NAME } from './FinalTextName' 3 | 4 | import { signUpUsernameValidation, stopUndefined } from '1_utils' 5 | 6 | // components 7 | import { Exports } from '5_comp_2' 8 | 9 | const { LabelForm } = stopUndefined(Exports) 10 | 11 | const FinalTextNamePropedSignUp = props => { 12 | return 13 | } 14 | 15 | const FinalTextNamePropedGeneraL = props => { 16 | return ( 17 | 18 | 24 | 25 | ) 26 | } 27 | 28 | export { 29 | FinalTextNamePropedSignUp, 30 | FinalTextNamePropedGeneraL, 31 | FINAL_TEXT_NAME, 32 | } 33 | -------------------------------------------------------------------------------- /src/5_comp_3/FinalTextPassword/FinalTextPassword.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_2' 4 | 5 | const { FinalInputText } = stopUndefined(Exports) 6 | 7 | const FINAL_TEXT_PASSWORD = 'password' 8 | 9 | const FinalTextPassword = props => { 10 | return ( 11 | 18 | ) 19 | } 20 | 21 | export { FinalTextPassword, FINAL_TEXT_PASSWORD } 22 | -------------------------------------------------------------------------------- /src/5_comp_3/TabServices/TabServices.jsx: -------------------------------------------------------------------------------- 1 | import React, { useMemo } from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_2' 4 | 5 | const { 6 | TabPanelService, 7 | Tab, 8 | TAB_NAME, 9 | TAB_CONTENT, 10 | TAB_PRODUCT_DESCRIPTION, 11 | TAB_PRODUCT_NUM_ORDERS, 12 | TAB_PRODUCT_PRICE, 13 | } = stopUndefined(Exports) 14 | 15 | const TabServices = props => { 16 | const { services } = props 17 | const tabs = useMemo( 18 | () => 19 | services.map(services_ => { 20 | const service = Object.keys(services_)[0] 21 | const { 22 | [TAB_PRODUCT_DESCRIPTION]: description, 23 | [TAB_PRODUCT_NUM_ORDERS]: orders, 24 | [TAB_PRODUCT_PRICE]: price, 25 | } = services_[service] 26 | return { 27 | [TAB_NAME]: service, 28 | [TAB_CONTENT]: ( 29 | 35 | ), 36 | } 37 | }), 38 | [services] 39 | ) 40 | 41 | return 42 | } 43 | 44 | export { TabServices } 45 | -------------------------------------------------------------------------------- /src/5_comp_3/TabServices/index.js: -------------------------------------------------------------------------------- 1 | import { TabServices } from './TabServices' 2 | 3 | export { TabServices } 4 | -------------------------------------------------------------------------------- /src/5_comp_3/UploaderAvatar/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | UploaderAvatar, 4 | UPLOADER_AVATAR_STATE_IMAGE, 5 | UPLOADER_AVATAR_ON_REMOVE, 6 | } from './UploaderAvatar' 7 | import { onRemove, onCrop } from './utils' 8 | import { 9 | StateContainer, 10 | storeUser, 11 | storeUserResetAvatar, 12 | STORE_USER_STATE_AVATAR, 13 | } from '2_state' 14 | 15 | const UploaderAvatarPropedCrop = props => { 16 | return 17 | } 18 | const mapStoreUserStateToProps = { 19 | [UPLOADER_AVATAR_STATE_IMAGE]: STORE_USER_STATE_AVATAR, 20 | } 21 | 22 | const mapStoreUserMethodToProps = { 23 | [UPLOADER_AVATAR_ON_REMOVE]: () => { 24 | storeUserResetAvatar() 25 | onRemove() 26 | }, 27 | } 28 | 29 | const UploaderAvatarPropedCropStoreUser = StateContainer( 30 | UploaderAvatarPropedCrop, 31 | [storeUser], 32 | [mapStoreUserStateToProps], 33 | [mapStoreUserMethodToProps] 34 | ) 35 | 36 | export { UploaderAvatarPropedCropStoreUser } 37 | -------------------------------------------------------------------------------- /src/5_comp_4/CheckoutCard/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { CheckoutCard } from './CheckoutCard' 3 | import { products } from './utils' 4 | 5 | const CheckoutCardPropedDefault = () => { 6 | return 7 | } 8 | 9 | export { CheckoutCardPropedDefault } 10 | -------------------------------------------------------------------------------- /src/5_comp_4/CheckoutCard/utils.js: -------------------------------------------------------------------------------- 1 | import { 2 | PRODUCT_IMAGE, 3 | PRODUCT_NAME, 4 | PRODUCT_SIZE, 5 | PRODUCT_PRICE, 6 | } from './CheckoutCard' 7 | 8 | const products = [ 9 | { 10 | [PRODUCT_NAME]: 'Shorts', 11 | [PRODUCT_IMAGE]: require('0_assets/img/gucci.png'), 12 | [PRODUCT_SIZE]: 'Small', 13 | [PRODUCT_PRICE]: '$29', 14 | }, 15 | { 16 | [PRODUCT_NAME]: 'Jacket', 17 | [PRODUCT_IMAGE]: require('0_assets/img/jacket.png'), 18 | [PRODUCT_SIZE]: '-', 19 | [PRODUCT_PRICE]: '$999', 20 | }, 21 | ] 22 | 23 | export { products } 24 | -------------------------------------------------------------------------------- /src/5_comp_4/ContainerSearchResults/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { ContainerSearchResults } from './ContainerSearchResults' 3 | import { cardPlayers } from './utils' 4 | 5 | const ContainerSearchResultsPropedDefault = props => { 6 | return 7 | } 8 | 9 | export { ContainerSearchResultsPropedDefault } 10 | -------------------------------------------------------------------------------- /src/5_comp_4/FormCard/index.js: -------------------------------------------------------------------------------- 1 | import { FormCard, FORM_CARD_DEFAULT } from './FormCard' 2 | 3 | export { FormCard, FORM_CARD_DEFAULT } 4 | -------------------------------------------------------------------------------- /src/5_comp_4/FormResetPassword/index.js: -------------------------------------------------------------------------------- 1 | import React, { useCallback } from 'react' 2 | import { FormResetPassword, FINAL_TEXT_EMAIL } from './FormResetPassword' 3 | // api 4 | import { handlePasswordReset } from '3_api' 5 | // route 6 | import { ROUTE_PAGE_SIGN_IN } from '2_routes' 7 | 8 | const FormResetPasswordPropedDefault = props => { 9 | const onSubmit = useCallback( 10 | values => handlePasswordReset(values[FINAL_TEXT_EMAIL]), 11 | [] 12 | ) 13 | return ( 14 | 19 | ) 20 | } 21 | 22 | export { FormResetPasswordPropedDefault } 23 | -------------------------------------------------------------------------------- /src/5_comp_4/FormSignUp/utils.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | // state management 3 | import { storeAlertShow, storeUserSetSigningIn } from '2_state' 4 | import { FINAL_TEXT_EMAIL, FINAL_TEXT_NAME } from './FormSignUp' 5 | 6 | const onSuccessfulSignUp = values => { 7 | const { [FINAL_TEXT_EMAIL]: email, [FINAL_TEXT_NAME]: username } = values 8 | const alertBody = ( 9 | 10 | Welcome {username}! An verification email has been sent to  11 | 17 | {` ${email}`} 18 | 19 | 20 | ) 21 | storeUserSetSigningIn(true) 22 | storeAlertShow(alertBody, 'success', 'tim-icons icon-bell-55') 23 | } 24 | 25 | export { onSuccessfulSignUp } 26 | -------------------------------------------------------------------------------- /src/5_comp_4/NavbarIndex/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { NavbarIndex, NAVBAR_COLORED } from './NavbarIndex' 3 | import { StateContainer, storeAlert, STORE_ALERT_STATE_IS_OPEN } from '2_state' 4 | import ReactResizeDetector from 'react-resize-detector' 5 | import { stopUndefined } from '1_utils' 6 | import { storeWrapperSetOffsetTop } from '2_state' 7 | import { Exports } from '5_comp_3' 8 | 9 | const { AlertStoreAlert } = stopUndefined(Exports) 10 | 11 | const mapStoreAlertStateToProp = { 12 | [NAVBAR_COLORED]: STORE_ALERT_STATE_IS_OPEN, 13 | } 14 | 15 | const NavbarIndexStoreAlert = StateContainer( 16 | NavbarIndex, 17 | [storeAlert], 18 | [mapStoreAlertStateToProp], 19 | [] 20 | ) 21 | 22 | const onResize = (width, height) => { 23 | storeWrapperSetOffsetTop(height) 24 | } 25 | const NavbarIndexStoreAlertPropApp = props => { 26 | return ( 27 | 28 | 29 | 30 | 31 | ) 32 | } 33 | 34 | export { NavbarIndexStoreAlertPropApp } 35 | -------------------------------------------------------------------------------- /src/5_comp_4/TabPaneAccountSettings/index.js: -------------------------------------------------------------------------------- 1 | import { TabPaneAccountSettings } from './TabPaneAccountSettings' 2 | 3 | export { TabPaneAccountSettings } 4 | -------------------------------------------------------------------------------- /src/5_comp_4/TabPaneGeneralSettings/index.js: -------------------------------------------------------------------------------- 1 | import { TabPaneGeneralSettings } from './TabPaneGeneralSettings' 2 | 3 | export { TabPaneGeneralSettings } 4 | -------------------------------------------------------------------------------- /src/5_comp_5/TabPanePaymentSettings/index.js: -------------------------------------------------------------------------------- 1 | import { TabPanePaymentSettings } from './TabPanePaymentSettings' 2 | 3 | export { TabPanePaymentSettings } 4 | -------------------------------------------------------------------------------- /src/5_comp_5/index.js: -------------------------------------------------------------------------------- 1 | import { Exports as ExportOrganisms } from '5_comp_4' 2 | import { TabPanePaymentSettings } from './TabPanePaymentSettings' 3 | 4 | export const Exports = { 5 | ...ExportOrganisms, 6 | TabPanePaymentSettings, 7 | } 8 | -------------------------------------------------------------------------------- /src/5_comp_6/PageChat/index.js: -------------------------------------------------------------------------------- 1 | import { PageChat } from './PageChat' 2 | export { PageChat } 3 | -------------------------------------------------------------------------------- /src/5_comp_6/PageCheckout/PageCheckout.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Container, Row, Col } from 'reactstrap' 4 | import { Exports } from '5_comp_5' 5 | 6 | const { 7 | CheckoutCardPropedDefault, 8 | Section, 9 | WrapperStoreWrapperPropedCheckout, 10 | } = stopUndefined(Exports) 11 | 12 | const PageCheckout = () => { 13 | return ( 14 | 15 |
16 | 17 | 18 | 19 |

Order summary

20 | 21 | 22 |
23 |
24 |
25 |
26 | ) 27 | } 28 | 29 | export { PageCheckout } 30 | -------------------------------------------------------------------------------- /src/5_comp_6/PageCheckout/index.js: -------------------------------------------------------------------------------- 1 | import { PageCheckout } from './PageCheckout' 2 | export { PageCheckout } 3 | -------------------------------------------------------------------------------- /src/5_comp_6/PageFilter/PageFilter.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_5' 4 | import { Container } from 'reactstrap' 5 | 6 | const { 7 | ContainerSearchResultsPropedDefault, 8 | Section, 9 | WrapperStoreWrapperPropedIndex, 10 | } = stopUndefined(Exports) 11 | 12 | const PageFilter = () => { 13 | return ( 14 | 15 |
16 | 17 | 18 | 19 |
20 |
21 | ) 22 | } 23 | 24 | export { PageFilter } 25 | -------------------------------------------------------------------------------- /src/5_comp_6/PageFilter/index.js: -------------------------------------------------------------------------------- 1 | import { PageFilter } from './PageFilter' 2 | export { PageFilter } 3 | -------------------------------------------------------------------------------- /src/5_comp_6/PageHelp/PageHelp.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Exports } from '5_comp_5' 4 | 5 | // reactstrap components 6 | import { Container, Row, Col } from 'reactstrap' 7 | 8 | const { WrapperStoreWrapperPropedIndex } = stopUndefined(Exports) 9 | 10 | const PageHelp = () => { 11 | useEffect(() => { 12 | document.body.classList.add('index-page') 13 | document.documentElement.scrollTop = 0 14 | document.scrollingElement.scrollTop = 0 15 | return () => { 16 | document.body.classList.remove('index-page') 17 | } 18 | }, []) 19 | return ( 20 | 21 | 22 | 23 | 24 |

Help Page

25 | 26 |
27 |
28 |
29 | ) 30 | } 31 | 32 | export { PageHelp } 33 | -------------------------------------------------------------------------------- /src/5_comp_6/PageHelp/index.js: -------------------------------------------------------------------------------- 1 | import { PageHelp } from './PageHelp' 2 | export { PageHelp } 3 | -------------------------------------------------------------------------------- /src/5_comp_6/PageIndex/index.js: -------------------------------------------------------------------------------- 1 | import { PageIndex } from './PageIndex' 2 | export { PageIndex } 3 | -------------------------------------------------------------------------------- /src/5_comp_6/PagePasswordReset.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Container, Row, Col } from 'reactstrap' 4 | import { Exports } from '5_comp_5' 5 | 6 | const { 7 | FormResetPasswordPropedDefault, 8 | Section, 9 | WrapperStoreWrapperPropedReset, 10 | } = stopUndefined(Exports) 11 | 12 | const PagePasswordReset = () => { 13 | return ( 14 | 15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
32 |
33 | ) 34 | } 35 | 36 | export { PagePasswordReset } 37 | -------------------------------------------------------------------------------- /src/5_comp_6/PagePolicies/index.js: -------------------------------------------------------------------------------- 1 | import { PagePolicies } from './PagePolicies' 2 | 3 | export { PagePolicies } 4 | -------------------------------------------------------------------------------- /src/5_comp_6/PageProfile/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { PageProfile, PAGE_PROFILE_STATE_CURRENT_USER_UID } from './PageProfile' 3 | import { StateContainer, storeUser, STORE_USER_STATE_UID } from '2_state' 4 | import { useData, comments } from './utils' 5 | 6 | const PageProfilePropedData = props => ( 7 | 8 | ) 9 | const PageProfileStoreUser = StateContainer(PageProfilePropedData, storeUser, { 10 | [PAGE_PROFILE_STATE_CURRENT_USER_UID]: STORE_USER_STATE_UID, 11 | }) 12 | export { PageProfileStoreUser } 13 | -------------------------------------------------------------------------------- /src/5_comp_6/PageProfile/styled.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line 2 | import styled from 'styled-components/macro' 3 | import React from 'react' 4 | import clsx from 'clsx' 5 | import { stopUndefined } from '1_utils' 6 | import { Exports } from '5_comp_5' 7 | const { Col } = stopUndefined(Exports) 8 | 9 | const ColStyledSection = props => { 10 | const { className, ...otherProps } = props 11 | return ( 12 | 13 | ) 14 | } 15 | 16 | const ColStyledGiftCard = props => { 17 | const { className, ...otherProps } = props 18 | return ( 19 | 23 | ) 24 | } 25 | 26 | const ColStyledTitle = props => { 27 | const { className, ...otherProps } = props 28 | return 29 | } 30 | 31 | export { ColStyledSection, ColStyledGiftCard, ColStyledTitle } 32 | -------------------------------------------------------------------------------- /src/5_comp_6/PageSignIn.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { stopUndefined } from '1_utils' 3 | import { Container, Row, Col } from 'reactstrap' 4 | import { Exports } from '5_comp_5' 5 | 6 | const { 7 | FormSignInPropedSignIn, 8 | Section, 9 | WrapperStoreWrapperPropedLogin, 10 | } = stopUndefined(Exports) 11 | 12 | const SignInPage = () => { 13 | return ( 14 | 15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
32 |
33 | ) 34 | } 35 | 36 | export { SignInPage } 37 | -------------------------------------------------------------------------------- /src/sw-build.js: -------------------------------------------------------------------------------- 1 | const workboxBuild = require('workbox-build') 2 | // NOTE: This should be run *AFTER* all your assets are built 3 | const buildSW = () => { 4 | // This will return a Promise 5 | return workboxBuild 6 | .injectManifest({ 7 | swSrc: 'src/sw-template.js', // this is your sw template file 8 | swDest: 'build/sw.js', // this will be created in the build step 9 | globDirectory: 'build', 10 | globPatterns: ['**/*.{js,css,html}'], 11 | maximumFileSizeToCacheInBytes: 4 * 1024 * 1024, 12 | }) 13 | .then(({ count, size, warnings }) => { 14 | // Optionally, log any warnings and details. 15 | warnings.forEach(console.warn) 16 | console.log(`${count} files will be precached, totaling ${size} bytes.`) 17 | }) 18 | } 19 | buildSW() 20 | -------------------------------------------------------------------------------- /src/sw-template.js: -------------------------------------------------------------------------------- 1 | if ('function' === typeof importScripts) { 2 | // eslint-disable-next-line no-undef 3 | importScripts( 4 | 'https://storage.googleapis.com/workbox-cdn/releases/3.5.0/workbox-sw.js' 5 | ) 6 | /* global workbox */ 7 | if (workbox) { 8 | console.log('Workbox is loaded') 9 | 10 | /* injection point for manifest files. */ 11 | workbox.precaching.precacheAndRoute([]) 12 | 13 | /* custom cache rules*/ 14 | workbox.routing.registerNavigationRoute('/index.html', { 15 | // eslint-disable-next-line no-useless-escape 16 | blacklist: [/^\/_/, /\/[^\/]+\.[^\/]+$/], 17 | }) 18 | 19 | workbox.routing.registerRoute( 20 | /\.(?:png|gif|jpg|jpeg)$/, 21 | workbox.strategies.cacheFirst({ 22 | cacheName: 'images', 23 | plugins: [ 24 | new workbox.expiration.Plugin({ 25 | maxEntries: 60, 26 | maxAgeSeconds: 30 * 24 * 60 * 60, // 30 Days 27 | }), 28 | ], 29 | }) 30 | ) 31 | } else { 32 | console.log('Workbox could not be loaded. No Offline support') 33 | } 34 | } 35 | --------------------------------------------------------------------------------