Skip to content

cssの修正完了 - #44

Merged
Myxogastria0808 merged 9 commits into
mainfrom
dev
Jan 16, 2026
Merged

cssの修正完了#44
Myxogastria0808 merged 9 commits into
mainfrom
dev

Conversation

@Myxogastria0808

Copy link
Copy Markdown
Member

No description provided.

Copilot AI review requested due to automatic review settings January 16, 2026 21:05
@Myxogastria0808
Myxogastria0808 merged commit d288fb4 into main Jan 16, 2026
14 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 874ee18be4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +30 to +34
{props.inviteUrl ? (
<button
className={styles.button}
type="button"
onClick={() => props.inviteUrl && inviteUrlHandler(props.inviteUrl)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Provide fallback access to invite URL

When the Clipboard API is unavailable or permission is denied (e.g., non-HTTPS context, Safari limitations, or user rejection), this component only renders a copy button and never displays the actual invite URL, so users have no way to obtain the link. The previous UI exposed the URL in a read-only input, which served as a manual fallback. Consider rendering the URL (or showing it on copy failure) so the invite link remains accessible in those environments.

Useful? React with 👍 / 👎.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request implements comprehensive CSS and UI improvements for a money-sharing/group expense management application. The changes focus on modernizing the user interface, adding toast notifications for better user feedback, and refactoring components for better maintainability.

Changes:

  • Added react-hot-toast library for toast notifications throughout the application
  • Refactored components into smaller, more focused modules (Root, GroupDetail, Login pages)
  • Created new shared components: Loading, Error, FullPaymentButton, InviteButton
  • Replaced generic Button component with specialized button components
  • Updated CSS styling with new animations, responsive design, and better layout

Reviewed changes

Copilot reviewed 59 out of 61 changed files in this pull request and generated 16 comments.

Show a summary per file
File Description
products/frontend/src/share/index.ts Updated exports: removed Button, added Loading, Error, FullPaymentButton, InviteButton
products/frontend/src/share/Loading/* New animated loading component with wave animation
products/frontend/src/share/Error/* New error display component with animated boxes
products/frontend/src/share/InviteButton/* New component for copying invite URLs with toast feedback
products/frontend/src/share/FullPaymentButton/* New circular button for marking debts as paid
products/frontend/src/share/FormButton/* Renamed from Button, updated margin styling
products/frontend/src/routes/Share/index.tsx Added Toaster configuration for global toast notifications
products/frontend/src/routes/Share/components/Header/* Simplified header layout, removed user display and nav container
products/frontend/src/routes/SessionCheck/index.tsx Replaced text with Loading/Error components
products/frontend/src/routes/Root/* Major refactoring: split into sub-components (Logo, Description, Menu, Group, Borrow, Lent)
products/frontend/src/routes/Profile/* Added form styling and toast notifications
products/frontend/src/routes/NotFound/* Improved 404 page styling
products/frontend/src/routes/Login/* Extracted LoginButton component, improved layout
products/frontend/src/routes/Invite/* Added toast notifications and improved success message display
products/frontend/src/routes/GroupDetail/* Split into sub-components, added toast notifications, improved form styling
products/frontend/src/routes/GenerateGroup/* Added toast notifications, improved form styling
products/frontend/src/lib/date.ts New utility function for date formatting
products/frontend/src/index.css Added color variables for error and disabled states
package.json, pnpm-workspace.yaml, pnpm-lock.yaml Added react-hot-toast dependency
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

<div className={styles.memberWrapper}>
<small className={styles.label}>[メンバー]</small>
<p className={styles.memberNames}>
{(group.members ?? []).map((member) => member.user_name).join('、')}

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The nullish coalescing operator on line 46 is redundant since the group.members array is defined as non-nullable in the Props type definition (lines 17-20). This defensive check is unnecessary and adds confusion about the actual data type.

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +18
<div className={styles.loader}>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
</div>

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Error component displays a "loader" animation with boxes, which is typically associated with loading states, not error states. This creates a confusing user experience where an error message is accompanied by a loading animation. Consider either removing the loader animation from error states or using a different visual indicator more appropriate for errors (like an icon or static visual element).

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +18
<div className={styles.loader}>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
</div>

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The empty spans used for the loading animation boxes lack semantic meaning and accessibility context. Consider adding aria-hidden="true" to the loader container div to hide this decorative animation from screen readers, improving the experience for users with assistive technologies.

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +18
<div className={styles.loader}>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
<span className={styles.box}></span>
</div>

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similarly, the empty spans used for the error animation boxes lack semantic meaning and accessibility context. Consider adding aria-hidden="true" to the loader container div to hide this decorative animation from screen readers.

Copilot uses AI. Check for mistakes.
<button
className={styles.button}
type="button"
onClick={() => props.inviteUrl && inviteUrlHandler(props.inviteUrl)}

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The onClick handler on line 34 has redundant null checking. The props.inviteUrl check is unnecessary because the button is already conditionally rendered based on props.inviteUrl being truthy (line 30), guaranteeing it won't be null at this point. The onClick can be simplified to just call inviteUrlHandler(props.inviteUrl).

Copilot uses AI. Check for mistakes.
const creditorId = watch('creditor_id');

// メンバー一覧の取得
// メンバー 一覧の取得

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment says "メンバー 一覧の取得" (Getting member list) but there's an extra space between "メンバー" and "一覧". This should be "メンバー一覧の取得" without the space for consistency with other similar comments in the codebase.

Suggested change
// メンバー 一覧の取得
// メンバー一覧の取得

Copilot uses AI. Check for mistakes.
Comment on lines +38 to +42
.box:nth-child(2n) {
animation-delay: 0s;
}
.box:nth-child(2n + 1) {
animation-delay: 0.6s;

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The animation delay pattern for the Error component uses 2n (even) and 2n+1 (odd) selectors with only two different delays (0s and 0.6s), which creates a pattern where boxes 2 and 4 animate together (0s) and boxes 1, 3, and 5 animate together (0.6s). This creates an unbalanced animation. Consider using individual nth-child selectors with incremental delays (like in Loading component) for a smoother, more balanced wave effect.

Copilot uses AI. Check for mistakes.
const FullPaymentButton: FC<Props> = (props: Props) => {
return (
<button className={styles.button} type="button" onClick={props.onClick} disabled={props.disabled}>
{!props.disabled && '完済'}

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The button content disappears when disabled (line 13), leaving an empty button. This creates a poor user experience as the button becomes a blank circle when disabled. The text should remain visible (possibly with reduced opacity) to maintain the button's purpose and improve accessibility for screen readers.

Copilot uses AI. Check for mistakes.
Comment on lines 18 to +20
// css
import styles from './index.module.css';
import { Link } from 'react-router';

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Link import from 'react-router' is placed after the CSS import on line 19, breaking the typical import ordering convention. It should be moved up to group with other external library imports, likely near the top of the file after the react import.

Suggested change
// css
import styles from './index.module.css';
import { Link } from 'react-router';
import { Link } from 'react-router';
// css
import styles from './index.module.css';

Copilot uses AI. Check for mistakes.
<>
<h3 className={styles.memberTitle}>参加メンバー</h3>
<p className={styles.memberNames}>
{(props.groupInfoResult?.members ?? []).map((member) => member.user_name).join('、')}

Copilot AI Jan 16, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similarly, the nullish coalescing operator on line 23 is redundant since props.groupInfoResult.members is defined as a non-nullable array in the Props type definition (lines 11-14). This defensive check is unnecessary.

Suggested change
{(props.groupInfoResult?.members ?? []).map((member) => member.user_name).join('、')}
{props.groupInfoResult.members.map((member) => member.user_name).join('、')}

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants