@negative-space/input 1.0.0 → 1.1.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/dist/index.d.mts CHANGED
@@ -1,5 +1,7 @@
1
+ import { SpinnerProps } from '@negative-space/spinner';
1
2
  import React from 'react';
2
3
  import { IconButtonProps } from '@negative-space/button';
4
+ import { TooltipProps } from '@negative-space/tooltip';
3
5
 
4
6
  interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'className' | 'prefix' | 'style'> {
5
7
  classNames?: {
@@ -12,6 +14,7 @@ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, '
12
14
  prefix?: string;
13
15
  content?: string;
14
16
  suffix?: string;
17
+ spinner?: string;
15
18
  };
16
19
  styles?: {
17
20
  field?: {
@@ -23,21 +26,29 @@ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, '
23
26
  prefix?: React.CSSProperties;
24
27
  content?: React.CSSProperties;
25
28
  suffix?: React.CSSProperties;
29
+ spinner?: React.CSSProperties;
26
30
  };
27
31
  label?: string;
28
32
  error?: string;
29
33
  prefix?: React.ReactNode;
30
34
  suffix?: React.ReactNode;
31
35
  htmlFor?: string;
36
+ loading?: boolean;
37
+ spinnerPosition?: 'prefix' | 'suffix';
38
+ spinnerProps?: Omit<SpinnerProps, 'loading' | 'className' | 'style'>;
32
39
  }
33
40
  declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
34
41
 
35
42
  interface InputPasswordProps extends Omit<InputProps, 'classNames' | 'styles' | 'suffix' | 'type'> {
36
43
  classNames?: InputProps['classNames'] & {
37
44
  button?: string;
45
+ icon?: string;
46
+ tooltip?: TooltipProps['classNames'];
38
47
  };
39
48
  styles?: InputProps['styles'] & {
40
49
  button?: React.CSSProperties;
50
+ icon?: React.CSSProperties;
51
+ tooltip?: TooltipProps['styles'];
41
52
  };
42
53
  onToggleVisibility?: (visible: boolean) => void;
43
54
  buttonProps?: Omit<IconButtonProps, 'onClick' | 'aria-label'>;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
+ import { SpinnerProps } from '@negative-space/spinner';
1
2
  import React from 'react';
2
3
  import { IconButtonProps } from '@negative-space/button';
4
+ import { TooltipProps } from '@negative-space/tooltip';
3
5
 
4
6
  interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'className' | 'prefix' | 'style'> {
5
7
  classNames?: {
@@ -12,6 +14,7 @@ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, '
12
14
  prefix?: string;
13
15
  content?: string;
14
16
  suffix?: string;
17
+ spinner?: string;
15
18
  };
16
19
  styles?: {
17
20
  field?: {
@@ -23,21 +26,29 @@ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, '
23
26
  prefix?: React.CSSProperties;
24
27
  content?: React.CSSProperties;
25
28
  suffix?: React.CSSProperties;
29
+ spinner?: React.CSSProperties;
26
30
  };
27
31
  label?: string;
28
32
  error?: string;
29
33
  prefix?: React.ReactNode;
30
34
  suffix?: React.ReactNode;
31
35
  htmlFor?: string;
36
+ loading?: boolean;
37
+ spinnerPosition?: 'prefix' | 'suffix';
38
+ spinnerProps?: Omit<SpinnerProps, 'loading' | 'className' | 'style'>;
32
39
  }
33
40
  declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
34
41
 
35
42
  interface InputPasswordProps extends Omit<InputProps, 'classNames' | 'styles' | 'suffix' | 'type'> {
36
43
  classNames?: InputProps['classNames'] & {
37
44
  button?: string;
45
+ icon?: string;
46
+ tooltip?: TooltipProps['classNames'];
38
47
  };
39
48
  styles?: InputProps['styles'] & {
40
49
  button?: React.CSSProperties;
50
+ icon?: React.CSSProperties;
51
+ tooltip?: TooltipProps['styles'];
41
52
  };
42
53
  onToggleVisibility?: (visible: boolean) => void;
43
54
  buttonProps?: Omit<IconButtonProps, 'onClick' | 'aria-label'>;
package/dist/index.js CHANGED
@@ -1,11 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var React = require('react');
4
- var system = require('@negative-space/system');
5
3
  var field = require('@negative-space/field');
6
4
  var flex = require('@negative-space/flex');
5
+ var spinner = require('@negative-space/spinner');
6
+ var system = require('@negative-space/system');
7
+ var React = require('react');
7
8
  var jsxRuntime = require('react/jsx-runtime');
8
9
  var button = require('@negative-space/button');
10
+ var tooltip = require('@negative-space/tooltip');
9
11
 
10
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
13
 
@@ -13,10 +15,27 @@ var React__default = /*#__PURE__*/_interopDefault(React);
13
15
 
14
16
  // src/Input.tsx
15
17
  var Input = React__default.default.forwardRef(
16
- ({ classNames, styles, label, error, prefix, suffix, htmlFor, id, ...props }, ref) => {
18
+ ({
19
+ classNames,
20
+ styles,
21
+ label,
22
+ error,
23
+ prefix,
24
+ suffix,
25
+ htmlFor,
26
+ id,
27
+ loading = false,
28
+ spinnerPosition = "suffix",
29
+ spinnerProps,
30
+ disabled,
31
+ ...props
32
+ }, ref) => {
17
33
  const { global } = system.useNSUI();
18
34
  const generatedId = React__default.default.useId();
19
35
  const inputId = id ?? generatedId;
36
+ const resolvedSpinner = /* @__PURE__ */ jsxRuntime.jsx(spinner.Spinner, { loading: true, className: classNames?.spinner, style: styles?.spinner, ...spinnerProps });
37
+ const showPrefix = prefix || loading && spinnerPosition === "prefix";
38
+ const showSuffix = suffix || loading && spinnerPosition === "suffix";
20
39
  return /* @__PURE__ */ jsxRuntime.jsx(
21
40
  field.Field,
22
41
  {
@@ -32,12 +51,12 @@ var Input = React__default.default.forwardRef(
32
51
  className: system.cn(`${global.prefixCls}-input-root`, classNames?.root),
33
52
  style: { marginTop: "6px", ...styles?.root },
34
53
  children: [
35
- prefix && /* @__PURE__ */ jsxRuntime.jsx(
54
+ showPrefix && /* @__PURE__ */ jsxRuntime.jsx(
36
55
  "span",
37
56
  {
38
57
  className: system.cn(`${global.prefixCls}-input-prefix`, classNames?.prefix),
39
- style: styles?.prefix,
40
- children: prefix
58
+ style: { display: "flex", alignItems: "center", ...styles?.prefix },
59
+ children: loading && spinnerPosition === "prefix" ? resolvedSpinner : prefix
41
60
  }
42
61
  ),
43
62
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -46,16 +65,18 @@ var Input = React__default.default.forwardRef(
46
65
  ...props,
47
66
  ref,
48
67
  id: inputId,
68
+ disabled: disabled || loading,
69
+ "data-loading": loading,
49
70
  className: system.cn(`${global.prefixCls}-input-content`, classNames?.content),
50
- style: { outline: "none", ...styles?.content }
71
+ style: { outline: "none", flex: 1, minWidth: 0, ...styles?.content }
51
72
  }
52
73
  ),
53
- suffix && /* @__PURE__ */ jsxRuntime.jsx(
74
+ showSuffix && /* @__PURE__ */ jsxRuntime.jsx(
54
75
  "span",
55
76
  {
56
77
  className: system.cn(`${global.prefixCls}-input-suffix`, classNames?.suffix),
57
- style: styles?.suffix,
58
- children: suffix
78
+ style: { display: "flex", alignItems: "center", ...styles?.suffix },
79
+ children: loading && spinnerPosition === "suffix" ? resolvedSpinner : suffix
59
80
  }
60
81
  )
61
82
  ]
@@ -67,9 +88,11 @@ var Input = React__default.default.forwardRef(
67
88
  );
68
89
  Input.displayName = "Input";
69
90
  var InputPassword = React__default.default.forwardRef(
70
- ({ onToggleVisibility, classNames, styles, buttonProps, ...rest }, ref) => {
71
- const { global } = system.useNSUI();
91
+ ({ onToggleVisibility, title, classNames, styles, buttonProps, ...rest }, ref) => {
92
+ const { global, components } = system.useNSUI();
72
93
  const [visible, setVisible] = React__default.default.useState(false);
94
+ const Title = title ?? (visible ? components.inputPassword.passwordTitle : components.inputPassword.textTitle);
95
+ const tooltip$1 = tooltip.useTooltip();
73
96
  const handleToggle = () => {
74
97
  setVisible((prev) => {
75
98
  const next = !prev;
@@ -77,31 +100,36 @@ var InputPassword = React__default.default.forwardRef(
77
100
  return next;
78
101
  });
79
102
  };
80
- return /* @__PURE__ */ jsxRuntime.jsx(
81
- Input,
82
- {
83
- ...rest,
84
- ref,
85
- type: visible ? "text" : "password",
86
- "data-visible": visible,
87
- classNames: {
88
- ...classNames,
89
- root: system.cn(classNames?.root, `${global.prefixCls}-input-password`)
90
- },
91
- styles,
92
- suffix: /* @__PURE__ */ jsxRuntime.jsx(
93
- button.IconButton,
94
- {
95
- ...buttonProps,
96
- onClick: handleToggle,
97
- "aria-label": visible ? "Hide password" : "Show password",
98
- className: classNames?.button,
99
- style: styles?.button,
100
- children: visible ? /* @__PURE__ */ jsxRuntime.jsx(system.EyeOff, {}) : /* @__PURE__ */ jsxRuntime.jsx(system.Eye, {})
101
- }
102
- )
103
- }
104
- );
103
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
104
+ /* @__PURE__ */ jsxRuntime.jsx(
105
+ Input,
106
+ {
107
+ ...rest,
108
+ ref,
109
+ type: visible ? "text" : "password",
110
+ "data-visible": visible,
111
+ classNames: {
112
+ ...classNames,
113
+ root: system.cn(classNames?.root, `${global.prefixCls}-input-password`)
114
+ },
115
+ styles,
116
+ suffix: /* @__PURE__ */ jsxRuntime.jsx(
117
+ button.IconButton,
118
+ {
119
+ ...buttonProps,
120
+ ...tooltip$1.triggerProps,
121
+ onClick: handleToggle,
122
+ title: !global.tooltip ? Title : void 0,
123
+ "aria-label": Title,
124
+ className: classNames?.button,
125
+ style: styles?.button,
126
+ children: visible ? /* @__PURE__ */ jsxRuntime.jsx(system.EyeOff, { className: classNames?.icon, style: styles?.icon }) : /* @__PURE__ */ jsxRuntime.jsx(system.Eye, { className: classNames?.icon, style: styles?.icon })
127
+ }
128
+ )
129
+ }
130
+ ),
131
+ global.tooltip && /* @__PURE__ */ jsxRuntime.jsx(tooltip.Tooltip, { tooltip: tooltip$1, classNames: classNames?.tooltip, styles: styles?.tooltip, children: Title })
132
+ ] });
105
133
  }
106
134
  );
107
135
  InputPassword.displayName = "InputPassword";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Input.tsx","../src/InputPassword.tsx"],"names":["React","useNSUI","jsx","Field","jsxs","Flex","cn","IconButton","EyeOff","Eye"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { Field } from '@negative-space/field'\nimport { Flex } from '@negative-space/flex'\n\nexport interface InputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'className' | 'prefix' | 'style'\n> {\n classNames?: {\n field?: {\n root?: string\n label?: string\n error?: string\n }\n root?: string\n prefix?: string\n content?: string\n suffix?: string\n }\n styles?: {\n field?: {\n root?: React.CSSProperties\n label?: React.CSSProperties\n error?: React.CSSProperties\n }\n root?: React.CSSProperties\n prefix?: React.CSSProperties\n content?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n label?: string\n error?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n htmlFor?: string\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ classNames, styles, label, error, prefix, suffix, htmlFor, id, ...props }, ref) => {\n const { global } = useNSUI()\n const generatedId = React.useId()\n const inputId = id ?? generatedId\n\n return (\n <Field\n classNames={classNames?.field}\n styles={styles?.field}\n label={label}\n error={error}\n htmlFor={htmlFor ?? inputId}\n >\n <Flex\n alignItems=\"center\"\n className={cn(`${global.prefixCls}-input-root`, classNames?.root)}\n style={{ marginTop: '6px', ...styles?.root }}\n >\n {prefix && (\n <span\n className={cn(`${global.prefixCls}-input-prefix`, classNames?.prefix)}\n style={styles?.prefix}\n >\n {prefix}\n </span>\n )}\n\n <input\n {...props}\n ref={ref}\n id={inputId}\n className={cn(`${global.prefixCls}-input-content`, classNames?.content)}\n style={{ outline: 'none', ...styles?.content }}\n />\n\n {suffix && (\n <span\n className={cn(`${global.prefixCls}-input-suffix`, classNames?.suffix)}\n style={styles?.suffix}\n >\n {suffix}\n </span>\n )}\n </Flex>\n </Field>\n )\n }\n)\n\nInput.displayName = 'Input'\n","import React from 'react'\nimport { cn, useNSUI, Eye, EyeOff } from '@negative-space/system'\nimport { Input, type InputProps } from '.'\nimport { IconButton, type IconButtonProps } from '@negative-space/button'\n\nexport interface InputPasswordProps extends Omit<\n InputProps,\n 'classNames' | 'styles' | 'suffix' | 'type'\n> {\n classNames?: InputProps['classNames'] & {\n button?: string\n }\n styles?: InputProps['styles'] & {\n button?: React.CSSProperties\n }\n onToggleVisibility?: (visible: boolean) => void\n buttonProps?: Omit<IconButtonProps, 'onClick' | 'aria-label'>\n}\n\nexport const InputPassword = React.forwardRef<HTMLInputElement, InputPasswordProps>(\n ({ onToggleVisibility, classNames, styles, buttonProps, ...rest }, ref) => {\n const { global } = useNSUI()\n const [visible, setVisible] = React.useState(false)\n\n const handleToggle = () => {\n setVisible((prev) => {\n const next = !prev\n onToggleVisibility?.(next)\n return next\n })\n }\n\n return (\n <Input\n {...rest}\n ref={ref}\n type={visible ? 'text' : 'password'}\n data-visible={visible}\n classNames={{\n ...classNames,\n root: cn(classNames?.root, `${global.prefixCls}-input-password`)\n }}\n styles={styles}\n suffix={\n <IconButton\n {...buttonProps}\n onClick={handleToggle}\n aria-label={visible ? 'Hide password' : 'Show password'}\n className={classNames?.button}\n style={styles?.button}\n >\n {visible ? <EyeOff /> : <Eye />}\n </IconButton>\n }\n />\n )\n }\n)\n\nInputPassword.displayName = 'InputPassword'\n"]}
1
+ {"version":3,"sources":["../src/Input.tsx","../src/InputPassword.tsx"],"names":["React","useNSUI","jsx","Spinner","Field","jsxs","Flex","cn","tooltip","useTooltip","Fragment","IconButton","EyeOff","Eye","Tooltip"],"mappings":";;;;;;;;;;;;;;;;AA4CO,IAAM,QAAQA,sBAAA,CAAM,UAAA;AAAA,EACzB,CACE;AAAA,IACE,UAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,EAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,eAAA,GAAkB,QAAA;AAAA,IAClB,YAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,EAAE,MAAA,EAAO,GAAIC,cAAA,EAAQ;AAC3B,IAAA,MAAM,WAAA,GAAcD,uBAAM,KAAA,EAAM;AAChC,IAAA,MAAM,UAAU,EAAA,IAAM,WAAA;AAEtB,IAAA,MAAM,eAAA,mBACJE,cAAA,CAACC,eAAA,EAAA,EAAQ,OAAA,EAAO,IAAA,EAAC,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAU,GAAG,YAAA,EAAc,CAAA;AAG7F,IAAA,MAAM,UAAA,GAAa,MAAA,IAAW,OAAA,IAAW,eAAA,KAAoB,QAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,MAAA,IAAW,OAAA,IAAW,eAAA,KAAoB,QAAA;AAE7D,IAAA,uBACED,cAAA;AAAA,MAACE,WAAA;AAAA,MAAA;AAAA,QACC,YAAY,UAAA,EAAY,KAAA;AAAA,QACxB,QAAQ,MAAA,EAAQ,KAAA;AAAA,QAChB,KAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAS,OAAA,IAAW,OAAA;AAAA,QAEpB,QAAA,kBAAAC,eAAA;AAAA,UAACC,SAAA;AAAA,UAAA;AAAA,YACC,UAAA,EAAW,QAAA;AAAA,YACX,WAAWC,SAAA,CAAG,CAAA,EAAG,OAAO,SAAS,CAAA,WAAA,CAAA,EAAe,YAAY,IAAI,CAAA;AAAA,YAChE,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,GAAG,QAAQ,IAAA,EAAK;AAAA,YAE1C,QAAA,EAAA;AAAA,cAAA,UAAA,oBACCL,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,WAAWK,SAAA,CAAG,CAAA,EAAG,OAAO,SAAS,CAAA,aAAA,CAAA,EAAiB,YAAY,MAAM,CAAA;AAAA,kBACpE,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAG,QAAQ,MAAA,EAAO;AAAA,kBAEjE,QAAA,EAAA,OAAA,IAAW,eAAA,KAAoB,QAAA,GAAW,eAAA,GAAkB;AAAA;AAAA,eAC/D;AAAA,8BAGFL,cAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACE,GAAG,KAAA;AAAA,kBACJ,GAAA;AAAA,kBACA,EAAA,EAAI,OAAA;AAAA,kBACJ,UAAU,QAAA,IAAY,OAAA;AAAA,kBACtB,cAAA,EAAc,OAAA;AAAA,kBACd,WAAWK,SAAA,CAAG,CAAA,EAAG,OAAO,SAAS,CAAA,cAAA,CAAA,EAAkB,YAAY,OAAO,CAAA;AAAA,kBACtE,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,GAAG,QAAA,EAAU,CAAA,EAAG,GAAG,MAAA,EAAQ,OAAA;AAAQ;AAAA,eACrE;AAAA,cAEC,UAAA,oBACCL,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,WAAWK,SAAA,CAAG,CAAA,EAAG,OAAO,SAAS,CAAA,aAAA,CAAA,EAAiB,YAAY,MAAM,CAAA;AAAA,kBACpE,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAG,QAAQ,MAAA,EAAO;AAAA,kBAEjE,QAAA,EAAA,OAAA,IAAW,eAAA,KAAoB,QAAA,GAAW,eAAA,GAAkB;AAAA;AAAA;AAC/D;AAAA;AAAA;AAEJ;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA;AC/Fb,IAAM,gBAAgBP,sBAAAA,CAAM,UAAA;AAAA,EACjC,CAAC,EAAE,kBAAA,EAAoB,KAAA,EAAO,UAAA,EAAY,QAAQ,WAAA,EAAa,GAAG,IAAA,EAAK,EAAG,GAAA,KAAQ;AAChF,IAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAW,GAAIC,cAAAA,EAAQ;AACvC,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,sBAAAA,CAAM,SAAS,KAAK,CAAA;AAElD,IAAA,MAAM,QACJ,KAAA,KACC,OAAA,GAAU,WAAW,aAAA,CAAc,aAAA,GAAgB,WAAW,aAAA,CAAc,SAAA,CAAA;AAE/E,IAAA,MAAMQ,YAAUC,kBAAA,EAAW;AAE3B,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,QAAA,MAAM,OAAO,CAAC,IAAA;AACd,QAAA,kBAAA,GAAqB,IAAI,CAAA;AACzB,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,uBACEJ,gBAAAK,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAR,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACE,GAAG,IAAA;AAAA,UACJ,GAAA;AAAA,UACA,IAAA,EAAM,UAAU,MAAA,GAAS,UAAA;AAAA,UACzB,cAAA,EAAc,OAAA;AAAA,UACd,UAAA,EAAY;AAAA,YACV,GAAG,UAAA;AAAA,YACH,MAAMK,SAAAA,CAAG,UAAA,EAAY,MAAM,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,eAAA,CAAiB;AAAA,WACjE;AAAA,UACA,MAAA;AAAA,UACA,wBACEL,cAAAA;AAAA,YAACS,iBAAA;AAAA,YAAA;AAAA,cACE,GAAG,WAAA;AAAA,cACH,GAAGH,SAAA,CAAQ,YAAA;AAAA,cACZ,OAAA,EAAS,YAAA;AAAA,cACT,KAAA,EAAO,CAAC,MAAA,CAAO,OAAA,GAAU,KAAA,GAAQ,MAAA;AAAA,cACjC,YAAA,EAAY,KAAA;AAAA,cACZ,WAAW,UAAA,EAAY,MAAA;AAAA,cACvB,OAAO,MAAA,EAAQ,MAAA;AAAA,cAEd,oCACCN,cAAAA,CAACU,iBAAO,SAAA,EAAW,UAAA,EAAY,MAAM,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA,mBAE1DV,eAACW,UAAA,EAAA,EAAI,SAAA,EAAW,YAAY,IAAA,EAAM,KAAA,EAAO,QAAQ,IAAA,EAAM;AAAA;AAAA;AAE3D;AAAA,OAEJ;AAAA,MACC,MAAA,CAAO,OAAA,oBACNX,cAAAA,CAACY,eAAA,EAAA,WAAQN,SAAA,EAAkB,UAAA,EAAY,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EACzE,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"index.js","sourcesContent":["import { Field } from '@negative-space/field'\nimport { Flex } from '@negative-space/flex'\nimport { Spinner, type SpinnerProps } from '@negative-space/spinner'\nimport { cn, useNSUI } from '@negative-space/system'\nimport React from 'react'\n\nexport interface InputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'className' | 'prefix' | 'style'\n> {\n classNames?: {\n field?: {\n root?: string\n label?: string\n error?: string\n }\n root?: string\n prefix?: string\n content?: string\n suffix?: string\n spinner?: string\n }\n styles?: {\n field?: {\n root?: React.CSSProperties\n label?: React.CSSProperties\n error?: React.CSSProperties\n }\n root?: React.CSSProperties\n prefix?: React.CSSProperties\n content?: React.CSSProperties\n suffix?: React.CSSProperties\n spinner?: React.CSSProperties\n }\n label?: string\n error?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n htmlFor?: string\n loading?: boolean\n spinnerPosition?: 'prefix' | 'suffix'\n spinnerProps?: Omit<SpinnerProps, 'loading' | 'className' | 'style'>\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n classNames,\n styles,\n label,\n error,\n prefix,\n suffix,\n htmlFor,\n id,\n loading = false,\n spinnerPosition = 'suffix',\n spinnerProps,\n disabled,\n ...props\n },\n ref\n ) => {\n const { global } = useNSUI()\n const generatedId = React.useId()\n const inputId = id ?? generatedId\n\n const resolvedSpinner = (\n <Spinner loading className={classNames?.spinner} style={styles?.spinner} {...spinnerProps} />\n )\n\n const showPrefix = prefix || (loading && spinnerPosition === 'prefix')\n const showSuffix = suffix || (loading && spinnerPosition === 'suffix')\n\n return (\n <Field\n classNames={classNames?.field}\n styles={styles?.field}\n label={label}\n error={error}\n htmlFor={htmlFor ?? inputId}\n >\n <Flex\n alignItems=\"center\"\n className={cn(`${global.prefixCls}-input-root`, classNames?.root)}\n style={{ marginTop: '6px', ...styles?.root }}\n >\n {showPrefix && (\n <span\n className={cn(`${global.prefixCls}-input-prefix`, classNames?.prefix)}\n style={{ display: 'flex', alignItems: 'center', ...styles?.prefix }}\n >\n {loading && spinnerPosition === 'prefix' ? resolvedSpinner : prefix}\n </span>\n )}\n\n <input\n {...props}\n ref={ref}\n id={inputId}\n disabled={disabled || loading}\n data-loading={loading}\n className={cn(`${global.prefixCls}-input-content`, classNames?.content)}\n style={{ outline: 'none', flex: 1, minWidth: 0, ...styles?.content }}\n />\n\n {showSuffix && (\n <span\n className={cn(`${global.prefixCls}-input-suffix`, classNames?.suffix)}\n style={{ display: 'flex', alignItems: 'center', ...styles?.suffix }}\n >\n {loading && spinnerPosition === 'suffix' ? resolvedSpinner : suffix}\n </span>\n )}\n </Flex>\n </Field>\n )\n }\n)\n\nInput.displayName = 'Input'\n","import { IconButton, type IconButtonProps } from '@negative-space/button'\nimport { cn, Eye, EyeOff, useNSUI } from '@negative-space/system'\nimport { Tooltip, type TooltipProps, useTooltip } from '@negative-space/tooltip'\nimport React from 'react'\n\nimport { Input, type InputProps } from '.'\n\nexport interface InputPasswordProps extends Omit<\n InputProps,\n 'classNames' | 'styles' | 'suffix' | 'type'\n> {\n classNames?: InputProps['classNames'] & {\n button?: string\n icon?: string\n tooltip?: TooltipProps['classNames']\n }\n styles?: InputProps['styles'] & {\n button?: React.CSSProperties\n icon?: React.CSSProperties\n tooltip?: TooltipProps['styles']\n }\n onToggleVisibility?: (visible: boolean) => void\n buttonProps?: Omit<IconButtonProps, 'onClick' | 'aria-label'>\n}\n\nexport const InputPassword = React.forwardRef<HTMLInputElement, InputPasswordProps>(\n ({ onToggleVisibility, title, classNames, styles, buttonProps, ...rest }, ref) => {\n const { global, components } = useNSUI()\n const [visible, setVisible] = React.useState(false)\n\n const Title =\n title ??\n (visible ? components.inputPassword.passwordTitle : components.inputPassword.textTitle)\n\n const tooltip = useTooltip()\n\n const handleToggle = () => {\n setVisible((prev) => {\n const next = !prev\n onToggleVisibility?.(next)\n return next\n })\n }\n\n return (\n <>\n <Input\n {...rest}\n ref={ref}\n type={visible ? 'text' : 'password'}\n data-visible={visible}\n classNames={{\n ...classNames,\n root: cn(classNames?.root, `${global.prefixCls}-input-password`)\n }}\n styles={styles}\n suffix={\n <IconButton\n {...buttonProps}\n {...tooltip.triggerProps}\n onClick={handleToggle}\n title={!global.tooltip ? Title : undefined}\n aria-label={Title}\n className={classNames?.button}\n style={styles?.button}\n >\n {visible ? (\n <EyeOff className={classNames?.icon} style={styles?.icon} />\n ) : (\n <Eye className={classNames?.icon} style={styles?.icon} />\n )}\n </IconButton>\n }\n />\n {global.tooltip && (\n <Tooltip tooltip={tooltip} classNames={classNames?.tooltip} styles={styles?.tooltip}>\n {Title}\n </Tooltip>\n )}\n </>\n )\n }\n)\n\nInputPassword.displayName = 'InputPassword'\n"]}
package/dist/index.mjs CHANGED
@@ -1,16 +1,35 @@
1
- import React from 'react';
2
- import { useNSUI, cn, EyeOff, Eye } from '@negative-space/system';
3
1
  import { Field } from '@negative-space/field';
4
2
  import { Flex } from '@negative-space/flex';
5
- import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { Spinner } from '@negative-space/spinner';
4
+ import { useNSUI, cn, EyeOff, Eye } from '@negative-space/system';
5
+ import React from 'react';
6
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
7
  import { IconButton } from '@negative-space/button';
8
+ import { useTooltip, Tooltip } from '@negative-space/tooltip';
7
9
 
8
10
  // src/Input.tsx
9
11
  var Input = React.forwardRef(
10
- ({ classNames, styles, label, error, prefix, suffix, htmlFor, id, ...props }, ref) => {
12
+ ({
13
+ classNames,
14
+ styles,
15
+ label,
16
+ error,
17
+ prefix,
18
+ suffix,
19
+ htmlFor,
20
+ id,
21
+ loading = false,
22
+ spinnerPosition = "suffix",
23
+ spinnerProps,
24
+ disabled,
25
+ ...props
26
+ }, ref) => {
11
27
  const { global } = useNSUI();
12
28
  const generatedId = React.useId();
13
29
  const inputId = id ?? generatedId;
30
+ const resolvedSpinner = /* @__PURE__ */ jsx(Spinner, { loading: true, className: classNames?.spinner, style: styles?.spinner, ...spinnerProps });
31
+ const showPrefix = prefix || loading && spinnerPosition === "prefix";
32
+ const showSuffix = suffix || loading && spinnerPosition === "suffix";
14
33
  return /* @__PURE__ */ jsx(
15
34
  Field,
16
35
  {
@@ -26,12 +45,12 @@ var Input = React.forwardRef(
26
45
  className: cn(`${global.prefixCls}-input-root`, classNames?.root),
27
46
  style: { marginTop: "6px", ...styles?.root },
28
47
  children: [
29
- prefix && /* @__PURE__ */ jsx(
48
+ showPrefix && /* @__PURE__ */ jsx(
30
49
  "span",
31
50
  {
32
51
  className: cn(`${global.prefixCls}-input-prefix`, classNames?.prefix),
33
- style: styles?.prefix,
34
- children: prefix
52
+ style: { display: "flex", alignItems: "center", ...styles?.prefix },
53
+ children: loading && spinnerPosition === "prefix" ? resolvedSpinner : prefix
35
54
  }
36
55
  ),
37
56
  /* @__PURE__ */ jsx(
@@ -40,16 +59,18 @@ var Input = React.forwardRef(
40
59
  ...props,
41
60
  ref,
42
61
  id: inputId,
62
+ disabled: disabled || loading,
63
+ "data-loading": loading,
43
64
  className: cn(`${global.prefixCls}-input-content`, classNames?.content),
44
- style: { outline: "none", ...styles?.content }
65
+ style: { outline: "none", flex: 1, minWidth: 0, ...styles?.content }
45
66
  }
46
67
  ),
47
- suffix && /* @__PURE__ */ jsx(
68
+ showSuffix && /* @__PURE__ */ jsx(
48
69
  "span",
49
70
  {
50
71
  className: cn(`${global.prefixCls}-input-suffix`, classNames?.suffix),
51
- style: styles?.suffix,
52
- children: suffix
72
+ style: { display: "flex", alignItems: "center", ...styles?.suffix },
73
+ children: loading && spinnerPosition === "suffix" ? resolvedSpinner : suffix
53
74
  }
54
75
  )
55
76
  ]
@@ -61,9 +82,11 @@ var Input = React.forwardRef(
61
82
  );
62
83
  Input.displayName = "Input";
63
84
  var InputPassword = React.forwardRef(
64
- ({ onToggleVisibility, classNames, styles, buttonProps, ...rest }, ref) => {
65
- const { global } = useNSUI();
85
+ ({ onToggleVisibility, title, classNames, styles, buttonProps, ...rest }, ref) => {
86
+ const { global, components } = useNSUI();
66
87
  const [visible, setVisible] = React.useState(false);
88
+ const Title = title ?? (visible ? components.inputPassword.passwordTitle : components.inputPassword.textTitle);
89
+ const tooltip = useTooltip();
67
90
  const handleToggle = () => {
68
91
  setVisible((prev) => {
69
92
  const next = !prev;
@@ -71,31 +94,36 @@ var InputPassword = React.forwardRef(
71
94
  return next;
72
95
  });
73
96
  };
74
- return /* @__PURE__ */ jsx(
75
- Input,
76
- {
77
- ...rest,
78
- ref,
79
- type: visible ? "text" : "password",
80
- "data-visible": visible,
81
- classNames: {
82
- ...classNames,
83
- root: cn(classNames?.root, `${global.prefixCls}-input-password`)
84
- },
85
- styles,
86
- suffix: /* @__PURE__ */ jsx(
87
- IconButton,
88
- {
89
- ...buttonProps,
90
- onClick: handleToggle,
91
- "aria-label": visible ? "Hide password" : "Show password",
92
- className: classNames?.button,
93
- style: styles?.button,
94
- children: visible ? /* @__PURE__ */ jsx(EyeOff, {}) : /* @__PURE__ */ jsx(Eye, {})
95
- }
96
- )
97
- }
98
- );
97
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
98
+ /* @__PURE__ */ jsx(
99
+ Input,
100
+ {
101
+ ...rest,
102
+ ref,
103
+ type: visible ? "text" : "password",
104
+ "data-visible": visible,
105
+ classNames: {
106
+ ...classNames,
107
+ root: cn(classNames?.root, `${global.prefixCls}-input-password`)
108
+ },
109
+ styles,
110
+ suffix: /* @__PURE__ */ jsx(
111
+ IconButton,
112
+ {
113
+ ...buttonProps,
114
+ ...tooltip.triggerProps,
115
+ onClick: handleToggle,
116
+ title: !global.tooltip ? Title : void 0,
117
+ "aria-label": Title,
118
+ className: classNames?.button,
119
+ style: styles?.button,
120
+ children: visible ? /* @__PURE__ */ jsx(EyeOff, { className: classNames?.icon, style: styles?.icon }) : /* @__PURE__ */ jsx(Eye, { className: classNames?.icon, style: styles?.icon })
121
+ }
122
+ )
123
+ }
124
+ ),
125
+ global.tooltip && /* @__PURE__ */ jsx(Tooltip, { tooltip, classNames: classNames?.tooltip, styles: styles?.tooltip, children: Title })
126
+ ] });
99
127
  }
100
128
  );
101
129
  InputPassword.displayName = "InputPassword";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Input.tsx","../src/InputPassword.tsx"],"names":["React","useNSUI","jsx","cn"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { Field } from '@negative-space/field'\nimport { Flex } from '@negative-space/flex'\n\nexport interface InputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'className' | 'prefix' | 'style'\n> {\n classNames?: {\n field?: {\n root?: string\n label?: string\n error?: string\n }\n root?: string\n prefix?: string\n content?: string\n suffix?: string\n }\n styles?: {\n field?: {\n root?: React.CSSProperties\n label?: React.CSSProperties\n error?: React.CSSProperties\n }\n root?: React.CSSProperties\n prefix?: React.CSSProperties\n content?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n label?: string\n error?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n htmlFor?: string\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ classNames, styles, label, error, prefix, suffix, htmlFor, id, ...props }, ref) => {\n const { global } = useNSUI()\n const generatedId = React.useId()\n const inputId = id ?? generatedId\n\n return (\n <Field\n classNames={classNames?.field}\n styles={styles?.field}\n label={label}\n error={error}\n htmlFor={htmlFor ?? inputId}\n >\n <Flex\n alignItems=\"center\"\n className={cn(`${global.prefixCls}-input-root`, classNames?.root)}\n style={{ marginTop: '6px', ...styles?.root }}\n >\n {prefix && (\n <span\n className={cn(`${global.prefixCls}-input-prefix`, classNames?.prefix)}\n style={styles?.prefix}\n >\n {prefix}\n </span>\n )}\n\n <input\n {...props}\n ref={ref}\n id={inputId}\n className={cn(`${global.prefixCls}-input-content`, classNames?.content)}\n style={{ outline: 'none', ...styles?.content }}\n />\n\n {suffix && (\n <span\n className={cn(`${global.prefixCls}-input-suffix`, classNames?.suffix)}\n style={styles?.suffix}\n >\n {suffix}\n </span>\n )}\n </Flex>\n </Field>\n )\n }\n)\n\nInput.displayName = 'Input'\n","import React from 'react'\nimport { cn, useNSUI, Eye, EyeOff } from '@negative-space/system'\nimport { Input, type InputProps } from '.'\nimport { IconButton, type IconButtonProps } from '@negative-space/button'\n\nexport interface InputPasswordProps extends Omit<\n InputProps,\n 'classNames' | 'styles' | 'suffix' | 'type'\n> {\n classNames?: InputProps['classNames'] & {\n button?: string\n }\n styles?: InputProps['styles'] & {\n button?: React.CSSProperties\n }\n onToggleVisibility?: (visible: boolean) => void\n buttonProps?: Omit<IconButtonProps, 'onClick' | 'aria-label'>\n}\n\nexport const InputPassword = React.forwardRef<HTMLInputElement, InputPasswordProps>(\n ({ onToggleVisibility, classNames, styles, buttonProps, ...rest }, ref) => {\n const { global } = useNSUI()\n const [visible, setVisible] = React.useState(false)\n\n const handleToggle = () => {\n setVisible((prev) => {\n const next = !prev\n onToggleVisibility?.(next)\n return next\n })\n }\n\n return (\n <Input\n {...rest}\n ref={ref}\n type={visible ? 'text' : 'password'}\n data-visible={visible}\n classNames={{\n ...classNames,\n root: cn(classNames?.root, `${global.prefixCls}-input-password`)\n }}\n styles={styles}\n suffix={\n <IconButton\n {...buttonProps}\n onClick={handleToggle}\n aria-label={visible ? 'Hide password' : 'Show password'}\n className={classNames?.button}\n style={styles?.button}\n >\n {visible ? <EyeOff /> : <Eye />}\n </IconButton>\n }\n />\n )\n }\n)\n\nInputPassword.displayName = 'InputPassword'\n"]}
1
+ {"version":3,"sources":["../src/Input.tsx","../src/InputPassword.tsx"],"names":["React","useNSUI","jsxs","jsx","cn"],"mappings":"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","file":"index.mjs","sourcesContent":["import { Field } from '@negative-space/field'\nimport { Flex } from '@negative-space/flex'\nimport { Spinner, type SpinnerProps } from '@negative-space/spinner'\nimport { cn, useNSUI } from '@negative-space/system'\nimport React from 'react'\n\nexport interface InputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'className' | 'prefix' | 'style'\n> {\n classNames?: {\n field?: {\n root?: string\n label?: string\n error?: string\n }\n root?: string\n prefix?: string\n content?: string\n suffix?: string\n spinner?: string\n }\n styles?: {\n field?: {\n root?: React.CSSProperties\n label?: React.CSSProperties\n error?: React.CSSProperties\n }\n root?: React.CSSProperties\n prefix?: React.CSSProperties\n content?: React.CSSProperties\n suffix?: React.CSSProperties\n spinner?: React.CSSProperties\n }\n label?: string\n error?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n htmlFor?: string\n loading?: boolean\n spinnerPosition?: 'prefix' | 'suffix'\n spinnerProps?: Omit<SpinnerProps, 'loading' | 'className' | 'style'>\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n classNames,\n styles,\n label,\n error,\n prefix,\n suffix,\n htmlFor,\n id,\n loading = false,\n spinnerPosition = 'suffix',\n spinnerProps,\n disabled,\n ...props\n },\n ref\n ) => {\n const { global } = useNSUI()\n const generatedId = React.useId()\n const inputId = id ?? generatedId\n\n const resolvedSpinner = (\n <Spinner loading className={classNames?.spinner} style={styles?.spinner} {...spinnerProps} />\n )\n\n const showPrefix = prefix || (loading && spinnerPosition === 'prefix')\n const showSuffix = suffix || (loading && spinnerPosition === 'suffix')\n\n return (\n <Field\n classNames={classNames?.field}\n styles={styles?.field}\n label={label}\n error={error}\n htmlFor={htmlFor ?? inputId}\n >\n <Flex\n alignItems=\"center\"\n className={cn(`${global.prefixCls}-input-root`, classNames?.root)}\n style={{ marginTop: '6px', ...styles?.root }}\n >\n {showPrefix && (\n <span\n className={cn(`${global.prefixCls}-input-prefix`, classNames?.prefix)}\n style={{ display: 'flex', alignItems: 'center', ...styles?.prefix }}\n >\n {loading && spinnerPosition === 'prefix' ? resolvedSpinner : prefix}\n </span>\n )}\n\n <input\n {...props}\n ref={ref}\n id={inputId}\n disabled={disabled || loading}\n data-loading={loading}\n className={cn(`${global.prefixCls}-input-content`, classNames?.content)}\n style={{ outline: 'none', flex: 1, minWidth: 0, ...styles?.content }}\n />\n\n {showSuffix && (\n <span\n className={cn(`${global.prefixCls}-input-suffix`, classNames?.suffix)}\n style={{ display: 'flex', alignItems: 'center', ...styles?.suffix }}\n >\n {loading && spinnerPosition === 'suffix' ? resolvedSpinner : suffix}\n </span>\n )}\n </Flex>\n </Field>\n )\n }\n)\n\nInput.displayName = 'Input'\n","import { IconButton, type IconButtonProps } from '@negative-space/button'\nimport { cn, Eye, EyeOff, useNSUI } from '@negative-space/system'\nimport { Tooltip, type TooltipProps, useTooltip } from '@negative-space/tooltip'\nimport React from 'react'\n\nimport { Input, type InputProps } from '.'\n\nexport interface InputPasswordProps extends Omit<\n InputProps,\n 'classNames' | 'styles' | 'suffix' | 'type'\n> {\n classNames?: InputProps['classNames'] & {\n button?: string\n icon?: string\n tooltip?: TooltipProps['classNames']\n }\n styles?: InputProps['styles'] & {\n button?: React.CSSProperties\n icon?: React.CSSProperties\n tooltip?: TooltipProps['styles']\n }\n onToggleVisibility?: (visible: boolean) => void\n buttonProps?: Omit<IconButtonProps, 'onClick' | 'aria-label'>\n}\n\nexport const InputPassword = React.forwardRef<HTMLInputElement, InputPasswordProps>(\n ({ onToggleVisibility, title, classNames, styles, buttonProps, ...rest }, ref) => {\n const { global, components } = useNSUI()\n const [visible, setVisible] = React.useState(false)\n\n const Title =\n title ??\n (visible ? components.inputPassword.passwordTitle : components.inputPassword.textTitle)\n\n const tooltip = useTooltip()\n\n const handleToggle = () => {\n setVisible((prev) => {\n const next = !prev\n onToggleVisibility?.(next)\n return next\n })\n }\n\n return (\n <>\n <Input\n {...rest}\n ref={ref}\n type={visible ? 'text' : 'password'}\n data-visible={visible}\n classNames={{\n ...classNames,\n root: cn(classNames?.root, `${global.prefixCls}-input-password`)\n }}\n styles={styles}\n suffix={\n <IconButton\n {...buttonProps}\n {...tooltip.triggerProps}\n onClick={handleToggle}\n title={!global.tooltip ? Title : undefined}\n aria-label={Title}\n className={classNames?.button}\n style={styles?.button}\n >\n {visible ? (\n <EyeOff className={classNames?.icon} style={styles?.icon} />\n ) : (\n <Eye className={classNames?.icon} style={styles?.icon} />\n )}\n </IconButton>\n }\n />\n {global.tooltip && (\n <Tooltip tooltip={tooltip} classNames={classNames?.tooltip} styles={styles?.tooltip}>\n {Title}\n </Tooltip>\n )}\n </>\n )\n }\n)\n\nInputPassword.displayName = 'InputPassword'\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@negative-space/input",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -28,10 +28,12 @@
28
28
  "url": "https://github.com/negative-space-ui/nsui/issues"
29
29
  },
30
30
  "dependencies": {
31
- "@negative-space/button": "2.4.2",
31
+ "@negative-space/button": "2.5.0",
32
32
  "@negative-space/field": "1.0.1",
33
33
  "@negative-space/flex": "1.2.2",
34
- "@negative-space/system": "1.3.0"
34
+ "@negative-space/spinner": "2.2.0",
35
+ "@negative-space/system": "1.3.0",
36
+ "@negative-space/tooltip": "1.0.0"
35
37
  },
36
38
  "peerDependencies": {
37
39
  "react": "^19.2.3"