diff --git a/application/client/babel.config.js b/application/client/babel.config.js index c3c574591a..f51f26c2fc 100644 --- a/application/client/babel.config.js +++ b/application/client/babel.config.js @@ -4,16 +4,14 @@ module.exports = { [ "@babel/preset-env", { - targets: "ie 11", - corejs: "3", - modules: "commonjs", + targets: "defaults, not ie 11", + modules: false, useBuiltIns: false, }, ], [ "@babel/preset-react", { - development: true, runtime: "automatic", }, ], diff --git a/application/client/package.json b/application/client/package.json index 9f8e80a6a8..e2885c7fa8 100644 --- a/application/client/package.json +++ b/application/client/package.json @@ -5,13 +5,10 @@ "license": "MPL-2.0", "author": "CyberAgent, Inc.", "scripts": { - "build": "NODE_ENV=development webpack", + "build": "NODE_ENV=production webpack", "typecheck": "tsc" }, "dependencies": { - "@ffmpeg/core": "0.12.10", - "@ffmpeg/ffmpeg": "0.12.15", - "@imagemagick/magick-wasm": "0.0.37", "@mlc-ai/web-llm": "0.2.80", "@web-speed-hackathon-2026/client": "workspace:*", "bayesian-bm25": "0.4.0", @@ -20,10 +17,9 @@ "classnames": "2.5.1", "common-tags": "1.8.2", "core-js": "3.45.1", + "dayjs": "1.11.20", "encoding-japanese": "2.2.0", "fast-average-color": "9.5.0", - "gifler": "github:themadcreator/gifler#v0.3.0", - "image-size": "2.0.2", "jquery": "3.7.1", "jquery-binarytransport": "1.0.0", "json-repair-js": "1.0.0", @@ -31,12 +27,9 @@ "kuromoji": "0.1.2", "langs": "2.0.0", "lodash": "4.17.21", - "moment": "2.30.1", "negaposi-analyzer-ja": "1.0.1", "normalize.css": "8.0.1", - "omggif": "1.0.10", "pako": "2.1.0", - "piexifjs": "1.0.6", "react": "19.2.0", "react-dom": "19.2.0", "react-helmet": "npm:@dr.pogodin/react-helmet@3.0.4", @@ -57,6 +50,8 @@ "@babel/preset-env": "7.28.3", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", + "@tailwindcss/postcss": "^4.2.2", + "@tailwindcss/vite": "^4.2.2", "@tsconfig/strictest": "2.0.8", "@types/bluebird": "3.5.42", "@types/common-tags": "1.8.4", @@ -74,6 +69,7 @@ "@types/react-syntax-highlighter": "15.5.13", "@types/redux-form": "^8.3.11", "babel-loader": "10.0.0", + "compression-webpack-plugin": "12.0.0", "copy-webpack-plugin": "13.0.1", "css-loader": "7.1.2", "html-webpack-plugin": "5.6.4", @@ -83,6 +79,7 @@ "postcss-loader": "8.2.0", "postcss-preset-env": "10.4.0", "react-markdown": "10.1.0", + "tailwindcss": "^4.2.2", "typescript": "5.9.3", "webpack": "5.102.1", "webpack-cli": "6.0.1", diff --git a/application/client/postcss.config.js b/application/client/postcss.config.js index d7ee920b94..bcb66acf3f 100644 --- a/application/client/postcss.config.js +++ b/application/client/postcss.config.js @@ -1,9 +1,11 @@ +const tailwindcss = require("@tailwindcss/postcss"); const postcssImport = require("postcss-import"); const postcssPresetEnv = require("postcss-preset-env"); module.exports = { plugins: [ postcssImport(), + tailwindcss(), postcssPresetEnv({ stage: 3, }), diff --git a/application/client/src/components/application/SearchPage.tsx b/application/client/src/components/application/SearchPage.tsx index e99045de45..4893776c6c 100644 --- a/application/client/src/components/application/SearchPage.tsx +++ b/application/client/src/components/application/SearchPage.tsx @@ -1,14 +1,11 @@ -import { useEffect, useMemo, useState } from "react"; +import { ChangeEvent, FormEvent, useEffect, useMemo, useState, useCallback } from "react"; import { useNavigate } from "react-router"; -import { Field, InjectedFormProps, reduxForm, WrappedFieldProps } from "redux-form"; import { Timeline } from "@web-speed-hackathon-2026/client/src/components/timeline/Timeline"; import { parseSearchQuery, sanitizeSearchText, } from "@web-speed-hackathon-2026/client/src/search/services"; -import { SearchFormData } from "@web-speed-hackathon-2026/client/src/search/types"; -import { validate } from "@web-speed-hackathon-2026/client/src/search/validation"; import { analyzeSentiment } from "@web-speed-hackathon-2026/client/src/utils/negaposi_analyzer"; import { Button } from "../foundation/Button"; @@ -18,33 +15,17 @@ interface Props { results: Models.Post[]; } -const SearchInput = ({ input, meta }: WrappedFieldProps) => ( -