woori-product-component 0.1.5 → 0.1.7

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 CHANGED
@@ -1,22 +1,23 @@
1
1
  # woori-product-component
2
2
 
3
- 금융 애플리케이션에서 사용할 있는 **상품 정보 카드(ProductCard) UI 컴포넌트 라이브러리**입니다.
4
- React 기반으로 설계되었으며, **디자인 시스템 토큰(CSS Variables)** 을 활용해
5
- 다양한 프로젝트 환경에서 재사용할 수 있도록 구현되었습니다.
3
+ A **ProductCard UI component library** for financial applications.
6
4
 
7
- > 패키지는 UI 컴포넌트만 제공하며,
8
- > 라우팅·데이터 패칭·비즈니스 로직에는 의존하지 않습니다.
5
+ This library is built with React and uses **design system tokens (CSS Variables)**
6
+ to enable easy reuse across different projects and environments.
7
+
8
+ > This package provides UI components only.
9
+ > It does not include routing, data fetching, or business logic.
9
10
 
10
11
  ---
11
12
 
12
13
  ## ✨ Features
13
14
 
14
- - 💳 금융 상품 요약 카드 UI (예금/적금/대출 )
15
- - 🎨 CSS 변수 기반 디자인 토큰 적용
16
- - ♻️ props 기반 재사용 가능한 컴포넌트 설계
17
- - 🧭 페이지 이동은 `href` / `onClick`으로 외부 위임
18
- - ♿ 접근성 고려 (role, tabIndex, keyboard interaction)
19
- - 🧩 React 의존 최소화 (`peerDependencies`)
15
+ - 💳 Financial product summary card UI (deposit, savings, loan, etc.)
16
+ - 🎨 CSS Variables–based design tokens
17
+ - ♻️ Reusable component design using props
18
+ - 🧭 Navigation delegated via `href` or `onClick`
19
+ - ♿ Accessibility considerations (role, tabIndex, keyboard interaction)
20
+ - 🧩 Minimal React dependencies (`peerDependencies` only)
20
21
 
21
22
  ---
22
23
 
@@ -28,9 +29,29 @@ npm install woori-product-component
28
29
  yarn add woori-product-component
29
30
  ```
30
31
 
32
+ ## Usage
33
+
34
+ ```jsx
35
+ import { ProductCard } from "woori-product-component";
36
+
37
+ <ProductCard
38
+ title="우리 첫거래우대 정기예금"
39
+ description="우리은행 첫거래 고객을 우대하는 비대면 전용 예금"
40
+ items={[
41
+ { label: "예상금리", value: "연 X.XX%" },
42
+ { label: "기간", value: "XX개월" },
43
+ { label: "금액", value: "X,XXX만원" },
44
+ { label: "예상이자", value: "최대 XXX만원", highlight: true },
45
+ ]}
46
+ tone="recommend"
47
+ eligible={true}
48
+ onClick={() => console.log("상품 클릭됨")}
49
+ />
50
+
31
51
  ## Disclaimer
32
52
 
33
53
  This project is intended for **educational and demonstration purposes only**.
34
54
 
35
55
  It is **not affiliated with, endorsed by, or sponsored by Woori Bank**.
36
56
  All product names, brands, and trademarks are the property of their respective owners.
57
+ ```
@@ -133,7 +133,7 @@ function te() {
133
133
  "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."
134
134
  )), e = this.props.ref, e !== void 0 ? e : null;
135
135
  }
136
- function b(e, r, t, a, h, g) {
136
+ function b(e, r, t, a, h, y) {
137
137
  var n = t.ref;
138
138
  return e = {
139
139
  $$typeof: S,
@@ -163,10 +163,10 @@ function te() {
163
163
  configurable: !1,
164
164
  enumerable: !1,
165
165
  writable: !0,
166
- value: g
166
+ value: y
167
167
  }), Object.freeze && (Object.freeze(e.props), Object.freeze(e)), e;
168
168
  }
169
- function A(e, r, t, a, h, g) {
169
+ function A(e, r, t, a, h, y) {
170
170
  var n = r.children;
171
171
  if (n !== void 0)
172
172
  if (a)
@@ -211,7 +211,7 @@ React keys must be passed directly to JSX without using spread:
211
211
  t,
212
212
  s(),
213
213
  h,
214
- g
214
+ y
215
215
  );
216
216
  }
217
217
  function N(e) {
@@ -220,7 +220,7 @@ React keys must be passed directly to JSX without using spread:
220
220
  function w(e) {
221
221
  return typeof e == "object" && e !== null && e.$$typeof === S;
222
222
  }
223
- var R = ee, S = /* @__PURE__ */ Symbol.for("react.transitional.element"), W = /* @__PURE__ */ Symbol.for("react.portal"), x = /* @__PURE__ */ Symbol.for("react.fragment"), U = /* @__PURE__ */ Symbol.for("react.strict_mode"), q = /* @__PURE__ */ Symbol.for("react.profiler"), J = /* @__PURE__ */ Symbol.for("react.consumer"), V = /* @__PURE__ */ Symbol.for("react.context"), z = /* @__PURE__ */ Symbol.for("react.forward_ref"), G = /* @__PURE__ */ Symbol.for("react.suspense"), X = /* @__PURE__ */ Symbol.for("react.suspense_list"), B = /* @__PURE__ */ Symbol.for("react.memo"), k = /* @__PURE__ */ Symbol.for("react.lazy"), H = /* @__PURE__ */ Symbol.for("react.activity"), Z = /* @__PURE__ */ Symbol.for("react.client.reference"), j = R.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, P = Object.prototype.hasOwnProperty, Q = Array.isArray, y = console.createTask ? console.createTask : function() {
223
+ var R = ee, S = /* @__PURE__ */ Symbol.for("react.transitional.element"), W = /* @__PURE__ */ Symbol.for("react.portal"), x = /* @__PURE__ */ Symbol.for("react.fragment"), U = /* @__PURE__ */ Symbol.for("react.strict_mode"), q = /* @__PURE__ */ Symbol.for("react.profiler"), J = /* @__PURE__ */ Symbol.for("react.consumer"), V = /* @__PURE__ */ Symbol.for("react.context"), z = /* @__PURE__ */ Symbol.for("react.forward_ref"), G = /* @__PURE__ */ Symbol.for("react.suspense"), X = /* @__PURE__ */ Symbol.for("react.suspense_list"), B = /* @__PURE__ */ Symbol.for("react.memo"), k = /* @__PURE__ */ Symbol.for("react.lazy"), H = /* @__PURE__ */ Symbol.for("react.activity"), Z = /* @__PURE__ */ Symbol.for("react.client.reference"), j = R.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, P = Object.prototype.hasOwnProperty, Q = Array.isArray, g = console.createTask ? console.createTask : function() {
224
224
  return null;
225
225
  };
226
226
  R = {
@@ -231,7 +231,7 @@ React keys must be passed directly to JSX without using spread:
231
231
  var C, Y = {}, $ = R.react_stack_bottom_frame.bind(
232
232
  R,
233
233
  l
234
- )(), I = y(_(l)), L = {};
234
+ )(), I = g(_(l)), L = {};
235
235
  v.Fragment = x, v.jsx = function(e, r, t) {
236
236
  var a = 1e4 > j.recentlyCreatedOwnerStacks++;
237
237
  return A(
@@ -240,7 +240,7 @@ React keys must be passed directly to JSX without using spread:
240
240
  t,
241
241
  !1,
242
242
  a ? Error("react-stack-top-frame") : $,
243
- a ? y(_(e)) : I
243
+ a ? g(_(e)) : I
244
244
  );
245
245
  }, v.jsxs = function(e, r, t) {
246
246
  var a = 1e4 > j.recentlyCreatedOwnerStacks++;
@@ -250,7 +250,7 @@ React keys must be passed directly to JSX without using spread:
250
250
  t,
251
251
  !0,
252
252
  a ? Error("react-stack-top-frame") : $,
253
- a ? y(_(e)) : I
253
+ a ? g(_(e)) : I
254
254
  );
255
255
  };
256
256
  })()), v;
@@ -266,7 +266,7 @@ function se({
266
266
  description: f,
267
267
  items: d = [],
268
268
  tone: _ = "default",
269
- eligible: s,
269
+ eligible: s = !0,
270
270
  onClick: l
271
271
  }) {
272
272
  const i = typeof l == "function", m = new Map(d.map((u) => [u.label, u]));
@@ -277,7 +277,7 @@ function se({
277
277
  role: i ? "button" : void 0,
278
278
  tabIndex: i ? 0 : void 0,
279
279
  onClick: i ? l : void 0,
280
- "aria-disabled": !s,
280
+ "aria-disabled": !1,
281
281
  children: [
282
282
  /* @__PURE__ */ o.jsxs("header", { className: "pc__header", children: [
283
283
  /* @__PURE__ */ o.jsx("h3", { className: "pc__title", children: c }),
@@ -4,4 +4,4 @@
4
4
  <%s {...props} />
5
5
  React keys must be passed directly to JSX without using spread:
6
6
  let props = %s;
7
- <%s key={someKey} {...props} />`,n,a,v,a),U[a+n]=!0)}if(a=null,t!==void 0&&(_(t),a=""+t),i(r)&&(_(r.key),a=""+r.key),"key"in r){t={};for(var S in r)S!=="key"&&(t[S]=r[S])}else t=r;return a&&p(t,typeof e=="function"?e.displayName||e.name||"Unknown":e),T(e,a,t,s(),j,P)}function Y(e){$(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===y&&(e._payload.status==="fulfilled"?$(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function $(e){return typeof e=="object"&&e!==null&&e.$$typeof===I}var x=E,I=Symbol.for("react.transitional.element"),X=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),B=Symbol.for("react.strict_mode"),H=Symbol.for("react.profiler"),Z=Symbol.for("react.consumer"),Q=Symbol.for("react.context"),K=Symbol.for("react.forward_ref"),ee=Symbol.for("react.suspense"),re=Symbol.for("react.suspense_list"),te=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),ne=Symbol.for("react.activity"),ae=Symbol.for("react.client.reference"),g=x.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,L=Object.prototype.hasOwnProperty,oe=Array.isArray,O=console.createTask?console.createTask:function(){return null};x={react_stack_bottom_frame:function(e){return e()}};var F,M={},W=x.react_stack_bottom_frame.bind(x,l)(),D=O(m(l)),U={};R.Fragment=k,R.jsx=function(e,r,t){var n=1e4>g.recentlyCreatedOwnerStacks++;return C(e,r,t,!1,n?Error("react-stack-top-frame"):W,n?O(m(e)):D)},R.jsxs=function(e,r,t){var n=1e4>g.recentlyCreatedOwnerStacks++;return C(e,r,t,!0,n?Error("react-stack-top-frame"):W,n?O(m(e)):D)}})()),R}var w;function V(){return w||(w=1,process.env.NODE_ENV==="production"?h.exports=q():h.exports=J()),h.exports}var o=V();const z=["예상금리","기간","금액","예상이자"];function G({title:c,description:d,items:_=[],tone:m="default",eligible:s,onClick:l}){const i=typeof l=="function",p=new Map(_.map(u=>[u.label,u]));return o.jsxs("div",{className:`pc pc--${m}`,role:i?"button":void 0,tabIndex:i?0:void 0,onClick:i?l:void 0,"aria-disabled":!s,children:[o.jsxs("header",{className:"pc__header",children:[o.jsx("h3",{className:"pc__title",children:c}),d?o.jsx("p",{className:"pc__desc",children:d}):null]}),o.jsx("div",{className:"pc__box",children:o.jsx("ul",{className:"pc__list",children:z.map(u=>{const T=p.get(u);return o.jsxs("li",{className:"pc__row",children:[o.jsx("span",{className:"pc__label",children:u}),o.jsx("span",{className:`pc__value${T?.highlight?" pc__value--highlight":""}`,children:T?.value??"-"})]},u)})})}),!s&&o.jsxs("div",{className:"pc__eligibility",children:[o.jsx("span",{className:"pc__eligibility-icon","aria-hidden":"true",children:o.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",children:[o.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2"}),o.jsx("path",{d:"M12 7v6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),o.jsx("circle",{cx:"12",cy:"17",r:"1.2",fill:"currentColor"})]})}),o.jsx("span",{className:"pc__eligibility-text",children:"가입 대상이 아니에요"})]})]})}f.ProductCard=G,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})}));
7
+ <%s key={someKey} {...props} />`,n,a,v,a),U[a+n]=!0)}if(a=null,t!==void 0&&(_(t),a=""+t),i(r)&&(_(r.key),a=""+r.key),"key"in r){t={};for(var S in r)S!=="key"&&(t[S]=r[S])}else t=r;return a&&p(t,typeof e=="function"?e.displayName||e.name||"Unknown":e),T(e,a,t,s(),j,P)}function Y(e){$(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===y&&(e._payload.status==="fulfilled"?$(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function $(e){return typeof e=="object"&&e!==null&&e.$$typeof===I}var x=E,I=Symbol.for("react.transitional.element"),X=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),B=Symbol.for("react.strict_mode"),H=Symbol.for("react.profiler"),Z=Symbol.for("react.consumer"),Q=Symbol.for("react.context"),K=Symbol.for("react.forward_ref"),ee=Symbol.for("react.suspense"),re=Symbol.for("react.suspense_list"),te=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),ne=Symbol.for("react.activity"),ae=Symbol.for("react.client.reference"),g=x.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,L=Object.prototype.hasOwnProperty,oe=Array.isArray,O=console.createTask?console.createTask:function(){return null};x={react_stack_bottom_frame:function(e){return e()}};var F,M={},W=x.react_stack_bottom_frame.bind(x,l)(),D=O(m(l)),U={};R.Fragment=k,R.jsx=function(e,r,t){var n=1e4>g.recentlyCreatedOwnerStacks++;return C(e,r,t,!1,n?Error("react-stack-top-frame"):W,n?O(m(e)):D)},R.jsxs=function(e,r,t){var n=1e4>g.recentlyCreatedOwnerStacks++;return C(e,r,t,!0,n?Error("react-stack-top-frame"):W,n?O(m(e)):D)}})()),R}var w;function V(){return w||(w=1,process.env.NODE_ENV==="production"?h.exports=q():h.exports=J()),h.exports}var o=V();const z=["예상금리","기간","금액","예상이자"];function G({title:c,description:d,items:_=[],tone:m="default",eligible:s=!0,onClick:l}){const i=typeof l=="function",p=new Map(_.map(u=>[u.label,u]));return o.jsxs("div",{className:`pc pc--${m}`,role:i?"button":void 0,tabIndex:i?0:void 0,onClick:i?l:void 0,"aria-disabled":!1,children:[o.jsxs("header",{className:"pc__header",children:[o.jsx("h3",{className:"pc__title",children:c}),d?o.jsx("p",{className:"pc__desc",children:d}):null]}),o.jsx("div",{className:"pc__box",children:o.jsx("ul",{className:"pc__list",children:z.map(u=>{const T=p.get(u);return o.jsxs("li",{className:"pc__row",children:[o.jsx("span",{className:"pc__label",children:u}),o.jsx("span",{className:`pc__value${T?.highlight?" pc__value--highlight":""}`,children:T?.value??"-"})]},u)})})}),!s&&o.jsxs("div",{className:"pc__eligibility",children:[o.jsx("span",{className:"pc__eligibility-icon","aria-hidden":"true",children:o.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",children:[o.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2"}),o.jsx("path",{d:"M12 7v6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),o.jsx("circle",{cx:"12",cy:"17",r:"1.2",fill:"currentColor"})]})}),o.jsx("span",{className:"pc__eligibility-text",children:"가입 대상이 아니에요"})]})]})}f.ProductCard=G,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "name": "woori-product-component",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
+ "description": "A lightweight React UI component library created as part of an npm module practice project at Woori FISA, designed to demonstrate reusable component design with minimal dependencies.",
5
+ "keywords": [
6
+ "woori",
7
+ "woori-component",
8
+ "woori-product-card",
9
+ "woori-product-component",
10
+ "woori-fisa"
11
+ ],
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/woorifisa6-front/tech-seminar-component"
15
+ },
16
+ "contributors": [
17
+ {
18
+ "name": "Woojae"
19
+ },
20
+ {
21
+ "name": "Jaeha"
22
+ },
23
+ {
24
+ "name": "Hyeyoon"
25
+ },
26
+ {
27
+ "name": "Jimin"
28
+ }
29
+ ],
4
30
  "private": false,
5
31
  "license": "MIT",
6
32
  "type": "module",