diff --git a/.changeset/selfish-spies-clap.md b/.changeset/selfish-spies-clap.md new file mode 100644 index 00000000..35906bab --- /dev/null +++ b/.changeset/selfish-spies-clap.md @@ -0,0 +1,5 @@ +--- +"@devup-ui/wasm": patch +--- + +allow optional property of typography diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bc58bf13..b90d0de0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -54,3 +54,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} if: github.event_name == 'push' && github.ref == 'refs/heads/main' + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./apps/landing/out + if: github.event_name == 'push' && github.ref == 'refs/heads/main' diff --git a/apps/landing/.gitignore b/apps/landing/.gitignore new file mode 100644 index 00000000..ebe99d6c --- /dev/null +++ b/apps/landing/.gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +.df +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/apps/landing/README.md b/apps/landing/README.md new file mode 100644 index 00000000..665152ea --- /dev/null +++ b/apps/landing/README.md @@ -0,0 +1 @@ +## Nextjs App diff --git a/apps/landing/devup.json b/apps/landing/devup.json new file mode 100644 index 00000000..ab490c09 --- /dev/null +++ b/apps/landing/devup.json @@ -0,0 +1,470 @@ +{ + "theme": { + "colors": { + "default": { + "primary": "#6159D4", + "secondary": "#85A5F2", + "link": "#006BFF", + "text": "#2F2F2F", + "background": "#FFFFFF", + "containerBackground": "#FFFFFF", + "border": "#E0E0E0", + "success": "#4CAF50", + "warning": "#FF9800", + "error": "#F44336", + "info": "#2196F3", + "base": "#FFFFFF", + "negativeBase": "#000000", + "title": "#1A1A1A", + "caption": "#A9A8B4", + "shadow": "#87878740", + "codeBg": "#3E3B41", + "cardBg": "#F8F8F8", + "buttonBlue": "#266CCD", + "joinBg": "#CDE2FA", + "third": "#918AE9", + "buttonBlueHover": "#1453AC", + "buttonBlueActive": "#19498B", + "textReverse": "#FFFFFF", + "footerTitle": "#A3A4B4", + "footerBg": "#E6E7ED", + "footerText": "#51575F", + "menuHover": "#F6F4FF", + "menuActive": "#EAE8FC", + "captionBold": "#878594", + "search": "#9C50FF" + }, + "dark": { + "primary": "#737FE4", + "secondary": "#2A4586", + "link": "#006BFF", + "text": "#EDEDED", + "background": "#131313", + "containerBackground": "#1E1E1E", + "border": "#333333", + "success": "#4CAF50", + "warning": "#FF9800", + "error": "#F44336", + "info": "#2196F3", + "base": "#000000", + "negativeBase": "#FFFFFF", + "title": "#FAFAFA", + "shadow": "#62626240", + "codeBg": "#2E303C", + "cardBg": "#28272B", + "buttonBlue": "#0867AF", + "joinBg": "#2F363E", + "third": "#737FE4", + "buttonBlueHover": "#1453AC", + "buttonBlueActive": "#19498B", + "textReverse": "#2F2F2F", + "footerTitle": "#A3A4B4", + "footerBg": "#2E303C", + "footerText": "#FFFFFF", + "menuHover": "#3C404B", + "menuActive": "#283259", + "captionBold": "#878594", + "search": "#6FA4FF" + } + }, + "typography": { + "body": [ + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontWeight": "500", + "lineHeight": "130%", + "letterSpacing": "-0.42px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "16px", + "fontWeight": "500", + "lineHeight": "150%", + "letterSpacing": "-0.48px" + } + ], + "bodyReg": { + "fontFamily": "Pretendard", + "fontSize": "16px", + "fontWeight": "400", + "lineHeight": "150%", + "letterSpacing": "-0.48px" + }, + "buttonL": [ + { + "fontFamily": "Pretendard", + "fontSize": "17px", + "fontWeight": "800", + "lineHeight": "130%", + "letterSpacing": "-0.51px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "20px", + "fontWeight": "800", + "lineHeight": "130%", + "letterSpacing": "-0.6px" + } + ], + "buttonLbold": [ + { + "fontFamily": "Pretendard", + "fontSize": "17px", + "fontWeight": "700", + "lineHeight": "130%", + "letterSpacing": "-0.51px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontWeight": "700", + "lineHeight": "130%", + "letterSpacing": "-0.54px" + } + ], + "buttonLsemiB": [ + { + "fontFamily": "Pretendard", + "fontSize": "17px", + "fontWeight": "600", + "lineHeight": "130%", + "letterSpacing": "-0.51px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontWeight": "600", + "lineHeight": "130%", + "letterSpacing": "-0.54px" + } + ], + "buttonM": [ + { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontWeight": "600", + "lineHeight": "130%", + "letterSpacing": "-0.45px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "17px", + "fontWeight": "600", + "lineHeight": "130%", + "letterSpacing": "-0.51px" + } + ], + "buttonS": [ + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontWeight": "800", + "lineHeight": "130%", + "letterSpacing": "-0.42px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontWeight": "700", + "lineHeight": "130%", + "letterSpacing": "-0.45px" + } + ], + "buttonSmid": [ + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontWeight": "500", + "lineHeight": "130%", + "letterSpacing": "-0.42px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontWeight": "500", + "lineHeight": "130%", + "letterSpacing": "-0.45px" + } + ], + "caption": { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontWeight": "500", + "lineHeight": "140%", + "letterSpacing": "-0.42px" + }, + "captionBold": { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontWeight": "700", + "lineHeight": "130%", + "letterSpacing": "-0.42px" + }, + "code": [ + { + "fontFamily": "D2Coding", + "fontSize": "13px", + "fontWeight": "700", + "lineHeight": "150%", + "letterSpacing": "-0.39px" + }, + null, + null, + null, + { + "fontFamily": "D2Coding", + "fontSize": "15px", + "fontWeight": "700", + "lineHeight": "150%", + "letterSpacing": "-0.45px" + } + ], + "footerMenu": [ + { + "fontFamily": "Pretendard", + "fontSize": "13px", + "fontWeight": "500", + "lineHeight": "140%", + "letterSpacing": "-0.39px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "14px", + "fontWeight": "500", + "lineHeight": "140%", + "letterSpacing": "-0.42px" + } + ], + "h1": [ + { + "fontFamily": "Pretendard", + "fontSize": "38px", + "fontWeight": "800", + "lineHeight": "130%", + "letterSpacing": "-1.14px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "52px", + "fontWeight": "800", + "lineHeight": "130%", + "letterSpacing": "-1.56px" + } + ], + "h2": [ + { + "fontFamily": "Pretendard", + "fontSize": "36px", + "fontWeight": "800", + "lineHeight": "130%", + "letterSpacing": "-1.08px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "48px", + "fontWeight": "800", + "lineHeight": "130%", + "letterSpacing": "-1.44px" + } + ], + "h3": [ + { + "fontFamily": "Pretendard", + "fontSize": "32px", + "fontWeight": "700", + "lineHeight": "130%", + "letterSpacing": "-0.96px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "42px", + "fontWeight": "700", + "lineHeight": "130%", + "letterSpacing": "-1.26px" + } + ], + "h4": [ + { + "fontFamily": "Pretendard", + "fontSize": "28px", + "fontWeight": "700", + "lineHeight": "130%", + "letterSpacing": "-0.84px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "36px", + "fontWeight": "700", + "lineHeight": "130%", + "letterSpacing": "-1.08px" + } + ], + "h5": [ + { + "fontFamily": "Pretendard", + "fontSize": "24px", + "fontWeight": "600", + "lineHeight": "130%", + "letterSpacing": "-0.72px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "30px", + "fontWeight": "600", + "lineHeight": "130%", + "letterSpacing": "-0.9px" + } + ], + "h6": [ + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontWeight": "600", + "lineHeight": "130%", + "letterSpacing": "-0.54px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "24px", + "fontWeight": "600", + "lineHeight": "130%", + "letterSpacing": "-0.72px" + } + ], + "h6Reg": [ + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontWeight": "400", + "lineHeight": "130%", + "letterSpacing": "-0.54px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "24px", + "fontWeight": "400", + "lineHeight": "130%", + "letterSpacing": "-0.72px" + } + ], + "small": [ + { + "fontFamily": "Pretendard", + "fontSize": "11px", + "fontWeight": "300", + "lineHeight": "130%", + "letterSpacing": "-0.33px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "12px", + "fontWeight": "400", + "lineHeight": "140%", + "letterSpacing": "-0.36px" + } + ], + "smallBold": { + "fontFamily": "Pretendard", + "fontSize": "12px", + "fontWeight": "800", + "lineHeight": "140%", + "letterSpacing": "-0.36px" + }, + "textL": [ + { + "fontFamily": "Pretendard", + "fontSize": "16px", + "fontWeight": "500", + "lineHeight": "130%", + "letterSpacing": "-0.48px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "18px", + "fontWeight": "500", + "lineHeight": "150%", + "letterSpacing": "-0.54px" + } + ], + "textS": [ + { + "fontFamily": "Pretendard", + "fontSize": "13px", + "fontWeight": "500", + "lineHeight": "140%", + "letterSpacing": "-0.39px" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontWeight": "500", + "lineHeight": "140%", + "letterSpacing": "-0.45px" + } + ], + "textSbold": { + "fontFamily": "Pretendard", + "fontSize": "15px", + "fontWeight": "700", + "lineHeight": "140%", + "letterSpacing": "-0.45px" + } + } + } +} + diff --git a/apps/landing/next.config.ts b/apps/landing/next.config.ts new file mode 100644 index 00000000..b558310e --- /dev/null +++ b/apps/landing/next.config.ts @@ -0,0 +1,14 @@ +import { DevupUI } from '@devup-ui/next-plugin' +import createMDX from '@next/mdx' + +const withMDX = createMDX({}) + +export default withMDX( + DevupUI( + { + pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], + output: 'export', + }, + {}, + ), +) diff --git a/apps/landing/package.json b/apps/landing/package.json new file mode 100644 index 00000000..f8b8ab0e --- /dev/null +++ b/apps/landing/package.json @@ -0,0 +1,32 @@ +{ + "name": "landing", + "version": "0.1.0", + "type": "module", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "@devup-ui/react": "workspace:*", + "@mdx-js/loader": "^3.1.0", + "@mdx-js/react": "^3.1.0", + "@next/mdx": "^15.1.4", + "@types/mdx": "^2.0.13", + "next": "^15.1.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-syntax-highlighter": "^15.6.1", + "sanitize.css": "^13.0.0" + }, + "devDependencies": { + "@devup-ui/next-plugin": "workspace:*", + "@types/node": "^22", + "@types/react": "^19", + "@types/react-dom": "^19", + "@types/react-syntax-highlighter": "^15.5.13", + "typescript": "^5" + } +} diff --git a/apps/landing/public/arrow.svg b/apps/landing/public/arrow.svg new file mode 100644 index 00000000..a5204f63 --- /dev/null +++ b/apps/landing/public/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/landing/public/discord-bg.svg b/apps/landing/public/discord-bg.svg new file mode 100644 index 00000000..1d00a40c --- /dev/null +++ b/apps/landing/public/discord-bg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/apps/landing/public/discord.svg b/apps/landing/public/discord.svg new file mode 100644 index 00000000..b1488812 --- /dev/null +++ b/apps/landing/public/discord.svg @@ -0,0 +1,4 @@ + + + diff --git a/apps/landing/public/file.svg b/apps/landing/public/file.svg new file mode 100644 index 00000000..004145cd --- /dev/null +++ b/apps/landing/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/landing/public/github.svg b/apps/landing/public/github.svg new file mode 100644 index 00000000..8fe7a020 --- /dev/null +++ b/apps/landing/public/github.svg @@ -0,0 +1,4 @@ + + + diff --git a/apps/landing/public/globe.svg b/apps/landing/public/globe.svg new file mode 100644 index 00000000..567f17b0 --- /dev/null +++ b/apps/landing/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/landing/public/heart.svg b/apps/landing/public/heart.svg new file mode 100644 index 00000000..e423a10b --- /dev/null +++ b/apps/landing/public/heart.svg @@ -0,0 +1,4 @@ + + + diff --git a/apps/landing/public/icon.svg b/apps/landing/public/icon.svg new file mode 100644 index 00000000..3a7b4064 --- /dev/null +++ b/apps/landing/public/icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/landing/public/idea.svg b/apps/landing/public/idea.svg new file mode 100644 index 00000000..6eff0dbf --- /dev/null +++ b/apps/landing/public/idea.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/apps/landing/public/light.svg b/apps/landing/public/light.svg new file mode 100644 index 00000000..289dcb98 --- /dev/null +++ b/apps/landing/public/light.svg @@ -0,0 +1,5 @@ + + + diff --git a/apps/landing/public/logo.svg b/apps/landing/public/logo.svg new file mode 100644 index 00000000..374efa91 --- /dev/null +++ b/apps/landing/public/logo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/landing/public/next.svg b/apps/landing/public/next.svg new file mode 100644 index 00000000..5174b28c --- /dev/null +++ b/apps/landing/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/landing/public/notice.svg b/apps/landing/public/notice.svg new file mode 100644 index 00000000..dae4ce65 --- /dev/null +++ b/apps/landing/public/notice.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/apps/landing/public/outlink.svg b/apps/landing/public/outlink.svg new file mode 100644 index 00000000..89642afc --- /dev/null +++ b/apps/landing/public/outlink.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/landing/public/trophy.svg b/apps/landing/public/trophy.svg new file mode 100644 index 00000000..bed741d9 --- /dev/null +++ b/apps/landing/public/trophy.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/apps/landing/public/vercel.svg b/apps/landing/public/vercel.svg new file mode 100644 index 00000000..77053960 --- /dev/null +++ b/apps/landing/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/landing/public/white-logo.svg b/apps/landing/public/white-logo.svg new file mode 100644 index 00000000..335c28b7 --- /dev/null +++ b/apps/landing/public/white-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/apps/landing/public/window.svg b/apps/landing/public/window.svg new file mode 100644 index 00000000..b2b2a44f --- /dev/null +++ b/apps/landing/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/landing/src/app/(detail)/LeftMenu.tsx b/apps/landing/src/app/(detail)/LeftMenu.tsx new file mode 100644 index 00000000..7363eb74 --- /dev/null +++ b/apps/landing/src/app/(detail)/LeftMenu.tsx @@ -0,0 +1,109 @@ +import { Box, Flex, Image, Text, VStack } from '@devup-ui/react' + +export function LeftMenu() { + return ( + + + + 개요 + + + + + + 설치 + + + + + 개념 + + + + + + + + + 유틸리티 퍼스트 + + + + + 하이브리드 접근 방식 + + + + + 헤드리스 컴포넌트 + + + + + + + 구성 요소 + + + + + + API + + + + + + + + + 스타일이 지정됨 + + + + + CSS + + + + + + + 테마 + + + + + + + + + 테마 사용자 정의 + + + + + 테마 토큰 + + + + + 중단점 + + + + + 구성 요소 테마 + + + + + + ) +} diff --git a/apps/landing/src/app/(detail)/layout.tsx b/apps/landing/src/app/(detail)/layout.tsx new file mode 100644 index 00000000..34d2f3bd --- /dev/null +++ b/apps/landing/src/app/(detail)/layout.tsx @@ -0,0 +1,22 @@ +import 'sanitize.css' + +import { Flex } from '@devup-ui/react' + +import { DetailHeader } from '../../components/DetailHeader' +import { LeftMenu } from './LeftMenu' + +export default function DetailLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + <> + + + + {children} + + + ) +} diff --git a/apps/landing/src/app/favicon.ico b/apps/landing/src/app/favicon.ico new file mode 100644 index 00000000..718d6fea Binary files /dev/null and b/apps/landing/src/app/favicon.ico differ diff --git a/apps/landing/src/app/layout.tsx b/apps/landing/src/app/layout.tsx new file mode 100644 index 00000000..80543566 --- /dev/null +++ b/apps/landing/src/app/layout.tsx @@ -0,0 +1,25 @@ +import 'sanitize.css' + +import type { Metadata } from 'next' + +import { Footer } from '../components/Footer' + +export const metadata: Metadata = { + title: 'Devup UI', + description: 'Zero Config, Zero FOUC, Zero Runtime, CSS in JS Preprocessor', +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + + {children} +