├── .dockerignore ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .node-version ├── .npmrc ├── .prettierignore ├── .prettierrc.js ├── Dockerfile ├── LICENSE ├── README.md ├── databases └── database.seed.sqlite ├── fly.toml ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public ├── fonts │ ├── NotoSerifJP-Bold.otf │ └── NotoSerifJP-Regular.otf ├── icons │ └── logo.svg ├── images │ ├── avatars │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ ├── 003.jpg │ │ ├── 004.jpg │ │ ├── 005.jpg │ │ ├── 006.jpg │ │ ├── 007.jpg │ │ ├── 008.jpg │ │ ├── 009.jpg │ │ ├── 010.jpg │ │ ├── 011.jpg │ │ ├── 012.jpg │ │ ├── 013.jpg │ │ ├── 014.jpg │ │ ├── 015.jpg │ │ ├── 016.jpg │ │ ├── 017.jpg │ │ ├── 018.jpg │ │ ├── 019.jpg │ │ └── 020.jpg │ └── products │ │ ├── apple │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ ├── 003.jpg │ │ ├── 004.jpg │ │ ├── 005.jpg │ │ ├── 006.jpg │ │ └── 007.jpg │ │ ├── banana │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ ├── 003.jpg │ │ ├── 004.jpg │ │ ├── 005.jpg │ │ ├── 006.jpg │ │ ├── 007.jpg │ │ └── 008.jpg │ │ ├── blueberry │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ ├── 003.jpg │ │ ├── 004.jpg │ │ ├── 005.jpg │ │ ├── 006.jpg │ │ ├── 007.jpg │ │ ├── 008.jpg │ │ └── 009.jpg │ │ ├── cabbage │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ ├── 003.jpg │ │ ├── 004.jpg │ │ ├── 005.jpg │ │ ├── 006.jpg │ │ └── 007.jpg │ │ ├── carrot │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ ├── 003.jpg │ │ ├── 004.jpg │ │ ├── 005.jpg │ │ └── 006.jpg │ │ ├── strawberry │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ ├── 003.jpg │ │ ├── 004.jpg │ │ └── 005.jpg │ │ └── tomato │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ ├── 003.jpg │ │ ├── 004.jpg │ │ ├── 005.jpg │ │ ├── 006.jpg │ │ ├── 007.jpg │ │ ├── 008.jpg │ │ ├── 009.jpg │ │ └── 010.jpg ├── robots.txt └── videos │ ├── 001.mp4 │ ├── 002.mp4 │ └── 003.mp4 ├── src ├── client │ ├── components │ │ ├── application │ │ │ ├── App │ │ │ │ ├── App.tsx │ │ │ │ └── index.ts │ │ │ ├── Layout │ │ │ │ ├── Layout.styles.ts │ │ │ │ ├── Layout.tsx │ │ │ │ └── index.ts │ │ │ ├── Providers │ │ │ │ ├── Providers.tsx │ │ │ │ └── index.ts │ │ │ └── Routes │ │ │ │ ├── Routes.tsx │ │ │ │ ├── hooks │ │ │ │ ├── index.ts │ │ │ │ └── useScrollToTop.ts │ │ │ │ └── index.ts │ │ ├── feature │ │ │ ├── ProductCard │ │ │ │ ├── ProductCard.styles.ts │ │ │ │ ├── ProductCard.tsx │ │ │ │ └── index.ts │ │ │ ├── ProductGridList │ │ │ │ ├── ProductGridList.styles.ts │ │ │ │ ├── ProductGridList.tsx │ │ │ │ └── index.ts │ │ │ ├── ProductList │ │ │ │ ├── ProductList.tsx │ │ │ │ └── index.ts │ │ │ ├── ProductListSlideButton │ │ │ │ ├── ProductListSlideButton.styles.ts │ │ │ │ ├── ProductListSlideButton.tsx │ │ │ │ └── index.ts │ │ │ └── ProductListSlider │ │ │ │ ├── ProductListSlider.styles.ts │ │ │ │ ├── ProductListSlider.tsx │ │ │ │ ├── hooks │ │ │ │ └── useSlider.ts │ │ │ │ └── index.ts │ │ ├── foundation │ │ │ ├── Anchor │ │ │ │ ├── Anchor.styles.ts │ │ │ │ ├── Anchor.tsx │ │ │ │ └── index.ts │ │ │ ├── AspectRatio │ │ │ │ ├── AspectRatio.styles.ts │ │ │ │ ├── AspectRatio.tsx │ │ │ │ └── index.ts │ │ │ ├── GetDeviceType │ │ │ │ ├── GetDeviceType.tsx │ │ │ │ └── index.ts │ │ │ ├── Icon │ │ │ │ ├── Icon.styles.ts │ │ │ │ ├── Icon.tsx │ │ │ │ └── index.ts │ │ │ ├── Image │ │ │ │ ├── Image.styles.ts │ │ │ │ ├── Image.tsx │ │ │ │ └── index.ts │ │ │ ├── Modal │ │ │ │ ├── Modal.styles.ts │ │ │ │ ├── Modal.tsx │ │ │ │ └── index.ts │ │ │ ├── OutlineButton │ │ │ │ ├── OutlineButton.styles.ts │ │ │ │ ├── OutlineButton.tsx │ │ │ │ └── index.ts │ │ │ ├── PrimaryAnchor │ │ │ │ ├── PrimaryAnchor.styles.ts │ │ │ │ ├── PrimaryAnchor.tsx │ │ │ │ └── index.ts │ │ │ ├── PrimaryButton │ │ │ │ ├── PrimaryButton.styles.ts │ │ │ │ ├── PrimaryButton.tsx │ │ │ │ └── index.ts │ │ │ ├── TextArea │ │ │ │ ├── TextArea.styles.ts │ │ │ │ ├── TextArea.tsx │ │ │ │ └── index.ts │ │ │ ├── TextInput │ │ │ │ ├── TextInput.styles.ts │ │ │ │ ├── TextInput.tsx │ │ │ │ └── index.ts │ │ │ └── WidthRestriction │ │ │ │ ├── WidthRestriction.styles.ts │ │ │ │ ├── WidthRestriction.tsx │ │ │ │ └── index.ts │ │ ├── modal │ │ │ ├── SignInModal │ │ │ │ ├── SignInModal.styles.ts │ │ │ │ ├── SignInModal.tsx │ │ │ │ └── index.ts │ │ │ └── SignUpModal │ │ │ │ ├── SignUpModal.styles.ts │ │ │ │ ├── SignUpModal.tsx │ │ │ │ └── index.ts │ │ ├── navigators │ │ │ ├── Footer │ │ │ │ ├── Footer.styles.ts │ │ │ │ ├── Footer.tsx │ │ │ │ └── index.ts │ │ │ └── Header │ │ │ │ ├── Header.styles.ts │ │ │ │ ├── Header.tsx │ │ │ │ └── index.ts │ │ ├── order │ │ │ ├── CartItem │ │ │ │ ├── CartItem.styles.ts │ │ │ │ ├── CartItem.tsx │ │ │ │ └── index.ts │ │ │ ├── OrderForm │ │ │ │ ├── OrderForm.styles.ts │ │ │ │ ├── OrderForm.tsx │ │ │ │ └── index.ts │ │ │ └── OrderPreview │ │ │ │ ├── OrderPreview.styles.ts │ │ │ │ ├── OrderPreview.tsx │ │ │ │ └── index.ts │ │ ├── product │ │ │ ├── ProductHeroImage │ │ │ │ ├── ProductHeroImage.styles.ts │ │ │ │ ├── ProductHeroImage.tsx │ │ │ │ └── index.ts │ │ │ ├── ProductMediaListPreviewer │ │ │ │ ├── MediaItem │ │ │ │ │ ├── MediaItem.styles.ts │ │ │ │ │ ├── MediaItem.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── loadThumbnail.ts │ │ │ │ ├── MediaItemPreviewer │ │ │ │ │ ├── MediaItemPreiewer.styles.ts │ │ │ │ │ ├── MediaItemPreviewer.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ProductMediaListPreviewer.styles.ts │ │ │ │ ├── ProductMediaListPreviewer.tsx │ │ │ │ └── index.ts │ │ │ ├── ProductOfferLabel │ │ │ │ ├── ProductOfferLabel.styles.ts │ │ │ │ ├── ProductOfferLabel.tsx │ │ │ │ └── index.ts │ │ │ ├── ProductOverview │ │ │ │ ├── ProductOverview.styles.ts │ │ │ │ ├── ProductOverview.tsx │ │ │ │ └── index.ts │ │ │ └── ProductPurchaseSeciton │ │ │ │ ├── ProductPurchaseSection.styles.ts │ │ │ │ ├── ProductPurchaseSection.tsx │ │ │ │ └── index.ts │ │ └── review │ │ │ ├── ReviewList │ │ │ ├── ReviewList.styles.ts │ │ │ ├── ReviewList.tsx │ │ │ └── index.ts │ │ │ └── ReviewSection │ │ │ ├── ReviewSection.styles.ts │ │ │ ├── ReviewSection.tsx │ │ │ └── index.ts │ ├── global.styles.ts │ ├── graphql │ │ ├── fragments.ts │ │ ├── mutations.ts │ │ └── queries.ts │ ├── hooks │ │ ├── useActiveOffer.ts │ │ ├── useAmountInCart.ts │ │ ├── useAuthUser.ts │ │ ├── useFeatures.ts │ │ ├── useOrder.ts │ │ ├── useProduct.ts │ │ ├── useRecommendation.ts │ │ ├── useReviews.ts │ │ ├── useSendReview.ts │ │ ├── useSignIn.ts │ │ ├── useSignUp.ts │ │ ├── useSubmitOrder.ts │ │ ├── useTotalPrice.ts │ │ └── useUpdateCartItems.ts │ ├── index.tsx │ ├── pages │ │ ├── Fallback │ │ │ ├── Fallback.styles.ts │ │ │ ├── Fallback.tsx │ │ │ └── index.ts │ │ ├── NotFound │ │ │ ├── NotFound.styles.ts │ │ │ ├── NotFound.tsx │ │ │ └── index.ts │ │ ├── Order │ │ │ ├── Order.styles.ts │ │ │ ├── Order.tsx │ │ │ └── index.ts │ │ ├── OrderComplete │ │ │ ├── OrderComplete.styles.ts │ │ │ ├── OrderComplete.tsx │ │ │ └── index.ts │ │ ├── ProductDetail │ │ │ ├── ProductDetail.styles.ts │ │ │ ├── ProductDetail.tsx │ │ │ └── index.ts │ │ └── Top │ │ │ ├── Top.styles.ts │ │ │ ├── Top.tsx │ │ │ └── index.ts │ ├── polyfill │ │ ├── install.ts │ │ └── temporal.ts │ ├── store │ │ └── modal │ │ │ ├── hooks.ts │ │ │ ├── index.ts │ │ │ └── state.ts │ ├── types │ │ └── zipcode-ja.d.ts │ ├── utils │ │ ├── apollo_client.ts │ │ ├── get_active_offer.ts │ │ ├── get_media_type.ts │ │ ├── load_fonts.ts │ │ └── normalize_cart_item.ts │ └── vite-env.d.ts ├── model │ ├── feature_item.graphql │ ├── feature_item.ts │ ├── feature_section.graphql │ ├── feature_section.ts │ ├── limited_time_offer.graphql │ ├── limited_time_offer.ts │ ├── media_file.graphql │ ├── media_file.ts │ ├── order.graphql │ ├── order.ts │ ├── product.graphql │ ├── product.ts │ ├── product_media.graphql │ ├── product_media.ts │ ├── profile.graphql │ ├── profile.ts │ ├── recommendation.graphql │ ├── recommendation.ts │ ├── review.graphql │ ├── review.ts │ ├── shopping_cart_item.graphql │ ├── shopping_cart_item.ts │ ├── user.graphql │ └── user.ts └── server │ ├── context.ts │ ├── data_source.ts │ ├── graphql │ ├── feature_item_resolver.ts │ ├── feature_section_resolver.ts │ ├── index.ts │ ├── model_resolver.ts │ ├── mutation.graphql │ ├── mutation_resolver.ts │ ├── order_resolver.ts │ ├── product_media_resolver.ts │ ├── product_resolver.ts │ ├── profile_resolver.ts │ ├── query.graphql │ ├── query_resolver.ts │ ├── recommendation_resolver.ts │ ├── review_resolver.ts │ ├── shopping_cart_item_resolver.ts │ └── user_resolver.ts │ ├── index.ts │ └── utils │ ├── database_paths.ts │ ├── initialize_database.ts │ └── root_resolve.ts ├── stylelint.config.js ├── tools ├── aozora.ts ├── get_file_list.ts └── seed.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | databases/database.sqlite 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | __generated__ 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2022: true, 5 | node: true, 6 | }, 7 | extends: [ 8 | 'eslint:recommended', 9 | 'plugin:import/recommended', 10 | 'plugin:react/recommended', 11 | 'plugin:react-hooks/recommended', 12 | 'plugin:sort/recommended', 13 | 'plugin:@typescript-eslint/recommended', 14 | 'prettier', 15 | ], 16 | parser: '@typescript-eslint/parser', 17 | parserOptions: { 18 | ecmaVersion: 2022, 19 | sourceType: 'module', 20 | }, 21 | plugins: ['import', 'sort', '@typescript-eslint'], 22 | rules: { 23 | '@typescript-eslint/consistent-type-definitions': ['error', 'type'], 24 | '@typescript-eslint/consistent-type-imports': ['error'], 25 | '@typescript-eslint/no-unused-vars': [ 26 | 'error', 27 | { 28 | argsIgnorePattern: '^_', 29 | }, 30 | ], 31 | 'import/namespace': ['off'], 32 | 'import/order': [ 33 | 'error', 34 | { 35 | alphabetize: { 36 | order: 'asc', 37 | }, 38 | 'newlines-between': 'always', 39 | }, 40 | ], 41 | 'react/jsx-sort-props': [ 42 | 'error', 43 | { 44 | reservedFirst: true, 45 | shorthandFirst: true, 46 | }, 47 | ], 48 | 'react/prop-types': ['off'], 49 | 'react/react-in-jsx-scope': ['off'], 50 | 'sort/imports': ['off'], 51 | }, 52 | settings: { 53 | 'import/parsers': { 54 | '@typescript-eslint/parser': ['.ts', '.cts', '.mts', '.tsx'], 55 | }, 56 | 'import/resolver': { 57 | typescript: {}, 58 | }, 59 | react: { 60 | version: 'detect', 61 | }, 62 | }, 63 | }; 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,linux,macos,visualstudiocode 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,linux,macos,visualstudiocode 3 | 4 | ### Linux ### 5 | *~ 6 | 7 | # temporary files which can be created if a process still has a handle open of a deleted file 8 | .fuse_hidden* 9 | 10 | # KDE directory preferences 11 | .directory 12 | 13 | # Linux trash folder which might appear on any partition or disk 14 | .Trash-* 15 | 16 | # .nfs files are created when an open file is removed but is still being accessed 17 | .nfs* 18 | 19 | ### macOS ### 20 | # General 21 | .DS_Store 22 | .AppleDouble 23 | .LSOverride 24 | 25 | # Thumbnails 26 | ._* 27 | 28 | # Files that might appear in the root of a volume 29 | .DocumentRevisions-V100 30 | .fseventsd 31 | .Spotlight-V100 32 | .TemporaryItems 33 | .Trashes 34 | .VolumeIcon.icns 35 | .com.apple.timemachine.donotpresent 36 | 37 | # Directories potentially created on remote AFP share 38 | .AppleDB 39 | .AppleDesktop 40 | Network Trash Folder 41 | Temporary Items 42 | .apdisk 43 | 44 | ### macOS Patch ### 45 | # iCloud generated files 46 | *.icloud 47 | 48 | ### Node ### 49 | # Logs 50 | logs 51 | *.log 52 | npm-debug.log* 53 | yarn-debug.log* 54 | yarn-error.log* 55 | lerna-debug.log* 56 | .pnpm-debug.log* 57 | 58 | # Diagnostic reports (https://nodejs.org/api/report.html) 59 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 60 | 61 | # Runtime data 62 | pids 63 | *.pid 64 | *.seed 65 | *.pid.lock 66 | 67 | # Directory for instrumented libs generated by jscoverage/JSCover 68 | lib-cov 69 | 70 | # Coverage directory used by tools like istanbul 71 | coverage 72 | *.lcov 73 | 74 | # nyc test coverage 75 | .nyc_output 76 | 77 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 78 | .grunt 79 | 80 | # Bower dependency directory (https://bower.io/) 81 | bower_components 82 | 83 | # node-waf configuration 84 | .lock-wscript 85 | 86 | # Compiled binary addons (https://nodejs.org/api/addons.html) 87 | build/Release 88 | 89 | # Dependency directories 90 | node_modules/ 91 | jspm_packages/ 92 | 93 | # Snowpack dependency directory (https://snowpack.dev/) 94 | web_modules/ 95 | 96 | # TypeScript cache 97 | *.tsbuildinfo 98 | 99 | # Optional npm cache directory 100 | .npm 101 | 102 | # Optional eslint cache 103 | .eslintcache 104 | 105 | # Optional stylelint cache 106 | .stylelintcache 107 | 108 | # Microbundle cache 109 | .rpt2_cache/ 110 | .rts2_cache_cjs/ 111 | .rts2_cache_es/ 112 | .rts2_cache_umd/ 113 | 114 | # Optional REPL history 115 | .node_repl_history 116 | 117 | # Output of 'npm pack' 118 | *.tgz 119 | 120 | # Yarn Integrity file 121 | .yarn-integrity 122 | 123 | # dotenv environment variable files 124 | .env 125 | .env.development.local 126 | .env.test.local 127 | .env.production.local 128 | .env.local 129 | 130 | # parcel-bundler cache (https://parceljs.org/) 131 | .cache 132 | .parcel-cache 133 | 134 | # Next.js build output 135 | .next 136 | out 137 | 138 | # Nuxt.js build / generate output 139 | .nuxt 140 | dist 141 | 142 | # Gatsby files 143 | .cache/ 144 | # Comment in the public line in if your project uses Gatsby and not Next.js 145 | # https://nextjs.org/blog/next-9-1#public-directory-support 146 | # public 147 | 148 | # vuepress build output 149 | .vuepress/dist 150 | 151 | # vuepress v2.x temp and cache directory 152 | .temp 153 | 154 | # Docusaurus cache and generated files 155 | .docusaurus 156 | 157 | # Serverless directories 158 | .serverless/ 159 | 160 | # FuseBox cache 161 | .fusebox/ 162 | 163 | # DynamoDB Local files 164 | .dynamodb/ 165 | 166 | # TernJS port file 167 | .tern-port 168 | 169 | # Stores VSCode versions used for testing VSCode extensions 170 | .vscode-test 171 | 172 | # yarn v2 173 | .yarn/cache 174 | .yarn/unplugged 175 | .yarn/build-state.yml 176 | .yarn/install-state.gz 177 | .pnp.* 178 | 179 | ### Node Patch ### 180 | # Serverless Webpack directories 181 | .webpack/ 182 | 183 | # Optional stylelint cache 184 | 185 | # SvelteKit build / generate output 186 | .svelte-kit 187 | 188 | ### VisualStudioCode ### 189 | .vscode/* 190 | 191 | # Local History for Visual Studio Code 192 | .history/ 193 | 194 | # Built Visual Studio Code Extensions 195 | *.vsix 196 | 197 | ### VisualStudioCode Patch ### 198 | # Ignore all local history of files 199 | .history 200 | .ionide 201 | 202 | ### Windows ### 203 | # Windows thumbnail cache files 204 | Thumbs.db 205 | Thumbs.db:encryptable 206 | ehthumbs.db 207 | ehthumbs_vista.db 208 | 209 | # Dump file 210 | *.stackdump 211 | 212 | # Folder config file 213 | [Dd]esktop.ini 214 | 215 | # Recycle Bin used on file shares 216 | $RECYCLE.BIN/ 217 | 218 | # Windows Installer files 219 | *.cab 220 | *.msi 221 | *.msix 222 | *.msm 223 | *.msp 224 | 225 | # Windows shortcuts 226 | *.lnk 227 | 228 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,linux,macos,visualstudiocode 229 | 230 | databases/database.sqlite 231 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 18.13.0 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | save-exact=true 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | __generated__ 3 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | arrowParens: 'always', 3 | overrides: [ 4 | { 5 | files: ['package.json'], 6 | options: { 7 | plugins: [require.resolve('prettier-plugin-packagejson')], 8 | }, 9 | }, 10 | { 11 | excludeFiles: ['package.json'], 12 | files: ['*.json'], 13 | options: { 14 | jsonRecursiveSort: true, 15 | plugins: [require.resolve('prettier-plugin-sort-json')], 16 | }, 17 | }, 18 | ], 19 | plugins: [], 20 | printWidth: 120, 21 | singleQuote: true, 22 | trailingComma: 'all', 23 | }; 24 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18.13.0-bullseye AS build 2 | ENV TZ Asia/Tokyo 3 | ENV NODE_ENV development 4 | 5 | RUN apt-get update && apt-get install -y --no-install-recommends dumb-init sqlite3 6 | RUN npm install -g pnpm 7 | RUN mkdir /app 8 | WORKDIR /app 9 | COPY package.json pnpm-lock.yaml tsconfig.json tsconfig.node.json vite.config.ts index.html .npmrc /app/ 10 | COPY databases/ /app/databases/ 11 | COPY public/ /app/public/ 12 | COPY tools/ /app/tools/ 13 | COPY src/ /app/src/ 14 | RUN pnpm install 15 | RUN pnpm build 16 | 17 | ######################################################################## 18 | 19 | FROM node:18.13.0-bullseye-slim 20 | ENV TZ Asia/Tokyo 21 | ENV NODE_ENV development 22 | 23 | COPY --from=build /usr/bin/dumb-init /usr/bin/dumb-init 24 | COPY --from=build /usr/bin/sqlite3 /usr/bin/sqlite3 25 | COPY --from=build --chown=node:node /app /app 26 | WORKDIR /app 27 | USER node 28 | CMD ["dumb-init", "./node_modules/.bin/ts-node", "./src/server/index.ts"] 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Web Speed Hackathon 2023 2 | 3 | ## 概要 4 | 5 | **"Web Speed Hackathon 2023" は、非常に重たい Web アプリをチューニングして、いかに高速にするかを競う競技です。** 6 | 7 | - 募集要項: https://cyberagent.connpass.com/event/270424 8 | 9 | ## 課題 10 | 11 | 今回のテーマは、架空のショッピングサイト「買えるオーガニック」です。 12 | 後述のレギュレーションを守った上で、買えるオーガニック のパフォーマンスを改善してください。 13 | 14 | - デモサイト: https://web-speed-hackathon-2023.fly.dev 15 | - リーダーボード (順位表): https://web-speed-hackathon-scoring-server-2023.fly.dev 16 | 17 | ## 提出方法 18 | 19 | 評価対象となる環境(URL)を作成し、以下のレポジトリから参加登録を行なってください。 20 | 21 | https://github.com/CyberAgentHack/web-speed-hackathon-2023-scoring-tool 22 | 23 | ## デプロイ 24 | 25 | 提出用環境の作成は、以下のいずれかの手順でローカルのアプリケーションをデプロイすることで行えます。 26 | 27 | ### Fly.io へデプロイする場合 28 | 29 | 1. このレポジトリを自分のレポジトリに fork します 30 | - https://docs.github.com/ja/github/getting-started-with-github/fork-a-repo 31 | 1. 下記手順などに従い Fly.io へデプロイの設定を行います 32 | - https://fly.io/docs/hands-on/install-flyctl 33 | 1. `flyctl launch`コマンドで新規アプリケーションの設定を行います 34 | - 既にコミットしてある fly.toml ファイルを利用すると必要な設定を省くことができます 35 | - 実行途中に表示される Postgresql と Redis のセットアップに関しては行う必要はありません 36 | 1. 以降、`flyctl deploy`コマンドでデプロイを行うことができます 37 | 38 | ※ Github アカウントを紐づけて Fly.io のアカウントを新規作成すると、クレジットカードの登録なしで無料枠を利用することができます 39 | 40 | ### Fly.io 外へデプロイする場合 41 | 42 | - 無料の範囲内であれば、Fly.io 以外へデプロイしてもかまいません 43 | - **外部のサービスは全て無料枠の範囲内で使用してください。万が一コストが発生した場合は、全て自己負担となります。** 44 | - Fly.io 外へのデプロイについて、運営からサポートしません 45 | - デプロイ方法がわからない方は Fly.io で立ち上げることをオススメします 46 | 47 | ## 採点 48 | 49 | 採点は GitHub Actions を用いて、参加登録がされた時点および参加者が採点を要求した任意の時点で行われます。 50 | 51 | 採点の詳細についてはこちらに記載しています 52 | 53 | https://github.com/CyberAgentHack/web-speed-hackathon-2023-scoring-tool/blob/main/docs/SCORING.md 54 | 55 | ## レギュレーション 56 | 57 | レギュレーションに違反した場合には、順位対象外となります。 58 | 59 | レギュレーションの詳細についてはこちらに記載しています 60 | 61 | https://github.com/CyberAgentHack/web-speed-hackathon-2023-scoring-tool/blob/main/docs/REGULATION.md 62 | 63 | ### 上位にランクインしたアプリケーションについて 64 | 65 | 競技終了後、リーダーボードで上位にランクインしたアプリケーションをレギュレーションに抵触していないか運営が確認します。 66 | 確認にはチェックリストに基づいて運営が手作業で確認を行います 67 | 68 | チェックリストの詳細についてはこちらに記載しています 69 | 70 | https://github.com/CyberAgentHack/web-speed-hackathon-2023-scoring-tool/blob/main/docs/CHECKLIST.md 71 | 72 | ## 開発方法 73 | 74 | ### 環境 75 | 76 | - Node.js (v18 以上) 77 | - pnpm 78 | 79 | ### コマンド 80 | 81 | 最低限のコマンドだけ記載します。 82 | それ以外については、各フォルダの `package.json` を参照してください。 83 | 84 | #### 準備 85 | 86 | ```bash 87 | pnpm install 88 | ``` 89 | 90 | #### ビルド 91 | 92 | ```bash 93 | pnpm build 94 | ``` 95 | 96 | #### 開発環境の起動 97 | 98 | ファイル変更時にクライアント・サーバー両方のビルドと再起動が自動で行われます。 99 | **ホットリロードはありません**ので、変更をブラウザで確認するには変更後にリロードしてください。 100 | 101 | 標準では `http://localhost:8080` でアクセスできます。 102 | 103 | ```bash 104 | pnpm start 105 | ``` 106 | 107 | ## ライセンス 108 | 109 | - Code: (c) CyberAgent, Inc. 110 | - Image data: Unsplash License by https://unsplash.com 111 | - Video data: Pixabay License by https://pixabay.com/ 112 | -------------------------------------------------------------------------------- /databases/database.seed.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/databases/database.seed.sqlite -------------------------------------------------------------------------------- /fly.toml: -------------------------------------------------------------------------------- 1 | kill_signal = "SIGINT" 2 | kill_timeout = 5 3 | processes = [] 4 | 5 | [env] 6 | 7 | [experimental] 8 | auto_rollback = true 9 | 10 | [[services]] 11 | http_checks = [] 12 | internal_port = 8080 13 | processes = ["app"] 14 | protocol = "tcp" 15 | script_checks = [] 16 | [services.concurrency] 17 | hard_limit = 25 18 | soft_limit = 20 19 | type = "connections" 20 | 21 | [[services.ports]] 22 | force_https = true 23 | handlers = ["http"] 24 | port = 80 25 | 26 | [[services.ports]] 27 | handlers = ["tls", "http"] 28 | port = 443 29 | 30 | [[services.tcp_checks]] 31 | grace_period = "1s" 32 | interval = "15s" 33 | restart_limit = 0 34 | timeout = "2s" 35 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | <%= title %> 8 | 9 | <% for (var href of videos) { %> 10 | 11 | <% } %> 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "license": "MPL-2.0", 4 | "scripts": { 5 | "start": "npm-run-all -p start:client start:server", 6 | "start:client": "cross-env NODE_ENV=development vite build --watch", 7 | "start:server": "nodemon --watch src/server --ext 'ts,tsx' --exec 'ts-node src/server'", 8 | "build": "npm-run-all -s build:tsc build:vite", 9 | "build:tsc": "tsc", 10 | "build:vite": "cross-env NODE_ENV=development vite build", 11 | "format": "npm-run-all -s format:*", 12 | "format:prettier": "prettier --write './**/*.{ts,tsx,js,jsx,json}'", 13 | "format:eslint": "eslint ./ --fix --ext .js,.jsx,.ts,.tsx", 14 | "format:stylelint": "stylelint --ignore-path .gitignore --fix './**/styles.{js,ts}' './**/*.styles.{js,ts}' './**/*.css'", 15 | "seed": "npm-run-all -s clear:database seed:database", 16 | "seed:database": "cross-env SEED_BASE_UNIXTIME=1677855600 ts-node tools/seed.ts", 17 | "clear:database": "rm -f ./databases/database.sqlite" 18 | }, 19 | "dependencies": { 20 | "@apollo/client": "3.8.0-alpha.7", 21 | "@apollo/server": "4.3.0", 22 | "@as-integrations/koa": "0.2.1", 23 | "@emotion/css": "11.10.5", 24 | "@js-temporal/polyfill": "0.4.3", 25 | "@koa/router": "12.0.0", 26 | "@types/koa-session": "5.10.6", 27 | "bcrypt": "5.1.0", 28 | "canvaskit-wasm": "0.38.0", 29 | "classnames": "2.3.2", 30 | "core-js": "3.29.0", 31 | "currency-formatter": "1.5.9", 32 | "date-time-format-timezone": "1.0.22", 33 | "formik": "2.2.9", 34 | "graphql": "16.6.0", 35 | "http-graceful-shutdown": "3.1.13", 36 | "koa": "2.14.1", 37 | "koa-bodyparser": "4.3.0", 38 | "koa-logger": "3.2.1", 39 | "koa-route": "3.2.0", 40 | "koa-send": "5.0.1", 41 | "koa-session": "6.4.0", 42 | "koa-static": "5.0.0", 43 | "lodash": "4.17.21", 44 | "modern-css-reset": "1.4.0", 45 | "react": "18.2.0", 46 | "react-dom": "18.2.0", 47 | "react-error-boundary": "3.1.4", 48 | "react-helmet": "6.1.0", 49 | "react-icons": "4.7.1", 50 | "react-is": "18.2.0", 51 | "react-overlays": "5.2.1", 52 | "react-router-dom": "6.4.5", 53 | "recoil": "0.7.6", 54 | "reflect-metadata": "0.1.13", 55 | "setimmediate": "1.0.5", 56 | "sqlite3": "5.1.4", 57 | "styled-components": "5.3.6", 58 | "throttle-debounce": "5.0.0", 59 | "typeorm": "0.3.11", 60 | "zipcode-ja": "0.0.7", 61 | "zod": "3.20.6" 62 | }, 63 | "devDependencies": { 64 | "@babel/core": "7.20.5", 65 | "@types/bcrypt": "5.0.0", 66 | "@types/currency-formatter": "1.5.1", 67 | "@types/koa": "2.13.5", 68 | "@types/koa-bodyparser": "4.3.10", 69 | "@types/koa-logger": "3.1.2", 70 | "@types/koa-route": "3.2.5", 71 | "@types/koa-send": "4.1.3", 72 | "@types/koa-static": "4.0.2", 73 | "@types/lodash": "4.14.191", 74 | "@types/node": "18.11.15", 75 | "@types/react": "18.0.24", 76 | "@types/react-dom": "18.0.8", 77 | "@types/react-helmet": "6.1.6", 78 | "@types/throttle-debounce": "5.0.0", 79 | "@typescript-eslint/eslint-plugin": "5.45.0", 80 | "@typescript-eslint/parser": "5.45.0", 81 | "@vitejs/plugin-react": "3.1.0", 82 | "cross-env": "7.0.3", 83 | "csstype": "3.1.1", 84 | "eslint": "8.29.0", 85 | "eslint-config-prettier": "8.5.0", 86 | "eslint-import-resolver-typescript": "3.5.3", 87 | "eslint-plugin-import": "2.26.0", 88 | "eslint-plugin-react": "7.31.11", 89 | "eslint-plugin-react-hooks": "4.6.0", 90 | "eslint-plugin-sort": "2.4.0", 91 | "nodemon": "2.0.20", 92 | "npm-run-all": "4.1.5", 93 | "postcss": "8.4.21", 94 | "postcss-styled-syntax": "0.3.1", 95 | "prettier": "2.8.0", 96 | "prettier-plugin-packagejson": "2.4.3", 97 | "prettier-plugin-sort-json": "1.0.0", 98 | "stylelint": "15.1.0", 99 | "stylelint-config-recommended": "10.0.1", 100 | "stylelint-order": "6.0.2", 101 | "ts-node": "10.9.1", 102 | "typescript": "4.9.3", 103 | "vite": "4.1.4", 104 | "vite-plugin-ejs": "1.6.4", 105 | "vite-plugin-top-level-await": "1.2.4", 106 | "vite-plugin-wasm": "3.2.1" 107 | }, 108 | "packageManager": "pnpm@7.24.3", 109 | "engines": { 110 | "node": ">=18.0.0", 111 | "pnpm": ">=7.24.3" 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /public/fonts/NotoSerifJP-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/fonts/NotoSerifJP-Bold.otf -------------------------------------------------------------------------------- /public/fonts/NotoSerifJP-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/fonts/NotoSerifJP-Regular.otf -------------------------------------------------------------------------------- /public/images/avatars/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/001.jpg -------------------------------------------------------------------------------- /public/images/avatars/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/002.jpg -------------------------------------------------------------------------------- /public/images/avatars/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/003.jpg -------------------------------------------------------------------------------- /public/images/avatars/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/004.jpg -------------------------------------------------------------------------------- /public/images/avatars/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/005.jpg -------------------------------------------------------------------------------- /public/images/avatars/006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/006.jpg -------------------------------------------------------------------------------- /public/images/avatars/007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/007.jpg -------------------------------------------------------------------------------- /public/images/avatars/008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/008.jpg -------------------------------------------------------------------------------- /public/images/avatars/009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/009.jpg -------------------------------------------------------------------------------- /public/images/avatars/010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/010.jpg -------------------------------------------------------------------------------- /public/images/avatars/011.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/011.jpg -------------------------------------------------------------------------------- /public/images/avatars/012.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/012.jpg -------------------------------------------------------------------------------- /public/images/avatars/013.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/013.jpg -------------------------------------------------------------------------------- /public/images/avatars/014.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/014.jpg -------------------------------------------------------------------------------- /public/images/avatars/015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/015.jpg -------------------------------------------------------------------------------- /public/images/avatars/016.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/016.jpg -------------------------------------------------------------------------------- /public/images/avatars/017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/017.jpg -------------------------------------------------------------------------------- /public/images/avatars/018.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/018.jpg -------------------------------------------------------------------------------- /public/images/avatars/019.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/019.jpg -------------------------------------------------------------------------------- /public/images/avatars/020.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/avatars/020.jpg -------------------------------------------------------------------------------- /public/images/products/apple/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/apple/001.jpg -------------------------------------------------------------------------------- /public/images/products/apple/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/apple/002.jpg -------------------------------------------------------------------------------- /public/images/products/apple/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/apple/003.jpg -------------------------------------------------------------------------------- /public/images/products/apple/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/apple/004.jpg -------------------------------------------------------------------------------- /public/images/products/apple/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/apple/005.jpg -------------------------------------------------------------------------------- /public/images/products/apple/006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/apple/006.jpg -------------------------------------------------------------------------------- /public/images/products/apple/007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/apple/007.jpg -------------------------------------------------------------------------------- /public/images/products/banana/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/banana/001.jpg -------------------------------------------------------------------------------- /public/images/products/banana/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/banana/002.jpg -------------------------------------------------------------------------------- /public/images/products/banana/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/banana/003.jpg -------------------------------------------------------------------------------- /public/images/products/banana/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/banana/004.jpg -------------------------------------------------------------------------------- /public/images/products/banana/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/banana/005.jpg -------------------------------------------------------------------------------- /public/images/products/banana/006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/banana/006.jpg -------------------------------------------------------------------------------- /public/images/products/banana/007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/banana/007.jpg -------------------------------------------------------------------------------- /public/images/products/banana/008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/banana/008.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/001.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/002.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/003.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/004.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/005.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/006.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/007.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/008.jpg -------------------------------------------------------------------------------- /public/images/products/blueberry/009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/blueberry/009.jpg -------------------------------------------------------------------------------- /public/images/products/cabbage/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/cabbage/001.jpg -------------------------------------------------------------------------------- /public/images/products/cabbage/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/cabbage/002.jpg -------------------------------------------------------------------------------- /public/images/products/cabbage/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/cabbage/003.jpg -------------------------------------------------------------------------------- /public/images/products/cabbage/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/cabbage/004.jpg -------------------------------------------------------------------------------- /public/images/products/cabbage/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/cabbage/005.jpg -------------------------------------------------------------------------------- /public/images/products/cabbage/006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/cabbage/006.jpg -------------------------------------------------------------------------------- /public/images/products/cabbage/007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/cabbage/007.jpg -------------------------------------------------------------------------------- /public/images/products/carrot/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/carrot/001.jpg -------------------------------------------------------------------------------- /public/images/products/carrot/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/carrot/002.jpg -------------------------------------------------------------------------------- /public/images/products/carrot/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/carrot/003.jpg -------------------------------------------------------------------------------- /public/images/products/carrot/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/carrot/004.jpg -------------------------------------------------------------------------------- /public/images/products/carrot/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/carrot/005.jpg -------------------------------------------------------------------------------- /public/images/products/carrot/006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/carrot/006.jpg -------------------------------------------------------------------------------- /public/images/products/strawberry/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/strawberry/001.jpg -------------------------------------------------------------------------------- /public/images/products/strawberry/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/strawberry/002.jpg -------------------------------------------------------------------------------- /public/images/products/strawberry/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/strawberry/003.jpg -------------------------------------------------------------------------------- /public/images/products/strawberry/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/strawberry/004.jpg -------------------------------------------------------------------------------- /public/images/products/strawberry/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/strawberry/005.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/001.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/002.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/003.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/004.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/005.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/006.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/007.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/008.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/009.jpg -------------------------------------------------------------------------------- /public/images/products/tomato/010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/images/products/tomato/010.jpg -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / 3 | -------------------------------------------------------------------------------- /public/videos/001.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/videos/001.mp4 -------------------------------------------------------------------------------- /public/videos/002.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/videos/002.mp4 -------------------------------------------------------------------------------- /public/videos/003.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2023/16cc3f416e1cafcd46b60ad4e3540c16147cc5cc/public/videos/003.mp4 -------------------------------------------------------------------------------- /src/client/components/application/App/App.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | 3 | import { SignInModal } from '../../modal/SignInModal'; 4 | import { SignUpModal } from '../../modal/SignUpModal'; 5 | import { Providers } from '../Providers'; 6 | import { Routes } from '../Routes'; 7 | 8 | export const App: FC = () => ( 9 | 10 | 11 | 12 | 13 | 14 | ); 15 | -------------------------------------------------------------------------------- /src/client/components/application/App/index.ts: -------------------------------------------------------------------------------- 1 | export { App } from './App'; 2 | -------------------------------------------------------------------------------- /src/client/components/application/Layout/Layout.styles.ts: -------------------------------------------------------------------------------- 1 | import { css } from '@emotion/css'; 2 | 3 | export const container = () => css` 4 | max-width: 100vw; 5 | `; 6 | -------------------------------------------------------------------------------- /src/client/components/application/Layout/Layout.tsx: -------------------------------------------------------------------------------- 1 | import type { FC, ReactNode } from 'react'; 2 | 3 | import { Footer } from '../../navigators/Footer/Footer'; 4 | import { Header } from '../../navigators/Header/Header'; 5 | 6 | import * as styles from './Layout.styles'; 7 | 8 | type Props = { 9 | children: ReactNode; 10 | }; 11 | 12 | export const Layout: FC = ({ children }) => ( 13 | <> 14 |
15 |
{children}
16 |