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 +32 -11
- package/dist/woori-product-component.js +10 -10
- package/dist/woori-product-component.umd.cjs +1 -1
- package/package.json +27 -1
package/README.md
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
# woori-product-component
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
React 기반으로 설계되었으며, **디자인 시스템 토큰(CSS Variables)** 을 활용해
|
|
5
|
-
다양한 프로젝트 환경에서 재사용할 수 있도록 구현되었습니다.
|
|
3
|
+
A **ProductCard UI component library** for financial applications.
|
|
6
4
|
|
|
7
|
-
|
|
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
|
-
- 💳
|
|
15
|
-
- 🎨 CSS
|
|
16
|
-
- ♻️
|
|
17
|
-
- 🧭
|
|
18
|
-
- ♿
|
|
19
|
-
- 🧩 React
|
|
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,
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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 =
|
|
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 ?
|
|
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 ?
|
|
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": !
|
|
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":!
|
|
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.
|
|
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",
|