├── .babelrc ├── .circleci └── config.yml ├── .editorconfig ├── .envrc.sample ├── .eslintrc.js ├── .github └── pull_request_template.md ├── .gitignore ├── .node-version ├── .prettierignore ├── .prettierrc.js ├── LICENSE ├── README.md ├── app ├── app.html ├── app │ └── views │ │ └── error.html ├── assets │ ├── images │ │ ├── pc │ │ │ ├── article │ │ │ │ ├── a_icon_Good.png │ │ │ │ ├── a_icon_Good_selected.png │ │ │ │ ├── a_icon_menu.png │ │ │ │ ├── article_image_blank.png │ │ │ │ ├── icon_all_supporters.svg │ │ │ │ ├── icon_article_date.png │ │ │ │ ├── icon_article_like.png │ │ │ │ ├── icon_article_like_v2.png │ │ │ │ ├── icon_article_registration.png │ │ │ │ ├── icon_article_supporter.png │ │ │ │ ├── icon_article_tip.png │ │ │ │ ├── icon_bookmark.png │ │ │ │ ├── icon_chip.png │ │ │ │ ├── icon_chip_01.png │ │ │ │ ├── icon_chip_1.png │ │ │ │ ├── icon_chip_10.png │ │ │ │ ├── icon_etc.png │ │ │ │ ├── icon_like.png │ │ │ │ ├── icon_like_selected.png │ │ │ │ ├── icon_share.png │ │ │ │ ├── icon_share_facebook.png │ │ │ │ ├── icon_share_facebook_circle.svg │ │ │ │ ├── icon_share_twitter.png │ │ │ │ ├── icon_share_twitter_circle.svg │ │ │ │ ├── icon_twitter.png │ │ │ │ ├── img_article_registration_pc1.svg │ │ │ │ ├── img_article_registration_sp1.svg │ │ │ │ ├── m_ribbon_1.png │ │ │ │ ├── m_ribbon_2.png │ │ │ │ └── m_ribbon_3.png │ │ │ ├── bg │ │ │ │ ├── completed-phone-number-auth.png │ │ │ │ ├── first-process-created-article.png │ │ │ │ ├── first-process-got-token.png │ │ │ │ ├── first-process-liked-article.png │ │ │ │ ├── first-process-tipped-article.png │ │ │ │ ├── login.png │ │ │ │ ├── not-completed-phone-number-auth.png │ │ │ │ ├── request-login.png │ │ │ │ └── signup.png │ │ │ ├── common │ │ │ │ ├── header_logo_original.png │ │ │ │ ├── header_logo_original.svg │ │ │ │ ├── icon_btn_facebook.png │ │ │ │ ├── icon_btn_yahoo.png │ │ │ │ ├── icon_catset_like.png │ │ │ │ ├── icon_catset_like_white.png │ │ │ │ ├── icon_catset_tip.png │ │ │ │ ├── icon_catset_tip_white.png │ │ │ │ ├── icon_draftcassette_active.png │ │ │ │ ├── icon_edit.png │ │ │ │ ├── icon_like.png │ │ │ │ ├── icon_line.png │ │ │ │ ├── icon_logo_white.png │ │ │ │ ├── icon_notification.png │ │ │ │ ├── icon_notification_mark.png │ │ │ │ ├── icon_notification_none.png │ │ │ │ ├── icon_plus.png │ │ │ │ ├── icon_profile_img.png │ │ │ │ ├── icon_search.png │ │ │ │ ├── icon_token_cassette.png │ │ │ │ ├── icon_twitter.png │ │ │ │ ├── icon_user_noimg.png │ │ │ │ ├── icon_writing.png │ │ │ │ ├── image_bg404.png │ │ │ │ ├── img_FAQ.png │ │ │ │ ├── img_Instructions.png │ │ │ │ ├── img_anounce.png │ │ │ │ ├── img_banner_beginner_middle.png │ │ │ │ ├── img_banner_beginner_pc.png │ │ │ │ ├── logo_white.svg │ │ │ │ ├── metamask-fox.svg │ │ │ │ ├── thumbnail_blank.png │ │ │ │ └── thumbnail_noimg.png │ │ │ ├── editor │ │ │ │ ├── icon_bold.png │ │ │ │ ├── icon_bold_selected.png │ │ │ │ ├── icon_img.png │ │ │ │ ├── icon_img_selected.png │ │ │ │ ├── icon_index.png │ │ │ │ ├── icon_index_selected.png │ │ │ │ ├── icon_italic.png │ │ │ │ ├── icon_italic_selected.png │ │ │ │ ├── icon_line.png │ │ │ │ ├── icon_line_selected.png │ │ │ │ ├── icon_link.png │ │ │ │ ├── icon_link_selected.png │ │ │ │ ├── icon_movie.png │ │ │ │ ├── icon_movie_selected.png │ │ │ │ ├── icon_quote.png │ │ │ │ ├── icon_quote_selected.png │ │ │ │ ├── icon_text.png │ │ │ │ ├── icon_text_selected.png │ │ │ │ ├── icon_textlink.png │ │ │ │ ├── icon_textlink_selected.png │ │ │ │ └── icon_twitterGrey.png │ │ │ ├── notification │ │ │ │ ├── icon_announce.png │ │ │ │ ├── icon_download.png │ │ │ │ ├── icon_exclamation.png │ │ │ │ ├── icon_notification_check.png │ │ │ │ ├── icon_notification_message.png │ │ │ │ └── icon_notification_present.png │ │ │ ├── top │ │ │ │ ├── img_ anounce.png │ │ │ │ ├── img_FAQ.png │ │ │ │ └── img_Instructions.png │ │ │ └── topic │ │ │ │ ├── icon_category_recomend.png │ │ │ │ ├── topic_beauty.png │ │ │ │ ├── topic_business.png │ │ │ │ ├── topic_comic-animation.png │ │ │ │ ├── topic_crypto.png │ │ │ │ ├── topic_education-parenting.png │ │ │ │ ├── topic_game.png │ │ │ │ ├── topic_gourmet.png │ │ │ │ ├── topic_others.png │ │ │ │ ├── topic_technology.png │ │ │ │ └── topic_travel.png │ │ └── sp │ │ │ └── common │ │ │ ├── icon_bell.png │ │ │ ├── icon_editprofile.png │ │ │ ├── icon_search.png │ │ │ └── img_banner_beginner_sp.png │ └── stylesheets │ │ ├── ckeditor-pc.scss │ │ ├── ckeditor-sp-android.scss │ │ ├── ckeditor-sp.scss │ │ ├── ckeditor-view.scss │ │ ├── ckeditor.scss │ │ ├── gruvbox-dark-modified.css │ │ ├── medium-editor.scss │ │ ├── mixins │ │ ├── cassette-shadow-small.scss │ │ ├── cassette-shadow.scss │ │ ├── default-link.scss │ │ └── default-text.scss │ │ └── vuex-toast.scss ├── components │ ├── atoms │ │ ├── AppButton.vue │ │ ├── AppModal.vue │ │ ├── ArticleCardContentBookmark.vue │ │ ├── ArticleComment.vue │ │ ├── ArticleContentEditHistoryCardContentUpdatedAt.vue │ │ ├── ArticleEvent.vue │ │ ├── ArticleFooterActions.vue │ │ ├── ArticleSideActions.vue │ │ ├── ArticleSubInfos.vue │ │ ├── AuthorHeaderInfo.vue │ │ ├── AuthorInfo.vue │ │ ├── BadgeModal.vue │ │ ├── CreateNewArticleButton.vue │ │ ├── EyecatchAlternativeImage.vue │ │ ├── HeaderSessionLinks.vue │ │ ├── HeaderUserLoggedInItems.vue │ │ ├── ItemLabel.vue │ │ ├── NotificationCardContentDescription.vue │ │ ├── NotificationCardContentUpdatedAt.vue │ │ ├── NotificationCardImage.vue │ │ ├── TagInfo.vue │ │ ├── TheLoader.vue │ │ └── UserArticleListUserInfo.vue │ ├── molecules │ │ ├── ArticleCommentForm.vue │ │ ├── ArticleDeleteConfirmationModal.vue │ │ ├── ArticleReportConfirmationModal.vue │ │ ├── ArticleReportInputFreeTextModal.vue │ │ ├── ArticleReportSelectReasonModal.vue │ │ ├── ArticleTags.vue │ │ ├── BadgeCard.vue │ │ ├── BadgeDescriptionModalContent.vue │ │ ├── BadgeWalletAddress.vue │ │ ├── BcgRankingList.vue │ │ ├── CoinRankingList.vue │ │ ├── ConfirmPurchaseArticleModalContent.vue │ │ ├── DefaultHeaderNav.vue │ │ ├── EditHeaderNavEditArticle.vue │ │ ├── EditHeaderNavPostArticleV1.vue │ │ ├── EditHeaderNavPostArticleV2.vue │ │ ├── EditHeaderNavV1.vue │ │ ├── EditHeaderNavV2.vue │ │ ├── FirstProcessCreatedArticleModal.vue │ │ ├── FirstProcessGotTokenModal.vue │ │ ├── FirstProcessLikedArticleModal.vue │ │ ├── FirstProcessTippedArticleModal.vue │ │ ├── InputWithdrawAuthCodeModalForm.vue │ │ ├── LaboNLicenseTokenCertificateModalContent.vue │ │ ├── LaboNLicenseTokenTransferModalContent.vue │ │ ├── LoginModalForm.vue │ │ ├── MobileEditorHeaderPostArticleModalContent.vue │ │ ├── NotificationCardContent.vue │ │ ├── ProfileSettingsModalForm.vue │ │ ├── RequestInputWalletPasswordModalForm.vue │ │ ├── RequestLoginModalContent.vue │ │ ├── RequestPhoneNumberVerifyInputAuthCodeModalForm.vue │ │ ├── RequestPhoneNumberVerifyInputPhoneNumberModalForm.vue │ │ ├── RestrictEditArticleModalContent.vue │ │ ├── SearchTags.vue │ │ ├── SelectPaypartHeaderNav.vue │ │ ├── SelectPaypartPublishButton.vue │ │ ├── SignUpAuthFlowCompletedPhoneNumberAuthModal.vue │ │ ├── SignUpAuthFlowInputAuthCodeModalForm.vue │ │ ├── SignUpAuthFlowInputPhoneNumberModalForm.vue │ │ ├── SignUpAuthFlowInputUserIdForm.vue │ │ ├── SignUpAuthFlowInputWalletPasswordModalForm.vue │ │ ├── SignUpAuthFlowLoginModalForm.vue │ │ ├── SignUpAuthFlowNotCompletedPhoneNumberAuthModal.vue │ │ ├── SignUpModalForm.vue │ │ ├── SignUpModalSentMail.vue │ │ ├── TagsInputForm.vue │ │ ├── TipFlowCompletedModal.vue │ │ ├── TipFlowConfirmationModal.vue │ │ ├── TipFlowSelectTipAmountModal.vue │ │ ├── UserProfileNav.vue │ │ ├── UserReportConfirmationModal.vue │ │ ├── UserReportInputFreeTextModal.vue │ │ ├── UserReportSelectReasonModal.vue │ │ └── WithdrawalDetailModalContent.vue │ ├── organisms │ │ ├── AppFooter.vue │ │ ├── AppHeader.vue │ │ ├── ArticleCard.vue │ │ ├── ArticleCardList.vue │ │ ├── ArticleCommentReplyComment.vue │ │ ├── ArticleCommentReplyComments.vue │ │ ├── ArticleCommentReplyForm.vue │ │ ├── ArticleComments.vue │ │ ├── ArticleContentEditHistoryCard.vue │ │ ├── ArticleContentEditHistoryCardList.vue │ │ ├── ArticleDeleteModal.vue │ │ ├── ArticleDetailPaypart.vue │ │ ├── ArticleEditorV1.vue │ │ ├── ArticleEditorV2.vue │ │ ├── ArticleHeader.vue │ │ ├── ArticleRegistration.vue │ │ ├── ArticleRegistrationFooter.vue │ │ ├── ArticleReportModal.vue │ │ ├── ArticleSubInfosV2.vue │ │ ├── ArticleSupporters.vue │ │ ├── ArticleTopicRecommendedCardList.vue │ │ ├── ArticleTypeSelectNav.vue │ │ ├── BadgeCardList.vue │ │ ├── BadgeDescriptionModal.vue │ │ ├── BcgRanking.vue │ │ ├── BcgRankingTop.vue │ │ ├── CategoryNotices.vue │ │ ├── CoinRanking.vue │ │ ├── CoinRankingTop.vue │ │ ├── ConfirmPurchaseArticleModal.vue │ │ ├── EyecatchArticleCard.vue │ │ ├── EyecatchArticleCardList.vue │ │ ├── FirstProcessModal.vue │ │ ├── FormGroup.vue │ │ ├── GameRanking.vue │ │ ├── HowToUseImage.vue │ │ ├── InputWithdrawAuthCodeModal.vue │ │ ├── LaboNLicenseTokenCertificateModal.vue │ │ ├── LaboNLicenseTokenDropzone.vue │ │ ├── LaboNLicenseTokenList.vue │ │ ├── LaboNLicenseTokenTransferModal.vue │ │ ├── LaboNMajorityJudgementGrid.vue │ │ ├── LaboNQuadraticVotingGrid.vue │ │ ├── LoginModal.vue │ │ ├── MobileEditorHeader.vue │ │ ├── MobileEditorHeaderPostArticleModal.vue │ │ ├── MuteUserCard.vue │ │ ├── MuteUserCardList.vue │ │ ├── NotificationCard.vue │ │ ├── NotificationCardList.vue │ │ ├── ProfileSettingsModal.vue │ │ ├── RecommendedArticleCard.vue │ │ ├── RecommendedArticleCardList.vue │ │ ├── RelatedArticles.vue │ │ ├── RequestLoginModal.vue │ │ ├── RequestPhoneNumberVerifyModal.vue │ │ ├── RequestWalletPasswordModal.vue │ │ ├── RestrictEditArticleModal.vue │ │ ├── SearchArticleCardList.vue │ │ ├── SearchUserCard.vue │ │ ├── SearchUserCardList.vue │ │ ├── SelectPaypartEditor.vue │ │ ├── SelectPaypartHeader.vue │ │ ├── SignUpAuthFlowModal.vue │ │ ├── SignUpModal.vue │ │ ├── SubFooter.vue │ │ ├── TipEyecatchArticleCard.vue │ │ ├── TipEyecatchArticleCardList.vue │ │ ├── TipModal.vue │ │ ├── TopNotices.vue │ │ ├── UrlsInputForm.vue │ │ ├── UserArticleCardList.vue │ │ ├── UserArticlePopularCard.vue │ │ ├── UserArticlePopularCardList.vue │ │ ├── UserReportModal.vue │ │ ├── WalletNav.vue │ │ └── WithdrawalDetailModal.vue │ └── pages │ │ ├── ApplicationList.vue │ │ ├── ArticleContentEditHistories.vue │ │ ├── ArticleDetailV1.vue │ │ ├── ArticleDetailV2.vue │ │ ├── BadgeList.vue │ │ ├── BlankPage.vue │ │ ├── Campaigns.vue │ │ ├── CoinRanking.vue │ │ ├── ConnectedApplicationList.vue │ │ ├── CreateApplication.vue │ │ ├── CreateArticle.vue │ │ ├── DepositToken.vue │ │ ├── DraftArticleList.vue │ │ ├── EditApplication.vue │ │ ├── EditDraftArticleV1.vue │ │ ├── EditDraftArticleV2.vue │ │ ├── EditPublicArticleV1.vue │ │ ├── EditPublicArticleV2.vue │ │ ├── Esports.vue │ │ ├── HelpPage.vue │ │ ├── LaboNLicenseToken.vue │ │ ├── LaboNMajorityJudgement.vue │ │ ├── LaboNQuadraticVoting.vue │ │ ├── MuteUserList.vue │ │ ├── NewArticleList.vue │ │ ├── NftGames.vue │ │ ├── NotificationPage.vue │ │ ├── OauthAuthenticate.vue │ │ ├── PopularArticleList.vue │ │ ├── PrivacyPolicy.vue │ │ ├── PurchasedArticles.vue │ │ ├── SearchPage.vue │ │ ├── SelectPaypart.vue │ │ ├── TagArticleList.vue │ │ ├── TermsOfService.vue │ │ ├── TipRanking.vue │ │ ├── TipSupporters.vue │ │ ├── TokenHistoryCsvDownload.vue │ │ ├── TokenUseGuideline.vue │ │ ├── TopPage.vue │ │ ├── UserArticleList.vue │ │ ├── WithdrawToken.vue │ │ └── WithdrawalDetails.vue ├── layouts │ ├── default.vue │ └── error.vue ├── middleware │ └── .keep ├── pages │ ├── _userId │ │ └── articles │ │ │ └── _articleId │ │ │ ├── index.vue │ │ │ └── supporters.vue │ ├── articles │ │ ├── popular.vue │ │ ├── ranking │ │ │ └── tip.vue │ │ └── recent.vue │ ├── callback │ │ ├── facebook.vue │ │ ├── line.vue │ │ ├── twitter.vue │ │ └── yahoo.vue │ ├── campaigns.vue │ ├── category │ │ └── crypto │ │ │ └── coin_ranking.vue │ ├── confirm.vue │ ├── esports.vue │ ├── help.vue │ ├── index.vue │ ├── labo │ │ └── n │ │ │ ├── license_token.vue │ │ │ ├── majority_judgement.vue │ │ │ ├── quadratic_voting.vue │ │ │ └── random.vue │ ├── login.vue │ ├── me │ │ ├── articles │ │ │ ├── draft │ │ │ │ ├── _articleId │ │ │ │ │ ├── edit.vue │ │ │ │ │ └── paypart.vue │ │ │ │ └── v2 │ │ │ │ │ └── _articleId │ │ │ │ │ ├── content_edit_histories.vue │ │ │ │ │ └── edit.vue │ │ │ ├── new.vue │ │ │ ├── public │ │ │ │ ├── _articleId │ │ │ │ │ ├── edit.vue │ │ │ │ │ └── paypart.vue │ │ │ │ └── v2 │ │ │ │ │ └── _articleId │ │ │ │ │ ├── content_edit_histories.vue │ │ │ │ │ └── edit.vue │ │ │ └── purchased.vue │ │ ├── notifications.vue │ │ ├── settings │ │ │ ├── applications │ │ │ │ ├── _clientId │ │ │ │ │ └── edit.vue │ │ │ │ ├── index.vue │ │ │ │ └── new.vue │ │ │ ├── mute_users.vue │ │ │ └── sessions.vue │ │ ├── token_history_csv_download.vue │ │ └── wallet │ │ │ ├── deposit.vue │ │ │ ├── history.vue │ │ │ └── withdraw.vue │ ├── media_embed │ │ ├── any.vue │ │ └── twitter_profile │ │ │ └── _userName.vue │ ├── nft_games │ │ └── index.vue │ ├── oauth-authenticate.vue │ ├── privacy.vue │ ├── search │ │ └── index.vue │ ├── signup-login.vue │ ├── signup.vue │ ├── tag │ │ └── _tag.vue │ ├── terms.vue │ ├── token-use-guideline.vue │ ├── token-use-guidline.vue │ └── users │ │ └── _userId │ │ ├── badge.vue │ │ ├── drafts.vue │ │ └── index.vue ├── plugins │ ├── axios.js │ ├── editor.js │ ├── gtm.js │ ├── lazysizes.js │ ├── ve-table.js │ ├── vue-tags-input.js │ └── vuelidate.js ├── static │ ├── OGP_1200×630.png │ ├── favicon.ico │ ├── header_logo_original.png │ ├── icon_user_noimg.png │ ├── part.js │ └── touch-icon.png ├── store │ ├── index.js │ ├── modules │ │ ├── article.js │ │ ├── articleModals.js │ │ ├── badge.js │ │ ├── nftGames.js │ │ ├── presentation.js │ │ ├── report.js │ │ ├── tag.js │ │ └── user.js │ └── mutation-types.js └── utils │ ├── article.js │ ├── axios.js │ ├── client.js │ ├── cognito-auth-sdk.js │ ├── cognito-sdk.js │ ├── device.js │ ├── editor-head.js │ ├── format.js │ ├── oauth.js │ ├── wallet.js │ └── web3.js ├── build.sh ├── buildspec.yml ├── deploy.sh ├── deploy_via_ci.sh ├── jest.config.js ├── nuxt.config.ci.js ├── nuxt.config.debug.js ├── nuxt.config.development.js ├── nuxt.config.js ├── package.json ├── server ├── LICENSE ├── app.js ├── core │ └── nuxt.js ├── handler.js └── middlewares │ ├── header-middleware.js │ └── logger-middleware.js ├── serverless.yml ├── tests ├── components │ └── atoms │ │ └── AppButton.spec.js ├── helpers │ ├── axios.js │ └── responses │ │ ├── articles.js │ │ ├── index.js │ │ └── users.js └── store │ └── modules │ ├── article.spec.js │ └── presentation.spec.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "test": { 4 | "presets": [ 5 | [ 6 | "@babel/preset-env", 7 | { 8 | "targets": { 9 | "node": "current" 10 | } 11 | } 12 | ] 13 | ] 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_size = 2 6 | indent_style = space 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true 6 | }, 7 | parserOptions: { 8 | parser: '@babel/eslint-parser', 9 | babelOptions: { 10 | presets: ["@babel/preset-react"] 11 | }, 12 | requireConfigFile: false, 13 | }, 14 | plugins: [ 15 | '@babel' 16 | ], 17 | extends: '@nuxtjs', 18 | // add your custom rules here 19 | rules: { 20 | 'arrow-parens': 'off', 21 | 'import/no-named-as-default-member': 'off', 22 | 'no-console': 'off', 23 | 'no-irregular-whitespace': 'off', 24 | 'prefer-promise-reject-errors': 'off', 25 | 'require-await': 'off', 26 | 'space-before-function-paren': 'off', 27 | 'vue/attribute-hyphenation': 'off', 28 | 'vue/no-side-effects-in-computed-properties': 'off', 29 | 'vue/no-unused-component': 'off', 30 | 'vue/no-v-html': 'off', 31 | 'vue/order-in-components': 'off', 32 | 'vue/require-default-prop': 'off', 33 | 'vue/require-prop-types': 'off', 34 | 'vue/require-v-for-key': 'off', 35 | 'vue/require-valid-default-prop': 'off', 36 | 'vue/return-in-computed-property': 'off', 37 | 'vue/valid-v-for': 'off' 38 | }, 39 | globals: { 40 | describe: true, 41 | test: true, 42 | expect: true, 43 | beforeEach: true, 44 | afterEach: true, 45 | jest: true 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 概要 4 | 5 | - この変更が必要な理由は何か? 6 | - これによってどう解決されるのか 7 | - など、この変更に対する概要を記載 8 | 9 | ## SSM・環境変数 10 | 11 | - SSMに変更を加えたか否か 12 | - YES or NO 13 | - SSMを変更した場合は以下の作業を行う 14 | - [ ] `ssm` リポジトリへ環境変数名とその用途の **詳細な説明** を追加 15 | - [ ] Slack でエンジニア全員へ、この PR の内容とSSMへ変更があったことを共有(マージ時) 16 | - [ ] 必要があれば、master へマージされた時に走る CI 環境への追加(Context) 17 | - [ ] ビルドやローカルでの開発で必要な場合は、`build.sh`や`.envrc.sample`に追加 18 | - 環境変数に変更を加えたか否か(注:原則としてSSMを使用し、環境変数は使用しない) 19 | - YES or NO 20 | - SSMではなく環境変数を使用した理由は合理的理由は何か 21 | 22 | 23 | ## 影響範囲(システム) 24 | 25 | - 影響を与えるシステムはどこか 26 | 27 | * 例: 記事一覧画面 28 | * 例: プロフィール設定画面 29 | 30 | ## 技術的変更点概要 31 | 32 | - なにをどう変更したか 33 | - ロジックがどういう手順で動くのか 34 | - バックエンドからどういうクエリで何をとってそれに何を処理するのか 35 | 36 | ## 使い方 37 | 38 | - 使い方の説明 39 | - バグの場合は再現条件 40 | 41 | ## 個人情報やトークンの取り扱いに関係のある修正か 42 | 43 | - [ ] [E2E テスト戦略](https://alismedia.atlassian.net/wiki/spaces/DEV/pages/95453205/E2E) でテストすべき項目が担保できていること 44 | 45 | ## テスト結果とテスト項目 46 | 47 | - [ ] テストする際の項目を、このように、チェック可能な形式で記載する。 48 | - [ ] テストしたらチェックを入れていく。 49 | 50 | ## 保留した項目と TODO リスト 51 | 52 | 箇条書きで書く。可能な限り次のチケットを作る。 53 | 54 | ## 注意点・その他 55 | 56 | - この作業で特に注意する点があれば記載する 57 | - その他、補足事項があれば記載する 58 | 59 | ## レビュワーに依頼したいこと 60 | 61 | - 例: 内容を確認し、問題なければマージしてステージングで動作確認をお願いします。その後、リリースしますのでお知らせください。 62 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules 3 | 4 | # logs 5 | npm-debug.log 6 | 7 | # Nuxt build 8 | .nuxt 9 | 10 | # Nuxt generate 11 | dist 12 | 13 | .envrc 14 | 15 | # editor 16 | .idea 17 | .vscode 18 | 19 | # Jest 20 | coverage/ 21 | 22 | # etc 23 | yarn-error.log 24 | .serverless 25 | tmp* 26 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 18.12.1 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | functions/node_modules 2 | .nuxt 3 | dist 4 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | useTabs: false, 3 | printWidth: 100, 4 | tabWidth: 2, 5 | singleQuote: true, 6 | semi: false, 7 | arrowParens: 'always', 8 | trailingComma: 'none', 9 | jsxBracketSameLine: false 10 | } 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 ALIS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # frontend-application 2 | [![CircleCI](https://circleci.com/gh/AlisProject/frontend-application.svg?style=svg)](https://circleci.com/gh/AlisProject/frontend-application) 3 | 4 | # Prerequisite 5 | - nodenv 6 | - yarn 7 | - serverless 8 | - aws cli 9 | - direnv 10 | 11 | # Environment valuables 12 | ```bash 13 | # Create .envrc to suit your environment. 14 | cp -pr .envrc.sample .envrc 15 | vi .envrc # edit 16 | 17 | # allow 18 | direnv allow 19 | ``` 20 | 21 | Also, you should use variables in `.envrc.sample.develop` when you are developing. 22 | 23 | # Build and deployment 24 | 25 | ## Install dependencies 26 | ```bash 27 | # install dependencies 28 | nodenv install 29 | yarn 30 | ``` 31 | 32 | ## Build 33 | 34 | ```bash 35 | yarn build 36 | ``` 37 | 38 | ## Deployment 39 | 40 | ```bash 41 | yarn deploy 42 | 43 | # Re install dependencies 44 | yarn 45 | ``` 46 | 47 | # Development 48 | 49 | ## Serve with hot reload at localhost:3000 50 | ```bash 51 | yarn dev 52 | ``` 53 | 54 | ## Launch server 55 | ```bash 56 | yarn start 57 | ``` 58 | 59 | ## Generate static project 60 | ```bash 61 | yarn generate 62 | ``` 63 | -------------------------------------------------------------------------------- /app/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <% if (process.env.ALIS_APP_ID === 'alis') { %> 6 | 7 | 9 | 10 | 11 | <% } else { %> 12 | 13 | <% } %> 14 | {{ HEAD }} 15 | 16 | 17 | 18 | <% if (process.env.NODE_ENV === 'production') { %> 19 | 20 | 23 | 24 | <% } %> 25 | {{ APP }} 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/assets/images/pc/article/a_icon_Good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/a_icon_Good.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/a_icon_Good_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/a_icon_Good_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/a_icon_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/a_icon_menu.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/article_image_blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/article_image_blank.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_all_supporters.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_article_date.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_article_date.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_article_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_article_like.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_article_like_v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_article_like_v2.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_article_registration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_article_registration.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_article_supporter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_article_supporter.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_article_tip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_article_tip.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_bookmark.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_chip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_chip.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_chip_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_chip_01.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_chip_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_chip_1.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_chip_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_chip_10.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_etc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_etc.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_like.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_like_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_like_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_share.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_share_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_share_facebook.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_share_facebook_circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_share_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_share_twitter.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_share_twitter_circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/assets/images/pc/article/icon_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/icon_twitter.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/m_ribbon_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/m_ribbon_1.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/m_ribbon_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/m_ribbon_2.png -------------------------------------------------------------------------------- /app/assets/images/pc/article/m_ribbon_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/article/m_ribbon_3.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/completed-phone-number-auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/completed-phone-number-auth.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/first-process-created-article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/first-process-created-article.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/first-process-got-token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/first-process-got-token.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/first-process-liked-article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/first-process-liked-article.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/first-process-tipped-article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/first-process-tipped-article.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/login.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/not-completed-phone-number-auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/not-completed-phone-number-auth.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/request-login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/request-login.png -------------------------------------------------------------------------------- /app/assets/images/pc/bg/signup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/bg/signup.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/header_logo_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/header_logo_original.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_btn_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_btn_facebook.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_btn_yahoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_btn_yahoo.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_catset_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_catset_like.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_catset_like_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_catset_like_white.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_catset_tip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_catset_tip.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_catset_tip_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_catset_tip_white.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_draftcassette_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_draftcassette_active.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_edit.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_like.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_line.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_logo_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_logo_white.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_notification.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_notification_mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_notification_mark.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_notification_none.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_notification_none.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_plus.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_profile_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_profile_img.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_search.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_token_cassette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_token_cassette.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_twitter.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_user_noimg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_user_noimg.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/icon_writing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/icon_writing.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/image_bg404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/image_bg404.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/img_FAQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/img_FAQ.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/img_Instructions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/img_Instructions.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/img_anounce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/img_anounce.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/img_banner_beginner_middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/img_banner_beginner_middle.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/img_banner_beginner_pc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/img_banner_beginner_pc.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/thumbnail_blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/thumbnail_blank.png -------------------------------------------------------------------------------- /app/assets/images/pc/common/thumbnail_noimg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/common/thumbnail_noimg.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_bold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_bold.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_bold_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_bold_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_img.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_img_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_img_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_index.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_index_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_index_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_italic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_italic.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_italic_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_italic_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_line.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_line_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_line_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_link.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_link_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_link_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_movie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_movie.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_movie_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_movie_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_quote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_quote.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_quote_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_quote_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_text.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_text_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_text_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_textlink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_textlink.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_textlink_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_textlink_selected.png -------------------------------------------------------------------------------- /app/assets/images/pc/editor/icon_twitterGrey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/editor/icon_twitterGrey.png -------------------------------------------------------------------------------- /app/assets/images/pc/notification/icon_announce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/notification/icon_announce.png -------------------------------------------------------------------------------- /app/assets/images/pc/notification/icon_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/notification/icon_download.png -------------------------------------------------------------------------------- /app/assets/images/pc/notification/icon_exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/notification/icon_exclamation.png -------------------------------------------------------------------------------- /app/assets/images/pc/notification/icon_notification_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/notification/icon_notification_check.png -------------------------------------------------------------------------------- /app/assets/images/pc/notification/icon_notification_message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/notification/icon_notification_message.png -------------------------------------------------------------------------------- /app/assets/images/pc/notification/icon_notification_present.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/notification/icon_notification_present.png -------------------------------------------------------------------------------- /app/assets/images/pc/top/img_ anounce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/top/img_ anounce.png -------------------------------------------------------------------------------- /app/assets/images/pc/top/img_FAQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/top/img_FAQ.png -------------------------------------------------------------------------------- /app/assets/images/pc/top/img_Instructions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/top/img_Instructions.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/icon_category_recomend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/icon_category_recomend.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_beauty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_beauty.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_business.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_business.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_comic-animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_comic-animation.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_crypto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_crypto.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_education-parenting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_education-parenting.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_game.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_gourmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_gourmet.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_others.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_others.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_technology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_technology.png -------------------------------------------------------------------------------- /app/assets/images/pc/topic/topic_travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/pc/topic/topic_travel.png -------------------------------------------------------------------------------- /app/assets/images/sp/common/icon_bell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/sp/common/icon_bell.png -------------------------------------------------------------------------------- /app/assets/images/sp/common/icon_editprofile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/sp/common/icon_editprofile.png -------------------------------------------------------------------------------- /app/assets/images/sp/common/icon_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/sp/common/icon_search.png -------------------------------------------------------------------------------- /app/assets/images/sp/common/img_banner_beginner_sp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/assets/images/sp/common/img_banner_beginner_sp.png -------------------------------------------------------------------------------- /app/assets/stylesheets/ckeditor-pc.scss: -------------------------------------------------------------------------------- 1 | @import './ckeditor.scss'; 2 | 3 | .ck { 4 | &.ck-toolbar { 5 | filter: drop-shadow(0 3px 5px rgba(192, 192, 192, 0.5)); 6 | } 7 | 8 | &.ck-balloon-panel { 9 | filter: drop-shadow(0 3px 5px rgba(192, 192, 192, 0.5)); 10 | } 11 | 12 | &.ck-editor__editable_inline { 13 | padding: 0 1px; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/assets/stylesheets/ckeditor-sp-android.scss: -------------------------------------------------------------------------------- 1 | .ck { 2 | &.ck-sticky-panel { 3 | .ck.ck-toolbar { 4 | position: fixed; 5 | top: 56px; 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/assets/stylesheets/ckeditor-sp.scss: -------------------------------------------------------------------------------- 1 | @import './ckeditor.scss'; 2 | 3 | .ck { 4 | &.ck-editor__top { 5 | .ck.ck-toolbar { 6 | border: none; 7 | filter: none; 8 | position: absolute; 9 | width: 100%; 10 | box-shadow: 0px 6px 5px -5px rgba(0, 0, 0, 0.25); 11 | } 12 | } 13 | 14 | &.ck-editor__editable { 15 | border: none; 16 | 17 | &:not(.ck-editor__nested-editable).ck-focused { 18 | border: none; 19 | } 20 | } 21 | 22 | &.ck-editor__editable_inline { 23 | padding: 0 12px; 24 | } 25 | 26 | &.ck-balloon-panel { 27 | filter: drop-shadow(0 3px 5px rgba(192, 192, 192, 0.5)); 28 | 29 | .ck-toolbar { 30 | filter: drop-shadow(0 3px 5px rgba(192, 192, 192, 0.5)); 31 | position: relative; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/cassette-shadow-small.scss: -------------------------------------------------------------------------------- 1 | @mixin cassette-shadow-small { 2 | box-shadow: 0 0 9px 0 rgba(192, 192, 192, 0.7); 3 | transition: box-shadow 400ms ease; 4 | 5 | &:hover { 6 | box-shadow: 0 0 16px 0 rgba(0, 134, 204, 0.5); 7 | 8 | &:active { 9 | box-shadow: 0 0 2px 0 rgba(0, 134, 204, 0.5); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/cassette-shadow.scss: -------------------------------------------------------------------------------- 1 | @mixin cassette-shadow { 2 | box-shadow: 0 0 16px 0 rgba(192, 192, 192, 0.7); 3 | transition: box-shadow 400ms ease; 4 | 5 | &:hover { 6 | box-shadow: 0 0 16px 0 rgba(0, 134, 204, 0.5); 7 | 8 | &:active { 9 | box-shadow: 0 0 2px 0 rgba(0, 134, 204, 0.5); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/default-link.scss: -------------------------------------------------------------------------------- 1 | @mixin default-link { 2 | border-bottom: solid 1px transparent; 3 | color: #0086cc; 4 | cursor: pointer; 5 | font-weight: 500; 6 | text-decoration: none; 7 | transition: all 400ms ease; 8 | 9 | &:hover { 10 | border-bottom: solid 1px #0086cc; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/default-text.scss: -------------------------------------------------------------------------------- 1 | @import 'default-link'; 2 | 3 | @mixin default-text { 4 | color: #030303; 5 | font-size: 12px; 6 | font-weight: 500; 7 | line-height: 1.5; 8 | 9 | a { 10 | @include default-link(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/assets/stylesheets/vuex-toast.scss: -------------------------------------------------------------------------------- 1 | .toast { 2 | position: fixed; 3 | width: 100vw; 4 | z-index: 9998; 5 | left: 0; 6 | right: 0; 7 | top: 0; 8 | } 9 | 10 | .toast-type-info { 11 | background-color: #0086cc; 12 | } 13 | 14 | .toast-type-warning { 15 | background-color: #f06273; 16 | 17 | .toast-button { 18 | color: #f06273; 19 | } 20 | } 21 | 22 | .toast-message { 23 | box-sizing: border-box; 24 | color: #fff; 25 | font-size: 14px; 26 | line-height: 1.5; 27 | margin-bottom: 10px; 28 | padding: 8px 14px; 29 | position: relative; 30 | text-align: center; 31 | transition-property: opacity, transform; 32 | transition: 400ms cubic-bezier(0.17, 0.67, 0.17, 0.98); 33 | width: 100%; 34 | } 35 | 36 | .toast-button { 37 | display: none; 38 | } 39 | 40 | .toast-enter-active, 41 | .toast-leave { 42 | opacity: 1; 43 | } 44 | 45 | .toast-enter, 46 | .toast-leave-active { 47 | opacity: 0; 48 | } 49 | 50 | @media screen and (max-width: 550px) { 51 | .toast-message { 52 | font-size: 12px; 53 | padding: 6px 12px; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/components/atoms/ArticleCardContentBookmark.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 45 | -------------------------------------------------------------------------------- /app/components/atoms/ArticleContentEditHistoryCardContentUpdatedAt.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 24 | 25 | 33 | -------------------------------------------------------------------------------- /app/components/atoms/ArticleSubInfos.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 37 | 38 | 72 | -------------------------------------------------------------------------------- /app/components/atoms/CreateNewArticleButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 17 | 44 | -------------------------------------------------------------------------------- /app/components/atoms/EyecatchAlternativeImage.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | 30 | 51 | -------------------------------------------------------------------------------- /app/components/atoms/ItemLabel.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | 41 | -------------------------------------------------------------------------------- /app/components/atoms/NotificationCardContentUpdatedAt.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 24 | 25 | 33 | -------------------------------------------------------------------------------- /app/components/atoms/TheLoader.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | 22 | 74 | -------------------------------------------------------------------------------- /app/components/molecules/ArticleTags.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 32 | 33 | 65 | -------------------------------------------------------------------------------- /app/components/molecules/BadgeWalletAddress.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 47 | 48 | 68 | -------------------------------------------------------------------------------- /app/components/molecules/EditHeaderNavEditArticle.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 39 | 40 | 72 | -------------------------------------------------------------------------------- /app/components/molecules/NotificationCardContent.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 30 | 31 | 42 | -------------------------------------------------------------------------------- /app/components/molecules/RestrictEditArticleModalContent.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 35 | 36 | 64 | -------------------------------------------------------------------------------- /app/components/molecules/SearchTags.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 31 | 32 | 59 | -------------------------------------------------------------------------------- /app/components/molecules/SignUpModalSentMail.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 41 | 42 | 77 | -------------------------------------------------------------------------------- /app/components/molecules/TipFlowCompletedModal.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 44 | 45 | 81 | -------------------------------------------------------------------------------- /app/components/molecules/UserProfileNav.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 28 | 29 | 65 | -------------------------------------------------------------------------------- /app/components/organisms/AppFooter.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 63 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleCardList.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 22 | 23 | 51 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleCommentReplyComments.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 42 | 43 | 51 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleContentEditHistoryCard.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 40 | 41 | 76 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleContentEditHistoryCardList.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 28 | 29 | 69 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleDeleteModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 27 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleRegistration.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 27 | 28 | 55 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleReportModal.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 48 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleSubInfosV2.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | 27 | 65 | -------------------------------------------------------------------------------- /app/components/organisms/ArticleTypeSelectNav.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 56 | 57 | 80 | -------------------------------------------------------------------------------- /app/components/organisms/BadgeDescriptionModal.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 27 | -------------------------------------------------------------------------------- /app/components/organisms/BcgRankingTop.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 30 | 31 | 40 | -------------------------------------------------------------------------------- /app/components/organisms/CategoryNotices.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 95 | -------------------------------------------------------------------------------- /app/components/organisms/CoinRanking.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 33 | 34 | 53 | -------------------------------------------------------------------------------- /app/components/organisms/CoinRankingTop.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 30 | 31 | 40 | -------------------------------------------------------------------------------- /app/components/organisms/ConfirmPurchaseArticleModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/components/organisms/EyecatchArticleCardList.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 32 | 33 | 58 | -------------------------------------------------------------------------------- /app/components/organisms/FirstProcessModal.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 45 | -------------------------------------------------------------------------------- /app/components/organisms/GameRanking.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 30 | 31 | 40 | -------------------------------------------------------------------------------- /app/components/organisms/HowToUseImage.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 69 | -------------------------------------------------------------------------------- /app/components/organisms/InputWithdrawAuthCodeModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/components/organisms/LaboNLicenseTokenCertificateModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/components/organisms/LaboNLicenseTokenTransferModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/components/organisms/LoginModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 34 | -------------------------------------------------------------------------------- /app/components/organisms/MobileEditorHeaderPostArticleModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/components/organisms/MuteUserCardList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | 23 | 63 | -------------------------------------------------------------------------------- /app/components/organisms/NotificationCardList.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | 22 | 36 | -------------------------------------------------------------------------------- /app/components/organisms/ProfileSettingsModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 31 | -------------------------------------------------------------------------------- /app/components/organisms/RecommendedArticleCardList.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 35 | 36 | 64 | -------------------------------------------------------------------------------- /app/components/organisms/RelatedArticles.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 26 | 27 | 58 | -------------------------------------------------------------------------------- /app/components/organisms/RequestLoginModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/components/organisms/RequestPhoneNumberVerifyModal.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 40 | -------------------------------------------------------------------------------- /app/components/organisms/RequestWalletPasswordModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 32 | -------------------------------------------------------------------------------- /app/components/organisms/RestrictEditArticleModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/components/organisms/SearchArticleCardList.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 31 | 32 | 54 | -------------------------------------------------------------------------------- /app/components/organisms/SearchUserCardList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | 23 | 44 | -------------------------------------------------------------------------------- /app/components/organisms/SignUpModal.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 46 | 47 | 67 | -------------------------------------------------------------------------------- /app/components/organisms/SubFooter.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 44 | -------------------------------------------------------------------------------- /app/components/organisms/TipEyecatchArticleCardList.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 32 | 33 | 58 | -------------------------------------------------------------------------------- /app/components/organisms/TipModal.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 39 | -------------------------------------------------------------------------------- /app/components/organisms/TopNotices.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 70 | -------------------------------------------------------------------------------- /app/components/organisms/UserArticleCardList.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 31 | 32 | 55 | -------------------------------------------------------------------------------- /app/components/organisms/UserArticlePopularCardList.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 31 | 32 | 59 | -------------------------------------------------------------------------------- /app/components/organisms/UserReportModal.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 48 | -------------------------------------------------------------------------------- /app/components/organisms/WalletNav.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 39 | 40 | 62 | -------------------------------------------------------------------------------- /app/components/organisms/WithdrawalDetailModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/components/pages/BlankPage.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 17 | 27 | -------------------------------------------------------------------------------- /app/components/pages/CoinRanking.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 25 | 26 | 64 | -------------------------------------------------------------------------------- /app/components/pages/EditDraftArticleV1.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 40 | 41 | 55 | -------------------------------------------------------------------------------- /app/components/pages/EditPublicArticleV1.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 41 | 42 | 56 | -------------------------------------------------------------------------------- /app/components/pages/NftGames.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 22 | 23 | 55 | -------------------------------------------------------------------------------- /app/middleware/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/middleware/.keep -------------------------------------------------------------------------------- /app/pages/_userId/articles/_articleId/supporters.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 42 | -------------------------------------------------------------------------------- /app/pages/articles/popular.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 58 | -------------------------------------------------------------------------------- /app/pages/articles/ranking/tip.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 40 | -------------------------------------------------------------------------------- /app/pages/articles/recent.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 48 | -------------------------------------------------------------------------------- /app/pages/campaigns.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/category/crypto/coin_ranking.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/confirm.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 22 | -------------------------------------------------------------------------------- /app/pages/esports.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/help.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 33 | -------------------------------------------------------------------------------- /app/pages/labo/n/license_token.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 17 | -------------------------------------------------------------------------------- /app/pages/labo/n/majority_judgement.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 14 | -------------------------------------------------------------------------------- /app/pages/labo/n/quadratic_voting.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 14 | -------------------------------------------------------------------------------- /app/pages/labo/n/random.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 31 | -------------------------------------------------------------------------------- /app/pages/login.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 52 | -------------------------------------------------------------------------------- /app/pages/me/articles/draft/_articleId/edit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 45 | -------------------------------------------------------------------------------- /app/pages/me/articles/draft/_articleId/paypart.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | -------------------------------------------------------------------------------- /app/pages/me/articles/draft/v2/_articleId/content_edit_histories.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 17 | -------------------------------------------------------------------------------- /app/pages/me/articles/draft/v2/_articleId/edit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 56 | -------------------------------------------------------------------------------- /app/pages/me/articles/public/_articleId/edit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 45 | -------------------------------------------------------------------------------- /app/pages/me/articles/public/_articleId/paypart.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | -------------------------------------------------------------------------------- /app/pages/me/articles/public/v2/_articleId/content_edit_histories.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 17 | -------------------------------------------------------------------------------- /app/pages/me/articles/public/v2/_articleId/edit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 56 | -------------------------------------------------------------------------------- /app/pages/me/articles/purchased.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 24 | -------------------------------------------------------------------------------- /app/pages/me/notifications.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 21 | -------------------------------------------------------------------------------- /app/pages/me/settings/applications/_clientId/edit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 33 | -------------------------------------------------------------------------------- /app/pages/me/settings/applications/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 34 | -------------------------------------------------------------------------------- /app/pages/me/settings/applications/new.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 33 | -------------------------------------------------------------------------------- /app/pages/me/settings/mute_users.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/me/settings/sessions.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 32 | -------------------------------------------------------------------------------- /app/pages/me/token_history_csv_download.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/me/wallet/deposit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 49 | -------------------------------------------------------------------------------- /app/pages/me/wallet/history.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 23 | -------------------------------------------------------------------------------- /app/pages/me/wallet/withdraw.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 45 | -------------------------------------------------------------------------------- /app/pages/media_embed/twitter_profile/_userName.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 31 | 32 | 79 | -------------------------------------------------------------------------------- /app/pages/nft_games/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 35 | -------------------------------------------------------------------------------- /app/pages/oauth-authenticate.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 45 | -------------------------------------------------------------------------------- /app/pages/privacy.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/search/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 35 | -------------------------------------------------------------------------------- /app/pages/signup-login.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 49 | -------------------------------------------------------------------------------- /app/pages/signup.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 40 | -------------------------------------------------------------------------------- /app/pages/tag/_tag.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 44 | -------------------------------------------------------------------------------- /app/pages/terms.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/token-use-guideline.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | -------------------------------------------------------------------------------- /app/pages/token-use-guidline.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /app/pages/users/_userId/badge.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | -------------------------------------------------------------------------------- /app/pages/users/_userId/drafts.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 32 | -------------------------------------------------------------------------------- /app/plugins/axios.js: -------------------------------------------------------------------------------- 1 | export default async ({ $axios, store, env }) => { 2 | store.dispatch('user/initCognito') 3 | try { 4 | await store.dispatch('user/getUserSession') 5 | } catch (e) {} 6 | 7 | $axios.onRequest(async (req) => { 8 | if ( 9 | req.url.startsWith('/api/me/') || 10 | req.url.startsWith('/laboratory/labo/') || 11 | req.url.startsWith(env.WEB3_SERVICE_BASE_URL + '/api/me/') 12 | ) { 13 | try { 14 | await store.dispatch('user/getUserSession') 15 | const currentUser = localStorage.getItem( 16 | `CognitoIdentityServiceProvider.${env.COGNITO_APP_CLIENT_ID}.LastAuthUser` 17 | ) 18 | const token = localStorage.getItem( 19 | `CognitoIdentityServiceProvider.${env.COGNITO_APP_CLIENT_ID}.${currentUser}.idToken` 20 | ) 21 | req.headers.common.Authorization = token 22 | } catch (e) {} 23 | } 24 | return req 25 | }) 26 | 27 | if (process.client) { 28 | const currentUser = localStorage.getItem( 29 | `CognitoIdentityServiceProvider.${env.COGNITO_APP_CLIENT_ID}.LastAuthUser` 30 | ) 31 | const token = localStorage.getItem( 32 | `CognitoIdentityServiceProvider.${env.COGNITO_APP_CLIENT_ID}.${currentUser}.idToken` 33 | ) 34 | $axios.setToken(token) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/plugins/editor.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import { AlisEditorPc, AlisEditorSp } from '@alisproject/alis-editor' 3 | 4 | Vue.component('alis-editor-pc', AlisEditorPc) 5 | Vue.component('alis-editor-sp', AlisEditorSp) 6 | -------------------------------------------------------------------------------- /app/plugins/gtm.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | export default ({ app }) => { 4 | if (process.env.NODE_ENV !== 'production') return 5 | ;(function(w, d, s, l, i) { 6 | w[l] = w[l] || [] 7 | w[l].push({ 8 | 'gtm.start': new Date().getTime(), 9 | event: 'gtm.js' 10 | }) 11 | var f = d.getElementsByTagName(s)[0], 12 | j = d.createElement(s), 13 | dl = l != 'dataLayer' ? '&l=' + l : '' 14 | j.async = true 15 | j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl 16 | f.parentNode.insertBefore(j, f) 17 | })(window, document, 'script', 'dataLayer', 'GTM-5DZNDNB') 18 | 19 | window.dataLayer = window.dataLayer || [] 20 | window.dataLayer.push({ 21 | event: 'gtm.js', 22 | 'gtm.start': new Date().getTime() 23 | }) 24 | 25 | app.router.afterEach((to, from) => { 26 | const currentUser = localStorage.getItem( 27 | `CognitoIdentityServiceProvider.${process.env.COGNITO_APP_CLIENT_ID}.LastAuthUser` 28 | ) 29 | dataLayer.push(to.gtm || { userId: currentUser }) 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /app/plugins/lazysizes.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import lazySizes from 'lazysizes' 3 | 4 | Vue.use(lazySizes) 5 | -------------------------------------------------------------------------------- /app/plugins/ve-table.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueEasytable, { VePagination, veLoading } from 'vue-easytable' 3 | 4 | Vue.prototype.$veLoading = veLoading 5 | Vue.use(VueEasytable) 6 | Vue.use(VePagination) 7 | -------------------------------------------------------------------------------- /app/plugins/vue-tags-input.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueTagsInput from '@johmun/vue-tags-input' 3 | 4 | Vue.use(VueTagsInput) 5 | -------------------------------------------------------------------------------- /app/plugins/vuelidate.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuelidate from 'vuelidate' 3 | 4 | Vue.use(Vuelidate) 5 | -------------------------------------------------------------------------------- /app/static/OGP_1200×630.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/static/OGP_1200×630.png -------------------------------------------------------------------------------- /app/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/static/favicon.ico -------------------------------------------------------------------------------- /app/static/header_logo_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/static/header_logo_original.png -------------------------------------------------------------------------------- /app/static/icon_user_noimg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/static/icon_user_noimg.png -------------------------------------------------------------------------------- /app/static/touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlisProject/frontend-application/33836a42198578ba5404f8467d302830ed0e1e90/app/static/touch-icon.png -------------------------------------------------------------------------------- /app/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import { createModule } from 'vuex-toast' 4 | import article from './modules/article' 5 | import articleModals from './modules/articleModals' 6 | import user from './modules/user' 7 | import tag from './modules/tag' 8 | import report from './modules/report' 9 | import presentation from './modules/presentation' 10 | import badge from './modules/badge' 11 | import nftGames from './modules/nftGames' 12 | 13 | Vue.use(Vuex) 14 | 15 | export default () => 16 | new Vuex.Store({ 17 | modules: { 18 | article, 19 | articleModals, 20 | user, 21 | tag, 22 | report, 23 | presentation, 24 | badge, 25 | nftGames, 26 | toast: createModule({ 27 | dismissInterval: 2000 28 | }) 29 | } 30 | }) 31 | -------------------------------------------------------------------------------- /app/store/modules/articleModals.js: -------------------------------------------------------------------------------- 1 | import * as types from '../mutation-types' 2 | 3 | const namespaced = true 4 | 5 | const state = () => ({ 6 | articleDeleteModal: { 7 | isShow: false 8 | } 9 | }) 10 | 11 | const getters = { 12 | articleDeleteModal: (state) => state.articleDeleteModal 13 | } 14 | 15 | const actions = { 16 | setArticleDeleteModal({ commit }, { isShow }) { 17 | commit(types.SET_ARTICLE_DELETE_MODAL, { isShow }) 18 | } 19 | } 20 | 21 | const mutations = { 22 | [types.SET_ARTICLE_DELETE_MODAL](state, { isShow }) { 23 | state.articleDeleteModal.isShow = isShow 24 | } 25 | } 26 | 27 | export default { 28 | namespaced, 29 | state, 30 | getters, 31 | actions, 32 | mutations 33 | } 34 | -------------------------------------------------------------------------------- /app/store/modules/tag.js: -------------------------------------------------------------------------------- 1 | import * as types from '../mutation-types' 2 | 3 | const namespaced = true 4 | 5 | const state = () => ({ 6 | searchTags: { 7 | tags: [], 8 | page: 1, 9 | isFetching: false 10 | } 11 | }) 12 | 13 | const getters = { 14 | searchTags: (state) => state.searchTags 15 | } 16 | 17 | const actions = { 18 | async getSearchTags({ commit, state }, { query }) { 19 | try { 20 | if (state.searchTags.isFetching) return 21 | commit(types.SET_SEARCH_TAGS_IS_FETCHING, { isFetching: true }) 22 | const limit = 5 23 | const tags = await this.$axios.$get('/api/search/tags', { 24 | params: { limit, query, page: state.searchTags.page } 25 | }) 26 | commit(types.SET_SEARCH_TAGS, { tags }) 27 | } catch (error) { 28 | return Promise.reject(error) 29 | } finally { 30 | commit(types.SET_SEARCH_TAGS_IS_FETCHING, { isFetching: false }) 31 | } 32 | }, 33 | resetSearchTags({ commit }) { 34 | commit(types.SET_SEARCH_TAGS, { tags: [] }) 35 | } 36 | } 37 | 38 | const mutations = { 39 | [types.SET_SEARCH_TAGS](state, { tags }) { 40 | state.searchTags.tags = tags 41 | }, 42 | [types.SET_SEARCH_TAGS_IS_FETCHING](state, { isFetching }) { 43 | state.searchTags.isFetching = isFetching 44 | } 45 | } 46 | 47 | export default { 48 | namespaced, 49 | state, 50 | getters, 51 | actions, 52 | mutations 53 | } 54 | -------------------------------------------------------------------------------- /app/utils/axios.js: -------------------------------------------------------------------------------- 1 | /** 2 | * utils/axios.js 3 | * For calling it with utils function 4 | **/ 5 | import axios from 'axios' 6 | export default axios 7 | -------------------------------------------------------------------------------- /app/utils/client.js: -------------------------------------------------------------------------------- 1 | export function isPageScrollable() { 2 | const isScrollable = document.documentElement.scrollHeight > document.documentElement.clientHeight 3 | return isScrollable 4 | } 5 | 6 | export function isScrollBottom() { 7 | const downloadBarHeight = 50 8 | const isScrollBottom = 9 | window.innerHeight + Math.ceil(window.pageYOffset) >= 10 | document.body.offsetHeight - downloadBarHeight 11 | return isScrollBottom 12 | } 13 | -------------------------------------------------------------------------------- /app/utils/cognito-auth-sdk.js: -------------------------------------------------------------------------------- 1 | export default class CognitoAuthSDK { 2 | setTokens({ 3 | last_auth_user: lastAuthUser, 4 | id_token: idToken, 5 | access_token: accessToken, 6 | refresh_token: refreshToken 7 | }) { 8 | const key = `CognitoIdentityServiceProvider.${process.env.COGNITO_APP_CLIENT_ID}` 9 | const keyWithLastAuthUser = `${key}.${lastAuthUser}` 10 | localStorage.setItem(`${key}.LastAuthUser`, lastAuthUser) 11 | localStorage.setItem(`${keyWithLastAuthUser}.idToken`, idToken) 12 | localStorage.setItem(`${keyWithLastAuthUser}.accessToken`, accessToken) 13 | localStorage.setItem(`${keyWithLastAuthUser}.refreshToken`, refreshToken) 14 | } 15 | 16 | removeTokens({ lastAuthUser }) { 17 | const key = `CognitoIdentityServiceProvider.${process.env.COGNITO_APP_CLIENT_ID}` 18 | const keyWithLastAuthUser = `${key}.${lastAuthUser}` 19 | localStorage.removeItem(`${keyWithLastAuthUser}.idToken`) 20 | localStorage.removeItem(`${keyWithLastAuthUser}.accessToken`) 21 | localStorage.removeItem(`${keyWithLastAuthUser}.refreshToken`) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/utils/device.js: -------------------------------------------------------------------------------- 1 | export function isIOS() { 2 | return /iP(hone|(o|a)d)/.test(navigator.userAgent) 3 | } 4 | 5 | export function isAndroid() { 6 | return navigator.userAgent.includes('Android') 7 | } 8 | 9 | export function isMobile() { 10 | return isIOS() || isAndroid() 11 | } 12 | -------------------------------------------------------------------------------- /app/utils/editor-head.js: -------------------------------------------------------------------------------- 1 | export default { 2 | script: [ 3 | { src: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js' }, 4 | { 5 | src: 'https://cdnjs.cloudflare.com/ajax/libs/medium-editor/5.21.1/js/medium-editor.min.js' 6 | }, 7 | { 8 | src: 'https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.11/handlebars.runtime.min.js' 9 | }, 10 | { 11 | src: 'https://cdnjs.cloudflare.com/ajax/libs/jquery-sortable/0.9.13/jquery-sortable-min.js' 12 | }, 13 | { 14 | src: 15 | 'https://cdnjs.cloudflare.com/ajax/libs/blueimp-file-upload/9.19.3/js/vendor/jquery.ui.widget.min.js' 16 | }, 17 | { 18 | src: 19 | 'https://cdnjs.cloudflare.com/ajax/libs/blueimp-file-upload/9.19.3/js/jquery.iframe-transport.js' 20 | }, 21 | { 22 | src: 23 | 'https://cdnjs.cloudflare.com/ajax/libs/blueimp-file-upload/9.19.3/js/jquery.fileupload.js' 24 | }, 25 | { 26 | src: 27 | 'https://cdnjs.cloudflare.com/ajax/libs/medium-editor-insert-plugin/2.4.1/js/medium-editor-insert-plugin.js' 28 | }, 29 | { 30 | src: '/part.js' 31 | } 32 | ], 33 | link: [ 34 | { 35 | rel: 'stylesheet', 36 | href: 37 | 'https://cdnjs.cloudflare.com/ajax/libs/medium-editor-insert-plugin/2.4.1/css/medium-editor-insert-plugin.min.css' 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /app/utils/format.js: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs' 2 | import 'dayjs/locale/ja' 3 | import relativeTime from 'dayjs/plugin/relativeTime' 4 | import LocalizedFormat from 'dayjs/plugin/localizedFormat' 5 | 6 | dayjs.extend(relativeTime) 7 | dayjs.extend(LocalizedFormat) 8 | 9 | export function formatDate(date) { 10 | return dayjs 11 | .unix(date) 12 | .locale('ja') 13 | .format('L') 14 | } 15 | 16 | export function formatDateWithTime(date) { 17 | return dayjs 18 | .unix(date) 19 | .locale('ja') 20 | .format('YYYY/MM/DD HH:mm') 21 | } 22 | 23 | export function formatDateFromNow(date) { 24 | return dayjs 25 | .unix(date) 26 | .locale('ja') 27 | .startOf('minute') 28 | .fromNow() 29 | } 30 | 31 | export function formatDateWithJapaneseStyle(date) { 32 | return dayjs 33 | .unix(date) 34 | .locale('ja') 35 | .format('YYYY年MM月DD日 HH:mm') 36 | } 37 | -------------------------------------------------------------------------------- /app/utils/oauth.js: -------------------------------------------------------------------------------- 1 | const LOCALSTRAGE_OAUTH_PARAMS_KEY = 'OAuthParams' 2 | 3 | export function setOAuthParams(query) { 4 | if (Object.prototype.toString.call(query) !== '[object Object]') { 5 | throw new TypeError('query must be object.') 6 | } 7 | localStorage.setItem(LOCALSTRAGE_OAUTH_PARAMS_KEY, JSON.stringify(query)) 8 | } 9 | 10 | export function removeOAuthParams() { 11 | localStorage.removeItem(LOCALSTRAGE_OAUTH_PARAMS_KEY) 12 | } 13 | 14 | export function getOAuthParams() { 15 | return JSON.parse(localStorage.getItem(LOCALSTRAGE_OAUTH_PARAMS_KEY)) 16 | } 17 | -------------------------------------------------------------------------------- /buildspec.yml: -------------------------------------------------------------------------------- 1 | version: 0.2 2 | 3 | phases: 4 | install: 5 | run-as: root 6 | commands: 7 | - npm install -g yarn@1.6.0 8 | - yarn install --frozen-lockfile 9 | build: 10 | run-as: root 11 | commands: 12 | - chmod 755 ./*.sh 13 | - ./deploy_via_ci.sh 14 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e 3 | 4 | # SSMからNuxtのビルドに必要な値を取得し、環境変数へ格納 5 | # exportと一緒に記述すると、exportは成功とみなされてSSMの取得が失敗した場合でもスクリプトが継続してしまう 6 | # 値の取得に失敗した際には終了させたいので、2行に取得処理を分けている 7 | DIST_S3_BUCKET_NAME=`aws ssm get-parameter --name ${ALIS_APP_ID}ssmDistS3BucketName --query "Parameter.Value" --output text` 8 | export DIST_S3_BUCKET_NAME=${DIST_S3_BUCKET_NAME} 9 | 10 | # リソースをS3へアップロード 11 | aws s3 cp .nuxt/dist/client s3://${DIST_S3_BUCKET_NAME}/d/nuxt/dist --recursive --cache-control "public, max-age=31536000" --metadata-directive REPLACE 12 | aws s3 cp app/static/favicon.ico s3://${DIST_S3_BUCKET_NAME}/d/nuxt/dist/ 13 | aws s3 cp app/static/OGP_1200×630.png s3://${DIST_S3_BUCKET_NAME}/d/nuxt/dist/ 14 | aws s3 cp app/static/icon_user_noimg.png s3://${DIST_S3_BUCKET_NAME}/d/nuxt/dist/ 15 | aws s3 cp app/static/touch-icon.png s3://${DIST_S3_BUCKET_NAME}/d/nuxt/dist/ 16 | aws s3 cp app/static/header_logo_original.png s3://${DIST_S3_BUCKET_NAME}/d/nuxt/dist/ 17 | 18 | # yarn.lockの内容で、本番で使用するパッケージだけをインストール 19 | rm -rf ./node_modules 20 | yarn install --production --frozen-lockfile 21 | 22 | # node-module の不要ファイルを削除 23 | /home/circleci/go/bin/node-prune ./node_modules 24 | 25 | # デプロイ 26 | yarn sls:deploy 27 | -------------------------------------------------------------------------------- /deploy_via_ci.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | apt-get install python2.7-dev 4 | curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" 5 | python get-pip.py 6 | pip install awscli 7 | npm install -g serverless 8 | 9 | yarn build 10 | yarn deploy 11 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | moduleFileExtensions: ['js', 'json', 'vue'], 3 | transform: { 4 | '^.+\\.js$': '/node_modules/babel-jest', 5 | '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', 6 | '.*\\.(vue)$': '/node_modules/vue-jest' 7 | }, 8 | moduleNameMapper: { 9 | '^@/(.*)$': '/app/$1', 10 | '^~/(.*)$': '/app/$1' 11 | }, 12 | collectCoverageFrom: [ 13 | 'app/**/*.{js,vue}', 14 | '!./tests/**', 15 | '!app/layouts/error.vue', 16 | '!**/node_modules/**', 17 | '!**/.nuxt/**' 18 | ], 19 | testEnvironment: 'jsdom' 20 | } 21 | -------------------------------------------------------------------------------- /nuxt.config.ci.js: -------------------------------------------------------------------------------- 1 | // CI環境でのみ利用する設定 2 | const nuxtConfig = require('./nuxt.config.js') 3 | 4 | // Sentryへのreleaseとsourcemapの反映を行う 5 | nuxtConfig.sentry = { 6 | dsn: `${process.env.SENTRY_DSN}`, 7 | publishRelease: true, 8 | config: { 9 | release: `${process.env.SENTRY_RELEASE}`, 10 | ignoreErrors: [/^view-createPositionAt-offset-required.*/] 11 | } 12 | } 13 | 14 | module.exports = nuxtConfig 15 | -------------------------------------------------------------------------------- /nuxt.config.debug.js: -------------------------------------------------------------------------------- 1 | const nuxtConfig = require('./nuxt.config.development.js') 2 | 3 | nuxtConfig.build = { 4 | ...nuxtConfig.build, 5 | /* 6 | ** Run ESLint on save 7 | */ 8 | extend(config) { 9 | if (process.server && process.browser) { 10 | config.module.rules.push({ 11 | enforce: 'pre', 12 | test: /\.(js|vue)$/, 13 | loader: 'eslint-loader', 14 | exclude: /(node_modules)/ 15 | }) 16 | } 17 | 18 | config.devtool = 'eval-source-map' 19 | } 20 | } 21 | 22 | module.exports = nuxtConfig 23 | -------------------------------------------------------------------------------- /nuxt.config.development.js: -------------------------------------------------------------------------------- 1 | const nuxtConfig = require('./nuxt.config.js') 2 | 3 | nuxtConfig.axios = { 4 | proxyHeaders: false, 5 | proxy: true 6 | } 7 | 8 | nuxtConfig.proxy = { 9 | '/api': process.env.BASE_URL, 10 | '/oauth2': process.env.BASE_URL, 11 | '/laboratory': process.env.BASE_URL 12 | } 13 | 14 | module.exports = nuxtConfig 15 | -------------------------------------------------------------------------------- /server/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 mya-ake 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | 3 | const { nuxt } = require('./core/nuxt') 4 | const { setHeadersMiddleware } = require('./middlewares/header-middleware') 5 | const { loggerMiddleware } = require('./middlewares/logger-middleware') 6 | 7 | const app = express() 8 | 9 | /** middleware */ 10 | app.use(setHeadersMiddleware) 11 | app.use(loggerMiddleware) 12 | 13 | app.use(async (req, res, next) => { 14 | await nuxt.ready() 15 | nuxt.render(req, res, next) 16 | }) 17 | 18 | module.exports.app = app 19 | -------------------------------------------------------------------------------- /server/core/nuxt.js: -------------------------------------------------------------------------------- 1 | const { Nuxt } = require('nuxt') 2 | const config = require('./../../nuxt.config.js') 3 | 4 | config.dev = false 5 | 6 | const nuxt = new Nuxt(config) 7 | 8 | module.exports = { 9 | nuxt, 10 | config 11 | } 12 | -------------------------------------------------------------------------------- /server/handler.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const awsServerlessExpress = require('aws-serverless-express') 4 | const { app } = require('./app') 5 | 6 | const server = awsServerlessExpress.createServer(app) 7 | 8 | /* 9 | URLエンコードされていない不正な path (ex. /tag/←ᄊマ│ツノ₩ヨル￧ミニ) が指定された場合、そのまま awsServerlessExpress.proxy に連携すると、 10 | 内部で例外(ERR_UNESCAPED_CHARACTERS)をキャッチし、StatusCode 500 を返却する。 11 | ただし、path の入力ミスはクライアント側の問題であり StatusCode 400 が正しいため、path については 12 | awsServerlessExpress.proxy 連携前に検証し、問題があった場合は 400 を返却するようにしている。 13 | チェックの内容については node 内で利用されているものと同様の正規表現を利用。 14 | https://github.com/nodejs/node/blob/c9b93e234454322ac0b7a6cd29d394f428f3e37d/lib/_http_client.js#L67 15 | */ 16 | const INVALID_PATH_REGEX = /[^\u0021-\u00ff]/ 17 | 18 | module.exports.handler = (event, context, callback) => { 19 | console.log('[info]', 'Event', JSON.stringify(event)) 20 | if (INVALID_PATH_REGEX.test(event.path)) { 21 | console.log(`Invalid path: ${event.path}`) 22 | const response = { 23 | statusCode: 400, 24 | headers: {}, 25 | body: '', 26 | isBase64Encoded: false 27 | } 28 | // 待機中のイベントがあっても処理を中断 29 | context.callbackWaitsForEmptyEventLoop = false 30 | callback(null, response) 31 | } else { 32 | awsServerlessExpress.proxy(server, event, context) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /server/middlewares/header-middleware.js: -------------------------------------------------------------------------------- 1 | /** 2 | * レスポンスヘッダーを設定するミドルウェア 3 | * XSS 対策などのヘッダーを記述 4 | */ 5 | const setHeadersMiddleware = (req, res, next) => { 6 | res.removeHeader('x-powered-by') 7 | res.header('no-cache', 'Set-Cookie') 8 | res.header('x-xss-protection', '1; mode=block') 9 | res.header('x-content-type-options', 'nosniff') 10 | res.header('Cache-Control', 'max-age=120') 11 | if (req.path === '/media_embed/any' || req.path.startsWith('/media_embed/twitter_profile')) { 12 | res.header('x-frame-options', 'SAMEORIGIN') 13 | } else { 14 | res.header('x-frame-options', 'DENY') 15 | } 16 | next() 17 | } 18 | 19 | module.exports = { 20 | setHeadersMiddleware 21 | } 22 | -------------------------------------------------------------------------------- /server/middlewares/logger-middleware.js: -------------------------------------------------------------------------------- 1 | const loggerMiddleware = (req, res, next) => { 2 | console.log('[info]', 'Request URL: ', req.url) 3 | next() 4 | } 5 | 6 | module.exports = { 7 | loggerMiddleware 8 | } 9 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | service: ${env:ALIS_APP_ID}frontend 2 | 3 | frameworkVersion: ">=3.0.0" 4 | 5 | provider: 6 | name: aws 7 | runtime: nodejs18.x 8 | region: ${env:AWS_DEFAULT_REGION} 9 | stage: prod 10 | logs: 11 | restApi: true 12 | 13 | package: 14 | excludeDevDependencies: true 15 | exclude: 16 | - .** 17 | - .**/* 18 | - app/** 19 | - tests/** 20 | - coverage/** 21 | - LICENSE 22 | - README.md 23 | - package.json 24 | - yarn-error.log 25 | - yarn.lock 26 | include: 27 | - app/static/part.js 28 | - server/** 29 | - nuxt.config.js 30 | - .nuxt/** 31 | 32 | plugins: 33 | - serverless-plugin-aws-alerts 34 | - serverless-prune-plugin 35 | 36 | custom: 37 | # serverless-plugin-aws-alerts 38 | alerts: 39 | stages: 40 | - alis 41 | - staging 42 | topics: 43 | alarm: "arn:aws:sns:ap-northeast-1:879243243508:AlarmToSlack" 44 | definitions: 45 | functionErrors: 46 | treatMissingData: notBreaching 47 | # serverless-prune-plugin 48 | prune: 49 | automatic: true 50 | number: 3 51 | 52 | functions: 53 | handler: 54 | handler: server/handler.handler 55 | timeout: 30 56 | memorySize: 2048 57 | environment: 58 | BASE_URL: https://${ssm:${env:ALIS_APP_ID}ssmAlisAppDomain} 59 | REGION: ${env:AWS_DEFAULT_REGION} 60 | ALIS_APP_DOMAIN: ${ssm:${env:ALIS_APP_ID}ssmAlisAppDomain} 61 | SENTRY_DSN: ${ssm:${env:ALIS_APP_ID}ssmSentryDSN} 62 | events: 63 | - http: 64 | path: '/' 65 | method: get 66 | - http: 67 | path: '{proxy+}' 68 | method: get 69 | alarms: 70 | - functionErrors 71 | vpc: 72 | securityGroupIds: 73 | - "Fn::ImportValue": ${env:ALIS_APP_ID}-FrontendSecurityGroupId 74 | subnetIds: 75 | - "Fn::ImportValue": ${env:ALIS_APP_ID}-PrivateLambdaMultiAZ1aSubNetId 76 | - "Fn::ImportValue": ${env:ALIS_APP_ID}-PrivateLambdaMultiAZ1cSubNetId 77 | -------------------------------------------------------------------------------- /tests/components/atoms/AppButton.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import AppButton from '@/components/atoms/AppButton.vue' 3 | 4 | describe('AppButton', () => { 5 | test('is handle click event ', () => { 6 | const wrapper = mount(AppButton) 7 | jest.spyOn(wrapper.vm, 'callback') 8 | wrapper.find('button').trigger('click') 9 | expect(wrapper.vm.callback).toBeCalled() 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /tests/helpers/axios.js: -------------------------------------------------------------------------------- 1 | import responses from './responses' 2 | 3 | // Error を返したいときだけ false にする 4 | let isSafetyMode = true 5 | 6 | export default { 7 | setSafetyMode: (flag) => (isSafetyMode = flag), 8 | $get: (key) => 9 | isSafetyMode ? Promise.resolve(responses.$get[key]) : Promise.reject(Error('some error')), 10 | $post: (key) => 11 | isSafetyMode ? Promise.resolve(responses.$post[key]) : Promise.reject(Error('some error')) 12 | } 13 | -------------------------------------------------------------------------------- /tests/helpers/responses/articles.js: -------------------------------------------------------------------------------- 1 | const get = { 2 | '/api/articles/1/like': { 3 | likes_count: 10 4 | } 5 | } 6 | 7 | export default { 8 | get 9 | } 10 | -------------------------------------------------------------------------------- /tests/helpers/responses/index.js: -------------------------------------------------------------------------------- 1 | import users from './users' 2 | import articles from './articles' 3 | 4 | export default { 5 | $get: { 6 | ...users.get, 7 | ...articles.get 8 | }, 9 | $post: {} 10 | } 11 | -------------------------------------------------------------------------------- /tests/helpers/responses/users.js: -------------------------------------------------------------------------------- 1 | const get = { 2 | '/api/users/potato4d/info': { 3 | user_display_name: 'potato4d', 4 | user_id: 'potato4d', 5 | self_introduction: 'Frontend technical adviser of ALISMedia.', 6 | icon_image_url: 7 | 'https://alis.to/d/api/info_icon/potato4d/icon/a2981d2a-67ec-4780-86bb-615e97572822.png' 8 | } 9 | } 10 | 11 | export default { 12 | get 13 | } 14 | -------------------------------------------------------------------------------- /tests/store/modules/article.spec.js: -------------------------------------------------------------------------------- 1 | import Vuex from 'vuex' 2 | import { createLocalVue } from '@vue/test-utils' 3 | import article from '@/store/modules/article' 4 | import axios from '../../helpers/axios' 5 | 6 | describe('store/modules/article.js', () => { 7 | let store 8 | 9 | beforeEach(() => { 10 | const localVue = createLocalVue() 11 | localVue.use(Vuex) 12 | store = new Vuex.Store({ 13 | modules: { 14 | article 15 | } 16 | }) 17 | store.$axios = axios 18 | }) 19 | 20 | afterEach(() => { 21 | store = null 22 | }) 23 | 24 | // Action spec sample 25 | test('getUserInfo actions is return user entity', async () => { 26 | const result = await store.dispatch('article/getUserInfo', { userId: 'potato4d' }) 27 | expect(Object.keys(result).length).toBe(4) 28 | }) 29 | 30 | // Action using mutation and getters sample 31 | test('getLikesCountOfArticle action is set likesCount and can read it from getters', async () => { 32 | await store.dispatch('article/getLikesCountOfArticle', { articleId: 1 }) 33 | expect(store.getters['article/likesCount']).toBe(10) 34 | }) 35 | }) 36 | -------------------------------------------------------------------------------- /tests/store/modules/presentation.spec.js: -------------------------------------------------------------------------------- 1 | import Vuex from 'vuex' 2 | import { createLocalVue } from '@vue/test-utils' 3 | import presentation from '@/store/modules/presentation' 4 | import axios from '../../helpers/axios' 5 | 6 | describe('store/modules/presentation.js', () => { 7 | let store 8 | 9 | beforeEach(() => { 10 | const localVue = createLocalVue() 11 | localVue.use(Vuex) 12 | store = new Vuex.Store({ 13 | modules: { 14 | presentation 15 | } 16 | }) 17 | store.$axios = axios 18 | }) 19 | 20 | afterEach(() => { 21 | store = null 22 | }) 23 | 24 | // Action spec sample 25 | test("when dispatch 'setArticleListScrollHeight' with scrollHeight=100, articleListScrollHeight changed to 100", async () => { 26 | const scrollHeight = 100 27 | store.dispatch('presentation/setArticleListScrollHeight', { scrollHeight }) 28 | expect(store.getters['presentation/articleListScrollHeight']).toBe(100) 29 | }) 30 | }) 31 | --------------------------------------------------------------------------------