λ°°ν¬ μ¬μ΄νΈ: https://www.workroot.life
- WorkRoot μκ°: π³ "μΌ"μ ν΅ν΄ μμ μ λΏλ¦¬λ₯Ό λ΄λ¦¬λ©° "μ±μ₯"νλ ꡬμΈκ΅¬μ§ μ¬μ΄νΈ
- κ°λ° κΈ°κ°: 2024. 11. 21 ~ 2024. 12. 30
- κ°λ° μΈμ: 4λͺ
κΉμ | κΉμμ§ | κΉνμ€ | νμλ¦Ό |
---|---|---|---|
cccwon2 | yyezzzy | imtaejunk | hongggyelim |
- μν
- κΉμ: νμ₯, λ ν¬μ§ν 리 μΈν , λ‘κ·ΈμΈ/νμκ°μ , λ§μ΄νμ΄μ§, κ³΅κ³ λͺ©λ‘ νμ΄μ§, κ²μν λͺ©λ‘ νμ΄μ§, κ³΅κ³ μΉ΄λ μ»΄ν¬λνΈ, λͺ¨λ¬ μ»΄ν¬λνΈ, SEO μ€μ , μ§λ API μ°λ, Supabase μ°λ, νμλ‘ μμ±
- κΉμμ§: μμ λ‘κ·ΈμΈ/νμκ°μ , μλ°νΌ μμΈνμ΄μ§, λ‘κ³ , λλ©νμ΄μ§ λμμΈ λ° κΈ°ν, κ³΅ν΅ λ²νΌ μ»΄ν¬λνΈ, μ€ν λ¦¬λΆ μΈν , ν¬λ‘λ§€ν± λ°°ν¬ μΈν
- κΉνμ€: λλ© νμ΄μ§, κ²μν μμΈ νμ΄μ§, κ²μν μΉ΄λ μ»΄ν¬λνΈ, μ μ μλ¬ νμ΄μ§, 404 νμ΄μ§
- νμλ¦Ό: κ³΅κ³ μμ± νμ΄μ§, κ³΅κ³ μμ νμ΄μ§, κ³΅ν΅ μΈν μ»΄ν¬λνΈ, λ°μ΄ν°νΌμ»€ 컀μ€ν , λ§μ°μ€ 컀μ 컀μ€ν , κΉν μ‘μ CI μΈν
{
"extends": [
"next",
"next/core-web-vitals",
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended",
"prettier"
],
"plugins": ["@typescript-eslint", "prettier"],
"parser": "@typescript-eslint/parser",
"rules": {
"import/no-anonymous-default-export": "off",
"@typescript-eslint/no-explicit-any": "off",
"prettier/prettier": [
"error",
{
"endOfLine": "lf"
}
],
"linebreak-style": ["error", "unix"],
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "warn"
}
}
{
"printWidth": 120, // ν μ€μ μ΅λ κΈΈμ΄λ₯Ό 120μλ‘ μ ν
"tabWidth": 2, // λ€μ¬μ°κΈ° μ μ¬μ©ν 곡백 λ¬Έμ μ
"useTabs": false, // ν λ¬Έμ λμ 곡백 λ¬Έμ μ¬μ©
"semi": true, // λ¬Έμ₯ λμ μΈλ―Έμ½λ‘ μΆκ°
"singleQuote": false, // λ¬Έμμ΄μ μμλ°μ΄ν λμ ν°λ°μ΄ν μ¬μ©
"quoteProps": "as-needed", // κ°μ²΄ μμ±μ λ°μ΄ν μ¬μ© λ°©μ (νμν κ²½μ°μλ§ μ¬μ©)
"trailingComma": "es5", // κ°μ²΄, λ°°μ΄ λ±μ λ§μ§λ§ νλͺ© λ€μ μΌν μΆκ°
"bracketSpacing": true, // κ°μ²΄ 리ν°λ΄μ κ΄νΈ μ¬μ΄μ 곡백 μΆκ°
"arrowParens": "always", // νμ΄ν ν¨μμ λ§€κ°λ³μλ₯Ό νμ κ΄νΈλ‘ κ°μΈκΈ°
"proseWrap": "preserve", // λ§ν¬λ€μ΄ ν
μ€νΈμ μ€λ°κΏ μ²λ¦¬ λ°©μ
"endOfLine": "lf", // μ€ λ λ¬Έμλ₯Ό LF(Line Feed)λ‘ ν΅μΌ
"plugins": [
"prettier-plugin-tailwindcss" // Tailwind CSS ν΄λμ€ μλ μ λ ¬ νλ¬κ·ΈμΈ
]
}
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
"./stories/**/*.{js,ts,jsx,tsx}",
"./src/app/globals.css",
"./src/stories/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
colors: {
foreground: "var(--foreground)",
black: {
100: "#6B6B6B",
200: "#525252",
300: "#373737",
400: "#1F1F1F",
500: "#040404",
},
grayscale: {
50: "#FFFFFF",
100: "#DEDEDE",
200: "#C4C4C4",
300: "#ABABAB",
400: "#999999",
500: "#808080",
},
primary: {
orange: {
50: "#fbfffd",
100: "#8ab08c",
200: "#64a466",
300: "#388e3c",
400: "#156719",
},
blue: {
100: "#535779",
200: "#3E415B",
300: "#2A2C3D",
},
},
background: {
100: "#FCFCFC",
200: "#F7F7F7",
300: "#EFEFEF",
},
line: {
100: "#F2F2F2",
200: "#E6E6E6",
},
state: {
error: "#FC4100",
},
},
fontFamily: {
nexon: ["var(--font-nexon)", "sans-serif"],
hakgyo: ["var(--font-hakgyo)", "sans-serif"],
sans: ["Pretendard", "sans-serif"],
},
},
},
};
export default config;
- μ μ₯μ ν΄λ‘ :
git clone [repository-url]
- νκ²½ λ³μ μ€μ : νλ‘μ νΈ λ£¨νΈμ .env νμΌμ μμ±νκ³ λ€μ λ΄μ©μ μΆκ°ν©λλ€:
# ν΄λΌμ΄μΈνΈ μ¬μ΄λ
NEXT_PUBLIC_API_URL=your-api-url
NEXT_PUBLIC_TEAM_ID=your-team-id
# μλ² μ¬μ΄λ
CHROMATIC_PROJECT_TOKEN=your-chromatic-project-token
# λλ©μΈ
NEXT_PUBLIC_DOMAIN_URL=your-domain-url
# ν
μ€νΈ κ³μ (μ§μμ)
NEXT_PUBLIC_TEST_APPLICANT_ID=your-test-applicant-id
NEXT_PUBLIC_TEST_APPLICANT_PASSWORD=your-test-applicant-password
# ν
μ€νΈ κ³μ (μ¬μ₯λ)
NEXT_PUBLIC_TEST_OWNER_ID=your-test-owner-id
NEXT_PUBLIC_TEST_OWNER_PASSWORD=your-test-owner-password
# νμ΄μ€λΆ
NEXT_PUBLIC_FB_APP_ID=your-facebook-app-id
# μΉ΄μΉ΄μ€λ§΅
NEXT_PUBLIC_KAKAO_APP_KEY=your-kakao-app-key
# μνλ² μ΄μ€
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
# μΉ΄μΉ΄μ€ ν΄λΌμ΄μΈνΈ μμ΄λ
NEXT_PUBLIC_KAKAO_CLIENT_ID=your-kakao-client-id
# κ΅¬κΈ ν΄λΌμ΄μΈνΈ μμ΄λ
NEXT_PUBLIC_GOOGLE_CLIENT_ID=your-google-client-id
# μ±λν‘ νλ¬κ·ΈμΈ ν€
NEXT_PUBLIC_CHANNEL_IO_PLUGIN_KEY=your-channel-io-plugin-key
# κ΅¬κΈ μ λ리ν±μ€
NEXT_PUBLIC_GA_ID=your-google-analytics-id
- μμ‘΄μ± μ€μΉ:
npm install
- κ°λ° μλ² μ€ν:
npm run dev
src/
βββ app/ # Next.js 14+ App Router
β βββ (auth)/ # μΈμ¦ κ΄λ ¨ λΌμ°νΈ (λ‘κ·ΈμΈ, νμκ°μ
)
β βββ (home)/ # ν νμ΄μ§ κ΄λ ¨ λΌμ°νΈ
β βββ (pages)/ # μ£Όμ νμ΄μ§ λΌμ°νΈ
β β βββ (workform)/ # μν¬νΌ κ΄λ ¨ νμ΄μ§
β β βββ my-workform/ # λ§μ΄ μν¬νΌ νμ΄μ§
β β βββ work-talk/ # μν¬ν‘ κ²μν νμ΄μ§
β βββ components/ # κ³΅ν΅ μ»΄ν¬λνΈ
β βββ animation/ # μ λλ©μ΄μ
μ»΄ν¬λνΈ
β βββ button/ # λ²νΌ μ»΄ν¬λνΈ
β βββ card/ # μΉ΄λ μ»΄ν¬λνΈ
β βββ chip/ # μΉ© μ»΄ν¬λνΈ
β βββ input/ # μ
λ ₯ μ»΄ν¬λνΈ
β βββ layout/ # λ μ΄μμ μ»΄ν¬λνΈ
β βββ loading-spinner/ # λ‘λ© μ€νΌλ μ»΄ν¬λνΈ
β βββ pagination/ # νμ΄μ§λ€μ΄μ
μ»΄ν¬λνΈ
βββ constants/ # μμ μ μ
βββ hooks/ # 컀μ€ν
ν
β βββ queries/ # React Query κ΄λ ¨ ν
βββ lib/ # μ νΈλ¦¬ν° ν¨μ
βββ schemas/ # Zod μ€ν€λ§ μ μ
βββ store/ # μν κ΄λ¦¬ (Zustand)
βββ types/ # TypeScript νμ
μ μ
βββ utils/ # μ νΈλ¦¬ν° ν¨μ
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€λ₯Ό λ°λ¦ λλ€.