meticulous-ui 3.9.0 → 3.9.2
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/cjs/components/Form/Form.cjs +3 -3
- package/cjs/components/Form/FormField.cjs +15 -7
- package/components/Form/Form.js +60 -59
- package/components/Form/FormField.js +61 -52
- package/index.d.ts +46 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const y=require("react/jsx-runtime"),a=require("react"),p=require("styled-components"),B=require("../Button/Button.cjs"),D=require("./FormField.cjs"),E=t=>t&&t.__esModule?t:{default:t},m=E(p),T=m.default.form`
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: column;
|
|
4
4
|
gap: ${({$gap:t})=>t};
|
|
5
|
-
|
|
5
|
+
`,$=m.default.div`
|
|
6
6
|
align-self: flex-start;
|
|
7
|
-
`,
|
|
7
|
+
`,A=t=>Object.fromEntries(t.map(({id:i,validate:u,compProps:s})=>{var o;return u?[i,u((o=s==null?void 0:s.defaultValue)!=null?o:"")===null]:[i,!0]})),x=a.forwardRef(({fields:t=[],allProps:i={},onSubmit:u,submitLabel:s="Submit",disableUntilValid:o=!1,gap:h="2rem",labelMarginBottom:F="0.4rem",...R},_)=>{const V=a.useRef(Object.fromEntries(t.map(({id:e,compProps:r})=>{var n;return[e,(n=r==null?void 0:r.defaultValue)!=null?n:""]}))),b=a.useRef({}),M=a.useCallback(e=>(b.current[e]||(b.current[e]=r=>{V.current[e]=r}),b.current[e]),[]),[q,j]=a.useState(()=>A(t)),I=Object.values(q).every(Boolean),v=a.useRef({}),O=a.useCallback(e=>(v.current[e]||(v.current[e]=r=>{j(n=>({...n,[e]:r}))}),v.current[e]),[]),c=a.useRef({}),w=a.useCallback(e=>(c.current[e]||(c.current[e]={current:null}),c.current[e]),[]);a.useImperativeHandle(_,()=>({getValues:()=>({...V.current})}),[]);const S=a.useCallback(e=>{var f,d,g;e.preventDefault();let r=null;const n={};for(const{id:l}of t){const C=c.current[l],k=(d=(f=C==null?void 0:C.current)==null?void 0:f.triggerValidation())!=null?d:!0;n[l]=k,!k&&!r&&(r=l)}if(j(n),r){const l=(g=c.current[r])==null?void 0:g.current;l==null||l.scrollIntoView(),setTimeout(()=>l==null?void 0:l.triggerShake(),500);return}u==null||u({...V.current})},[t,u]);return y.jsxs(T,{onSubmit:S,$gap:h,noValidate:!0,...R,children:[t.map(({id:e,label:r,component:n,isMandatory:f,allProps:d,compProps:g,validate:l})=>y.jsx(D.default,{ref:w(e),label:r,component:n,isMandatory:f,sharedAllProps:i,allProps:d,compProps:g,validate:l,onValueChange:M(e),onValidityChange:O(e),labelMarginBottom:F},e)),u&&y.jsx($,{children:y.jsx(B.default,{type:"submit",disabled:o&&!I,children:s})})]})});x.displayName="Form";exports.default=x;
|
|
@@ -1,17 +1,25 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("react/jsx-runtime"),e=require("react"),F=require("styled-components"),C=require("../../colors/red.cjs"),D=t=>t&&t.__esModule?t:{default:t},l=D(F),H=F.keyframes`
|
|
2
|
+
0% { transform: translateX(0); }
|
|
3
|
+
20% { transform: translateX(-6px); }
|
|
4
|
+
40% { transform: translateX(6px); }
|
|
5
|
+
60% { transform: translateX(-4px); }
|
|
6
|
+
80% { transform: translateX(4px); }
|
|
7
|
+
100% { transform: translateX(0); }
|
|
8
|
+
`,N=l.default.div`
|
|
2
9
|
display: flex;
|
|
3
10
|
flex-direction: column;
|
|
4
11
|
gap: 0.4rem;
|
|
5
|
-
|
|
12
|
+
animation: ${({$shake:t})=>t?H:"none"} 0.35s ease;
|
|
13
|
+
`,O=l.default.div`
|
|
6
14
|
margin-bottom: ${({$labelMarginBottom:t})=>t};
|
|
7
|
-
`,
|
|
15
|
+
`,P=l.default.label`
|
|
8
16
|
font-size: 1.6rem;
|
|
9
17
|
font-weight: 600;
|
|
10
18
|
margin-bottom: 0.2rem;
|
|
11
|
-
`,
|
|
12
|
-
color: ${
|
|
19
|
+
`,A=l.default.span`
|
|
20
|
+
color: ${C.default.m600};
|
|
13
21
|
vertical-align: super;
|
|
14
|
-
`,
|
|
22
|
+
`,G=l.default.span`
|
|
15
23
|
font-size: 1.4rem;
|
|
16
24
|
color: red;
|
|
17
|
-
`,
|
|
25
|
+
`,X=e.forwardRef(({label:t,component:q,isMandatory:M,compProps:$,validate:f,onValueChange:p,onValidityChange:g,labelMarginBottom:I="0.4rem",sharedAllProps:x,allProps:h},z)=>{const E=e.useMemo(()=>({...x,...h}),[x,h]),{defaultValue:s,onChange:b,...K}=$||{},[L,T]=e.useState(s!=null?s:""),[v,R]=e.useState(null),[j,W]=e.useState(0),d=e.useRef(null),k=e.useRef(s!=null?s:""),S=e.useRef(null),a=e.useRef(f);a.current=f;const u=e.useRef(p);u.current=p;const i=e.useRef(g);i.current=g;const m=e.useRef(b);m.current=b,e.useImperativeHandle(z,()=>({triggerValidation:()=>{var n,c;const r=(c=(n=a.current)==null?void 0:n.call(a,k.current))!=null?c:null;return d.current=r,R(r),r===null},triggerShake:()=>W(r=>r+1),scrollIntoView:()=>{var r;return(r=S.current)==null?void 0:r.scrollIntoView({behavior:"smooth",block:"center"})}}));const B=e.useCallback(r=>{var c,_,y;const n=(r==null?void 0:r.target)!==void 0?r.target.value:r;k.current=n,T(n),(c=m.current)==null||c.call(m,n),(_=u.current)==null||_.call(u,n),d.current!==null&&(d.current=null,R(null),(y=i.current)==null||y.call(i,!0))},[]);return o.jsxs(N,{ref:S,$shake:j>0,children:[o.jsx(O,{$labelMarginBottom:I,children:o.jsxs(P,{children:[t,M&&o.jsx(A,{"aria-hidden":"true",children:" *"})]})}),o.jsx(q,{...E,...K,value:L,onChange:B}),v&&o.jsx(G,{role:"alert",children:v})]},j)});X.displayName="FormField";const J=e.memo(X);exports.default=J;
|
package/components/Form/Form.js
CHANGED
|
@@ -1,88 +1,89 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
const
|
|
1
|
+
import { jsxs as $, jsx as h } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as A, useRef as d, useCallback as g, useState as D, useImperativeHandle as H } from "react";
|
|
3
|
+
import k from "styled-components";
|
|
4
|
+
import N from "../Button/Button.js";
|
|
5
|
+
import S from "./FormField.js";
|
|
6
|
+
const T = k.form`
|
|
7
7
|
display: flex;
|
|
8
8
|
flex-direction: column;
|
|
9
|
-
gap: ${({ $gap:
|
|
10
|
-
`,
|
|
9
|
+
gap: ${({ $gap: n }) => n};
|
|
10
|
+
`, W = k.div`
|
|
11
11
|
align-self: flex-start;
|
|
12
|
-
`,
|
|
13
|
-
|
|
12
|
+
`, q = (n) => Object.fromEntries(
|
|
13
|
+
n.map(({ id: s, validate: l, compProps: u }) => {
|
|
14
14
|
var i;
|
|
15
|
-
return
|
|
15
|
+
return l ? [s, l((i = u == null ? void 0 : u.defaultValue) != null ? i : "") === null] : [s, !0];
|
|
16
16
|
})
|
|
17
|
-
),
|
|
17
|
+
), z = A(
|
|
18
18
|
({
|
|
19
|
-
fields:
|
|
20
|
-
allProps:
|
|
21
|
-
onSubmit:
|
|
22
|
-
submitLabel:
|
|
19
|
+
fields: n = [],
|
|
20
|
+
allProps: s = {},
|
|
21
|
+
onSubmit: l,
|
|
22
|
+
submitLabel: u = "Submit",
|
|
23
23
|
disableUntilValid: i = !1,
|
|
24
|
-
gap:
|
|
25
|
-
labelMarginBottom:
|
|
26
|
-
...
|
|
24
|
+
gap: p = "2rem",
|
|
25
|
+
labelMarginBottom: x = "0.4rem",
|
|
26
|
+
...j
|
|
27
27
|
}, I) => {
|
|
28
|
-
const V =
|
|
29
|
-
Object.fromEntries(
|
|
30
|
-
var
|
|
31
|
-
return [
|
|
28
|
+
const V = d(
|
|
29
|
+
Object.fromEntries(n.map(({ id: t, compProps: e }) => {
|
|
30
|
+
var a;
|
|
31
|
+
return [t, (a = e == null ? void 0 : e.defaultValue) != null ? a : ""];
|
|
32
32
|
}))
|
|
33
|
-
),
|
|
34
|
-
V.current[
|
|
35
|
-
}),
|
|
36
|
-
|
|
37
|
-
}), b.current[
|
|
38
|
-
|
|
33
|
+
), y = d({}), w = g((t) => (y.current[t] || (y.current[t] = (e) => {
|
|
34
|
+
V.current[t] = e;
|
|
35
|
+
}), y.current[t]), []), [M, C] = D(() => q(n)), O = Object.values(M).every(Boolean), b = d({}), R = g((t) => (b.current[t] || (b.current[t] = (e) => {
|
|
36
|
+
C((a) => ({ ...a, [t]: e }));
|
|
37
|
+
}), b.current[t]), []), c = d({}), B = g((t) => (c.current[t] || (c.current[t] = { current: null }), c.current[t]), []);
|
|
38
|
+
H(
|
|
39
39
|
I,
|
|
40
40
|
() => ({
|
|
41
41
|
getValues: () => ({ ...V.current })
|
|
42
42
|
}),
|
|
43
43
|
[]
|
|
44
44
|
);
|
|
45
|
-
const
|
|
46
|
-
(
|
|
47
|
-
var
|
|
48
|
-
|
|
49
|
-
let
|
|
50
|
-
const
|
|
51
|
-
for (const { id:
|
|
52
|
-
const
|
|
53
|
-
|
|
45
|
+
const E = g(
|
|
46
|
+
(t) => {
|
|
47
|
+
var o, f, m;
|
|
48
|
+
t.preventDefault();
|
|
49
|
+
let e = null;
|
|
50
|
+
const a = {};
|
|
51
|
+
for (const { id: r } of n) {
|
|
52
|
+
const v = c.current[r], F = (f = (o = v == null ? void 0 : v.current) == null ? void 0 : o.triggerValidation()) != null ? f : !0;
|
|
53
|
+
a[r] = F, !F && !e && (e = r);
|
|
54
54
|
}
|
|
55
|
-
if (
|
|
56
|
-
|
|
55
|
+
if (C(a), e) {
|
|
56
|
+
const r = (m = c.current[e]) == null ? void 0 : m.current;
|
|
57
|
+
r == null || r.scrollIntoView(), setTimeout(() => r == null ? void 0 : r.triggerShake(), 500);
|
|
57
58
|
return;
|
|
58
59
|
}
|
|
59
|
-
|
|
60
|
+
l == null || l({ ...V.current });
|
|
60
61
|
},
|
|
61
|
-
[
|
|
62
|
+
[n, l]
|
|
62
63
|
);
|
|
63
|
-
return /* @__PURE__ */
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
return /* @__PURE__ */ $(T, { onSubmit: E, $gap: p, noValidate: !0, ...j, children: [
|
|
65
|
+
n.map(({ id: t, label: e, component: a, isMandatory: o, allProps: f, compProps: m, validate: r }) => /* @__PURE__ */ h(
|
|
66
|
+
S,
|
|
66
67
|
{
|
|
67
|
-
ref:
|
|
68
|
-
label:
|
|
69
|
-
component:
|
|
70
|
-
isMandatory:
|
|
71
|
-
sharedAllProps:
|
|
68
|
+
ref: B(t),
|
|
69
|
+
label: e,
|
|
70
|
+
component: a,
|
|
71
|
+
isMandatory: o,
|
|
72
|
+
sharedAllProps: s,
|
|
72
73
|
allProps: f,
|
|
73
|
-
compProps:
|
|
74
|
-
validate:
|
|
75
|
-
onValueChange: w(
|
|
76
|
-
onValidityChange:
|
|
77
|
-
labelMarginBottom:
|
|
74
|
+
compProps: m,
|
|
75
|
+
validate: r,
|
|
76
|
+
onValueChange: w(t),
|
|
77
|
+
onValidityChange: R(t),
|
|
78
|
+
labelMarginBottom: x
|
|
78
79
|
},
|
|
79
|
-
|
|
80
|
+
t
|
|
80
81
|
)),
|
|
81
|
-
|
|
82
|
+
l && /* @__PURE__ */ h(W, { children: /* @__PURE__ */ h(N, { type: "submit", disabled: i && !O, children: u }) })
|
|
82
83
|
] });
|
|
83
84
|
}
|
|
84
85
|
);
|
|
85
|
-
|
|
86
|
+
z.displayName = "Form";
|
|
86
87
|
export {
|
|
87
|
-
|
|
88
|
+
z as default
|
|
88
89
|
};
|
|
@@ -1,74 +1,83 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { memo as
|
|
3
|
-
import c from "styled-components";
|
|
4
|
-
import
|
|
5
|
-
const
|
|
1
|
+
import { jsxs as j, jsx as u } from "react/jsx-runtime";
|
|
2
|
+
import { memo as T, forwardRef as A, useMemo as D, useState as d, useRef as e, useImperativeHandle as G, useCallback as J } from "react";
|
|
3
|
+
import c, { keyframes as O } from "styled-components";
|
|
4
|
+
import P from "../../colors/red.js";
|
|
5
|
+
const Q = O`
|
|
6
|
+
0% { transform: translateX(0); }
|
|
7
|
+
20% { transform: translateX(-6px); }
|
|
8
|
+
40% { transform: translateX(6px); }
|
|
9
|
+
60% { transform: translateX(-4px); }
|
|
10
|
+
80% { transform: translateX(4px); }
|
|
11
|
+
100% { transform: translateX(0); }
|
|
12
|
+
`, U = c.div`
|
|
6
13
|
display: flex;
|
|
7
14
|
flex-direction: column;
|
|
8
15
|
gap: 0.4rem;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
16
|
+
animation: ${({ $shake: o }) => o ? Q : "none"} 0.35s ease;
|
|
17
|
+
`, Y = c.div`
|
|
18
|
+
margin-bottom: ${({ $labelMarginBottom: o }) => o};
|
|
19
|
+
`, Z = c.label`
|
|
12
20
|
font-size: 1.6rem;
|
|
13
21
|
font-weight: 600;
|
|
14
22
|
margin-bottom: 0.2rem;
|
|
15
|
-
`,
|
|
16
|
-
color: ${
|
|
23
|
+
`, _ = c.span`
|
|
24
|
+
color: ${P.m600};
|
|
17
25
|
vertical-align: super;
|
|
18
|
-
`,
|
|
26
|
+
`, w = c.span`
|
|
19
27
|
font-size: 1.4rem;
|
|
20
28
|
color: red;
|
|
21
|
-
`,
|
|
29
|
+
`, z = A(
|
|
22
30
|
({
|
|
23
|
-
label:
|
|
24
|
-
component:
|
|
25
|
-
isMandatory:
|
|
26
|
-
compProps:
|
|
27
|
-
validate:
|
|
28
|
-
onValueChange:
|
|
29
|
-
onValidityChange:
|
|
30
|
-
labelMarginBottom:
|
|
31
|
-
sharedAllProps:
|
|
32
|
-
allProps:
|
|
33
|
-
},
|
|
34
|
-
const
|
|
35
|
-
() => ({ ...
|
|
36
|
-
[
|
|
37
|
-
), { defaultValue:
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
31
|
+
label: o,
|
|
32
|
+
component: E,
|
|
33
|
+
isMandatory: K,
|
|
34
|
+
compProps: L,
|
|
35
|
+
validate: f,
|
|
36
|
+
onValueChange: h,
|
|
37
|
+
onValidityChange: g,
|
|
38
|
+
labelMarginBottom: M = "0.4rem",
|
|
39
|
+
sharedAllProps: x,
|
|
40
|
+
allProps: b
|
|
41
|
+
}, R) => {
|
|
42
|
+
const W = D(
|
|
43
|
+
() => ({ ...x, ...b }),
|
|
44
|
+
[x, b]
|
|
45
|
+
), { defaultValue: n, onChange: k, ...q } = L || {}, [B, C] = d(n != null ? n : ""), [v, F] = d(null), [X, H] = d(0), p = e(null), $ = e(n != null ? n : ""), y = e(null), a = e(f);
|
|
46
|
+
a.current = f;
|
|
47
|
+
const l = e(h);
|
|
48
|
+
l.current = h;
|
|
49
|
+
const m = e(g);
|
|
50
|
+
m.current = g;
|
|
51
|
+
const i = e(k);
|
|
52
|
+
i.current = k, G(R, () => ({
|
|
45
53
|
triggerValidation: () => {
|
|
46
|
-
var
|
|
47
|
-
const r = (
|
|
48
|
-
return
|
|
54
|
+
var t, s;
|
|
55
|
+
const r = (s = (t = a.current) == null ? void 0 : t.call(a, $.current)) != null ? s : null;
|
|
56
|
+
return p.current = r, F(r), r === null;
|
|
49
57
|
},
|
|
58
|
+
triggerShake: () => H((r) => r + 1),
|
|
50
59
|
scrollIntoView: () => {
|
|
51
60
|
var r;
|
|
52
|
-
return (r =
|
|
61
|
+
return (r = y.current) == null ? void 0 : r.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
53
62
|
}
|
|
54
63
|
}));
|
|
55
|
-
const
|
|
56
|
-
var
|
|
57
|
-
const
|
|
58
|
-
|
|
64
|
+
const N = J((r) => {
|
|
65
|
+
var s, I, S;
|
|
66
|
+
const t = (r == null ? void 0 : r.target) !== void 0 ? r.target.value : r;
|
|
67
|
+
$.current = t, C(t), (s = i.current) == null || s.call(i, t), (I = l.current) == null || I.call(l, t), p.current !== null && (p.current = null, F(null), (S = m.current) == null || S.call(m, !0));
|
|
59
68
|
}, []);
|
|
60
|
-
return /* @__PURE__ */
|
|
61
|
-
/* @__PURE__ */
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
return /* @__PURE__ */ j(U, { ref: y, $shake: X > 0, children: [
|
|
70
|
+
/* @__PURE__ */ u(Y, { $labelMarginBottom: M, children: /* @__PURE__ */ j(Z, { children: [
|
|
71
|
+
o,
|
|
72
|
+
K && /* @__PURE__ */ u(_, { "aria-hidden": "true", children: " *" })
|
|
64
73
|
] }) }),
|
|
65
|
-
/* @__PURE__ */
|
|
66
|
-
|
|
67
|
-
] });
|
|
74
|
+
/* @__PURE__ */ u(E, { ...W, ...q, value: B, onChange: N }),
|
|
75
|
+
v && /* @__PURE__ */ u(w, { role: "alert", children: v })
|
|
76
|
+
] }, X);
|
|
68
77
|
}
|
|
69
78
|
);
|
|
70
|
-
|
|
71
|
-
const
|
|
79
|
+
z.displayName = "FormField";
|
|
80
|
+
const nr = T(z);
|
|
72
81
|
export {
|
|
73
|
-
|
|
82
|
+
nr as default
|
|
74
83
|
};
|
package/index.d.ts
CHANGED
|
@@ -665,6 +665,52 @@ export interface GridItemProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
665
665
|
export declare const Grid: React.FC<GridProps>;
|
|
666
666
|
export declare const GridItem: React.FC<GridItemProps>;
|
|
667
667
|
|
|
668
|
+
// ---------------------------------------------------------------------------
|
|
669
|
+
// Sidebar
|
|
670
|
+
// ---------------------------------------------------------------------------
|
|
671
|
+
|
|
672
|
+
export interface SidebarChildItem {
|
|
673
|
+
id: string;
|
|
674
|
+
label: string;
|
|
675
|
+
badge?: number;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
export interface SidebarNavItem {
|
|
679
|
+
id: string;
|
|
680
|
+
label: string;
|
|
681
|
+
icon: React.ReactNode;
|
|
682
|
+
badge?: number;
|
|
683
|
+
onAdd?: () => void;
|
|
684
|
+
children?: SidebarChildItem[];
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
export interface SidebarBottomItem {
|
|
688
|
+
id: string;
|
|
689
|
+
label?: string;
|
|
690
|
+
icon: React.ReactNode;
|
|
691
|
+
onClick?: () => void;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
export interface SidebarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
695
|
+
logo?: React.ReactNode;
|
|
696
|
+
storeName?: string;
|
|
697
|
+
storeUrl?: string;
|
|
698
|
+
onSwitchStore?: () => void;
|
|
699
|
+
navItems?: SidebarNavItem[];
|
|
700
|
+
activeId?: string;
|
|
701
|
+
onNavChange?: (id: string) => void;
|
|
702
|
+
bottomItems?: SidebarBottomItem[];
|
|
703
|
+
collapsed?: boolean;
|
|
704
|
+
onCollapseToggle?: () => void;
|
|
705
|
+
/** Stays collapsed; expands on hover and collapses again after any nav action */
|
|
706
|
+
hoverExpand?: boolean;
|
|
707
|
+
/** When true shows logo + store name + store URL + small hamburger. When false (default) shows a large hamburger beside the logo only. */
|
|
708
|
+
showStoreInfo?: boolean;
|
|
709
|
+
theme?: 'light' | 'dark';
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
export declare const Sidebar: React.FC<SidebarProps>;
|
|
713
|
+
|
|
668
714
|
// ---------------------------------------------------------------------------
|
|
669
715
|
// Hooks
|
|
670
716
|
// ---------------------------------------------------------------------------
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "meticulous-ui",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.2",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"description": "A comprehensive React UI component library with a wide range of customizable components, icons, colors, and utilities for building modern web applications.",
|
|
6
6
|
"types": "./index.d.ts",
|