From 82be0dabbce9ffe62a132a4644691088a3a6834f Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:32:26 +0900 Subject: [PATCH 1/7] =?UTF-8?q?storybook=20=E3=81=8C=20README=20=E3=81=AB?= =?UTF-8?q?=E6=9B=B8=E3=81=84=E3=81=A6=E3=81=82=E3=82=8B=E3=81=A8=E3=81=8A?= =?UTF-8?q?=E3=82=8A=E3=81=AB=E5=8B=95=E3=81=8B=E3=81=AA=E3=81=84=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lock | 55 ++++++++++++++++++++++++++++------------ docs/developer_readme.md | 13 +++++----- package.json | 4 ++- 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/bun.lock b/bun.lock index dede458..285b87c 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "name": "syllabus", "devDependencies": { "@biomejs/biome": "^2.1.1", + "concurrently": "^9.2.0", }, }, "packages/class_data": { @@ -481,12 +482,16 @@ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "concurrently": ["concurrently@9.2.0", "", { "dependencies": { "chalk": "^4.1.2", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" }, "bin": { "concurrently": "dist/bin/concurrently.js", "conc": "dist/bin/concurrently.js" } }, "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], @@ -523,7 +528,7 @@ "elysia": ["elysia@1.3.5", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-XVIKXlKFwUT7Sta8GY+wO5reD9I0rqAEtaz1Z71UgJb61csYt8Q3W9al8rtL5RgumuRR8e3DNdzlUN9GkC4KDw=="], - "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "enhanced-resolve": ["enhanced-resolve@5.18.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ=="], @@ -567,6 +572,8 @@ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], @@ -741,10 +748,14 @@ "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], "rollup": ["rollup@4.45.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.45.0", "@rollup/rollup-android-arm64": "4.45.0", "@rollup/rollup-darwin-arm64": "4.45.0", "@rollup/rollup-darwin-x64": "4.45.0", "@rollup/rollup-freebsd-arm64": "4.45.0", "@rollup/rollup-freebsd-x64": "4.45.0", "@rollup/rollup-linux-arm-gnueabihf": "4.45.0", "@rollup/rollup-linux-arm-musleabihf": "4.45.0", "@rollup/rollup-linux-arm64-gnu": "4.45.0", "@rollup/rollup-linux-arm64-musl": "4.45.0", "@rollup/rollup-linux-loongarch64-gnu": "4.45.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.45.0", "@rollup/rollup-linux-riscv64-gnu": "4.45.0", "@rollup/rollup-linux-riscv64-musl": "4.45.0", "@rollup/rollup-linux-s390x-gnu": "4.45.0", "@rollup/rollup-linux-x64-gnu": "4.45.0", "@rollup/rollup-linux-x64-musl": "4.45.0", "@rollup/rollup-win32-arm64-msvc": "4.45.0", "@rollup/rollup-win32-ia32-msvc": "4.45.0", "@rollup/rollup-win32-x64-msvc": "4.45.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A=="], + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], @@ -759,6 +770,8 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -767,11 +780,11 @@ "storybook": ["storybook@8.6.14", "", { "dependencies": { "@storybook/core": "8.6.14" }, "peerDependencies": { "prettier": "^2 || ^3" }, "optionalPeers": ["prettier"], "bin": { "sb": "./bin/index.cjs", "storybook": "./bin/index.cjs", "getstorybook": "./bin/index.cjs" } }, "sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw=="], - "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -781,7 +794,7 @@ "strtok3": ["strtok3@10.3.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], @@ -803,6 +816,8 @@ "token-types": ["token-types@6.0.3", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ=="], + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], @@ -833,16 +848,28 @@ "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], - "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "@joshwooding/vite-plugin-react-docgen-typescript/magic-string": ["magic-string@0.27.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" } }, "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA=="], "@storybook/core/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -865,6 +892,8 @@ "@vitest/expect/@vitest/utils": ["@vitest/utils@2.0.5", "", { "dependencies": { "@vitest/pretty-format": "2.0.5", "estree-walker": "^3.0.3", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" } }, "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ=="], + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -873,24 +902,18 @@ "redent/strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], - "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - "strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - - "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], + "@testing-library/jest-dom/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "@vitest/expect/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@2.0.5", "", { "dependencies": { "tinyrainbow": "^1.2.0" } }, "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ=="], "@vitest/expect/@vitest/utils/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - - "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], } } diff --git a/docs/developer_readme.md b/docs/developer_readme.md index 9290f07..10f1b7d 100644 --- a/docs/developer_readme.md +++ b/docs/developer_readme.md @@ -9,10 +9,15 @@ bun install --frozen-lockfile ## 開発 -開発モードを実行するには、以下のコマンドを実行してください。 ```bash +# 開発モードを実行するには、以下のコマンドを実行してください。 +# localhost:5173 に Vite サーバーが立ち上がるので、そこで確認してください。 bun dev + +# Storybookの使用 +# localhost:6006にStorybookが立ち上がるので、そこでUIを確認してください。 +bun run storybook ``` コードをプッシュする前に、コード品質をチェックするために以下のコマンドを実行してください。 @@ -60,9 +65,3 @@ Userのデータは`User`クラスを使用して扱います。Userのデータ } } ``` - -## Storybookの使用 -```bash -bun run storybook -``` - - localhost:6006にStorybookが立ち上がるので、そこでUIを確認してください。 diff --git a/package.json b/package.json index d4c7fea..422cd76 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,13 @@ "scripts": { "dev": "bun --filter=@packages/{web,server} dev", "dev:mock": "bun --filter=@packages/{web,server} dev:mock", + "storybook": "concurrently 'cd packages/server; bun dev' 'cd packages/web; bun run storybook'", "build": "cd packages/web && bun run build", "check": "bunx biome check .", "fix": "bunx biome check . --fix" }, "devDependencies": { - "@biomejs/biome": "^2.1.1" + "@biomejs/biome": "^2.1.1", + "concurrently": "^9.2.0" } } From 68389dc93de6299c35c4526704438dd98d64c88b Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:58:51 +0900 Subject: [PATCH 2/7] fix directory structure --- packages/models/models.ts | 100 ++++++++++++++++-- packages/server/app.ts | 5 +- packages/server/router/users.sample.ts | 43 -------- packages/web/src/App.tsx | 35 +++--- packages/web/src/app/context.ts | 9 -- packages/web/src/app/type.ts | 87 --------------- packages/web/src/{app => assets}/icon.ico | Bin .../components/ClassModal/ClassModalItem.tsx | 0 .../{app => }/components/ClassModal/index.tsx | 6 +- .../FilterUI/FilterComponents/ClassType.tsx | 3 +- .../FilterUI/FilterComponents/Evaluation.tsx | 2 +- .../FilterUI/FilterComponents/Freeword.tsx | 0 .../FilterComponents/RegistrationFilter.tsx | 0 .../FilterUI/FilterComponents/Semester.tsx | 2 +- .../components/FilterUI/FilterUI.tsx | 2 +- .../components/FilterUI/Sample/page.tsx | 0 .../components/FilterUI/UI/Checkbox.tsx | 0 .../components/FilterUI/UI/FilterCard.tsx | 0 .../components/FilterUI/UI/FlagButton.tsx | 0 .../src/{app => }/components/Footer/index.tsx | 0 .../src/{app => }/components/Header/index.tsx | 7 +- .../Sample/ClassModal/SampleClassData.ts | 2 +- .../components/Sample/ClassModal/page.tsx | 0 .../components/Sample/ColorTheme/field.tsx | 0 .../components/Sample/ColorTheme/page.tsx | 0 .../components/Sample/ColorTheme/toggle.tsx | 0 .../components/Sample/LoadClasses/page.tsx | 2 +- .../components/Sample/Timetable/page.tsx | 2 +- .../src/{app => }/components/Sample/page.tsx | 0 .../components/SearchResult/index.tsx | 0 .../components/Timetable/slots/classSlot.tsx | 2 +- .../components/Timetable/slots/daySlot.tsx | 2 +- .../components/Timetable/slots/periodSlot.tsx | 0 .../components/Timetable/slots/slot.tsx | 0 .../components/Timetable/timetableFrame.tsx | 2 +- packages/web/src/lib/tanstack/users.sample.ts | 47 -------- packages/web/src/pages/AboutUs.tsx | 2 +- packages/web/src/pages/Disclaimer.tsx | 2 +- packages/web/src/pages/Notion.tsx | 2 +- .../how-to-use/HowToUseItem.tsx | 0 .../HowToUseItem2.tsx} | 0 .../{HowToUse.tsx => how-to-use/page.tsx} | 2 +- packages/web/src/sample/UserManagement.tsx | 73 ------------- packages/web/src/services/theme/index.ts | 33 ++++++ packages/web/src/services/theme/types.ts | 5 + .../src/{app => services/user}/UserContext.ts | 6 +- .../{app/utils => services/user}/mock_data.ts | 4 +- .../src/{app/utils => services/user}/user.ts | 13 +-- packages/web/src/stories/Button.stories.ts | 2 +- packages/web/src/stories/Header.stories.ts | 2 +- packages/web/src/stories/Page.stories.ts | 2 +- .../{ => sample-components}/Button.tsx | 0 .../{ => sample-components}/Header.tsx | 0 .../stories/{ => sample-components}/Page.tsx | 0 .../{ => sample-components}/button.css | 0 .../{ => sample-components}/header.css | 0 .../stories/{ => sample-components}/page.css | 0 57 files changed, 181 insertions(+), 327 deletions(-) delete mode 100644 packages/server/router/users.sample.ts delete mode 100644 packages/web/src/app/context.ts delete mode 100644 packages/web/src/app/type.ts rename packages/web/src/{app => assets}/icon.ico (100%) rename packages/web/src/{app => }/components/ClassModal/ClassModalItem.tsx (100%) rename packages/web/src/{app => }/components/ClassModal/index.tsx (98%) rename packages/web/src/{app => }/components/FilterUI/FilterComponents/ClassType.tsx (97%) rename packages/web/src/{app => }/components/FilterUI/FilterComponents/Evaluation.tsx (98%) rename packages/web/src/{app => }/components/FilterUI/FilterComponents/Freeword.tsx (100%) rename packages/web/src/{app => }/components/FilterUI/FilterComponents/RegistrationFilter.tsx (100%) rename packages/web/src/{app => }/components/FilterUI/FilterComponents/Semester.tsx (97%) rename packages/web/src/{app => }/components/FilterUI/FilterUI.tsx (97%) rename packages/web/src/{app => }/components/FilterUI/Sample/page.tsx (100%) rename packages/web/src/{app => }/components/FilterUI/UI/Checkbox.tsx (100%) rename packages/web/src/{app => }/components/FilterUI/UI/FilterCard.tsx (100%) rename packages/web/src/{app => }/components/FilterUI/UI/FlagButton.tsx (100%) rename packages/web/src/{app => }/components/Footer/index.tsx (100%) rename packages/web/src/{app => }/components/Header/index.tsx (87%) rename packages/web/src/{app => }/components/Sample/ClassModal/SampleClassData.ts (99%) rename packages/web/src/{app => }/components/Sample/ClassModal/page.tsx (100%) rename packages/web/src/{app => }/components/Sample/ColorTheme/field.tsx (100%) rename packages/web/src/{app => }/components/Sample/ColorTheme/page.tsx (100%) rename packages/web/src/{app => }/components/Sample/ColorTheme/toggle.tsx (100%) rename packages/web/src/{app => }/components/Sample/LoadClasses/page.tsx (94%) rename packages/web/src/{app => }/components/Sample/Timetable/page.tsx (97%) rename packages/web/src/{app => }/components/Sample/page.tsx (100%) rename packages/web/src/{app => }/components/SearchResult/index.tsx (100%) rename packages/web/src/{app => }/components/Timetable/slots/classSlot.tsx (94%) rename packages/web/src/{app => }/components/Timetable/slots/daySlot.tsx (92%) rename packages/web/src/{app => }/components/Timetable/slots/periodSlot.tsx (100%) rename packages/web/src/{app => }/components/Timetable/slots/slot.tsx (100%) rename packages/web/src/{app => }/components/Timetable/timetableFrame.tsx (98%) delete mode 100644 packages/web/src/lib/tanstack/users.sample.ts rename packages/web/src/{app => pages}/how-to-use/HowToUseItem.tsx (100%) rename packages/web/src/pages/{HowToUseItem.tsx => how-to-use/HowToUseItem2.tsx} (100%) rename packages/web/src/pages/{HowToUse.tsx => how-to-use/page.tsx} (99%) delete mode 100644 packages/web/src/sample/UserManagement.tsx create mode 100644 packages/web/src/services/theme/index.ts create mode 100644 packages/web/src/services/theme/types.ts rename packages/web/src/{app => services/user}/UserContext.ts (82%) rename packages/web/src/{app/utils => services/user}/mock_data.ts (99%) rename packages/web/src/{app/utils => services/user}/user.ts (75%) rename packages/web/src/stories/{ => sample-components}/Button.tsx (100%) rename packages/web/src/stories/{ => sample-components}/Header.tsx (100%) rename packages/web/src/stories/{ => sample-components}/Page.tsx (100%) rename packages/web/src/stories/{ => sample-components}/button.css (100%) rename packages/web/src/stories/{ => sample-components}/header.css (100%) rename packages/web/src/stories/{ => sample-components}/page.css (100%) diff --git a/packages/models/models.ts b/packages/models/models.ts index 3eb537b..7c2cd27 100644 --- a/packages/models/models.ts +++ b/packages/models/models.ts @@ -1,15 +1,93 @@ import { t } from "elysia"; -export type CreateUser = typeof CreateUser.static; -export const CreateUser = t.Object({ - name: t.String({ - minLength: 1, - maxLength: 255, - }), -}); +// TODO: Elysia のスキーマにする +// サンプル変換: -export type User = typeof User.static; -export const User = t.Object({ - id: t.String({ format: "uuid" }), - ...CreateUser.properties, +export type Stream = typeof Stream.static; +export const Stream = t.Enum({ + s1: "s1", + s2: "s2", + s3: "s3", + l1: "l1", + l2: "l2", + l3: "l3", }); + +export type User = { + stream: Stream | undefined; + grade: number | undefined; + classNumber: number | undefined; +}; + +export type ClassDataType = { + code: string; + type: string; + category: string; + semester: string; + dayPeriod: DayPeriod[] | "集中"; + classroom: string; + titleJp: string; + lecturer: string; + titleEn: string; + lecturerEn: string; + ccCode: string; + credits: number; + detail: string; + schedule: string; + methods: string; + evaluation: string; + notes: string; + class: string; + guidance: string; + guidanceDate: string; + guidancePeriod: string; + time: number; + timeCompensation: string; + targetClass: string[][]; + importance: string[][]; + shortenedCategory: string; + shortenedEvaluation: string; + shortenedClassroom: string; +}; + +export type Day = "mon" | "tue" | "wed" | "thu" | "fri" | "sat"; + +export type DayPeriod = { + day: Day; + period: 1 | 2 | 3 | 4 | 5 | 6; +}; + +export const dayMapping: { [key in Day]: string } = { + mon: "月", + tue: "火", + wed: "水", + thu: "木", + fri: "金", + sat: "土", +}; + +/** + * セメスターを表現する型 + */ +export type Semester = "S" | "S1" | "S2" | "A" | "A1" | "A2"; + +/** + * 評価方法を表現する型 + */ +export type Evaluation = "試験" | "レポート" | "出席" | "平常"; + +/** + * セメスターを表現する型 + */ +export type ClassType = + | "基礎" + | "要求" + | "主題" + | "展開" + | "L" + | "A" + | "B" + | "C" + | "D" + | "E" + | "F"; diff --git a/packages/server/app.ts b/packages/server/app.ts index 93e1025..97cfd55 100644 --- a/packages/server/app.ts +++ b/packages/server/app.ts @@ -1,11 +1,8 @@ import { cors } from "@elysiajs/cors"; import { Elysia } from "elysia"; -import { usersRouter } from "./router/users.sample.ts"; export const app = new Elysia({ prefix: "/api", -}) - .use(cors()) - .group("/users", (app) => app.use(usersRouter)); +}).use(cors()); export type App = typeof app; diff --git a/packages/server/router/users.sample.ts b/packages/server/router/users.sample.ts deleted file mode 100644 index 9171708..0000000 --- a/packages/server/router/users.sample.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { CreateUser, type User } from "@packages/models"; -import { Elysia, status, t } from "elysia"; - -const users: User[] = []; - -export const usersRouter = new Elysia() - .get("/", () => users) - .get("/id", ({ query }) => users.find((user) => user.id === query.id), { - query: t.Object({ - id: t.String({ - format: "uuid", - }), - }), - }) - .post( - "/", - ({ body }) => { - users.push({ - id: crypto.randomUUID(), - ...body, - }); - return body; - }, - { - body: CreateUser, - }, - ) - .delete( - "/", - ({ query }) => { - const index = users.findIndex((user) => user.id === query.id); - if (index === -1) return status(404, "User not found"); - users.splice(index, 1); - return query.id; - }, - { - query: t.Object({ - id: t.String({ - format: "uuid", - }), - }), - }, - ); diff --git a/packages/web/src/App.tsx b/packages/web/src/App.tsx index b654f08..9778ad0 100644 --- a/packages/web/src/App.tsx +++ b/packages/web/src/App.tsx @@ -1,20 +1,22 @@ +import type { User } from "@packages/models"; import { QueryClientProvider } from "@tanstack/react-query"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { BrowserRouter, Route, Routes } from "react-router-dom"; -import { ThemeContext } from "@/app/context"; -import type { RegisterType, ThemeType } from "@/app/type"; -import { UserContext, type UserContextValue } from "@/app/UserContext"; -import { User } from "@/app/utils/user"; -import Footer from "./app/components/Footer/index.tsx"; -import Header from "./app/components/Header/index.tsx"; +import { + UserContext, + type UserContextValue, +} from "@/services/user/UserContext.ts"; +import { UserService } from "@/services/user/user.ts"; +import Footer from "./components/Footer/index.tsx"; +import Header from "./components/Header/index.tsx"; import { queryClient } from "./lib/tanstack/client.ts"; import AboutUs from "./pages/AboutUs.tsx"; import Disclaimer from "./pages/Disclaimer.tsx"; import Home from "./pages/Home.tsx"; -import HowToUse from "./pages/HowToUse.tsx"; +import HowToUse from "./pages/how-to-use/page.tsx"; import NotFound from "./pages/NotFound.tsx"; import Notion from "./pages/Notion.tsx"; -import UserManagement from "./sample/UserManagement.tsx"; +import { ThemeContext, useThemeProvider } from "./services/theme/index.ts"; /** * App コンポーネントは、アプリケーション全体のレイアウトを定義します。 @@ -27,18 +29,14 @@ export default function App() { /** * テーマ管理 */ - const [theme, setTheme] = useState("light"); - // the only proper use of useEffect - useEffect(() => { - document.body.setAttribute("data-theme", theme); - }, [theme]); + const themeService = useThemeProvider(); - const userInstance = new User(); - const [user, setUserState] = useState( + const userInstance = new UserService(); + const [user, setUserState] = useState( userInstance.getUser(), ); - const setUser = (newUser: RegisterType) => { + const setUser = (newUser: User) => { userInstance.setUser(newUser); setUserState(newUser); }; @@ -49,7 +47,7 @@ export default function App() { }; return ( - +
} /> } /> } /> - } /> } />
diff --git a/packages/web/src/app/context.ts b/packages/web/src/app/context.ts deleted file mode 100644 index d735edb..0000000 --- a/packages/web/src/app/context.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createContext } from "react"; - -import type { ThemeProviderValue } from "@/app/type"; - -/** - * テーマコンテキスト - * dark modeとlight modeの切り替えをHeaderでするためのContext - */ -export const ThemeContext = createContext(null); diff --git a/packages/web/src/app/type.ts b/packages/web/src/app/type.ts deleted file mode 100644 index f1276dd..0000000 --- a/packages/web/src/app/type.ts +++ /dev/null @@ -1,87 +0,0 @@ -export type ThemeType = "light" | "dark"; - -export type ThemeProviderValue = { - theme: ThemeType; - setTheme: (theme: ThemeType) => void; -}; - -export type Stream = "s1" | "s2" | "s3" | "l1" | "l2" | "l3"; - -export type RegisterType = { - stream: Stream | undefined; - grade: number | undefined; - classNumber: number | undefined; -}; - -export type ClassDataType = { - code: string; - type: string; - category: string; - semester: string; - dayPeriod: DayPeriod[] | "集中"; - classroom: string; - titleJp: string; - lecturer: string; - titleEn: string; - lecturerEn: string; - ccCode: string; - credits: number; - detail: string; - schedule: string; - methods: string; - evaluation: string; - notes: string; - class: string; - guidance: string; - guidanceDate: string; - guidancePeriod: string; - time: number; - timeCompensation: string; - targetClass: string[][]; - importance: string[][]; - shortenedCategory: string; - shortenedEvaluation: string; - shortenedClassroom: string; -}; - -export type Day = "mon" | "tue" | "wed" | "thu" | "fri" | "sat"; - -export type DayPeriod = { - day: Day; - period: 1 | 2 | 3 | 4 | 5 | 6; -}; - -export const dayMapping: { [key in Day]: string } = { - mon: "月", - tue: "火", - wed: "水", - thu: "木", - fri: "金", - sat: "土", -}; - -/** - * セメスターを表現する型 - */ -export type Semester = "S" | "S1" | "S2" | "A" | "A1" | "A2"; - -/** - * 評価方法を表現する型 - */ -export type Evaluation = "試験" | "レポート" | "出席" | "平常"; - -/** - * セメスターを表現する型 - */ -export type ClassType = - | "基礎" - | "要求" - | "主題" - | "展開" - | "L" - | "A" - | "B" - | "C" - | "D" - | "E" - | "F"; diff --git a/packages/web/src/app/icon.ico b/packages/web/src/assets/icon.ico similarity index 100% rename from packages/web/src/app/icon.ico rename to packages/web/src/assets/icon.ico diff --git a/packages/web/src/app/components/ClassModal/ClassModalItem.tsx b/packages/web/src/components/ClassModal/ClassModalItem.tsx similarity index 100% rename from packages/web/src/app/components/ClassModal/ClassModalItem.tsx rename to packages/web/src/components/ClassModal/ClassModalItem.tsx diff --git a/packages/web/src/app/components/ClassModal/index.tsx b/packages/web/src/components/ClassModal/index.tsx similarity index 98% rename from packages/web/src/app/components/ClassModal/index.tsx rename to packages/web/src/components/ClassModal/index.tsx index a576ec5..4036a48 100644 --- a/packages/web/src/app/components/ClassModal/index.tsx +++ b/packages/web/src/components/ClassModal/index.tsx @@ -1,6 +1,10 @@ import { Dialog, DialogPanel, DialogTitle } from "@headlessui/react"; +import { + type ClassDataType, + type DayPeriod, + dayMapping, +} from "@packages/models"; import { FiX } from "react-icons/fi"; -import { type ClassDataType, type DayPeriod, dayMapping } from "@/app/type"; import Item from "./ClassModalItem.tsx"; /** diff --git a/packages/web/src/app/components/FilterUI/FilterComponents/ClassType.tsx b/packages/web/src/components/FilterUI/FilterComponents/ClassType.tsx similarity index 97% rename from packages/web/src/app/components/FilterUI/FilterComponents/ClassType.tsx rename to packages/web/src/components/FilterUI/FilterComponents/ClassType.tsx index 7dd3dbd..2f6a5cd 100644 --- a/packages/web/src/app/components/FilterUI/FilterComponents/ClassType.tsx +++ b/packages/web/src/components/FilterUI/FilterComponents/ClassType.tsx @@ -1,8 +1,9 @@ /* * セメスターフィルターのコンポーネント */ + +import type { ClassType } from "@packages/models"; import type React from "react"; -import type { ClassType } from "@/app/type"; import { FlagButton } from "../UI/FlagButton.tsx"; /** diff --git a/packages/web/src/app/components/FilterUI/FilterComponents/Evaluation.tsx b/packages/web/src/components/FilterUI/FilterComponents/Evaluation.tsx similarity index 98% rename from packages/web/src/app/components/FilterUI/FilterComponents/Evaluation.tsx rename to packages/web/src/components/FilterUI/FilterComponents/Evaluation.tsx index 1c87f45..907faab 100644 --- a/packages/web/src/app/components/FilterUI/FilterComponents/Evaluation.tsx +++ b/packages/web/src/components/FilterUI/FilterComponents/Evaluation.tsx @@ -2,9 +2,9 @@ * 評価方法フィルターのコンポーネント */ +import type { Evaluation } from "@packages/models"; import type React from "react"; import type { ReactNode } from "react"; -import type { Evaluation } from "@/app/type"; import Checkbox from "../UI/Checkbox.tsx"; const evaluations: Evaluation[] = ["試験", "レポート", "出席", "平常"]; diff --git a/packages/web/src/app/components/FilterUI/FilterComponents/Freeword.tsx b/packages/web/src/components/FilterUI/FilterComponents/Freeword.tsx similarity index 100% rename from packages/web/src/app/components/FilterUI/FilterComponents/Freeword.tsx rename to packages/web/src/components/FilterUI/FilterComponents/Freeword.tsx diff --git a/packages/web/src/app/components/FilterUI/FilterComponents/RegistrationFilter.tsx b/packages/web/src/components/FilterUI/FilterComponents/RegistrationFilter.tsx similarity index 100% rename from packages/web/src/app/components/FilterUI/FilterComponents/RegistrationFilter.tsx rename to packages/web/src/components/FilterUI/FilterComponents/RegistrationFilter.tsx diff --git a/packages/web/src/app/components/FilterUI/FilterComponents/Semester.tsx b/packages/web/src/components/FilterUI/FilterComponents/Semester.tsx similarity index 97% rename from packages/web/src/app/components/FilterUI/FilterComponents/Semester.tsx rename to packages/web/src/components/FilterUI/FilterComponents/Semester.tsx index 95ca56b..321bd74 100644 --- a/packages/web/src/app/components/FilterUI/FilterComponents/Semester.tsx +++ b/packages/web/src/components/FilterUI/FilterComponents/Semester.tsx @@ -2,8 +2,8 @@ * セメスターフィルターのコンポーネント */ +import type { Semester } from "@packages/models"; import type React from "react"; -import type { Semester } from "@/app/type"; import { FlagButton } from "../UI/FlagButton.tsx"; /** diff --git a/packages/web/src/app/components/FilterUI/FilterUI.tsx b/packages/web/src/components/FilterUI/FilterUI.tsx similarity index 97% rename from packages/web/src/app/components/FilterUI/FilterUI.tsx rename to packages/web/src/components/FilterUI/FilterUI.tsx index 4be77ff..5080fc1 100644 --- a/packages/web/src/app/components/FilterUI/FilterUI.tsx +++ b/packages/web/src/components/FilterUI/FilterUI.tsx @@ -2,8 +2,8 @@ * 全てのフィルターを表示するコンポーネント */ +import type { ClassType, Evaluation, Semester } from "@packages/models"; import { useState } from "react"; -import type { ClassType, Evaluation, Semester } from "@/app/type"; import { ClassTypeFilter } from "./FilterComponents/ClassType.tsx"; import { EvaluationFilter } from "./FilterComponents/Evaluation.tsx"; import { Freeword } from "./FilterComponents/Freeword.tsx"; diff --git a/packages/web/src/app/components/FilterUI/Sample/page.tsx b/packages/web/src/components/FilterUI/Sample/page.tsx similarity index 100% rename from packages/web/src/app/components/FilterUI/Sample/page.tsx rename to packages/web/src/components/FilterUI/Sample/page.tsx diff --git a/packages/web/src/app/components/FilterUI/UI/Checkbox.tsx b/packages/web/src/components/FilterUI/UI/Checkbox.tsx similarity index 100% rename from packages/web/src/app/components/FilterUI/UI/Checkbox.tsx rename to packages/web/src/components/FilterUI/UI/Checkbox.tsx diff --git a/packages/web/src/app/components/FilterUI/UI/FilterCard.tsx b/packages/web/src/components/FilterUI/UI/FilterCard.tsx similarity index 100% rename from packages/web/src/app/components/FilterUI/UI/FilterCard.tsx rename to packages/web/src/components/FilterUI/UI/FilterCard.tsx diff --git a/packages/web/src/app/components/FilterUI/UI/FlagButton.tsx b/packages/web/src/components/FilterUI/UI/FlagButton.tsx similarity index 100% rename from packages/web/src/app/components/FilterUI/UI/FlagButton.tsx rename to packages/web/src/components/FilterUI/UI/FlagButton.tsx diff --git a/packages/web/src/app/components/Footer/index.tsx b/packages/web/src/components/Footer/index.tsx similarity index 100% rename from packages/web/src/app/components/Footer/index.tsx rename to packages/web/src/components/Footer/index.tsx diff --git a/packages/web/src/app/components/Header/index.tsx b/packages/web/src/components/Header/index.tsx similarity index 87% rename from packages/web/src/app/components/Header/index.tsx rename to packages/web/src/components/Header/index.tsx index a674437..911ff90 100644 --- a/packages/web/src/app/components/Header/index.tsx +++ b/packages/web/src/components/Header/index.tsx @@ -1,16 +1,13 @@ -import { useContext } from "react"; import { FaCog } from "react-icons/fa"; import { MdDarkMode, MdOutlineWbSunny } from "react-icons/md"; - -import { ThemeContext } from "@/app/context"; -import type { ThemeProviderValue } from "@/app/type"; +import { useTheme } from "@/services/theme/index.ts"; /** * ヘッダー * @returns ヘッダー */ export default function Header() { - const { theme, setTheme } = useContext(ThemeContext) as ThemeProviderValue; + const { theme, setTheme } = useTheme(); return (
))} @@ -62,13 +50,18 @@ const FilterCardExample = () => { ); }; -export const Default: Story = { - args: { - title: "Sample Filter", - children:
Filter content goes here
, +const meta = { + title: "Components/atoms/FilterCard", + component: FilterCardExample, + tags: [], + parameters: { + layout: "centered", }, -}; +} satisfies Meta; -export const WithButtons: Story = { +export default meta; +type Story = StoryObj; + +export const Default: Story = { render: () => , }; diff --git a/packages/web/src/stories/FlagButton.stories.tsx b/packages/web/src/stories/atoms/FlagButton.stories.tsx similarity index 89% rename from packages/web/src/stories/FlagButton.stories.tsx rename to packages/web/src/stories/atoms/FlagButton.stories.tsx index 43f8930..fa8096a 100644 --- a/packages/web/src/stories/FlagButton.stories.tsx +++ b/packages/web/src/stories/atoms/FlagButton.stories.tsx @@ -2,18 +2,6 @@ import type { Meta, StoryObj } from "@storybook/react"; import { useState } from "react"; import { FlagButton } from "@/components/FilterUI/UI/FlagButton"; -const meta = { - title: "Components/UI/FlagButton", - component: FlagButton, - tags: ["autodocs"], - parameters: { - layout: "centered", - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - const FlagButtonWrapper = ({ initialSelected = false, label = "Sample Button", @@ -29,6 +17,18 @@ const FlagButtonWrapper = ({ ); }; +const meta = { + title: "Components/atoms/FlagButton", + component: FlagButtonWrapper, + tags: ["autodocs"], + parameters: { + layout: "centered", + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + export const Unselected: Story = { render: () => , }; diff --git a/packages/web/src/stories/Button.stories.ts b/packages/web/src/stories/example/Button.stories.ts similarity index 100% rename from packages/web/src/stories/Button.stories.ts rename to packages/web/src/stories/example/Button.stories.ts diff --git a/packages/web/src/stories/Header.stories.ts b/packages/web/src/stories/example/Header.stories.ts similarity index 100% rename from packages/web/src/stories/Header.stories.ts rename to packages/web/src/stories/example/Header.stories.ts diff --git a/packages/web/src/stories/Page.stories.ts b/packages/web/src/stories/example/Page.stories.ts similarity index 100% rename from packages/web/src/stories/Page.stories.ts rename to packages/web/src/stories/example/Page.stories.ts diff --git a/packages/web/src/stories/sample-components/Button.tsx b/packages/web/src/stories/example/sample-components/Button.tsx similarity index 100% rename from packages/web/src/stories/sample-components/Button.tsx rename to packages/web/src/stories/example/sample-components/Button.tsx diff --git a/packages/web/src/stories/sample-components/Header.tsx b/packages/web/src/stories/example/sample-components/Header.tsx similarity index 100% rename from packages/web/src/stories/sample-components/Header.tsx rename to packages/web/src/stories/example/sample-components/Header.tsx diff --git a/packages/web/src/stories/sample-components/Page.tsx b/packages/web/src/stories/example/sample-components/Page.tsx similarity index 100% rename from packages/web/src/stories/sample-components/Page.tsx rename to packages/web/src/stories/example/sample-components/Page.tsx diff --git a/packages/web/src/stories/sample-components/button.css b/packages/web/src/stories/example/sample-components/button.css similarity index 100% rename from packages/web/src/stories/sample-components/button.css rename to packages/web/src/stories/example/sample-components/button.css diff --git a/packages/web/src/stories/sample-components/header.css b/packages/web/src/stories/example/sample-components/header.css similarity index 100% rename from packages/web/src/stories/sample-components/header.css rename to packages/web/src/stories/example/sample-components/header.css diff --git a/packages/web/src/stories/sample-components/page.css b/packages/web/src/stories/example/sample-components/page.css similarity index 100% rename from packages/web/src/stories/sample-components/page.css rename to packages/web/src/stories/example/sample-components/page.css diff --git a/packages/web/src/stories/Footer.stories.tsx b/packages/web/src/stories/layout/Footer.stories.tsx similarity index 89% rename from packages/web/src/stories/Footer.stories.tsx rename to packages/web/src/stories/layout/Footer.stories.tsx index 694e63e..83d93ed 100644 --- a/packages/web/src/stories/Footer.stories.tsx +++ b/packages/web/src/stories/layout/Footer.stories.tsx @@ -3,7 +3,7 @@ import { MemoryRouter } from "react-router-dom"; import Footer from "@/components/Footer"; const meta = { - title: "Components/Footer", + title: "Components/layout/Footer", component: Footer, decorators: [ (Story) => ( @@ -12,7 +12,7 @@ const meta = { ), ], - tags: ["autodocs"], + tags: [], parameters: { layout: "fullscreen", }, diff --git a/packages/web/src/stories/Header.stories.tsx b/packages/web/src/stories/layout/Header.stories.tsx similarity index 89% rename from packages/web/src/stories/Header.stories.tsx rename to packages/web/src/stories/layout/Header.stories.tsx index 2894f98..fc78e90 100644 --- a/packages/web/src/stories/Header.stories.tsx +++ b/packages/web/src/stories/layout/Header.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react"; import Header from "@/components/Header"; const meta = { - title: "Components/Header", + title: "Components/layout/Header", component: Header, tags: ["autodocs"], parameters: { diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index 17f20ca..1b45df7 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -18,6 +18,6 @@ "@@/*": ["../../*"] } }, - "include": ["src/**/*.ts", "src/**/*.tsx"], + "include": ["src/**/*.ts", "src/**/*.tsx", ".storybook/**/*"], "exclude": ["node_modules"] } From d7d73cfbea275c90248d472a33911bc120cae7ba Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:30:38 +0900 Subject: [PATCH 6/7] fix --- biome.jsonc | 2 +- packages/server/lib/auth.ts | 2 +- packages/web/src/App.tsx | 2 +- packages/web/src/stories/Timetable.stories.tsx | 2 -- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 2ee870d..8d86331 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.1.1/schema.json", + "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/packages/server/lib/auth.ts b/packages/server/lib/auth.ts index 783aa6f..3f0a01b 100644 --- a/packages/server/lib/auth.ts +++ b/packages/server/lib/auth.ts @@ -1,8 +1,8 @@ import { betterAuth } from "better-auth"; import { drizzleAdapter } from "better-auth/adapters/drizzle"; +import Elysia from "elysia"; import { db } from "../db/index.ts"; import * as schema from "../db/schema.ts"; -import Elysia from "elysia"; export const auth = betterAuth({ database: drizzleAdapter(db, { diff --git a/packages/web/src/App.tsx b/packages/web/src/App.tsx index b505444..4a80a8a 100644 --- a/packages/web/src/App.tsx +++ b/packages/web/src/App.tsx @@ -16,9 +16,9 @@ import Home from "./pages/Home.tsx"; import HowToUse from "./pages/how-to-use/page.tsx"; import NotFound from "./pages/NotFound.tsx"; import Notion from "./pages/Notion.tsx"; -import { ThemeContext, useThemeProvider } from "./services/theme/index.ts"; import Profile from "./pages/Profile.tsx"; import SignIn from "./pages/SignIn.tsx"; +import { ThemeContext, useThemeProvider } from "./services/theme/index.ts"; /** * App コンポーネントは、アプリケーション全体のレイアウトを定義します。 diff --git a/packages/web/src/stories/Timetable.stories.tsx b/packages/web/src/stories/Timetable.stories.tsx index 0a56668..73cd010 100644 --- a/packages/web/src/stories/Timetable.stories.tsx +++ b/packages/web/src/stories/Timetable.stories.tsx @@ -1,7 +1,5 @@ import type { ClassDataType } from "@packages/models"; import type { Meta, StoryObj } from "@storybook/react"; -import { useState } from "react"; -import { SampleClasses } from "@/components/Sample/ClassModal/SampleClassData"; import Timetable from "@/components/Timetable/timetableFrame"; // Define the default export that configures the component From 719a48301f360ba6417358e5bae2ccdcb3788671 Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:32:28 +0900 Subject: [PATCH 7/7] fix type error --- packages/web/.storybook/preview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/.storybook/preview.tsx b/packages/web/.storybook/preview.tsx index f141d88..1a3354e 100644 --- a/packages/web/.storybook/preview.tsx +++ b/packages/web/.storybook/preview.tsx @@ -1,4 +1,4 @@ -import type { Preview } from "@storybook/react-vite"; +import type { Preview } from "@storybook/react"; import "../src/app.css"; import { ThemeContext, useThemeProvider } from "@/services/theme/index.ts";