@nextlevel_korea/design-system 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,216 @@
1
+ # @nextlevel/design-system
2
+
3
+ TypeScript와 Tailwind CSS로 구축된 현대적인 React 디자인 시스템으로, 포괄적인 Storybook 문서화를 제공합니다.
4
+
5
+ ## 🚀 빠른 시작
6
+
7
+ ### 설치
8
+
9
+ ```bash
10
+ npm install @nextlevel/design-system
11
+ ```
12
+
13
+ ### 기본 사용법
14
+
15
+ ```tsx
16
+ import { Header } from '@nextlevel/design-system';
17
+ import '@nextlevel/design-system/styles';
18
+
19
+ function App() {
20
+ return (
21
+ <div>
22
+ <Header logo="https://your-logo-url.com/logo.png" />
23
+ </div>
24
+ );
25
+ }
26
+ ```
27
+
28
+ ## 📖 Storybook 문서
29
+
30
+ 우리 디자인 시스템을 탐색하고 이해하는 가장 좋은 방법은 인터랙티브 Storybook 문서를 통하는 것입니다.
31
+
32
+ ### 로컬에서 Storybook 실행하기
33
+
34
+ 컴포넌트를 탐색하기 위해 로컬에서 Storybook을 실행하려면:
35
+
36
+ ```bash
37
+ # 저장소 클론
38
+ git clone https://github.com/NextLevel-KR/design-system.git
39
+ cd design-system
40
+
41
+ # 의존성 설치
42
+ npm install
43
+
44
+ # Storybook 시작
45
+ npm run storybook
46
+ ```
47
+
48
+ 그런 다음 브라우저에서 [http://localhost:6006](http://localhost:6006)을 열어보세요.
49
+
50
+ ### Storybook에서 찾을 수 있는 것들
51
+
52
+ 우리 Storybook에는 다음이 포함됩니다:
53
+
54
+ - **📚 인터랙티브 문서** - 모든 컴포넌트의 실시간 예제
55
+ - **🎛️ 컨트롤 패널** - 실시간으로 컴포넌트 props 수정
56
+ - **📱 반응형 테스트** - 다양한 화면 크기에서 컴포넌트 테스트
57
+ - **🌙 다크/라이트 모드** - 테마 간 전환
58
+ - **♿ 접근성 테스트** - 내장된 a11y 검사
59
+ - **📋 코드 예제** - 복사-붙여넣기 가능한 코드 스니펫
60
+
61
+ ## 🧩 컴포넌트
62
+
63
+ ### Header
64
+
65
+ 커스터마이징 가능한 로고가 있는 유연한 헤더 컴포넌트입니다.
66
+
67
+ ```tsx
68
+ import { Header } from '@nextlevel/design-system';
69
+
70
+ // 기본 사용법
71
+ <Header logo="https://example.com/logo.png" />;
72
+ ```
73
+
74
+ **Props:**
75
+
76
+ - `logo` (string) - 로고 이미지 URL
77
+
78
+ **Storybook 예제:**
79
+
80
+ - 플레이스홀더 로고가 있는 기본 헤더
81
+ - 커스텀 브랜드 헤더
82
+ - 작은 컴팩트 헤더
83
+
84
+ ## 🛠️ 개발
85
+
86
+ ### 사전 요구사항
87
+
88
+ - Node.js 22+
89
+ - npm 또는 yarn
90
+
91
+ ### 설정
92
+
93
+ ```bash
94
+ # 의존성 설치
95
+ npm install
96
+
97
+ # 개발 서버 시작
98
+ npm run dev
99
+
100
+ # Storybook 시작
101
+ npm run storybook
102
+
103
+ # 라이브러리 빌드
104
+ npm run build:lib
105
+
106
+ # Storybook 빌드
107
+ npm run build-storybook
108
+ ```
109
+
110
+ ### 프로젝트 구조
111
+
112
+ ```
113
+ src/
114
+ ├── components/ # React 컴포넌트
115
+ │ ├── Header.tsx # Header 컴포넌트
116
+ │ └── Header.stories.tsx # Header Storybook 스토리
117
+ ├── utils/ # 유틸리티 함수
118
+ ├── index.ts # 메인 export 파일
119
+ └── index.css # 전역 스타일
120
+ ```
121
+
122
+ ### 새 컴포넌트 추가하기
123
+
124
+ 1. **컴포넌트 생성** `src/components/`에
125
+ 2. **Storybook 스토리 추가** 같은 이름 + `.stories.tsx`
126
+ 3. **컴포넌트 export** `src/index.ts`에서
127
+ 4. **Storybook에서 문서화** 예제와 컨트롤 포함
128
+
129
+ 예제:
130
+
131
+ ```tsx
132
+ // src/components/Button.tsx
133
+ export interface ButtonProps {
134
+ variant?: 'primary' | 'secondary';
135
+ children: React.ReactNode;
136
+ }
137
+
138
+ export const Button = ({ variant = 'primary', children }: ButtonProps) => {
139
+ return <button className={`btn btn-${variant}`}>{children}</button>;
140
+ };
141
+ ```
142
+
143
+ ```tsx
144
+ // src/components/Button.stories.tsx
145
+ import type { Meta, StoryObj } from '@storybook/react';
146
+ import { Button } from './Button';
147
+
148
+ const meta: Meta<typeof Button> = {
149
+ title: 'Components/Button',
150
+ component: Button,
151
+ argTypes: {
152
+ variant: {
153
+ control: 'select',
154
+ options: ['primary', 'secondary'],
155
+ },
156
+ },
157
+ };
158
+
159
+ export default meta;
160
+ type Story = StoryObj<typeof meta>;
161
+
162
+ export const Primary: Story = {
163
+ args: {
164
+ variant: 'primary',
165
+ children: 'Primary Button',
166
+ },
167
+ };
168
+ ```
169
+
170
+ ## 🎨 디자인 시스템 특징
171
+
172
+ - **TypeScript 우선** - 완전한 타입 안전성과 IntelliSense 지원
173
+ - **Tailwind CSS** - 유틸리티 우선 CSS 프레임워크
174
+ - **반응형 디자인** - 모바일 우선 접근법
175
+ - **접근성** - WCAG 2.1 준수 컴포넌트
176
+ - **커스터마이징 가능** - 쉬운 테마링과 커스터마이징
177
+
178
+ ## 📚 Storybook 애드온
179
+
180
+ 우리 Storybook은 다음으로 구성되어 있습니다:
181
+
182
+ - **@storybook/addon-docs** - 자동 문서 생성
183
+ - **@storybook/addon-controls** - 인터랙티브 prop 컨트롤
184
+ - **@storybook/addon-backgrounds** - 배경 전환
185
+ - **@storybook/addon-viewport** - 반응형 테스트
186
+
187
+ ## 🤝 기여하기
188
+
189
+ 1. 저장소를 포크하세요
190
+ 2. 기능 브랜치를 만드세요
191
+ 3. Storybook 스토리와 함께 컴포넌트를 추가하세요
192
+ 4. Storybook에서 테스트하세요
193
+ 5. 풀 리퀘스트를 제출하세요
194
+
195
+ ### Storybook 가이드라인
196
+
197
+ - 각 컴포넌트는 포괄적인 스토리를 가져야 합니다
198
+ - 여러 변형과 상태를 포함하세요
199
+ - 모든 props에 적절한 argTypes를 추가하세요
200
+ - 접근성 테스트를 포함하세요
201
+ - 명확한 문서를 제공하세요
202
+
203
+ ## 📄 라이선스
204
+
205
+ MIT 라이선스 - 자세한 내용은 [LICENSE](LICENSE) 파일을 참조하세요.
206
+
207
+ ## 🔗 링크
208
+
209
+ - [Storybook 문서](https://storybook.js.org/)
210
+ - [Tailwind CSS](https://tailwindcss.com/)
211
+ - [React](https://reactjs.org/)
212
+ - [TypeScript](https://www.typescriptlang.org/)
213
+
214
+ ---
215
+
216
+ NextLevel 팀이 ❤️로 만들었습니다
package/dist/index.cjs ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const ee=require("react");var P={exports:{}},R={};/**
2
+ * @license React
3
+ * react-jsx-runtime.production.js
4
+ *
5
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */var F;function re(){if(F)return R;F=1;var s=Symbol.for("react.transitional.element"),i=Symbol.for("react.fragment");function d(m,a,u){var E=null;if(u!==void 0&&(E=""+u),a.key!==void 0&&(E=""+a.key),"key"in a){u={};for(var b in a)b!=="key"&&(u[b]=a[b])}else u=a;return a=u.ref,{$$typeof:s,type:m,key:E,ref:a!==void 0?a:null,props:u}}return R.Fragment=i,R.jsx=d,R.jsxs=d,R}var _={};/**
10
+ * @license React
11
+ * react-jsx-runtime.development.js
12
+ *
13
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
14
+ *
15
+ * This source code is licensed under the MIT license found in the
16
+ * LICENSE file in the root directory of this source tree.
17
+ */var D;function te(){return D||(D=1,process.env.NODE_ENV!=="production"&&function(){function s(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===Z?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case T:return"Fragment";case q:return"Profiler";case U:return"StrictMode";case J:return"Suspense";case X:return"SuspenseList";case B:return"Activity"}if(typeof e=="object")switch(typeof e.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),e.$$typeof){case W:return"Portal";case V:return(e.displayName||"Context")+".Provider";case z:return(e._context.displayName||"Context")+".Consumer";case G:var r=e.render;return e=e.displayName,e||(e=r.displayName||r.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case H:return r=e.displayName||null,r!==null?r:s(e.type)||"Memo";case x:r=e._payload,e=e._init;try{return s(e(r))}catch{}}return null}function i(e){return""+e}function d(e){try{i(e);var r=!1}catch{r=!0}if(r){r=console;var t=r.error,n=typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object";return t.call(r,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",n),i(e)}}function m(e){if(e===T)return"<>";if(typeof e=="object"&&e!==null&&e.$$typeof===x)return"<...>";try{var r=s(e);return r?"<"+r+">":"<...>"}catch{return"<...>"}}function a(){var e=p.A;return e===null?null:e.getOwner()}function u(){return Error("react-stack-top-frame")}function E(e){if(y.call(e,"key")){var r=Object.getOwnPropertyDescriptor(e,"key").get;if(r&&r.isReactWarning)return!1}return e.key!==void 0}function b(e,r){function t(){N||(N=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",r))}t.isReactWarning=!0,Object.defineProperty(e,"key",{get:t,configurable:!0})}function M(){var e=s(this.type);return C[e]||(C[e]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),e=this.props.ref,e!==void 0?e:null}function L(e,r,t,n,l,c,O,S){return t=c.ref,e={$$typeof:h,type:e,key:r,props:c,_owner:l},(t!==void 0?t:null)!==null?Object.defineProperty(e,"ref",{enumerable:!1,get:M}):Object.defineProperty(e,"ref",{enumerable:!1,value:null}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:O}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:S}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function g(e,r,t,n,l,c,O,S){var o=r.children;if(o!==void 0)if(n)if(Q(o)){for(n=0;n<o.length;n++)w(o[n]);Object.freeze&&Object.freeze(o)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else w(o);if(y.call(r,"key")){o=s(e);var f=Object.keys(r).filter(function(K){return K!=="key"});n=0<f.length?"{key: someKey, "+f.join(": ..., ")+": ...}":"{key: someKey}",$[o+n]||(f=0<f.length?"{"+f.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
18
+ let props = %s;
19
+ <%s {...props} />
20
+ React keys must be passed directly to JSX without using spread:
21
+ let props = %s;
22
+ <%s key={someKey} {...props} />`,n,o,f,o),$[o+n]=!0)}if(o=null,t!==void 0&&(d(t),o=""+t),E(r)&&(d(r.key),o=""+r.key),"key"in r){t={};for(var A in r)A!=="key"&&(t[A]=r[A])}else t=r;return o&&b(t,typeof e=="function"?e.displayName||e.name||"Unknown":e),L(e,o,c,l,a(),t,O,S)}function w(e){typeof e=="object"&&e!==null&&e.$$typeof===h&&e._store&&(e._store.validated=1)}var v=ee,h=Symbol.for("react.transitional.element"),W=Symbol.for("react.portal"),T=Symbol.for("react.fragment"),U=Symbol.for("react.strict_mode"),q=Symbol.for("react.profiler"),z=Symbol.for("react.consumer"),V=Symbol.for("react.context"),G=Symbol.for("react.forward_ref"),J=Symbol.for("react.suspense"),X=Symbol.for("react.suspense_list"),H=Symbol.for("react.memo"),x=Symbol.for("react.lazy"),B=Symbol.for("react.activity"),Z=Symbol.for("react.client.reference"),p=v.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,y=Object.prototype.hasOwnProperty,Q=Array.isArray,k=console.createTask?console.createTask:function(){return null};v={"react-stack-bottom-frame":function(e){return e()}};var N,C={},Y=v["react-stack-bottom-frame"].bind(v,u)(),I=k(m(u)),$={};_.Fragment=T,_.jsx=function(e,r,t,n,l){var c=1e4>p.recentlyCreatedOwnerStacks++;return g(e,r,t,!1,n,l,c?Error("react-stack-top-frame"):Y,c?k(m(e)):I)},_.jsxs=function(e,r,t,n,l){var c=1e4>p.recentlyCreatedOwnerStacks++;return g(e,r,t,!0,n,l,c?Error("react-stack-top-frame"):Y,c?k(m(e)):I)}}()),_}process.env.NODE_ENV==="production"?P.exports=re():P.exports=te();var j=P.exports;const ne=({logo:s,title:i})=>j.jsxs("header",{children:[s&&j.jsx("img",{src:s,alt:"logo"}),i&&j.jsx("h1",{children:i})]});exports.Header=ne;
package/dist/index.js ADDED
@@ -0,0 +1,285 @@
1
+ import ee from "react";
2
+ var P = { exports: {} }, R = {};
3
+ /**
4
+ * @license React
5
+ * react-jsx-runtime.production.js
6
+ *
7
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
8
+ *
9
+ * This source code is licensed under the MIT license found in the
10
+ * LICENSE file in the root directory of this source tree.
11
+ */
12
+ var F;
13
+ function re() {
14
+ if (F) return R;
15
+ F = 1;
16
+ var s = Symbol.for("react.transitional.element"), i = Symbol.for("react.fragment");
17
+ function d(m, a, c) {
18
+ var E = null;
19
+ if (c !== void 0 && (E = "" + c), a.key !== void 0 && (E = "" + a.key), "key" in a) {
20
+ c = {};
21
+ for (var b in a)
22
+ b !== "key" && (c[b] = a[b]);
23
+ } else c = a;
24
+ return a = c.ref, {
25
+ $$typeof: s,
26
+ type: m,
27
+ key: E,
28
+ ref: a !== void 0 ? a : null,
29
+ props: c
30
+ };
31
+ }
32
+ return R.Fragment = i, R.jsx = d, R.jsxs = d, R;
33
+ }
34
+ var _ = {};
35
+ /**
36
+ * @license React
37
+ * react-jsx-runtime.development.js
38
+ *
39
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
40
+ *
41
+ * This source code is licensed under the MIT license found in the
42
+ * LICENSE file in the root directory of this source tree.
43
+ */
44
+ var D;
45
+ function te() {
46
+ return D || (D = 1, process.env.NODE_ENV !== "production" && function() {
47
+ function s(e) {
48
+ if (e == null) return null;
49
+ if (typeof e == "function")
50
+ return e.$$typeof === Z ? null : e.displayName || e.name || null;
51
+ if (typeof e == "string") return e;
52
+ switch (e) {
53
+ case T:
54
+ return "Fragment";
55
+ case z:
56
+ return "Profiler";
57
+ case U:
58
+ return "StrictMode";
59
+ case J:
60
+ return "Suspense";
61
+ case X:
62
+ return "SuspenseList";
63
+ case B:
64
+ return "Activity";
65
+ }
66
+ if (typeof e == "object")
67
+ switch (typeof e.tag == "number" && console.error(
68
+ "Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."
69
+ ), e.$$typeof) {
70
+ case W:
71
+ return "Portal";
72
+ case q:
73
+ return (e.displayName || "Context") + ".Provider";
74
+ case V:
75
+ return (e._context.displayName || "Context") + ".Consumer";
76
+ case G:
77
+ var r = e.render;
78
+ return e = e.displayName, e || (e = r.displayName || r.name || "", e = e !== "" ? "ForwardRef(" + e + ")" : "ForwardRef"), e;
79
+ case H:
80
+ return r = e.displayName || null, r !== null ? r : s(e.type) || "Memo";
81
+ case g:
82
+ r = e._payload, e = e._init;
83
+ try {
84
+ return s(e(r));
85
+ } catch {
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+ function i(e) {
91
+ return "" + e;
92
+ }
93
+ function d(e) {
94
+ try {
95
+ i(e);
96
+ var r = !1;
97
+ } catch {
98
+ r = !0;
99
+ }
100
+ if (r) {
101
+ r = console;
102
+ var t = r.error, n = typeof Symbol == "function" && Symbol.toStringTag && e[Symbol.toStringTag] || e.constructor.name || "Object";
103
+ return t.call(
104
+ r,
105
+ "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",
106
+ n
107
+ ), i(e);
108
+ }
109
+ }
110
+ function m(e) {
111
+ if (e === T) return "<>";
112
+ if (typeof e == "object" && e !== null && e.$$typeof === g)
113
+ return "<...>";
114
+ try {
115
+ var r = s(e);
116
+ return r ? "<" + r + ">" : "<...>";
117
+ } catch {
118
+ return "<...>";
119
+ }
120
+ }
121
+ function a() {
122
+ var e = p.A;
123
+ return e === null ? null : e.getOwner();
124
+ }
125
+ function c() {
126
+ return Error("react-stack-top-frame");
127
+ }
128
+ function E(e) {
129
+ if (y.call(e, "key")) {
130
+ var r = Object.getOwnPropertyDescriptor(e, "key").get;
131
+ if (r && r.isReactWarning) return !1;
132
+ }
133
+ return e.key !== void 0;
134
+ }
135
+ function b(e, r) {
136
+ function t() {
137
+ N || (N = !0, console.error(
138
+ "%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",
139
+ r
140
+ ));
141
+ }
142
+ t.isReactWarning = !0, Object.defineProperty(e, "key", {
143
+ get: t,
144
+ configurable: !0
145
+ });
146
+ }
147
+ function L() {
148
+ var e = s(this.type);
149
+ return C[e] || (C[e] = !0, console.error(
150
+ "Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release."
151
+ )), e = this.props.ref, e !== void 0 ? e : null;
152
+ }
153
+ function M(e, r, t, n, l, u, O, A) {
154
+ return t = u.ref, e = {
155
+ $$typeof: x,
156
+ type: e,
157
+ key: r,
158
+ props: u,
159
+ _owner: l
160
+ }, (t !== void 0 ? t : null) !== null ? Object.defineProperty(e, "ref", {
161
+ enumerable: !1,
162
+ get: L
163
+ }) : Object.defineProperty(e, "ref", { enumerable: !1, value: null }), e._store = {}, Object.defineProperty(e._store, "validated", {
164
+ configurable: !1,
165
+ enumerable: !1,
166
+ writable: !0,
167
+ value: 0
168
+ }), Object.defineProperty(e, "_debugInfo", {
169
+ configurable: !1,
170
+ enumerable: !1,
171
+ writable: !0,
172
+ value: null
173
+ }), Object.defineProperty(e, "_debugStack", {
174
+ configurable: !1,
175
+ enumerable: !1,
176
+ writable: !0,
177
+ value: O
178
+ }), Object.defineProperty(e, "_debugTask", {
179
+ configurable: !1,
180
+ enumerable: !1,
181
+ writable: !0,
182
+ value: A
183
+ }), Object.freeze && (Object.freeze(e.props), Object.freeze(e)), e;
184
+ }
185
+ function w(e, r, t, n, l, u, O, A) {
186
+ var o = r.children;
187
+ if (o !== void 0)
188
+ if (n)
189
+ if (Q(o)) {
190
+ for (n = 0; n < o.length; n++)
191
+ h(o[n]);
192
+ Object.freeze && Object.freeze(o);
193
+ } else
194
+ console.error(
195
+ "React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead."
196
+ );
197
+ else h(o);
198
+ if (y.call(r, "key")) {
199
+ o = s(e);
200
+ var f = Object.keys(r).filter(function(K) {
201
+ return K !== "key";
202
+ });
203
+ n = 0 < f.length ? "{key: someKey, " + f.join(": ..., ") + ": ...}" : "{key: someKey}", $[o + n] || (f = 0 < f.length ? "{" + f.join(": ..., ") + ": ...}" : "{}", console.error(
204
+ `A props object containing a "key" prop is being spread into JSX:
205
+ let props = %s;
206
+ <%s {...props} />
207
+ React keys must be passed directly to JSX without using spread:
208
+ let props = %s;
209
+ <%s key={someKey} {...props} />`,
210
+ n,
211
+ o,
212
+ f,
213
+ o
214
+ ), $[o + n] = !0);
215
+ }
216
+ if (o = null, t !== void 0 && (d(t), o = "" + t), E(r) && (d(r.key), o = "" + r.key), "key" in r) {
217
+ t = {};
218
+ for (var S in r)
219
+ S !== "key" && (t[S] = r[S]);
220
+ } else t = r;
221
+ return o && b(
222
+ t,
223
+ typeof e == "function" ? e.displayName || e.name || "Unknown" : e
224
+ ), M(
225
+ e,
226
+ o,
227
+ u,
228
+ l,
229
+ a(),
230
+ t,
231
+ O,
232
+ A
233
+ );
234
+ }
235
+ function h(e) {
236
+ typeof e == "object" && e !== null && e.$$typeof === x && e._store && (e._store.validated = 1);
237
+ }
238
+ var v = ee, x = Symbol.for("react.transitional.element"), W = Symbol.for("react.portal"), T = Symbol.for("react.fragment"), U = Symbol.for("react.strict_mode"), z = Symbol.for("react.profiler"), V = Symbol.for("react.consumer"), q = Symbol.for("react.context"), G = Symbol.for("react.forward_ref"), J = Symbol.for("react.suspense"), X = Symbol.for("react.suspense_list"), H = Symbol.for("react.memo"), g = Symbol.for("react.lazy"), B = Symbol.for("react.activity"), Z = Symbol.for("react.client.reference"), p = v.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, y = Object.prototype.hasOwnProperty, Q = Array.isArray, k = console.createTask ? console.createTask : function() {
239
+ return null;
240
+ };
241
+ v = {
242
+ "react-stack-bottom-frame": function(e) {
243
+ return e();
244
+ }
245
+ };
246
+ var N, C = {}, Y = v["react-stack-bottom-frame"].bind(
247
+ v,
248
+ c
249
+ )(), I = k(m(c)), $ = {};
250
+ _.Fragment = T, _.jsx = function(e, r, t, n, l) {
251
+ var u = 1e4 > p.recentlyCreatedOwnerStacks++;
252
+ return w(
253
+ e,
254
+ r,
255
+ t,
256
+ !1,
257
+ n,
258
+ l,
259
+ u ? Error("react-stack-top-frame") : Y,
260
+ u ? k(m(e)) : I
261
+ );
262
+ }, _.jsxs = function(e, r, t, n, l) {
263
+ var u = 1e4 > p.recentlyCreatedOwnerStacks++;
264
+ return w(
265
+ e,
266
+ r,
267
+ t,
268
+ !0,
269
+ n,
270
+ l,
271
+ u ? Error("react-stack-top-frame") : Y,
272
+ u ? k(m(e)) : I
273
+ );
274
+ };
275
+ }()), _;
276
+ }
277
+ process.env.NODE_ENV === "production" ? P.exports = re() : P.exports = te();
278
+ var j = P.exports;
279
+ const oe = ({ logo: s, title: i }) => /* @__PURE__ */ j.jsxs("header", { children: [
280
+ s && /* @__PURE__ */ j.jsx("img", { src: s, alt: "logo" }),
281
+ i && /* @__PURE__ */ j.jsx("h1", { children: i })
282
+ ] });
283
+ export {
284
+ oe as Header
285
+ };
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Pretendard,ui-sans-serif,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Fira Mono,ui-monospace,SFMono-Regular,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}[type=text]:focus,input:where(:not([type])):focus,[type=email]:focus,[type=url]:focus,[type=password]:focus,[type=number]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=month]:focus,[type=search]:focus,[type=tel]:focus,[type=time]:focus,[type=week]:focus,[multiple]:focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}.text-\[36px\]{font-size:36px}.font-bold{font-weight:700}.text-success{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}
package/dist/vite.svg ADDED
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@nextlevel_korea/design-system",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "A modern React design system built with TypeScript and Tailwind CSS - The NextLevel Design System",
6
+ "keywords": [
7
+ "nextlevel"
8
+ ],
9
+ "author": "NextLevel",
10
+ "license": "MIT",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/NextLevel-KR/design-system.git"
14
+ },
15
+ "main": "./dist/index.js",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js",
22
+ "require": "./dist/index.cjs"
23
+ },
24
+ "./styles": "./dist/index.css"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md"
29
+ ],
30
+ "scripts": {
31
+ "dev": "vite",
32
+ "build": "tsc -b && vite build",
33
+ "build:lib": "tsc && vite build --config vite.lib.config.ts",
34
+ "lint": "eslint .",
35
+ "preview": "vite preview",
36
+ "tw:init": "tailwindcss init -p",
37
+ "prepublishOnly": "npm run build:lib",
38
+ "storybook": "storybook dev -p 6006",
39
+ "build-storybook": "storybook build"
40
+ },
41
+ "peerDependencies": {
42
+ "react": "^18.0.0 || ^19.0.0",
43
+ "react-dom": "^18.0.0 || ^19.0.0"
44
+ },
45
+ "dependencies": {
46
+ "clsx": "^2.1.1",
47
+ "tailwind-merge": "^3.3.1"
48
+ },
49
+ "devDependencies": {
50
+ "@eslint/js": "^9.30.1",
51
+ "@storybook/addon-docs": "^9.0.18",
52
+ "@storybook/addon-onboarding": "^9.0.18",
53
+ "@storybook/react-vite": "^9.0.18",
54
+ "@tailwindcss/forms": "^0.5.7",
55
+ "@tailwindcss/typography": "^0.5.9",
56
+ "@types/react": "^19.1.8",
57
+ "@types/react-dom": "^19.1.6",
58
+ "@vitejs/plugin-react": "^4.6.0",
59
+ "autoprefixer": "^10.4.14",
60
+ "eslint": "^9.30.1",
61
+ "eslint-plugin-react-hooks": "^5.2.0",
62
+ "eslint-plugin-react-refresh": "^0.4.20",
63
+ "eslint-plugin-storybook": "^9.0.18",
64
+ "globals": "^16.3.0",
65
+ "postcss": "^8.4.38",
66
+ "react": "^19.1.0",
67
+ "react-dom": "^19.1.0",
68
+ "storybook": "^9.0.18",
69
+ "tailwindcss": "^3.4.3",
70
+ "ts-node": "^10.9.2",
71
+ "typescript": "~5.8.3",
72
+ "typescript-eslint": "^8.35.1",
73
+ "vite": "^5.4.19"
74
+ }
75
+ }