Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Typography ui #20

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Conversation

raymondanythings
Copy link
Collaborator

@raymondanythings raymondanythings commented Nov 19, 2024

Typography 컴포넌트 제작

  • 택스트를 나타내는 컴포넌트를 제작했어요.
  • as 속성을 통해 택스트를 표현하는 태그를 사용할 수 있어요.

Summary by CodeRabbit

  • New Features

    • @layer-ui/typography 패키지가 추가되어 텍스트 렌더링을 위한 Typography 컴포넌트를 제공합니다.
    • 새로운 /typography 경로로 연결되는 링크가 RootLayout에 추가되었습니다.
    • TypographyPage 컴포넌트가 생성되어 "Typography" 제목을 표시합니다.
  • Bug Fixes

    • 없음
  • Documentation

    • package.json 파일에 패키지 메타데이터가 정의되었습니다.
  • Chores

    • TypeScript 설정에 @layer-ui/typography 경로 매핑이 추가되었습니다.

Copy link

coderabbitai bot commented Nov 19, 2024

Walkthrough

이 PR은 @layer-ui/typography 패키지를 위한 새로운 package.json 파일을 도입하고, Typography 컴포넌트를 포함하는 여러 파일을 추가합니다. Typography 컴포넌트는 다양한 HTML 태그로 텍스트를 렌더링할 수 있도록 설계되었으며, 이와 관련된 타입 정의도 포함됩니다. 또한, ssr/app/layout.tsxssr/app/typography/page.tsx 파일에 새로운 링크와 페이지 컴포넌트를 추가하여 사용자 인터페이스를 확장합니다. 마지막으로, tsconfig.json 파일에 새로운 경로 매핑이 추가되었습니다.

Changes

파일 경로 변경 요약
packages/ui/typography/package.json 새로운 패키지 @layer-ui/typography 추가, 메타데이터 및 모듈 내보내기 정의
packages/ui/typography/src/Typography.tsx Typography 컴포넌트 및 TypographyProps 타입 정의 및 내보내기
packages/ui/typography/src/index.ts Typography 컴포넌트와 TypographyProps 타입을 내보내는 새로운 진입점 파일 추가
ssr/app/layout.tsx RootLayout 컴포넌트에 "Typography" 섹션으로의 링크 추가
ssr/app/typography/page.tsx TypographyPage라는 새로운 컴포넌트 추가, Typography 컴포넌트를 사용하여 "Typography" 텍스트 렌더링
tsconfig.json @layer-ui/typography 모듈에 대한 새로운 경로 매핑 추가

Possibly related PRs

  • feat: 라이브러리 빌드 설정 #8: 이 PR은 새로운 @layer-ui/typography 패키지를 도입하며, PR #8은 UI 라이브러리의 빌드 구성을 설정하여 타이포그래피 패키지를 포함할 가능성이 있습니다.

Suggested labels

enhancement

Suggested reviewers

  • leeminhee119

🐰 새로운 글꼴이 생겼어요,
텍스트를 꾸미는 방법을 알게 되었죠.
다양한 태그로 멋지게,
우리의 디자인을 빛내줄 거예요!
링크를 추가하고 페이지를 만들며,
모두 함께 즐거운 변화를 맞이해요! ✨

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 eslint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

packages/ui/typography/src/Typography.tsx

(node:55081) ESLintIgnoreWarning: The ".eslintignore" file is no longer supported. Switch to using the "ignores" property in "eslint.config.js": https://eslint.org/docs/latest/use/configure/migration-guide#ignoring-files
(Use node --trace-warnings ... to show where the warning was created)

Oops! Something went wrong! :(

ESLint: 9.15.0

ESLint couldn't find an eslint.config.(js|mjs|cjs) file.

From ESLint v9.0.0, the default configuration file is now eslint.config.js.
If you are using a .eslintrc.* file, please follow the migration guide
to update your configuration file to the new format:

https://eslint.org/docs/latest/use/configure/migration-guide

If you still have problems after following the migration guide, please stop by
https://eslint.org/chat/help to chat with the team.


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (3)
packages/ui/typography/src/Typography.tsx (2)

4-7: 의미론적 변형(Semantic Variants) 추가 제안

현재 구현은 기본적인 HTML 태그 렌더링을 잘 지원하고 있습니다만, 디자인 시스템의 일관성을 위해 의미론적 변형을 추가하는 것이 좋을 것 같습니다.

다음과 같은 변형을 추가하는 것을 고려해보세요:

 type TypographyProps<T extends TextTags = TextTags> = {
   as?: T;
   children: string;
+  variant?: 'heading' | 'body' | 'caption' | 'label';
 } & Omit<React.HTMLAttributes<HTMLElement>, "color" | "as" | "variant">;

6-6: children 타입 제한 완화 제안

현재 children이 문자열로만 제한되어 있어 컴포넌트의 유연성이 제한될 수 있습니다.

다음과 같이 React.ReactNode로 확장하는 것을 고려해보세요:

- children: string;
+ children: React.ReactNode;
ssr/app/layout.tsx (1)

Line range hint 18-27: 스타일 중복 개선 제안

모든 Link 컴포넌트에 동일한 스타일이 반복되어 있습니다. 스타일 재사용성을 높이기 위해 공통 스타일을 분리하는 것을 제안드립니다.

다음과 같이 개선해보시는 건 어떨까요:

+ const linkStyle = {
+   border: "1px solid black",
+   borderRadius: "0.5em",
+   padding: "0.2em 1em",
+   backgroundColor: "#cccccc"
+ };

  <div style={{ display: "flex", flexDirection: "column", gap: "0.5em" }}>
-   <Link style={{ border: "1px solid black", borderRadius: "0.5em", padding: "0.2em 1em", backgroundColor: "#cccccc" }} href="/button">
+   <Link style={linkStyle} href="/button">
      Button
    </Link>
-   <Link style={{ border: "1px solid black", borderRadius: "0.5em", padding: "0.2em 1em", backgroundColor: "#cccccc" }} href="/modal">
+   <Link style={linkStyle} href="/modal">
      Modal
    </Link>
-   <Link style={{ border: "1px solid black", borderRadius: "0.5em", padding: "0.2em 1em", backgroundColor: "#cccccc" }} href="/typography">
+   <Link style={linkStyle} href="/typography">
      Typography
    </Link>
  </div>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb1c79 and c74d85b.

📒 Files selected for processing (6)
  • packages/ui/typography/package.json (1 hunks)
  • packages/ui/typography/src/Typography.tsx (1 hunks)
  • packages/ui/typography/src/index.ts (1 hunks)
  • ssr/app/layout.tsx (1 hunks)
  • ssr/app/typography/page.tsx (1 hunks)
  • tsconfig.json (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • ssr/app/typography/page.tsx
🔇 Additional comments (8)
packages/ui/typography/src/index.ts (2)

1-3: 모듈 구조가 깔끔하게 구현되었습니다!

배럴 패턴을 사용한 깔끔한 모듈 구조와 타입 내보내기가 잘 되어있습니다. "use client" 지시문도 적절하게 배치되어 있습니다.


2-3: Typography 컴포넌트 구현 확인이 필요합니다.

Typography 컴포넌트의 실제 구현과 사용 예시를 확인해 보겠습니다.

✅ Verification successful

Let's check the usage example in the typography page to get a complete picture.


Typography 컴포넌트 구현이 적절합니다

Typography 컴포넌트는 다음과 같은 특징을 가지고 있습니다:

  • HTML 텍스트 태그들을 유연하게 지원 (span, p, h1-h6 등)
  • React.forwardRef를 통한 ref 전달 지원
  • 적절한 타입 정의와 제네릭 사용
  • 불필요한 props 제외 처리 (color, variant 등)

개선 제안사항:

  • 컴포넌트 사용 예시와 문서화가 부족합니다. README.md 파일 추가를 권장드립니다.
  • 기본 스타일링이나 테마 시스템과의 연동이 없습니다. 향후 필요에 따라 추가를 고려해보세요.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Typography 컴포넌트 구현 확인

# Typography.tsx 파일 검색
echo "Typography 컴포넌트 구현 확인:"
fd "Typography.tsx" packages/ui/typography/src -x cat {}

# 사용 예시 검색
echo "\n사용 예시 확인:"
rg -l "Typography" ssr/app/typography/

Length of output: 889


Script:

#!/bin/bash
# Typography 사용 예시 확인
echo "Typography 페이지 구현:"
cat ssr/app/typography/page.tsx

# README나 문서 확인
echo "\n문서 확인:"
fd "README" packages/ui/typography -x cat {}

Length of output: 305

packages/ui/typography/src/Typography.tsx (2)

19-23: 구현이 잘 되었습니다!

컴포넌트 이름 설정과 내보내기가 React 모범 사례를 잘 따르고 있습니다.


10-10: 🛠️ Refactor suggestion

타입 안전성 개선 필요

as any 타입 캐스팅은 타입 안전성을 저해할 수 있습니다.

다음과 같이 더 안전한 방식으로 변경하는 것을 추천드립니다:

- const { as: Comp = "span" as any, children, ...rest } = props;
+ const { as: Comp = "span" as T, children, ...rest } = props;

Likely invalid or redundant comment.

ssr/app/layout.tsx (1)

25-27: 구현이 일관성있게 잘 되었습니다!

Typography 섹션에 대한 새로운 링크가 기존 네비게이션 스타일과 일치하게 구현되었습니다.

packages/ui/typography/package.json (2)

1-4: 패키지 기본 정보가 적절히 구성되었습니다!

스코프 네이밍과 버전 관리가 npm 컨벤션을 잘 따르고 있습니다.


48-54: 저장소 정보가 올바르게 구성되었습니다!

GitHub 저장소 URL과 이슈 트래커가 적절히 설정되어 있습니다.

tsconfig.json (1)

40-41: 경로 매핑이 올바르게 추가되었습니다!

Typography 컴포넌트를 위한 경로 매핑이 기존 UI 컴포넌트들의 패턴을 잘 따르고 있습니다.

경로가 올바르게 설정되었는지 확인하기 위해 다음 스크립트를 실행합니다:

✅ Verification successful

Typography 컴포넌트의 경로 매핑이 정상적으로 설정되었습니다

소스 디렉토리와 필수 파일들이 모두 존재하는 것을 확인했습니다:

  • ./packages/ui/typography/src/Typography.tsx
  • ./packages/ui/typography/src/index.ts
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Typography 컴포넌트의 소스 디렉토리 존재 여부 확인

# Typography 컴포넌트 소스 디렉토리 확인
if [ -d "./packages/ui/typography/src" ]; then
    echo "✓ Typography 소스 디렉토리가 존재합니다"
    
    # 필수 파일들의 존재 여부 확인
    fd . "./packages/ui/typography/src" -t f -e tsx -e ts
else
    echo "✗ Typography 소스 디렉토리를 찾을 수 없습니다"
fi

Length of output: 242

Comment on lines +30 to +47
"dependencies": {
"@radix-ui/react-slot": "^1.1.0",
"@layer-lib/react-use-mounted": "workspace:*"
},
"peerDependencies": {
"@types/react": "*",
"@types/react-dom": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"@types/react-dom": {
"optional": true
}
},
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

의존성 버전 범위를 더 구체적으로 지정해주세요.

현재 구성의 잠재적 문제점들:

  1. React 19.0.0-rc와 같은 릴리스 후보 버전을 프로덕션에서 사용하는 것은 위험할 수 있습니다.
  2. @types/react@types/react-dom의 버전이 *로 지정되어 있어 타입 불일치 문제가 발생할 수 있습니다.

다음과 같은 수정을 제안드립니다:

  "peerDependencies": {
-   "@types/react": "*",
-   "@types/react-dom": "*",
+   "@types/react": "^17.0.0 || ^18.0.0",
+   "@types/react-dom": "^17.0.0 || ^18.0.0",
-   "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
-   "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+   "react": "^17.0.0 || ^18.0.0",
+   "react-dom": "^17.0.0 || ^18.0.0"
  }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"dependencies": {
"@radix-ui/react-slot": "^1.1.0",
"@layer-lib/react-use-mounted": "workspace:*"
},
"peerDependencies": {
"@types/react": "*",
"@types/react-dom": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"@types/react-dom": {
"optional": true
}
},
"dependencies": {
"@radix-ui/react-slot": "^1.1.0",
"@layer-lib/react-use-mounted": "workspace:*"
},
"peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0",
"@types/react-dom": "^17.0.0 || ^18.0.0",
"react": "^17.0.0 || ^18.0.0",
"react-dom": "^17.0.0 || ^18.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"@types/react-dom": {
"optional": true
}
},

Comment on lines +5 to +29
"exports": {
".": {
"import": {
"types": "./dist/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
}
},
"source": "./src/index.ts",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
"dist",
"README.md"
],
"sideEffects": false,
"scripts": {
"clean": "rm -rf dist",
"version": "pnpm version"
},
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

빌드 스크립트 추가가 필요합니다.

현재 cleanversion 스크립트만 정의되어 있습니다. TypeScript 소스를 컴파일하고 번들링하기 위한 빌드 스크립트가 필요합니다.

다음과 같은 스크립트 추가를 제안드립니다:

  "scripts": {
    "clean": "rm -rf dist",
-   "version": "pnpm version"
+   "version": "pnpm version",
+   "build": "tsup src/index.ts --format esm,cjs --dts",
+   "dev": "tsup src/index.ts --format esm,cjs --watch --dts",
+   "lint": "eslint \"src/**/*.ts*\"",
+   "test": "jest"
  }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"exports": {
".": {
"import": {
"types": "./dist/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
}
},
"source": "./src/index.ts",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
"dist",
"README.md"
],
"sideEffects": false,
"scripts": {
"clean": "rm -rf dist",
"version": "pnpm version"
},
"exports": {
".": {
"import": {
"types": "./dist/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
}
},
"source": "./src/index.ts",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
"dist",
"README.md"
],
"sideEffects": false,
"scripts": {
"clean": "rm -rf dist",
"version": "pnpm version",
"build": "tsup src/index.ts --format esm,cjs --dts",
"dev": "tsup src/index.ts --format esm,cjs --watch --dts",
"lint": "eslint \"src/**/*.ts*\"",
"test": "jest"
},

Copy link
Collaborator

@leeminhee119 leeminhee119 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!

Copy link
Owner

@klmhyeonwoo klmhyeonwoo left a comment

Choose a reason for hiding this comment

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

고생하셨습니다 :-)

} & Omit<React.HTMLAttributes<HTMLElement>, "color" | "as" | "variant">;

const Typography = React.forwardRef(<T extends TextTags>(props: TypographyProps<T>, ref: React.ForwardedRef<HTMLElement>) => {
const { as: Comp = "span" as any, children, ...rest } = props;
Copy link
Owner

Choose a reason for hiding this comment

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

타입을 any로 타입을 강제 캐스팅하신 의도가 따로 있으신지 궁금합니다!

Copy link
Collaborator

@Doeunnkimm Doeunnkimm left a comment

Choose a reason for hiding this comment

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

궁금한 점들이 있어서 리뷰 남겼어요! 🙇


type TypographyProps<T extends TextTags = TextTags> = {
as?: T;
children: string;
Copy link
Collaborator

Choose a reason for hiding this comment

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

children을 string으로 강제하는 이유가 있나용 ? 🤔 시맨틱하게 ReactNode로 허용해도 좋지 않을까 제안드려보아요

Copy link
Owner

@klmhyeonwoo klmhyeonwoo Nov 19, 2024

Choose a reason for hiding this comment

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

To. @Doeunnkimm

반갑습미다 도은님 : )

기존 레이어 서비스에서 타이포그래피 컴포넌트는 정말 문자에 대한 타입만 받도록 하고 있었어요!
(물론 지금은 디자인 시스템 관련 라이브러리를 만들고 있지만)
그래서 Typography 컴포넌트에서 타이포에 대한 목적을 가지는 컴포넌트라면 타입을 string 으로 받아도 어색하지 않다는 생각을 했었는데, 혹시 ReactNode로 했을 때의 장점 또는 변경에 따른 사이드 이펙트는 없을까요?!

Copy link
Collaborator

@Doeunnkimm Doeunnkimm Nov 19, 2024

Choose a reason for hiding this comment

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

아하 답변 이해했어요!

확장성 면에서 말씀드린 것이였는데요!
Typography를 사용하다보면 확장된 형태로 쓸 때 내부에 ReactNode를 두는 케이스가 있는 것 같아요!

예를 들면

// 이런거1
<Typography>
  안녕하세요~ <a>깃헙 링크</a> 보내드려요~
</Typography>

// 이런거2
<Typography>
  검정 <span style={{ color: 'blue' }}>파랑</span> 검정
</Typography>

처럼 Typography의 스타일을 inherit 해서 사용할 수 있을 때 이점이 있을 것 같아요!

Copy link
Owner

Choose a reason for hiding this comment

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

아하 이해했습니다! 지금 범용적 라이브러리 목적으로 봤을 때 코멘트 남겨주신 부분이 굳인 것 같습니다! 체고체고

Copy link
Collaborator

Choose a reason for hiding this comment

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

문득 궁금한 것이... Typography는 theme에만 존재해도 되지 않을까하는 생각이 들었어유
지금 구현되어 있는 내용만 보았을 때는 tag 부분만 as로 들어가는 것이 전부인데 어떤 의미를 가지고 있는지 잘 모르겠어요!

ui에도 들어가게 된 히스토리가 있나용 ? 😲

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants