@negative-space/button 2.4.0 → 2.4.1
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 +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.d.mts
CHANGED
|
@@ -7,14 +7,14 @@ interface ButtonProps extends Omit<FlexProps<'button'>, 'as' | 'prefix' | 'class
|
|
|
7
7
|
suffix?: React.ReactNode;
|
|
8
8
|
classNames?: {
|
|
9
9
|
btn?: string;
|
|
10
|
-
content?: string;
|
|
11
10
|
prefix?: string;
|
|
11
|
+
content?: string;
|
|
12
12
|
suffix?: string;
|
|
13
13
|
};
|
|
14
14
|
styles?: {
|
|
15
15
|
btn?: React.CSSProperties;
|
|
16
|
-
content?: React.CSSProperties;
|
|
17
16
|
prefix?: React.CSSProperties;
|
|
17
|
+
content?: React.CSSProperties;
|
|
18
18
|
suffix?: React.CSSProperties;
|
|
19
19
|
};
|
|
20
20
|
controlled?: boolean;
|
|
@@ -22,7 +22,7 @@ interface ButtonProps extends Omit<FlexProps<'button'>, 'as' | 'prefix' | 'class
|
|
|
22
22
|
isLoading?: boolean;
|
|
23
23
|
spinner?: React.ReactNode;
|
|
24
24
|
spinnerPosition?: 'full' | 'prefix' | 'content' | 'suffix';
|
|
25
|
-
spinnerProps?: SpinnerProps
|
|
25
|
+
spinnerProps?: Omit<SpinnerProps, 'isLoading'>;
|
|
26
26
|
}
|
|
27
27
|
declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
28
28
|
|
package/dist/index.d.ts
CHANGED
|
@@ -7,14 +7,14 @@ interface ButtonProps extends Omit<FlexProps<'button'>, 'as' | 'prefix' | 'class
|
|
|
7
7
|
suffix?: React.ReactNode;
|
|
8
8
|
classNames?: {
|
|
9
9
|
btn?: string;
|
|
10
|
-
content?: string;
|
|
11
10
|
prefix?: string;
|
|
11
|
+
content?: string;
|
|
12
12
|
suffix?: string;
|
|
13
13
|
};
|
|
14
14
|
styles?: {
|
|
15
15
|
btn?: React.CSSProperties;
|
|
16
|
-
content?: React.CSSProperties;
|
|
17
16
|
prefix?: React.CSSProperties;
|
|
17
|
+
content?: React.CSSProperties;
|
|
18
18
|
suffix?: React.CSSProperties;
|
|
19
19
|
};
|
|
20
20
|
controlled?: boolean;
|
|
@@ -22,7 +22,7 @@ interface ButtonProps extends Omit<FlexProps<'button'>, 'as' | 'prefix' | 'class
|
|
|
22
22
|
isLoading?: boolean;
|
|
23
23
|
spinner?: React.ReactNode;
|
|
24
24
|
spinnerPosition?: 'full' | 'prefix' | 'content' | 'suffix';
|
|
25
|
-
spinnerProps?: SpinnerProps
|
|
25
|
+
spinnerProps?: Omit<SpinnerProps, 'isLoading'>;
|
|
26
26
|
}
|
|
27
27
|
declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
28
28
|
|
package/dist/index.js
CHANGED
|
@@ -47,7 +47,7 @@ var Button = React__default.default.forwardRef(
|
|
|
47
47
|
const rippleDisabled = isRippleDisabled ?? components.button.isRippleDisabled;
|
|
48
48
|
const { createRipple } = ripple.useRipple(`${global.prefixCls}-ripple`);
|
|
49
49
|
const isDisabled = disabled || isLoading || (controlled ? groupDisabled : false);
|
|
50
|
-
const resolvedSpinner = spinner$1 ?? /* @__PURE__ */ jsxRuntime.jsx(spinner.Spinner, { ...spinnerProps });
|
|
50
|
+
const resolvedSpinner = spinner$1 ?? /* @__PURE__ */ jsxRuntime.jsx(spinner.Spinner, { isLoading: true, ...spinnerProps });
|
|
51
51
|
const handleClick = (e) => {
|
|
52
52
|
if (isDisabled) return;
|
|
53
53
|
const isKeyboard = e.detail === 0;
|
|
@@ -119,11 +119,11 @@ var IconButton = React__default.default.forwardRef(
|
|
|
119
119
|
"button",
|
|
120
120
|
{
|
|
121
121
|
ref,
|
|
122
|
-
className: system.cn(`${global.prefixCls}-icon-btn ${global.prefixCls}-clickable`, className),
|
|
123
|
-
style,
|
|
124
122
|
disabled: isDisabled,
|
|
125
123
|
"data-disabled": isDisabled,
|
|
126
124
|
onClick: handleClick,
|
|
125
|
+
className: system.cn(`${global.prefixCls}-icon-btn ${global.prefixCls}-clickable`, className),
|
|
126
|
+
style,
|
|
127
127
|
...props
|
|
128
128
|
}
|
|
129
129
|
);
|
|
@@ -146,7 +146,7 @@ var ButtonGroup = React__default.default.forwardRef(
|
|
|
146
146
|
Button,
|
|
147
147
|
{
|
|
148
148
|
controlled: true,
|
|
149
|
-
classNames: system.
|
|
149
|
+
classNames: system.mergeCn(classNames?.button, item.button.classNames),
|
|
150
150
|
styles: { ...styles?.button, ...item.button.styles },
|
|
151
151
|
...item.button
|
|
152
152
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ButtonContext.ts","../src/useButtonContext.ts","../src/Button.tsx","../src/IconButton.tsx","../src/ButtonGroup.tsx"],"names":["React","useContext","spinner","useNSUI","useRipple","jsx","Spinner","Flex","cn","jsxs","Fragment","mergeClassNames"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react'\n\nexport type ButtonContextValue = {\n disabled?: boolean\n}\n\nexport const ButtonContext = React.createContext<ButtonContextValue | null>(null)\n","import { useContext } from 'react'\nimport { ButtonContext, type ButtonContextValue } from './ButtonContext'\n\nexport const useButtonContextConditional = (\n controlled: boolean\n): ButtonContextValue | { disabled: false } => {\n const ctx = useContext(ButtonContext)\n\n if (controlled && !ctx) {\n throw new Error('Button components must be used within ButtonGroup')\n }\n\n return ctx ?? { disabled: false }\n}\n","import React from 'react'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { Flex, FlexProps } from '@negative-space/flex'\nimport { Spinner, type SpinnerProps } from '@negative-space/spinner'\nimport { useRipple } from '@negative-space/ripple'\nimport { useButtonContextConditional } from './useButtonContext'\n\nexport interface ButtonProps extends Omit<\n FlexProps<'button'>,\n 'as' | 'prefix' | 'className' | 'style'\n> {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n classNames?: {\n btn?: string\n content?: string\n prefix?: string\n suffix?: string\n }\n styles?: {\n btn?: React.CSSProperties\n content?: React.CSSProperties\n prefix?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n controlled?: boolean\n isRippleDisabled?: boolean\n isLoading?: boolean\n spinner?: React.ReactNode\n spinnerPosition?: 'full' | 'prefix' | 'content' | 'suffix'\n spinnerProps?: SpinnerProps\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n prefix,\n suffix,\n classNames,\n controlled,\n styles,\n disabled = false,\n isRippleDisabled,\n onClick,\n isLoading = false,\n spinner,\n spinnerPosition = 'full',\n spinnerProps,\n alignItems = 'center',\n justify = 'center',\n ...props\n },\n ref\n ) => {\n const { global, components } = useNSUI()\n const context = useButtonContextConditional(!!controlled)\n const groupDisabled = context.disabled\n\n const rippleDisabled = isRippleDisabled ?? components.button.isRippleDisabled\n const { createRipple } = useRipple(`${global.prefixCls}-ripple`)\n\n const isDisabled = disabled || isLoading || (controlled ? groupDisabled : false)\n const resolvedSpinner = spinner ?? <Spinner {...spinnerProps} />\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n if (isDisabled) return\n const isKeyboard = e.detail === 0\n if (!rippleDisabled) createRipple(e, { centered: isKeyboard })\n\n onClick?.(e)\n }\n\n const showPrefix = prefix || (isLoading && spinnerPosition === 'prefix')\n const showContent = children || (isLoading && spinnerPosition === 'content')\n const showSuffix = suffix || (isLoading && spinnerPosition === 'suffix')\n\n return (\n <Flex\n {...props}\n ref={ref}\n as=\"button\"\n alignItems={alignItems}\n justify={justify}\n disabled={isDisabled}\n data-disabled={isDisabled}\n onClick={handleClick}\n className={cn(`${global.prefixCls}-btn ${global.prefixCls}-clickable`, classNames?.btn)}\n style={styles?.btn}\n >\n {spinnerPosition === 'full' && isLoading ? (\n resolvedSpinner\n ) : (\n <>\n {showPrefix && (\n <span\n className={cn(`${global.prefixCls}-btn-prefix`, classNames?.prefix)}\n style={styles?.prefix}\n >\n {spinnerPosition === 'prefix' && isLoading ? resolvedSpinner : prefix}\n </span>\n )}\n\n {showContent && (\n <span\n className={cn(`${global.prefixCls}-btn-content`, classNames?.content)}\n style={styles?.content}\n >\n {spinnerPosition === 'content' && isLoading ? resolvedSpinner : children}\n </span>\n )}\n\n {showSuffix && (\n <span\n className={cn(`${global.prefixCls}-btn-suffix`, classNames?.suffix)}\n style={styles?.suffix}\n >\n {spinnerPosition === 'suffix' && isLoading ? resolvedSpinner : suffix}\n </span>\n )}\n </>\n )}\n </Flex>\n )\n }\n)\n\nButton.displayName = 'Button'\n","import React from 'react'\nimport { useRipple } from '@negative-space/ripple'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { useButtonContextConditional } from './useButtonContext'\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n controlled?: boolean\n isRippleDisabled?: boolean\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ className, controlled, style, disabled, isRippleDisabled, onClick, ...props }, ref) => {\n const { global, components } = useNSUI()\n const rippleDisabled = isRippleDisabled ?? components.iconButton.isRippleDisabled\n\n const context = useButtonContextConditional(!!controlled)\n const groupDisabled = context.disabled\n const isDisabled = disabled || (controlled ? groupDisabled : false)\n\n const { createRipple } = useRipple(`${global.prefixCls}-ripple`)\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n if (isDisabled) return\n const isKeyboard = e.detail === 0\n if (!rippleDisabled) createRipple(e, { centered: isKeyboard })\n\n onClick?.(e)\n }\n\n return (\n <button\n ref={ref}\n className={cn(`${global.prefixCls}-icon-btn ${global.prefixCls}-clickable`, className)}\n style={style}\n disabled={isDisabled}\n data-disabled={isDisabled}\n onClick={handleClick}\n {...props}\n />\n )\n }\n)\n\nIconButton.displayName = 'IconButton'\n","import React from 'react'\nimport { cn, mergeClassNames, useNSUI } from '@negative-space/system'\nimport { Flex, type FlexProps } from '@negative-space/flex'\nimport { Button, type ButtonProps } from './Button'\nimport { IconButton, type IconButtonProps } from './IconButton'\nimport { ButtonContext } from './ButtonContext'\n\nexport type ButtonComponent =\n | { button: Omit<ButtonProps, 'controlled'> }\n | { iconButton: Omit<IconButtonProps, 'controlled'> }\n\nexport interface ButtonGroupProps extends Omit<FlexProps, 'as' | 'className' | 'style'> {\n classNames?: {\n root?: string\n button?: {\n btn?: string\n content?: string\n prefix?: string\n suffix?: string\n }\n iconButton?: string\n }\n styles?: {\n root?: React.CSSProperties\n button?: {\n btn?: React.CSSProperties\n content?: React.CSSProperties\n prefix?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n iconButton?: React.CSSProperties\n }\n disabled?: boolean\n items: ButtonComponent[]\n}\n\nexport const ButtonGroup = React.forwardRef<HTMLDivElement, ButtonGroupProps>(\n ({ items, classNames, styles, disabled, ...props }, ref) => {\n const { global } = useNSUI()\n\n return (\n <ButtonContext.Provider value={{ disabled }}>\n <Flex\n {...props}\n ref={ref}\n className={cn(`${global.prefixCls}-btn-group`, classNames?.root)}\n style={styles?.root}\n >\n {items.map((item, index) => {\n if ('button' in item) {\n return (\n <Button\n key={index}\n controlled\n classNames={mergeClassNames(classNames?.button, item.button.classNames)}\n styles={{ ...styles?.button, ...item.button.styles }}\n {...item.button}\n />\n )\n }\n\n if ('iconButton' in item) {\n return (\n <IconButton\n key={index}\n controlled\n className={cn(classNames?.iconButton, item.iconButton.className)}\n style={{ ...styles?.iconButton, ...item.iconButton.style }}\n {...item.iconButton}\n />\n )\n }\n\n return null\n })}\n </Flex>\n </ButtonContext.Provider>\n )\n }\n)\n\nButtonGroup.displayName = 'ButtonGroup'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ButtonContext.ts","../src/useButtonContext.ts","../src/Button.tsx","../src/IconButton.tsx","../src/ButtonGroup.tsx"],"names":["React","useContext","spinner","useNSUI","useRipple","jsx","Spinner","Flex","cn","jsxs","Fragment","mergeCn"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react'\n\nexport type ButtonContextValue = {\n disabled?: boolean\n}\n\nexport const ButtonContext = React.createContext<ButtonContextValue | null>(null)\n","import { useContext } from 'react'\nimport { ButtonContext, type ButtonContextValue } from './ButtonContext'\n\nexport const useButtonContextConditional = (\n controlled: boolean\n): ButtonContextValue | { disabled: false } => {\n const ctx = useContext(ButtonContext)\n\n if (controlled && !ctx) {\n throw new Error('Button components must be used within ButtonGroup')\n }\n\n return ctx ?? { disabled: false }\n}\n","import React from 'react'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { Flex, FlexProps } from '@negative-space/flex'\nimport { Spinner, type SpinnerProps } from '@negative-space/spinner'\nimport { useRipple } from '@negative-space/ripple'\nimport { useButtonContextConditional } from './useButtonContext'\n\nexport interface ButtonProps extends Omit<\n FlexProps<'button'>,\n 'as' | 'prefix' | 'className' | 'style'\n> {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n classNames?: {\n btn?: string\n prefix?: string\n content?: string\n suffix?: string\n }\n styles?: {\n btn?: React.CSSProperties\n prefix?: React.CSSProperties\n content?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n controlled?: boolean\n isRippleDisabled?: boolean\n isLoading?: boolean\n spinner?: React.ReactNode\n spinnerPosition?: 'full' | 'prefix' | 'content' | 'suffix'\n spinnerProps?: Omit<SpinnerProps, 'isLoading'>\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n prefix,\n suffix,\n classNames,\n controlled,\n styles,\n disabled = false,\n isRippleDisabled,\n onClick,\n isLoading = false,\n spinner,\n spinnerPosition = 'full',\n spinnerProps,\n alignItems = 'center',\n justify = 'center',\n ...props\n },\n ref\n ) => {\n const { global, components } = useNSUI()\n const context = useButtonContextConditional(!!controlled)\n const groupDisabled = context.disabled\n\n const rippleDisabled = isRippleDisabled ?? components.button.isRippleDisabled\n const { createRipple } = useRipple(`${global.prefixCls}-ripple`)\n\n const isDisabled = disabled || isLoading || (controlled ? groupDisabled : false)\n const resolvedSpinner = spinner ?? <Spinner isLoading {...spinnerProps} />\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n if (isDisabled) return\n const isKeyboard = e.detail === 0\n if (!rippleDisabled) createRipple(e, { centered: isKeyboard })\n\n onClick?.(e)\n }\n\n const showPrefix = prefix || (isLoading && spinnerPosition === 'prefix')\n const showContent = children || (isLoading && spinnerPosition === 'content')\n const showSuffix = suffix || (isLoading && spinnerPosition === 'suffix')\n\n return (\n <Flex\n {...props}\n ref={ref}\n as=\"button\"\n alignItems={alignItems}\n justify={justify}\n disabled={isDisabled}\n data-disabled={isDisabled}\n onClick={handleClick}\n className={cn(`${global.prefixCls}-btn ${global.prefixCls}-clickable`, classNames?.btn)}\n style={styles?.btn}\n >\n {spinnerPosition === 'full' && isLoading ? (\n resolvedSpinner\n ) : (\n <>\n {showPrefix && (\n <span\n className={cn(`${global.prefixCls}-btn-prefix`, classNames?.prefix)}\n style={styles?.prefix}\n >\n {spinnerPosition === 'prefix' && isLoading ? resolvedSpinner : prefix}\n </span>\n )}\n\n {showContent && (\n <span\n className={cn(`${global.prefixCls}-btn-content`, classNames?.content)}\n style={styles?.content}\n >\n {spinnerPosition === 'content' && isLoading ? resolvedSpinner : children}\n </span>\n )}\n\n {showSuffix && (\n <span\n className={cn(`${global.prefixCls}-btn-suffix`, classNames?.suffix)}\n style={styles?.suffix}\n >\n {spinnerPosition === 'suffix' && isLoading ? resolvedSpinner : suffix}\n </span>\n )}\n </>\n )}\n </Flex>\n )\n }\n)\n\nButton.displayName = 'Button'\n","import React from 'react'\nimport { useRipple } from '@negative-space/ripple'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { useButtonContextConditional } from './useButtonContext'\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n controlled?: boolean\n isRippleDisabled?: boolean\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ className, controlled, style, disabled, isRippleDisabled, onClick, ...props }, ref) => {\n const { global, components } = useNSUI()\n const rippleDisabled = isRippleDisabled ?? components.iconButton.isRippleDisabled\n\n const context = useButtonContextConditional(!!controlled)\n const groupDisabled = context.disabled\n const isDisabled = disabled || (controlled ? groupDisabled : false)\n\n const { createRipple } = useRipple(`${global.prefixCls}-ripple`)\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n if (isDisabled) return\n const isKeyboard = e.detail === 0\n if (!rippleDisabled) createRipple(e, { centered: isKeyboard })\n\n onClick?.(e)\n }\n\n return (\n <button\n ref={ref}\n disabled={isDisabled}\n data-disabled={isDisabled}\n onClick={handleClick}\n className={cn(`${global.prefixCls}-icon-btn ${global.prefixCls}-clickable`, className)}\n style={style}\n {...props}\n />\n )\n }\n)\n\nIconButton.displayName = 'IconButton'\n","import React from 'react'\nimport { cn, mergeCn, useNSUI } from '@negative-space/system'\nimport { Flex, type FlexProps } from '@negative-space/flex'\nimport { Button, type ButtonProps } from './Button'\nimport { IconButton, type IconButtonProps } from './IconButton'\nimport { ButtonContext } from './ButtonContext'\n\nexport type ButtonComponent =\n | { button: Omit<ButtonProps, 'controlled'> }\n | { iconButton: Omit<IconButtonProps, 'controlled'> }\n\nexport interface ButtonGroupProps extends Omit<FlexProps, 'as' | 'className' | 'style'> {\n classNames?: {\n root?: string\n button?: {\n btn?: string\n content?: string\n prefix?: string\n suffix?: string\n }\n iconButton?: string\n }\n styles?: {\n root?: React.CSSProperties\n button?: {\n btn?: React.CSSProperties\n content?: React.CSSProperties\n prefix?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n iconButton?: React.CSSProperties\n }\n disabled?: boolean\n items: ButtonComponent[]\n}\n\nexport const ButtonGroup = React.forwardRef<HTMLDivElement, ButtonGroupProps>(\n ({ items, classNames, styles, disabled, ...props }, ref) => {\n const { global } = useNSUI()\n\n return (\n <ButtonContext.Provider value={{ disabled }}>\n <Flex\n {...props}\n ref={ref}\n className={cn(`${global.prefixCls}-btn-group`, classNames?.root)}\n style={styles?.root}\n >\n {items.map((item, index) => {\n if ('button' in item) {\n return (\n <Button\n key={index}\n controlled\n classNames={mergeCn(classNames?.button, item.button.classNames)}\n styles={{ ...styles?.button, ...item.button.styles }}\n {...item.button}\n />\n )\n }\n\n if ('iconButton' in item) {\n return (\n <IconButton\n key={index}\n controlled\n className={cn(classNames?.iconButton, item.iconButton.className)}\n style={{ ...styles?.iconButton, ...item.iconButton.style }}\n {...item.iconButton}\n />\n )\n }\n\n return null\n })}\n </Flex>\n </ButtonContext.Provider>\n )\n }\n)\n\nButtonGroup.displayName = 'ButtonGroup'\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { useContext } from 'react';
|
|
2
|
-
import { useNSUI, cn,
|
|
2
|
+
import { useNSUI, cn, mergeCn } from '@negative-space/system';
|
|
3
3
|
import { Flex } from '@negative-space/flex';
|
|
4
4
|
import { Spinner } from '@negative-space/spinner';
|
|
5
5
|
import { useRipple } from '@negative-space/ripple';
|
|
@@ -41,7 +41,7 @@ var Button = React.forwardRef(
|
|
|
41
41
|
const rippleDisabled = isRippleDisabled ?? components.button.isRippleDisabled;
|
|
42
42
|
const { createRipple } = useRipple(`${global.prefixCls}-ripple`);
|
|
43
43
|
const isDisabled = disabled || isLoading || (controlled ? groupDisabled : false);
|
|
44
|
-
const resolvedSpinner = spinner ?? /* @__PURE__ */ jsx(Spinner, { ...spinnerProps });
|
|
44
|
+
const resolvedSpinner = spinner ?? /* @__PURE__ */ jsx(Spinner, { isLoading: true, ...spinnerProps });
|
|
45
45
|
const handleClick = (e) => {
|
|
46
46
|
if (isDisabled) return;
|
|
47
47
|
const isKeyboard = e.detail === 0;
|
|
@@ -113,11 +113,11 @@ var IconButton = React.forwardRef(
|
|
|
113
113
|
"button",
|
|
114
114
|
{
|
|
115
115
|
ref,
|
|
116
|
-
className: cn(`${global.prefixCls}-icon-btn ${global.prefixCls}-clickable`, className),
|
|
117
|
-
style,
|
|
118
116
|
disabled: isDisabled,
|
|
119
117
|
"data-disabled": isDisabled,
|
|
120
118
|
onClick: handleClick,
|
|
119
|
+
className: cn(`${global.prefixCls}-icon-btn ${global.prefixCls}-clickable`, className),
|
|
120
|
+
style,
|
|
121
121
|
...props
|
|
122
122
|
}
|
|
123
123
|
);
|
|
@@ -140,7 +140,7 @@ var ButtonGroup = React.forwardRef(
|
|
|
140
140
|
Button,
|
|
141
141
|
{
|
|
142
142
|
controlled: true,
|
|
143
|
-
classNames:
|
|
143
|
+
classNames: mergeCn(classNames?.button, item.button.classNames),
|
|
144
144
|
styles: { ...styles?.button, ...item.button.styles },
|
|
145
145
|
...item.button
|
|
146
146
|
},
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ButtonContext.ts","../src/useButtonContext.ts","../src/Button.tsx","../src/IconButton.tsx","../src/ButtonGroup.tsx"],"names":["React","useNSUI","useRipple","jsx","cn","Flex"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react'\n\nexport type ButtonContextValue = {\n disabled?: boolean\n}\n\nexport const ButtonContext = React.createContext<ButtonContextValue | null>(null)\n","import { useContext } from 'react'\nimport { ButtonContext, type ButtonContextValue } from './ButtonContext'\n\nexport const useButtonContextConditional = (\n controlled: boolean\n): ButtonContextValue | { disabled: false } => {\n const ctx = useContext(ButtonContext)\n\n if (controlled && !ctx) {\n throw new Error('Button components must be used within ButtonGroup')\n }\n\n return ctx ?? { disabled: false }\n}\n","import React from 'react'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { Flex, FlexProps } from '@negative-space/flex'\nimport { Spinner, type SpinnerProps } from '@negative-space/spinner'\nimport { useRipple } from '@negative-space/ripple'\nimport { useButtonContextConditional } from './useButtonContext'\n\nexport interface ButtonProps extends Omit<\n FlexProps<'button'>,\n 'as' | 'prefix' | 'className' | 'style'\n> {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n classNames?: {\n btn?: string\n content?: string\n prefix?: string\n suffix?: string\n }\n styles?: {\n btn?: React.CSSProperties\n content?: React.CSSProperties\n prefix?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n controlled?: boolean\n isRippleDisabled?: boolean\n isLoading?: boolean\n spinner?: React.ReactNode\n spinnerPosition?: 'full' | 'prefix' | 'content' | 'suffix'\n spinnerProps?: SpinnerProps\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n prefix,\n suffix,\n classNames,\n controlled,\n styles,\n disabled = false,\n isRippleDisabled,\n onClick,\n isLoading = false,\n spinner,\n spinnerPosition = 'full',\n spinnerProps,\n alignItems = 'center',\n justify = 'center',\n ...props\n },\n ref\n ) => {\n const { global, components } = useNSUI()\n const context = useButtonContextConditional(!!controlled)\n const groupDisabled = context.disabled\n\n const rippleDisabled = isRippleDisabled ?? components.button.isRippleDisabled\n const { createRipple } = useRipple(`${global.prefixCls}-ripple`)\n\n const isDisabled = disabled || isLoading || (controlled ? groupDisabled : false)\n const resolvedSpinner = spinner ?? <Spinner {...spinnerProps} />\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n if (isDisabled) return\n const isKeyboard = e.detail === 0\n if (!rippleDisabled) createRipple(e, { centered: isKeyboard })\n\n onClick?.(e)\n }\n\n const showPrefix = prefix || (isLoading && spinnerPosition === 'prefix')\n const showContent = children || (isLoading && spinnerPosition === 'content')\n const showSuffix = suffix || (isLoading && spinnerPosition === 'suffix')\n\n return (\n <Flex\n {...props}\n ref={ref}\n as=\"button\"\n alignItems={alignItems}\n justify={justify}\n disabled={isDisabled}\n data-disabled={isDisabled}\n onClick={handleClick}\n className={cn(`${global.prefixCls}-btn ${global.prefixCls}-clickable`, classNames?.btn)}\n style={styles?.btn}\n >\n {spinnerPosition === 'full' && isLoading ? (\n resolvedSpinner\n ) : (\n <>\n {showPrefix && (\n <span\n className={cn(`${global.prefixCls}-btn-prefix`, classNames?.prefix)}\n style={styles?.prefix}\n >\n {spinnerPosition === 'prefix' && isLoading ? resolvedSpinner : prefix}\n </span>\n )}\n\n {showContent && (\n <span\n className={cn(`${global.prefixCls}-btn-content`, classNames?.content)}\n style={styles?.content}\n >\n {spinnerPosition === 'content' && isLoading ? resolvedSpinner : children}\n </span>\n )}\n\n {showSuffix && (\n <span\n className={cn(`${global.prefixCls}-btn-suffix`, classNames?.suffix)}\n style={styles?.suffix}\n >\n {spinnerPosition === 'suffix' && isLoading ? resolvedSpinner : suffix}\n </span>\n )}\n </>\n )}\n </Flex>\n )\n }\n)\n\nButton.displayName = 'Button'\n","import React from 'react'\nimport { useRipple } from '@negative-space/ripple'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { useButtonContextConditional } from './useButtonContext'\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n controlled?: boolean\n isRippleDisabled?: boolean\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ className, controlled, style, disabled, isRippleDisabled, onClick, ...props }, ref) => {\n const { global, components } = useNSUI()\n const rippleDisabled = isRippleDisabled ?? components.iconButton.isRippleDisabled\n\n const context = useButtonContextConditional(!!controlled)\n const groupDisabled = context.disabled\n const isDisabled = disabled || (controlled ? groupDisabled : false)\n\n const { createRipple } = useRipple(`${global.prefixCls}-ripple`)\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n if (isDisabled) return\n const isKeyboard = e.detail === 0\n if (!rippleDisabled) createRipple(e, { centered: isKeyboard })\n\n onClick?.(e)\n }\n\n return (\n <button\n ref={ref}\n className={cn(`${global.prefixCls}-icon-btn ${global.prefixCls}-clickable`, className)}\n style={style}\n disabled={isDisabled}\n data-disabled={isDisabled}\n onClick={handleClick}\n {...props}\n />\n )\n }\n)\n\nIconButton.displayName = 'IconButton'\n","import React from 'react'\nimport { cn, mergeClassNames, useNSUI } from '@negative-space/system'\nimport { Flex, type FlexProps } from '@negative-space/flex'\nimport { Button, type ButtonProps } from './Button'\nimport { IconButton, type IconButtonProps } from './IconButton'\nimport { ButtonContext } from './ButtonContext'\n\nexport type ButtonComponent =\n | { button: Omit<ButtonProps, 'controlled'> }\n | { iconButton: Omit<IconButtonProps, 'controlled'> }\n\nexport interface ButtonGroupProps extends Omit<FlexProps, 'as' | 'className' | 'style'> {\n classNames?: {\n root?: string\n button?: {\n btn?: string\n content?: string\n prefix?: string\n suffix?: string\n }\n iconButton?: string\n }\n styles?: {\n root?: React.CSSProperties\n button?: {\n btn?: React.CSSProperties\n content?: React.CSSProperties\n prefix?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n iconButton?: React.CSSProperties\n }\n disabled?: boolean\n items: ButtonComponent[]\n}\n\nexport const ButtonGroup = React.forwardRef<HTMLDivElement, ButtonGroupProps>(\n ({ items, classNames, styles, disabled, ...props }, ref) => {\n const { global } = useNSUI()\n\n return (\n <ButtonContext.Provider value={{ disabled }}>\n <Flex\n {...props}\n ref={ref}\n className={cn(`${global.prefixCls}-btn-group`, classNames?.root)}\n style={styles?.root}\n >\n {items.map((item, index) => {\n if ('button' in item) {\n return (\n <Button\n key={index}\n controlled\n classNames={mergeClassNames(classNames?.button, item.button.classNames)}\n styles={{ ...styles?.button, ...item.button.styles }}\n {...item.button}\n />\n )\n }\n\n if ('iconButton' in item) {\n return (\n <IconButton\n key={index}\n controlled\n className={cn(classNames?.iconButton, item.iconButton.className)}\n style={{ ...styles?.iconButton, ...item.iconButton.style }}\n {...item.iconButton}\n />\n )\n }\n\n return null\n })}\n </Flex>\n </ButtonContext.Provider>\n )\n }\n)\n\nButtonGroup.displayName = 'ButtonGroup'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ButtonContext.ts","../src/useButtonContext.ts","../src/Button.tsx","../src/IconButton.tsx","../src/ButtonGroup.tsx"],"names":["React","useNSUI","useRipple","jsx","cn","Flex"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react'\n\nexport type ButtonContextValue = {\n disabled?: boolean\n}\n\nexport const ButtonContext = React.createContext<ButtonContextValue | null>(null)\n","import { useContext } from 'react'\nimport { ButtonContext, type ButtonContextValue } from './ButtonContext'\n\nexport const useButtonContextConditional = (\n controlled: boolean\n): ButtonContextValue | { disabled: false } => {\n const ctx = useContext(ButtonContext)\n\n if (controlled && !ctx) {\n throw new Error('Button components must be used within ButtonGroup')\n }\n\n return ctx ?? { disabled: false }\n}\n","import React from 'react'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { Flex, FlexProps } from '@negative-space/flex'\nimport { Spinner, type SpinnerProps } from '@negative-space/spinner'\nimport { useRipple } from '@negative-space/ripple'\nimport { useButtonContextConditional } from './useButtonContext'\n\nexport interface ButtonProps extends Omit<\n FlexProps<'button'>,\n 'as' | 'prefix' | 'className' | 'style'\n> {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n classNames?: {\n btn?: string\n prefix?: string\n content?: string\n suffix?: string\n }\n styles?: {\n btn?: React.CSSProperties\n prefix?: React.CSSProperties\n content?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n controlled?: boolean\n isRippleDisabled?: boolean\n isLoading?: boolean\n spinner?: React.ReactNode\n spinnerPosition?: 'full' | 'prefix' | 'content' | 'suffix'\n spinnerProps?: Omit<SpinnerProps, 'isLoading'>\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n prefix,\n suffix,\n classNames,\n controlled,\n styles,\n disabled = false,\n isRippleDisabled,\n onClick,\n isLoading = false,\n spinner,\n spinnerPosition = 'full',\n spinnerProps,\n alignItems = 'center',\n justify = 'center',\n ...props\n },\n ref\n ) => {\n const { global, components } = useNSUI()\n const context = useButtonContextConditional(!!controlled)\n const groupDisabled = context.disabled\n\n const rippleDisabled = isRippleDisabled ?? components.button.isRippleDisabled\n const { createRipple } = useRipple(`${global.prefixCls}-ripple`)\n\n const isDisabled = disabled || isLoading || (controlled ? groupDisabled : false)\n const resolvedSpinner = spinner ?? <Spinner isLoading {...spinnerProps} />\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n if (isDisabled) return\n const isKeyboard = e.detail === 0\n if (!rippleDisabled) createRipple(e, { centered: isKeyboard })\n\n onClick?.(e)\n }\n\n const showPrefix = prefix || (isLoading && spinnerPosition === 'prefix')\n const showContent = children || (isLoading && spinnerPosition === 'content')\n const showSuffix = suffix || (isLoading && spinnerPosition === 'suffix')\n\n return (\n <Flex\n {...props}\n ref={ref}\n as=\"button\"\n alignItems={alignItems}\n justify={justify}\n disabled={isDisabled}\n data-disabled={isDisabled}\n onClick={handleClick}\n className={cn(`${global.prefixCls}-btn ${global.prefixCls}-clickable`, classNames?.btn)}\n style={styles?.btn}\n >\n {spinnerPosition === 'full' && isLoading ? (\n resolvedSpinner\n ) : (\n <>\n {showPrefix && (\n <span\n className={cn(`${global.prefixCls}-btn-prefix`, classNames?.prefix)}\n style={styles?.prefix}\n >\n {spinnerPosition === 'prefix' && isLoading ? resolvedSpinner : prefix}\n </span>\n )}\n\n {showContent && (\n <span\n className={cn(`${global.prefixCls}-btn-content`, classNames?.content)}\n style={styles?.content}\n >\n {spinnerPosition === 'content' && isLoading ? resolvedSpinner : children}\n </span>\n )}\n\n {showSuffix && (\n <span\n className={cn(`${global.prefixCls}-btn-suffix`, classNames?.suffix)}\n style={styles?.suffix}\n >\n {spinnerPosition === 'suffix' && isLoading ? resolvedSpinner : suffix}\n </span>\n )}\n </>\n )}\n </Flex>\n )\n }\n)\n\nButton.displayName = 'Button'\n","import React from 'react'\nimport { useRipple } from '@negative-space/ripple'\nimport { cn, useNSUI } from '@negative-space/system'\nimport { useButtonContextConditional } from './useButtonContext'\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n controlled?: boolean\n isRippleDisabled?: boolean\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ className, controlled, style, disabled, isRippleDisabled, onClick, ...props }, ref) => {\n const { global, components } = useNSUI()\n const rippleDisabled = isRippleDisabled ?? components.iconButton.isRippleDisabled\n\n const context = useButtonContextConditional(!!controlled)\n const groupDisabled = context.disabled\n const isDisabled = disabled || (controlled ? groupDisabled : false)\n\n const { createRipple } = useRipple(`${global.prefixCls}-ripple`)\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n if (isDisabled) return\n const isKeyboard = e.detail === 0\n if (!rippleDisabled) createRipple(e, { centered: isKeyboard })\n\n onClick?.(e)\n }\n\n return (\n <button\n ref={ref}\n disabled={isDisabled}\n data-disabled={isDisabled}\n onClick={handleClick}\n className={cn(`${global.prefixCls}-icon-btn ${global.prefixCls}-clickable`, className)}\n style={style}\n {...props}\n />\n )\n }\n)\n\nIconButton.displayName = 'IconButton'\n","import React from 'react'\nimport { cn, mergeCn, useNSUI } from '@negative-space/system'\nimport { Flex, type FlexProps } from '@negative-space/flex'\nimport { Button, type ButtonProps } from './Button'\nimport { IconButton, type IconButtonProps } from './IconButton'\nimport { ButtonContext } from './ButtonContext'\n\nexport type ButtonComponent =\n | { button: Omit<ButtonProps, 'controlled'> }\n | { iconButton: Omit<IconButtonProps, 'controlled'> }\n\nexport interface ButtonGroupProps extends Omit<FlexProps, 'as' | 'className' | 'style'> {\n classNames?: {\n root?: string\n button?: {\n btn?: string\n content?: string\n prefix?: string\n suffix?: string\n }\n iconButton?: string\n }\n styles?: {\n root?: React.CSSProperties\n button?: {\n btn?: React.CSSProperties\n content?: React.CSSProperties\n prefix?: React.CSSProperties\n suffix?: React.CSSProperties\n }\n iconButton?: React.CSSProperties\n }\n disabled?: boolean\n items: ButtonComponent[]\n}\n\nexport const ButtonGroup = React.forwardRef<HTMLDivElement, ButtonGroupProps>(\n ({ items, classNames, styles, disabled, ...props }, ref) => {\n const { global } = useNSUI()\n\n return (\n <ButtonContext.Provider value={{ disabled }}>\n <Flex\n {...props}\n ref={ref}\n className={cn(`${global.prefixCls}-btn-group`, classNames?.root)}\n style={styles?.root}\n >\n {items.map((item, index) => {\n if ('button' in item) {\n return (\n <Button\n key={index}\n controlled\n classNames={mergeCn(classNames?.button, item.button.classNames)}\n styles={{ ...styles?.button, ...item.button.styles }}\n {...item.button}\n />\n )\n }\n\n if ('iconButton' in item) {\n return (\n <IconButton\n key={index}\n controlled\n className={cn(classNames?.iconButton, item.iconButton.className)}\n style={{ ...styles?.iconButton, ...item.iconButton.style }}\n {...item.iconButton}\n />\n )\n }\n\n return null\n })}\n </Flex>\n </ButtonContext.Provider>\n )\n }\n)\n\nButtonGroup.displayName = 'ButtonGroup'\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@negative-space/button",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
"url": "https://github.com/negative-space-ui/nsui/issues"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@negative-space/flex": "1.2.
|
|
35
|
+
"@negative-space/flex": "1.2.1",
|
|
36
36
|
"@negative-space/ripple": "1.1.2",
|
|
37
|
-
"@negative-space/system": "1.
|
|
38
|
-
"@negative-space/spinner": "2.1.
|
|
37
|
+
"@negative-space/system": "1.2.0",
|
|
38
|
+
"@negative-space/spinner": "2.1.4"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"react": "^19.2.3"
|