@fluentui/react-spinbutton 9.5.16 → 9.6.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/CHANGELOG.md +21 -3
- package/dist/index.d.ts +14 -1
- package/lib/SpinButton.js +1 -1
- package/lib/SpinButton.js.map +1 -1
- package/lib/components/SpinButton/SpinButton.types.js.map +1 -1
- package/lib/components/SpinButton/index.js +1 -1
- package/lib/components/SpinButton/index.js.map +1 -1
- package/lib/components/SpinButton/renderSpinButton.js.map +1 -1
- package/lib/components/SpinButton/useSpinButton.js +34 -20
- package/lib/components/SpinButton/useSpinButton.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib-commonjs/SpinButton.js +3 -0
- package/lib-commonjs/SpinButton.js.map +1 -1
- package/lib-commonjs/components/SpinButton/SpinButton.types.js.map +1 -1
- package/lib-commonjs/components/SpinButton/index.js +3 -0
- package/lib-commonjs/components/SpinButton/index.js.map +1 -1
- package/lib-commonjs/components/SpinButton/renderSpinButton.js.map +1 -1
- package/lib-commonjs/components/SpinButton/useSpinButton.js +35 -18
- package/lib-commonjs/components/SpinButton/useSpinButton.js.map +1 -1
- package/lib-commonjs/index.js +3 -0
- package/lib-commonjs/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,35 @@
|
|
|
1
1
|
# Change Log - @fluentui/react-spinbutton
|
|
2
2
|
|
|
3
|
-
This log was last generated on Wed,
|
|
3
|
+
This log was last generated on Wed, 01 Apr 2026 15:50:23 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## [9.6.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinbutton_v9.6.1)
|
|
8
|
+
|
|
9
|
+
Wed, 01 Apr 2026 15:50:23 GMT
|
|
10
|
+
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-spinbutton_v9.6.0..@fluentui/react-spinbutton_v9.6.1)
|
|
11
|
+
|
|
12
|
+
### Patches
|
|
13
|
+
|
|
14
|
+
- Bump @fluentui/react-field to v9.5.0 ([PR #35912](https://github.com/microsoft/fluentui/pull/35912) by beachball)
|
|
15
|
+
|
|
16
|
+
## [9.6.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinbutton_v9.6.0)
|
|
17
|
+
|
|
18
|
+
Mon, 30 Mar 2026 14:37:41 GMT
|
|
19
|
+
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-spinbutton_v9.5.16..@fluentui/react-spinbutton_v9.6.0)
|
|
20
|
+
|
|
21
|
+
### Minor changes
|
|
22
|
+
|
|
23
|
+
- feat(react-spinbutton): add useSpinButtonBase_unstable hook ([PR #35907](https://github.com/microsoft/fluentui/pull/35907) by dmytrokirpa@microsoft.com)
|
|
24
|
+
|
|
7
25
|
## [9.5.16](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinbutton_v9.5.16)
|
|
8
26
|
|
|
9
|
-
Wed, 11 Mar 2026 09:
|
|
27
|
+
Wed, 11 Mar 2026 09:22:22 GMT
|
|
10
28
|
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-spinbutton_v9.5.15..@fluentui/react-spinbutton_v9.5.16)
|
|
11
29
|
|
|
12
30
|
### Patches
|
|
13
31
|
|
|
14
|
-
- Bump @fluentui/react-field to v9.4.16 ([PR #
|
|
32
|
+
- Bump @fluentui/react-field to v9.4.16 ([PR #35859](https://github.com/microsoft/fluentui/pull/35859) by beachball)
|
|
15
33
|
|
|
16
34
|
## [9.5.15](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinbutton_v9.5.15)
|
|
17
35
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ComponentProps } from '@fluentui/react-utilities';
|
|
2
2
|
import type { ComponentState } from '@fluentui/react-utilities';
|
|
3
|
+
import type { DistributiveOmit } from '@fluentui/react-utilities';
|
|
3
4
|
import type { ForwardRefComponent } from '@fluentui/react-utilities';
|
|
4
5
|
import type { JSXElement } from '@fluentui/react-utilities';
|
|
5
6
|
import * as React_2 from 'react';
|
|
@@ -9,13 +10,17 @@ import { SlotClassNames } from '@fluentui/react-utilities';
|
|
|
9
10
|
/**
|
|
10
11
|
* Render the final JSX of SpinButton
|
|
11
12
|
*/
|
|
12
|
-
export declare const renderSpinButton_unstable: (state:
|
|
13
|
+
export declare const renderSpinButton_unstable: (state: SpinButtonBaseState) => JSXElement;
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* A SpinButton allows someone to incrementally adjust a value in small steps.
|
|
16
17
|
*/
|
|
17
18
|
export declare const SpinButton: ForwardRefComponent<SpinButtonProps>;
|
|
18
19
|
|
|
20
|
+
export declare type SpinButtonBaseProps = DistributiveOmit<SpinButtonProps, 'appearance' | 'size'>;
|
|
21
|
+
|
|
22
|
+
export declare type SpinButtonBaseState = DistributiveOmit<SpinButtonState, 'appearance' | 'size'>;
|
|
23
|
+
|
|
19
24
|
export declare type SpinButtonBounds = 'none' | 'min' | 'max' | 'both';
|
|
20
25
|
|
|
21
26
|
export declare type SpinButtonChangeEvent = React_2.MouseEvent<HTMLButtonElement> | React_2.ChangeEvent<HTMLElement> | React_2.FocusEvent<HTMLInputElement> | React_2.KeyboardEvent<HTMLInputElement>;
|
|
@@ -164,6 +169,14 @@ export declare type SpinButtonState = ComponentState<SpinButtonSlots> & Required
|
|
|
164
169
|
*/
|
|
165
170
|
export declare const useSpinButton_unstable: (props: SpinButtonProps, ref: React_2.Ref<HTMLInputElement>) => SpinButtonState;
|
|
166
171
|
|
|
172
|
+
/**
|
|
173
|
+
* Create the base state required to render SpinButton without design-specific props.
|
|
174
|
+
*
|
|
175
|
+
* @param props - props from this instance of SpinButton (without appearance/size)
|
|
176
|
+
* @param ref - reference to root HTMLElement of SpinButton
|
|
177
|
+
*/
|
|
178
|
+
export declare const useSpinButtonBase_unstable: (props: SpinButtonBaseProps, ref: React_2.Ref<HTMLInputElement>) => SpinButtonBaseState;
|
|
179
|
+
|
|
167
180
|
/**
|
|
168
181
|
* Apply styling to the SpinButton slots based on the state
|
|
169
182
|
*/
|
package/lib/SpinButton.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SpinButton, renderSpinButton_unstable, spinButtonClassNames, useSpinButtonStyles_unstable, useSpinButton_unstable } from './components/SpinButton/index';
|
|
1
|
+
export { SpinButton, renderSpinButton_unstable, spinButtonClassNames, useSpinButtonStyles_unstable, useSpinButtonBase_unstable, useSpinButton_unstable } from './components/SpinButton/index';
|
package/lib/SpinButton.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SpinButton.ts"],"sourcesContent":["export type {\n SpinButtonBounds,\n SpinButtonChangeEvent,\n SpinButtonOnChangeData,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonSpinState,\n SpinButtonState,\n} from './components/SpinButton/index';\nexport {\n SpinButton,\n renderSpinButton_unstable,\n spinButtonClassNames,\n useSpinButtonStyles_unstable,\n useSpinButton_unstable,\n} from './components/SpinButton/index';\n"],"names":["SpinButton","renderSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable","useSpinButton_unstable"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/SpinButton.ts"],"sourcesContent":["export type {\n SpinButtonBaseProps,\n SpinButtonBaseState,\n SpinButtonBounds,\n SpinButtonChangeEvent,\n SpinButtonOnChangeData,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonSpinState,\n SpinButtonState,\n} from './components/SpinButton/index';\nexport {\n SpinButton,\n renderSpinButton_unstable,\n spinButtonClassNames,\n useSpinButtonStyles_unstable,\n useSpinButtonBase_unstable,\n useSpinButton_unstable,\n} from './components/SpinButton/index';\n"],"names":["SpinButton","renderSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable","useSpinButtonBase_unstable","useSpinButton_unstable"],"mappings":"AAWA,SACEA,UAAU,EACVC,yBAAyB,EACzBC,oBAAoB,EACpBC,4BAA4B,EAC5BC,0BAA0B,EAC1BC,sBAAsB,QACjB,gCAAgC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SpinButton/SpinButton.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities';\nimport * as React from 'react';\n\nexport type SpinButtonSlots = {\n /**\n * The root element of SpinButton is a container `<div>`.\n * The root slot receives the `className` and `style` specified on the `<SpinButton>`.\n * All other native props are applied to the primary slot: `input`.\n */\n root: NonNullable<Slot<'span'>>;\n\n /**\n * Input that displays the current value and accepts direct input from the user.\n * Displayed value is formatted.\n *\n * This is the primary slot.\n */\n input: NonNullable<Slot<'input'>>;\n\n /**\n * Renders the increment control.\n */\n incrementButton: NonNullable<Slot<'button'>>;\n\n /**\n * Renders the decrement control.\n */\n decrementButton: NonNullable<Slot<'button'>>;\n};\n\n/**\n * SpinButton Props\n */\nexport type SpinButtonProps = Omit<\n ComponentProps<Partial<SpinButtonSlots>, 'input'>,\n 'defaultValue' | 'onChange' | 'size' | 'value'\n> & {\n /**\n * Controls the colors and borders of the input.\n * @default 'outline'\n */\n appearance?: 'outline' | 'underline' | 'filled-darker' | 'filled-lighter';\n\n /**\n * Initial value of the control (assumed to be valid). Updates to this prop will not be respected.\n *\n * Use this if you intend for the SpinButton to be an uncontrolled component which maintains its\n * own value. For a controlled component, use `value` instead. (Mutually exclusive with `value`.)\n *\n * Use `null` to indicate the control has no value.\n */\n defaultValue?: number | null;\n\n /**\n * String representation of `value`.\n *\n * Use this when displaying the value to users as something other than a plain number.\n * For example, when displaying currency values this might be \"$1.00\" when value is `1`.\n *\n * Only provide this if the SpinButton is a controlled component where you are maintaining its\n * current state and passing updates based on change events. When SpinButton is used as an\n * uncontrolled component this prop is ignored.\n */\n displayValue?: string;\n\n /**\n * Max value of the control. If not provided, the control has no maximum value.\n */\n max?: number;\n\n /**\n * Min value of the control. If not provided, the control has no minimum value.\n */\n min?: number;\n\n /**\n * Callback for when the committed value changes.\n * - User presses the up/down buttons (on single press or every spin)\n * - User presses the up/down arrow keys (on single press or every spin)\n * - User *commits* edits to the input text by focusing away (blurring) or pressing enter.\n * Note that this is NOT called for every key press while the user is editing.\n */\n // eslint-disable-next-line @nx/workspace-consistent-callback-type -- can't change type of existing callback\n onChange?: (event: SpinButtonChangeEvent, data: SpinButtonOnChangeData) => void;\n\n /**\n * How many decimal places the value should be rounded to.\n *\n * The default is calculated based on the precision of `step`: i.e. if step = 1, precision = 0.\n * step = 0.0089, precision = 4. step = 300, precision = 2. step = 23.00, precision = 2.\n */\n precision?: number;\n\n /**\n * Size of the input.\n * @default 'medium'\n */\n size?: 'small' | 'medium';\n\n /**\n * Difference between two adjacent values of the control.\n * This value is used to calculate the precision of the input if no `precision` is given.\n * The precision calculated this way will always be greater than or equal 0.\n * @default 1\n */\n step?: number;\n\n /**\n * Large difference between two values. This should be greater than `step` and is used\n * when users hit the Page Up or Page Down keys.\n * @default 1\n */\n stepPage?: number;\n\n /**\n * Current value of the control (assumed to be valid).\n *\n * Only provide this if the SpinButton is a controlled component where you are maintaining its\n * current state and passing updates based on change events; otherwise, use the `defaultValue`\n * property.\n *\n * Use `null` to indicate the control has no value.\n *\n * Mutually exclusive with `defaultValue`.\n */\n value?: number | null;\n};\n\n/**\n * State used in rendering SpinButton\n */\nexport type SpinButtonState = ComponentState<SpinButtonSlots> &\n Required<Pick<SpinButtonProps, 'appearance' | 'size'>> & {\n /**\n * State used to track which direction, if any, SpinButton is currently spinning.\n * @default 'rest'\n */\n spinState: SpinButtonSpinState;\n\n /**\n * State used to track if the value is at the range bounds of [min-max].\n * @default 'none'\n */\n atBound: SpinButtonBounds;\n };\n\nexport type SpinButtonChangeEvent =\n | React.MouseEvent<HTMLButtonElement>\n | React.ChangeEvent<HTMLElement>\n | React.FocusEvent<HTMLInputElement>\n | React.KeyboardEvent<HTMLInputElement>;\n\nexport type SpinButtonOnChangeData = {\n value?: number | null;\n displayValue?: string;\n};\n\nexport type SpinButtonSpinState = 'rest' | 'up' | 'down';\nexport type SpinButtonBounds = 'none' | 'min' | 'max' | 'both';\n"],"names":["React"],"mappings":"AACA,YAAYA,WAAW,QAAQ"}
|
|
1
|
+
{"version":3,"sources":["../src/components/SpinButton/SpinButton.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, DistributiveOmit, Slot } from '@fluentui/react-utilities';\nimport * as React from 'react';\n\nexport type SpinButtonSlots = {\n /**\n * The root element of SpinButton is a container `<div>`.\n * The root slot receives the `className` and `style` specified on the `<SpinButton>`.\n * All other native props are applied to the primary slot: `input`.\n */\n root: NonNullable<Slot<'span'>>;\n\n /**\n * Input that displays the current value and accepts direct input from the user.\n * Displayed value is formatted.\n *\n * This is the primary slot.\n */\n input: NonNullable<Slot<'input'>>;\n\n /**\n * Renders the increment control.\n */\n incrementButton: NonNullable<Slot<'button'>>;\n\n /**\n * Renders the decrement control.\n */\n decrementButton: NonNullable<Slot<'button'>>;\n};\n\n/**\n * SpinButton Props\n */\nexport type SpinButtonProps = Omit<\n ComponentProps<Partial<SpinButtonSlots>, 'input'>,\n 'defaultValue' | 'onChange' | 'size' | 'value'\n> & {\n /**\n * Controls the colors and borders of the input.\n * @default 'outline'\n */\n appearance?: 'outline' | 'underline' | 'filled-darker' | 'filled-lighter';\n\n /**\n * Initial value of the control (assumed to be valid). Updates to this prop will not be respected.\n *\n * Use this if you intend for the SpinButton to be an uncontrolled component which maintains its\n * own value. For a controlled component, use `value` instead. (Mutually exclusive with `value`.)\n *\n * Use `null` to indicate the control has no value.\n */\n defaultValue?: number | null;\n\n /**\n * String representation of `value`.\n *\n * Use this when displaying the value to users as something other than a plain number.\n * For example, when displaying currency values this might be \"$1.00\" when value is `1`.\n *\n * Only provide this if the SpinButton is a controlled component where you are maintaining its\n * current state and passing updates based on change events. When SpinButton is used as an\n * uncontrolled component this prop is ignored.\n */\n displayValue?: string;\n\n /**\n * Max value of the control. If not provided, the control has no maximum value.\n */\n max?: number;\n\n /**\n * Min value of the control. If not provided, the control has no minimum value.\n */\n min?: number;\n\n /**\n * Callback for when the committed value changes.\n * - User presses the up/down buttons (on single press or every spin)\n * - User presses the up/down arrow keys (on single press or every spin)\n * - User *commits* edits to the input text by focusing away (blurring) or pressing enter.\n * Note that this is NOT called for every key press while the user is editing.\n */\n // eslint-disable-next-line @nx/workspace-consistent-callback-type -- can't change type of existing callback\n onChange?: (event: SpinButtonChangeEvent, data: SpinButtonOnChangeData) => void;\n\n /**\n * How many decimal places the value should be rounded to.\n *\n * The default is calculated based on the precision of `step`: i.e. if step = 1, precision = 0.\n * step = 0.0089, precision = 4. step = 300, precision = 2. step = 23.00, precision = 2.\n */\n precision?: number;\n\n /**\n * Size of the input.\n * @default 'medium'\n */\n size?: 'small' | 'medium';\n\n /**\n * Difference between two adjacent values of the control.\n * This value is used to calculate the precision of the input if no `precision` is given.\n * The precision calculated this way will always be greater than or equal 0.\n * @default 1\n */\n step?: number;\n\n /**\n * Large difference between two values. This should be greater than `step` and is used\n * when users hit the Page Up or Page Down keys.\n * @default 1\n */\n stepPage?: number;\n\n /**\n * Current value of the control (assumed to be valid).\n *\n * Only provide this if the SpinButton is a controlled component where you are maintaining its\n * current state and passing updates based on change events; otherwise, use the `defaultValue`\n * property.\n *\n * Use `null` to indicate the control has no value.\n *\n * Mutually exclusive with `defaultValue`.\n */\n value?: number | null;\n};\n\n/**\n * State used in rendering SpinButton\n */\nexport type SpinButtonState = ComponentState<SpinButtonSlots> &\n Required<Pick<SpinButtonProps, 'appearance' | 'size'>> & {\n /**\n * State used to track which direction, if any, SpinButton is currently spinning.\n * @default 'rest'\n */\n spinState: SpinButtonSpinState;\n\n /**\n * State used to track if the value is at the range bounds of [min-max].\n * @default 'none'\n */\n atBound: SpinButtonBounds;\n };\n\nexport type SpinButtonChangeEvent =\n | React.MouseEvent<HTMLButtonElement>\n | React.ChangeEvent<HTMLElement>\n | React.FocusEvent<HTMLInputElement>\n | React.KeyboardEvent<HTMLInputElement>;\n\nexport type SpinButtonOnChangeData = {\n value?: number | null;\n displayValue?: string;\n};\n\nexport type SpinButtonSpinState = 'rest' | 'up' | 'down';\nexport type SpinButtonBounds = 'none' | 'min' | 'max' | 'both';\n\nexport type SpinButtonBaseProps = DistributiveOmit<SpinButtonProps, 'appearance' | 'size'>;\nexport type SpinButtonBaseState = DistributiveOmit<SpinButtonState, 'appearance' | 'size'>;\n"],"names":["React"],"mappings":"AACA,YAAYA,WAAW,QAAQ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { SpinButton } from './SpinButton';
|
|
2
2
|
export { renderSpinButton_unstable } from './renderSpinButton';
|
|
3
|
-
export { useSpinButton_unstable } from './useSpinButton';
|
|
3
|
+
export { useSpinButtonBase_unstable, useSpinButton_unstable } from './useSpinButton';
|
|
4
4
|
export { spinButtonClassNames, useSpinButtonStyles_unstable } from './useSpinButtonStyles.styles';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SpinButton/index.ts"],"sourcesContent":["export { SpinButton } from './SpinButton';\nexport type {\n SpinButtonBounds,\n SpinButtonChangeEvent,\n SpinButtonOnChangeData,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonSpinState,\n SpinButtonState,\n} from './SpinButton.types';\nexport { renderSpinButton_unstable } from './renderSpinButton';\nexport { useSpinButton_unstable } from './useSpinButton';\nexport { spinButtonClassNames, useSpinButtonStyles_unstable } from './useSpinButtonStyles.styles';\n"],"names":["SpinButton","renderSpinButton_unstable","useSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;
|
|
1
|
+
{"version":3,"sources":["../src/components/SpinButton/index.ts"],"sourcesContent":["export { SpinButton } from './SpinButton';\nexport type {\n SpinButtonBaseProps,\n SpinButtonBaseState,\n SpinButtonBounds,\n SpinButtonChangeEvent,\n SpinButtonOnChangeData,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonSpinState,\n SpinButtonState,\n} from './SpinButton.types';\nexport { renderSpinButton_unstable } from './renderSpinButton';\nexport { useSpinButtonBase_unstable, useSpinButton_unstable } from './useSpinButton';\nexport { spinButtonClassNames, useSpinButtonStyles_unstable } from './useSpinButtonStyles.styles';\n"],"names":["SpinButton","renderSpinButton_unstable","useSpinButtonBase_unstable","useSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAY1C,SAASC,yBAAyB,QAAQ,qBAAqB;AAC/D,SAASC,0BAA0B,EAAEC,sBAAsB,QAAQ,kBAAkB;AACrF,SAASC,oBAAoB,EAAEC,4BAA4B,QAAQ,+BAA+B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SpinButton/renderSpinButton.tsx"],"sourcesContent":["/** @jsxRuntime automatic */\n/** @jsxImportSource @fluentui/react-jsx-runtime */\n\nimport { assertSlots } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport type {
|
|
1
|
+
{"version":3,"sources":["../src/components/SpinButton/renderSpinButton.tsx"],"sourcesContent":["/** @jsxRuntime automatic */\n/** @jsxImportSource @fluentui/react-jsx-runtime */\n\nimport { assertSlots } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport type { SpinButtonBaseState, SpinButtonSlots } from './SpinButton.types';\n\n/**\n * Render the final JSX of SpinButton\n */\nexport const renderSpinButton_unstable = (state: SpinButtonBaseState): JSXElement => {\n assertSlots<SpinButtonSlots>(state);\n\n return (\n <state.root>\n <state.input />\n <state.incrementButton />\n <state.decrementButton />\n </state.root>\n );\n};\n"],"names":["assertSlots","renderSpinButton_unstable","state","root","input","incrementButton","decrementButton"],"mappings":"AAAA,0BAA0B,GAC1B,iDAAiD;AAEjD,SAASA,WAAW,QAAQ,4BAA4B;AAIxD;;CAEC,GACD,OAAO,MAAMC,4BAA4B,CAACC;IACxCF,YAA6BE;IAE7B,qBACE,MAACA,MAAMC,IAAI;;0BACT,KAACD,MAAME,KAAK;0BACZ,KAACF,MAAMG,eAAe;0BACtB,KAACH,MAAMI,eAAe;;;AAG5B,EAAE"}
|
|
@@ -14,19 +14,11 @@ const MAX_SPIN_TIME_MS = 1000;
|
|
|
14
14
|
// pull this out into a util function in the SpinButton package.
|
|
15
15
|
const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
16
16
|
/**
|
|
17
|
-
* Create the state required to render SpinButton.
|
|
17
|
+
* Create the base state required to render SpinButton without design-specific props.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
* before being passed to renderSpinButton_unstable.
|
|
21
|
-
*
|
|
22
|
-
* @param props - props from this instance of SpinButton
|
|
19
|
+
* @param props - props from this instance of SpinButton (without appearance/size)
|
|
23
20
|
* @param ref - reference to root HTMLElement of SpinButton
|
|
24
|
-
*/ export const
|
|
25
|
-
// Merge props from surrounding <Field>, if any
|
|
26
|
-
props = useFieldControlProps_unstable(props, {
|
|
27
|
-
supportsLabelFor: true,
|
|
28
|
-
supportsRequired: true
|
|
29
|
-
});
|
|
21
|
+
*/ export const useSpinButtonBase_unstable = (props, ref)=>{
|
|
30
22
|
const nativeProps = getPartitionedNativeProps({
|
|
31
23
|
props,
|
|
32
24
|
primarySlotTagName: 'input',
|
|
@@ -35,13 +27,10 @@ const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
|
35
27
|
'max',
|
|
36
28
|
'min',
|
|
37
29
|
'onChange',
|
|
38
|
-
'size',
|
|
39
30
|
'value'
|
|
40
31
|
]
|
|
41
32
|
});
|
|
42
|
-
const
|
|
43
|
-
var _overrides_inputDefaultAppearance;
|
|
44
|
-
const { value, displayValue, defaultValue, min, max, step = 1, stepPage = 1, precision: precisionFromProps, onChange, size = 'medium', appearance = (_overrides_inputDefaultAppearance = overrides.inputDefaultAppearance) !== null && _overrides_inputDefaultAppearance !== void 0 ? _overrides_inputDefaultAppearance : 'outline', root, input, incrementButton, decrementButton } = props;
|
|
33
|
+
const { value, displayValue, defaultValue, min, max, step = 1, stepPage = 1, precision: precisionFromProps, onChange, root, input, incrementButton, decrementButton } = props;
|
|
45
34
|
const precision = React.useMemo(()=>{
|
|
46
35
|
return precisionFromProps !== null && precisionFromProps !== void 0 ? precisionFromProps : Math.max(calculatePrecision(step), 0);
|
|
47
36
|
}, [
|
|
@@ -105,6 +94,7 @@ const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
|
105
94
|
if (inputRef.current) {
|
|
106
95
|
// we need to set this here using the IDL attribute directly, because otherwise the timing of the ARIA value update
|
|
107
96
|
// is not in sync with the user-entered native input value, and some screen readers end up reading the wrong value.
|
|
97
|
+
// eslint-disable-next-line react-compiler/react-compiler
|
|
108
98
|
inputRef.current.ariaValueNow = newValue;
|
|
109
99
|
}
|
|
110
100
|
};
|
|
@@ -213,8 +203,6 @@ const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
|
213
203
|
}
|
|
214
204
|
}
|
|
215
205
|
const state = {
|
|
216
|
-
size,
|
|
217
|
-
appearance,
|
|
218
206
|
spinState: keyboardSpinState,
|
|
219
207
|
atBound: internalState.current.atBound,
|
|
220
208
|
components: {
|
|
@@ -231,7 +219,6 @@ const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
|
231
219
|
defaultProps: {
|
|
232
220
|
autoComplete: 'off',
|
|
233
221
|
role: 'spinbutton',
|
|
234
|
-
appearance,
|
|
235
222
|
type: 'text',
|
|
236
223
|
...nativeProps.primary
|
|
237
224
|
},
|
|
@@ -240,7 +227,6 @@ const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
|
240
227
|
incrementButton: slot.always(incrementButton, {
|
|
241
228
|
defaultProps: {
|
|
242
229
|
tabIndex: -1,
|
|
243
|
-
children: /*#__PURE__*/ React.createElement(ChevronUp16Regular, null),
|
|
244
230
|
disabled: nativeProps.primary.readOnly || nativeProps.primary.disabled || internalState.current.atBound === 'max' || internalState.current.atBound === 'both',
|
|
245
231
|
'aria-label': 'Increment value',
|
|
246
232
|
type: 'button'
|
|
@@ -250,7 +236,6 @@ const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
|
250
236
|
decrementButton: slot.always(decrementButton, {
|
|
251
237
|
defaultProps: {
|
|
252
238
|
tabIndex: -1,
|
|
253
|
-
children: /*#__PURE__*/ React.createElement(ChevronDown16Regular, null),
|
|
254
239
|
disabled: nativeProps.primary.readOnly || nativeProps.primary.disabled || internalState.current.atBound === 'min' || internalState.current.atBound === 'both',
|
|
255
240
|
'aria-label': 'Decrement value',
|
|
256
241
|
type: 'button'
|
|
@@ -279,3 +264,32 @@ const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
|
279
264
|
state.decrementButton.onMouseLeave = mergeCallbacks(state.decrementButton.onMouseLeave, handleStepMouseUpOrLeave);
|
|
280
265
|
return state;
|
|
281
266
|
};
|
|
267
|
+
/**
|
|
268
|
+
* Create the state required to render SpinButton.
|
|
269
|
+
*
|
|
270
|
+
* The returned state can be modified with hooks such as useSpinButtonStyles_unstable,
|
|
271
|
+
* before being passed to renderSpinButton_unstable.
|
|
272
|
+
*
|
|
273
|
+
* @param props - props from this instance of SpinButton
|
|
274
|
+
* @param ref - reference to root HTMLElement of SpinButton
|
|
275
|
+
*/ export const useSpinButton_unstable = (props, ref)=>{
|
|
276
|
+
var _state_incrementButton, _state_decrementButton;
|
|
277
|
+
// Merge props from surrounding <Field>, if any
|
|
278
|
+
props = useFieldControlProps_unstable(props, {
|
|
279
|
+
supportsLabelFor: true,
|
|
280
|
+
supportsRequired: true
|
|
281
|
+
});
|
|
282
|
+
const overrides = useOverrides();
|
|
283
|
+
var _overrides_inputDefaultAppearance;
|
|
284
|
+
const { appearance = (_overrides_inputDefaultAppearance = overrides.inputDefaultAppearance) !== null && _overrides_inputDefaultAppearance !== void 0 ? _overrides_inputDefaultAppearance : 'outline', size = 'medium', ...baseProps } = props;
|
|
285
|
+
const state = useSpinButtonBase_unstable(baseProps, ref);
|
|
286
|
+
var _children;
|
|
287
|
+
(_children = (_state_incrementButton = state.incrementButton).children) !== null && _children !== void 0 ? _children : _state_incrementButton.children = /*#__PURE__*/ React.createElement(ChevronUp16Regular, null);
|
|
288
|
+
var _children1;
|
|
289
|
+
(_children1 = (_state_decrementButton = state.decrementButton).children) !== null && _children1 !== void 0 ? _children1 : _state_decrementButton.children = /*#__PURE__*/ React.createElement(ChevronDown16Regular, null);
|
|
290
|
+
return {
|
|
291
|
+
...state,
|
|
292
|
+
appearance,
|
|
293
|
+
size
|
|
294
|
+
};
|
|
295
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SpinButton/useSpinButton.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useFieldControlProps_unstable } from '@fluentui/react-field';\nimport {\n getPartitionedNativeProps,\n mergeCallbacks,\n useControllableState,\n useTimeout,\n slot,\n useMergedRefs,\n} from '@fluentui/react-utilities';\nimport { ArrowUp, ArrowDown, End, Enter, Escape, Home, PageDown, PageUp } from '@fluentui/keyboard-keys';\nimport {\n SpinButtonProps,\n SpinButtonState,\n SpinButtonSpinState,\n SpinButtonChangeEvent,\n SpinButtonBounds,\n} from './SpinButton.types';\nimport { calculatePrecision, precisionRound, getBound, clamp } from '../../utils/index';\nimport { ChevronUp16Regular, ChevronDown16Regular } from '@fluentui/react-icons';\nimport { useOverrides_unstable as useOverrides } from '@fluentui/react-shared-contexts';\n\ntype InternalState = {\n value: number | null;\n spinState: SpinButtonSpinState;\n spinTime: number;\n spinDelay: number;\n previousTextValue?: string;\n atBound: SpinButtonBounds;\n};\n\nconst DEFAULT_SPIN_DELAY_MS = 150;\nconst MIN_SPIN_DELAY_MS = 80;\nconst MAX_SPIN_TIME_MS = 1000;\n\n// This is here to give an ease for the mouse held down case.\n// Exact easing it to be defined. Once it is we'll likely\n// pull this out into a util function in the SpinButton package.\nconst lerp = (start: number, end: number, percent: number): number => start + (end - start) * percent;\n\n/**\n * Create the state required to render SpinButton.\n *\n * The returned state can be modified with hooks such as useSpinButtonStyles_unstable,\n * before being passed to renderSpinButton_unstable.\n *\n * @param props - props from this instance of SpinButton\n * @param ref - reference to root HTMLElement of SpinButton\n */\nexport const useSpinButton_unstable = (props: SpinButtonProps, ref: React.Ref<HTMLInputElement>): SpinButtonState => {\n // Merge props from surrounding <Field>, if any\n props = useFieldControlProps_unstable(props, { supportsLabelFor: true, supportsRequired: true });\n\n const nativeProps = getPartitionedNativeProps({\n props,\n primarySlotTagName: 'input',\n excludedPropNames: ['defaultValue', 'max', 'min', 'onChange', 'size', 'value'],\n });\n\n const overrides = useOverrides();\n\n const {\n value,\n displayValue,\n defaultValue,\n min,\n max,\n step = 1,\n stepPage = 1,\n precision: precisionFromProps,\n onChange,\n size = 'medium',\n appearance = overrides.inputDefaultAppearance ?? 'outline',\n root,\n input,\n incrementButton,\n decrementButton,\n } = props;\n\n const precision = React.useMemo(() => {\n return precisionFromProps ?? Math.max(calculatePrecision(step), 0);\n }, [precisionFromProps, step]);\n\n const [currentValue, setCurrentValue] = useControllableState({\n state: value,\n defaultState: defaultValue,\n initialState: 0,\n });\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const isControlled = value !== undefined;\n\n const [textValue, setTextValue] = React.useState<string | undefined>(undefined);\n const [keyboardSpinState, setKeyboardSpinState] = React.useState<SpinButtonSpinState>('rest');\n\n const internalState = React.useRef<InternalState>({\n value: currentValue,\n spinState: 'rest',\n spinTime: 0,\n spinDelay: DEFAULT_SPIN_DELAY_MS,\n atBound: currentValue !== null ? getBound(precisionRound(currentValue, precision), min, max) : 'none',\n });\n\n const [setStepTimeout, clearStepTimeout] = useTimeout();\n\n const stepValue = (\n e: SpinButtonChangeEvent,\n direction: 'up' | 'down' | 'upPage' | 'downPage',\n startFrom?: string,\n ) => {\n let startValue = internalState.current.value;\n if (startFrom) {\n const num = parseFloat(startFrom);\n if (!isNaN(num)) {\n startValue = num;\n }\n }\n const val = startValue;\n const dir = direction === 'up' || direction === 'upPage' ? 1 : -1;\n const stepSize = direction === 'upPage' || direction === 'downPage' ? stepPage : step;\n\n if (val === null) {\n const stepStart = min === undefined ? 0 : min;\n const nullStep = clamp(stepStart + stepSize * dir, min, max);\n commit(e, nullStep);\n return;\n }\n\n let newValue = val + stepSize * dir;\n if (!Number.isNaN(newValue)) {\n newValue = clamp(newValue, min, max);\n }\n\n commit(e, newValue);\n\n if (internalState.current.spinState !== 'rest') {\n setStepTimeout(() => {\n // Ease the step speed a bit\n internalState.current.spinTime += internalState.current.spinDelay;\n internalState.current.spinDelay = lerp(\n DEFAULT_SPIN_DELAY_MS,\n MIN_SPIN_DELAY_MS,\n internalState.current.spinTime / MAX_SPIN_TIME_MS,\n );\n stepValue(e, direction);\n }, internalState.current.spinDelay);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!internalState.current.previousTextValue) {\n internalState.current.previousTextValue = textValue ?? String(currentValue);\n }\n const newValue = e.target.value;\n setTextValue(newValue);\n if (inputRef.current) {\n // we need to set this here using the IDL attribute directly, because otherwise the timing of the ARIA value update\n // is not in sync with the user-entered native input value, and some screen readers end up reading the wrong value.\n inputRef.current.ariaValueNow = newValue;\n }\n };\n\n const handleIncrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.spinState = 'up';\n stepValue(e, 'up');\n };\n\n const handleDecrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.spinState = 'down';\n stepValue(e, 'down');\n };\n\n const handleStepMouseUpOrLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n clearStepTimeout();\n internalState.current.spinState = 'rest';\n internalState.current.spinDelay = DEFAULT_SPIN_DELAY_MS;\n internalState.current.spinTime = 0;\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.previousTextValue = undefined;\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n let nextKeyboardSpinState: SpinButtonSpinState = 'rest';\n\n if (e.currentTarget.readOnly) {\n return;\n }\n\n if (e.key === ArrowUp) {\n stepValue(e, 'up', textValue);\n nextKeyboardSpinState = 'up';\n } else if (e.key === ArrowDown) {\n stepValue(e, 'down', textValue);\n nextKeyboardSpinState = 'down';\n } else if (e.key === PageUp) {\n e.preventDefault();\n stepValue(e, 'upPage', textValue);\n nextKeyboardSpinState = 'up';\n } else if (e.key === PageDown) {\n e.preventDefault();\n stepValue(e, 'downPage', textValue);\n nextKeyboardSpinState = 'down';\n } else if (!e.shiftKey && e.key === Home && min !== undefined) {\n commit(e, min);\n nextKeyboardSpinState = 'down';\n } else if (!e.shiftKey && e.key === End && max !== undefined) {\n commit(e, max);\n nextKeyboardSpinState = 'up';\n } else if (e.key === Enter) {\n commit(e, currentValue, textValue);\n internalState.current.previousTextValue = undefined;\n } else if (e.key === Escape) {\n if (internalState.current.previousTextValue) {\n setTextValue(undefined);\n internalState.current.previousTextValue = undefined;\n }\n }\n\n if (keyboardSpinState !== nextKeyboardSpinState) {\n setKeyboardSpinState(nextKeyboardSpinState);\n }\n };\n\n const handleKeyUp = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (keyboardSpinState !== 'rest') {\n setKeyboardSpinState('rest');\n internalState.current.spinState = 'rest';\n }\n };\n\n const commit = (e: SpinButtonChangeEvent, newValue?: number | null, newDisplayValue?: string) => {\n const valueChanged = newValue !== undefined && currentValue !== newValue;\n const displayValueChanged =\n newDisplayValue !== undefined &&\n internalState.current.previousTextValue !== undefined &&\n internalState.current.previousTextValue !== newDisplayValue;\n\n let roundedValue;\n if (valueChanged) {\n roundedValue = precisionRound(newValue!, precision);\n setCurrentValue(roundedValue);\n internalState.current.value = roundedValue;\n } else if (displayValueChanged && !isControlled) {\n const nextValue = parseFloat(newDisplayValue as string);\n if (!isNaN(nextValue)) {\n setCurrentValue(precisionRound(nextValue, precision));\n internalState.current.value = precisionRound(nextValue, precision);\n }\n }\n\n if (valueChanged || displayValueChanged) {\n onChange?.(e, { value: roundedValue, displayValue: newDisplayValue });\n }\n\n setTextValue(undefined);\n };\n\n let valueToDisplay;\n if (textValue !== undefined) {\n valueToDisplay = textValue;\n } else if (value === null || currentValue === null) {\n valueToDisplay = displayValue ?? '';\n internalState.current.value = null;\n internalState.current.atBound = 'none';\n } else {\n const roundedValue = precisionRound(currentValue, precision);\n internalState.current.value = roundedValue;\n internalState.current.atBound = getBound(roundedValue, min, max);\n if (isControlled) {\n valueToDisplay = displayValue ?? String(roundedValue);\n } else {\n valueToDisplay = String(roundedValue);\n }\n }\n\n const state: SpinButtonState = {\n size,\n appearance,\n spinState: keyboardSpinState,\n atBound: internalState.current.atBound,\n\n components: {\n root: 'span',\n input: 'input',\n incrementButton: 'button',\n decrementButton: 'button',\n },\n root: slot.always(root, {\n defaultProps: nativeProps.root,\n elementType: 'span',\n }),\n input: slot.always(input, {\n defaultProps: {\n autoComplete: 'off',\n role: 'spinbutton',\n appearance,\n type: 'text',\n ...nativeProps.primary,\n },\n elementType: 'input',\n }),\n incrementButton: slot.always(incrementButton, {\n defaultProps: {\n tabIndex: -1,\n children: <ChevronUp16Regular />,\n disabled:\n nativeProps.primary.readOnly ||\n nativeProps.primary.disabled ||\n internalState.current.atBound === 'max' ||\n internalState.current.atBound === 'both',\n 'aria-label': 'Increment value',\n type: 'button',\n },\n elementType: 'button',\n }),\n decrementButton: slot.always(decrementButton, {\n defaultProps: {\n tabIndex: -1,\n children: <ChevronDown16Regular />,\n disabled:\n nativeProps.primary.readOnly ||\n nativeProps.primary.disabled ||\n internalState.current.atBound === 'min' ||\n internalState.current.atBound === 'both',\n 'aria-label': 'Decrement value',\n type: 'button',\n },\n elementType: 'button',\n }),\n };\n\n state.input.value = valueToDisplay;\n state.input.ref = useMergedRefs(inputRef, ref);\n state.input['aria-valuemin'] = min;\n state.input['aria-valuemax'] = max;\n state.input['aria-valuenow'] = internalState.current.value ?? undefined;\n state.input['aria-valuetext'] = state.input['aria-valuetext'] ?? ((value !== undefined && displayValue) || undefined);\n state.input.onChange = mergeCallbacks(state.input.onChange, handleInputChange);\n state.input.onInput = mergeCallbacks(state.input.onInput, handleInputChange);\n state.input.onBlur = mergeCallbacks(state.input.onBlur, handleBlur);\n state.input.onKeyDown = mergeCallbacks(state.input.onKeyDown, handleKeyDown);\n state.input.onKeyUp = mergeCallbacks(state.input.onKeyUp, handleKeyUp);\n\n state.incrementButton.onMouseDown = mergeCallbacks(handleIncrementMouseDown, state.incrementButton.onMouseDown);\n state.incrementButton.onMouseUp = mergeCallbacks(state.incrementButton.onMouseUp, handleStepMouseUpOrLeave);\n state.incrementButton.onMouseLeave = mergeCallbacks(state.incrementButton.onMouseLeave, handleStepMouseUpOrLeave);\n\n state.decrementButton.onMouseDown = mergeCallbacks(handleDecrementMouseDown, state.decrementButton.onMouseDown);\n state.decrementButton.onMouseUp = mergeCallbacks(state.decrementButton.onMouseUp, handleStepMouseUpOrLeave);\n state.decrementButton.onMouseLeave = mergeCallbacks(state.decrementButton.onMouseLeave, handleStepMouseUpOrLeave);\n\n return state;\n};\n"],"names":["React","useFieldControlProps_unstable","getPartitionedNativeProps","mergeCallbacks","useControllableState","useTimeout","slot","useMergedRefs","ArrowUp","ArrowDown","End","Enter","Escape","Home","PageDown","PageUp","calculatePrecision","precisionRound","getBound","clamp","ChevronUp16Regular","ChevronDown16Regular","useOverrides_unstable","useOverrides","DEFAULT_SPIN_DELAY_MS","MIN_SPIN_DELAY_MS","MAX_SPIN_TIME_MS","lerp","start","end","percent","useSpinButton_unstable","props","ref","supportsLabelFor","supportsRequired","nativeProps","primarySlotTagName","excludedPropNames","overrides","value","displayValue","defaultValue","min","max","step","stepPage","precision","precisionFromProps","onChange","size","appearance","inputDefaultAppearance","root","input","incrementButton","decrementButton","useMemo","Math","currentValue","setCurrentValue","state","defaultState","initialState","inputRef","useRef","isControlled","undefined","textValue","setTextValue","useState","keyboardSpinState","setKeyboardSpinState","internalState","spinState","spinTime","spinDelay","atBound","setStepTimeout","clearStepTimeout","stepValue","e","direction","startFrom","startValue","current","num","parseFloat","isNaN","val","dir","stepSize","stepStart","nullStep","commit","newValue","Number","handleInputChange","previousTextValue","String","target","ariaValueNow","handleIncrementMouseDown","handleDecrementMouseDown","handleStepMouseUpOrLeave","handleBlur","handleKeyDown","nextKeyboardSpinState","currentTarget","readOnly","key","preventDefault","shiftKey","handleKeyUp","newDisplayValue","valueChanged","displayValueChanged","roundedValue","nextValue","valueToDisplay","components","always","defaultProps","elementType","autoComplete","role","type","primary","tabIndex","children","disabled","onInput","onBlur","onKeyDown","onKeyUp","onMouseDown","onMouseUp","onMouseLeave"],"mappings":"AAAA;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,6BAA6B,QAAQ,wBAAwB;AACtE,SACEC,yBAAyB,EACzBC,cAAc,EACdC,oBAAoB,EACpBC,UAAU,EACVC,IAAI,EACJC,aAAa,QACR,4BAA4B;AACnC,SAASC,OAAO,EAAEC,SAAS,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,MAAM,QAAQ,0BAA0B;AAQzG,SAASC,kBAAkB,EAAEC,cAAc,EAAEC,QAAQ,EAAEC,KAAK,QAAQ,oBAAoB;AACxF,SAASC,kBAAkB,EAAEC,oBAAoB,QAAQ,wBAAwB;AACjF,SAASC,yBAAyBC,YAAY,QAAQ,kCAAkC;AAWxF,MAAMC,wBAAwB;AAC9B,MAAMC,oBAAoB;AAC1B,MAAMC,mBAAmB;AAEzB,6DAA6D;AAC7D,yDAAyD;AACzD,gEAAgE;AAChE,MAAMC,OAAO,CAACC,OAAeC,KAAaC,UAA4BF,QAAQ,AAACC,CAAAA,MAAMD,KAAI,IAAKE;AAE9F;;;;;;;;CAQC,GACD,OAAO,MAAMC,yBAAyB,CAACC,OAAwBC;IAC7D,+CAA+C;IAC/CD,QAAQ/B,8BAA8B+B,OAAO;QAAEE,kBAAkB;QAAMC,kBAAkB;IAAK;IAE9F,MAAMC,cAAclC,0BAA0B;QAC5C8B;QACAK,oBAAoB;QACpBC,mBAAmB;YAAC;YAAgB;YAAO;YAAO;YAAY;YAAQ;SAAQ;IAChF;IAEA,MAAMC,YAAYhB;QAaHgB;IAXf,MAAM,EACJC,KAAK,EACLC,YAAY,EACZC,YAAY,EACZC,GAAG,EACHC,GAAG,EACHC,OAAO,CAAC,EACRC,WAAW,CAAC,EACZC,WAAWC,kBAAkB,EAC7BC,QAAQ,EACRC,OAAO,QAAQ,EACfC,aAAaZ,CAAAA,oCAAAA,UAAUa,sBAAsB,cAAhCb,+CAAAA,oCAAoC,SAAS,EAC1Dc,IAAI,EACJC,KAAK,EACLC,eAAe,EACfC,eAAe,EAChB,GAAGxB;IAEJ,MAAMe,YAAY/C,MAAMyD,OAAO,CAAC;QAC9B,OAAOT,+BAAAA,gCAAAA,qBAAsBU,KAAKd,GAAG,CAAC5B,mBAAmB6B,OAAO;IAClE,GAAG;QAACG;QAAoBH;KAAK;IAE7B,MAAM,CAACc,cAAcC,gBAAgB,GAAGxD,qBAAqB;QAC3DyD,OAAOrB;QACPsB,cAAcpB;QACdqB,cAAc;IAChB;IAEA,MAAMC,WAAWhE,MAAMiE,MAAM,CAAmB;IAEhD,MAAMC,eAAe1B,UAAU2B;IAE/B,MAAM,CAACC,WAAWC,aAAa,GAAGrE,MAAMsE,QAAQ,CAAqBH;IACrE,MAAM,CAACI,mBAAmBC,qBAAqB,GAAGxE,MAAMsE,QAAQ,CAAsB;IAEtF,MAAMG,gBAAgBzE,MAAMiE,MAAM,CAAgB;QAChDzB,OAAOmB;QACPe,WAAW;QACXC,UAAU;QACVC,WAAWpD;QACXqD,SAASlB,iBAAiB,OAAOzC,SAASD,eAAe0C,cAAcZ,YAAYJ,KAAKC,OAAO;IACjG;IAEA,MAAM,CAACkC,gBAAgBC,iBAAiB,GAAG1E;IAE3C,MAAM2E,YAAY,CAChBC,GACAC,WACAC;QAEA,IAAIC,aAAaX,cAAcY,OAAO,CAAC7C,KAAK;QAC5C,IAAI2C,WAAW;YACb,MAAMG,MAAMC,WAAWJ;YACvB,IAAI,CAACK,MAAMF,MAAM;gBACfF,aAAaE;YACf;QACF;QACA,MAAMG,MAAML;QACZ,MAAMM,MAAMR,cAAc,QAAQA,cAAc,WAAW,IAAI,CAAC;QAChE,MAAMS,WAAWT,cAAc,YAAYA,cAAc,aAAapC,WAAWD;QAEjF,IAAI4C,QAAQ,MAAM;YAChB,MAAMG,YAAYjD,QAAQwB,YAAY,IAAIxB;YAC1C,MAAMkD,WAAW1E,MAAMyE,YAAYD,WAAWD,KAAK/C,KAAKC;YACxDkD,OAAOb,GAAGY;YACV;QACF;QAEA,IAAIE,WAAWN,MAAME,WAAWD;QAChC,IAAI,CAACM,OAAOR,KAAK,CAACO,WAAW;YAC3BA,WAAW5E,MAAM4E,UAAUpD,KAAKC;QAClC;QAEAkD,OAAOb,GAAGc;QAEV,IAAItB,cAAcY,OAAO,CAACX,SAAS,KAAK,QAAQ;YAC9CI,eAAe;gBACb,4BAA4B;gBAC5BL,cAAcY,OAAO,CAACV,QAAQ,IAAIF,cAAcY,OAAO,CAACT,SAAS;gBACjEH,cAAcY,OAAO,CAACT,SAAS,GAAGjD,KAChCH,uBACAC,mBACAgD,cAAcY,OAAO,CAACV,QAAQ,GAAGjD;gBAEnCsD,UAAUC,GAAGC;YACf,GAAGT,cAAcY,OAAO,CAACT,SAAS;QACpC;IACF;IAEA,MAAMqB,oBAAoB,CAAChB;QACzB,IAAI,CAACR,cAAcY,OAAO,CAACa,iBAAiB,EAAE;YAC5CzB,cAAcY,OAAO,CAACa,iBAAiB,GAAG9B,sBAAAA,uBAAAA,YAAa+B,OAAOxC;QAChE;QACA,MAAMoC,WAAWd,EAAEmB,MAAM,CAAC5D,KAAK;QAC/B6B,aAAa0B;QACb,IAAI/B,SAASqB,OAAO,EAAE;YACpB,mHAAmH;YACnH,mHAAmH;YACnHrB,SAASqB,OAAO,CAACgB,YAAY,GAAGN;QAClC;IACF;IAEA,MAAMO,2BAA2B,CAACrB;QAChCa,OAAOb,GAAGtB,cAAcS;QACxBK,cAAcY,OAAO,CAACX,SAAS,GAAG;QAClCM,UAAUC,GAAG;IACf;IAEA,MAAMsB,2BAA2B,CAACtB;QAChCa,OAAOb,GAAGtB,cAAcS;QACxBK,cAAcY,OAAO,CAACX,SAAS,GAAG;QAClCM,UAAUC,GAAG;IACf;IAEA,MAAMuB,2BAA2B,CAACvB;QAChCF;QACAN,cAAcY,OAAO,CAACX,SAAS,GAAG;QAClCD,cAAcY,OAAO,CAACT,SAAS,GAAGpD;QAClCiD,cAAcY,OAAO,CAACV,QAAQ,GAAG;IACnC;IAEA,MAAM8B,aAAa,CAACxB;QAClBa,OAAOb,GAAGtB,cAAcS;QACxBK,cAAcY,OAAO,CAACa,iBAAiB,GAAG/B;IAC5C;IAEA,MAAMuC,gBAAgB,CAACzB;QACrB,IAAI0B,wBAA6C;QAEjD,IAAI1B,EAAE2B,aAAa,CAACC,QAAQ,EAAE;YAC5B;QACF;QAEA,IAAI5B,EAAE6B,GAAG,KAAKtG,SAAS;YACrBwE,UAAUC,GAAG,MAAMb;YACnBuC,wBAAwB;QAC1B,OAAO,IAAI1B,EAAE6B,GAAG,KAAKrG,WAAW;YAC9BuE,UAAUC,GAAG,QAAQb;YACrBuC,wBAAwB;QAC1B,OAAO,IAAI1B,EAAE6B,GAAG,KAAK/F,QAAQ;YAC3BkE,EAAE8B,cAAc;YAChB/B,UAAUC,GAAG,UAAUb;YACvBuC,wBAAwB;QAC1B,OAAO,IAAI1B,EAAE6B,GAAG,KAAKhG,UAAU;YAC7BmE,EAAE8B,cAAc;YAChB/B,UAAUC,GAAG,YAAYb;YACzBuC,wBAAwB;QAC1B,OAAO,IAAI,CAAC1B,EAAE+B,QAAQ,IAAI/B,EAAE6B,GAAG,KAAKjG,QAAQ8B,QAAQwB,WAAW;YAC7D2B,OAAOb,GAAGtC;YACVgE,wBAAwB;QAC1B,OAAO,IAAI,CAAC1B,EAAE+B,QAAQ,IAAI/B,EAAE6B,GAAG,KAAKpG,OAAOkC,QAAQuB,WAAW;YAC5D2B,OAAOb,GAAGrC;YACV+D,wBAAwB;QAC1B,OAAO,IAAI1B,EAAE6B,GAAG,KAAKnG,OAAO;YAC1BmF,OAAOb,GAAGtB,cAAcS;YACxBK,cAAcY,OAAO,CAACa,iBAAiB,GAAG/B;QAC5C,OAAO,IAAIc,EAAE6B,GAAG,KAAKlG,QAAQ;YAC3B,IAAI6D,cAAcY,OAAO,CAACa,iBAAiB,EAAE;gBAC3C7B,aAAaF;gBACbM,cAAcY,OAAO,CAACa,iBAAiB,GAAG/B;YAC5C;QACF;QAEA,IAAII,sBAAsBoC,uBAAuB;YAC/CnC,qBAAqBmC;QACvB;IACF;IAEA,MAAMM,cAAc,CAAChC;QACnB,IAAIV,sBAAsB,QAAQ;YAChCC,qBAAqB;YACrBC,cAAcY,OAAO,CAACX,SAAS,GAAG;QACpC;IACF;IAEA,MAAMoB,SAAS,CAACb,GAA0Bc,UAA0BmB;QAClE,MAAMC,eAAepB,aAAa5B,aAAaR,iBAAiBoC;QAChE,MAAMqB,sBACJF,oBAAoB/C,aACpBM,cAAcY,OAAO,CAACa,iBAAiB,KAAK/B,aAC5CM,cAAcY,OAAO,CAACa,iBAAiB,KAAKgB;QAE9C,IAAIG;QACJ,IAAIF,cAAc;YAChBE,eAAepG,eAAe8E,UAAWhD;YACzCa,gBAAgByD;YAChB5C,cAAcY,OAAO,CAAC7C,KAAK,GAAG6E;QAChC,OAAO,IAAID,uBAAuB,CAAClD,cAAc;YAC/C,MAAMoD,YAAY/B,WAAW2B;YAC7B,IAAI,CAAC1B,MAAM8B,YAAY;gBACrB1D,gBAAgB3C,eAAeqG,WAAWvE;gBAC1C0B,cAAcY,OAAO,CAAC7C,KAAK,GAAGvB,eAAeqG,WAAWvE;YAC1D;QACF;QAEA,IAAIoE,gBAAgBC,qBAAqB;YACvCnE,qBAAAA,+BAAAA,SAAWgC,GAAG;gBAAEzC,OAAO6E;gBAAc5E,cAAcyE;YAAgB;QACrE;QAEA7C,aAAaF;IACf;IAEA,IAAIoD;IACJ,IAAInD,cAAcD,WAAW;QAC3BoD,iBAAiBnD;IACnB,OAAO,IAAI5B,UAAU,QAAQmB,iBAAiB,MAAM;QAClD4D,iBAAiB9E,yBAAAA,0BAAAA,eAAgB;QACjCgC,cAAcY,OAAO,CAAC7C,KAAK,GAAG;QAC9BiC,cAAcY,OAAO,CAACR,OAAO,GAAG;IAClC,OAAO;QACL,MAAMwC,eAAepG,eAAe0C,cAAcZ;QAClD0B,cAAcY,OAAO,CAAC7C,KAAK,GAAG6E;QAC9B5C,cAAcY,OAAO,CAACR,OAAO,GAAG3D,SAASmG,cAAc1E,KAAKC;QAC5D,IAAIsB,cAAc;YAChBqD,iBAAiB9E,yBAAAA,0BAAAA,eAAgB0D,OAAOkB;QAC1C,OAAO;YACLE,iBAAiBpB,OAAOkB;QAC1B;IACF;IAEA,MAAMxD,QAAyB;QAC7BX;QACAC;QACAuB,WAAWH;QACXM,SAASJ,cAAcY,OAAO,CAACR,OAAO;QAEtC2C,YAAY;YACVnE,MAAM;YACNC,OAAO;YACPC,iBAAiB;YACjBC,iBAAiB;QACnB;QACAH,MAAM/C,KAAKmH,MAAM,CAACpE,MAAM;YACtBqE,cAActF,YAAYiB,IAAI;YAC9BsE,aAAa;QACf;QACArE,OAAOhD,KAAKmH,MAAM,CAACnE,OAAO;YACxBoE,cAAc;gBACZE,cAAc;gBACdC,MAAM;gBACN1E;gBACA2E,MAAM;gBACN,GAAG1F,YAAY2F,OAAO;YACxB;YACAJ,aAAa;QACf;QACApE,iBAAiBjD,KAAKmH,MAAM,CAAClE,iBAAiB;YAC5CmE,cAAc;gBACZM,UAAU,CAAC;gBACXC,wBAAU,oBAAC7G;gBACX8G,UACE9F,YAAY2F,OAAO,CAAClB,QAAQ,IAC5BzE,YAAY2F,OAAO,CAACG,QAAQ,IAC5BzD,cAAcY,OAAO,CAACR,OAAO,KAAK,SAClCJ,cAAcY,OAAO,CAACR,OAAO,KAAK;gBACpC,cAAc;gBACdiD,MAAM;YACR;YACAH,aAAa;QACf;QACAnE,iBAAiBlD,KAAKmH,MAAM,CAACjE,iBAAiB;YAC5CkE,cAAc;gBACZM,UAAU,CAAC;gBACXC,wBAAU,oBAAC5G;gBACX6G,UACE9F,YAAY2F,OAAO,CAAClB,QAAQ,IAC5BzE,YAAY2F,OAAO,CAACG,QAAQ,IAC5BzD,cAAcY,OAAO,CAACR,OAAO,KAAK,SAClCJ,cAAcY,OAAO,CAACR,OAAO,KAAK;gBACpC,cAAc;gBACdiD,MAAM;YACR;YACAH,aAAa;QACf;IACF;IAEA9D,MAAMP,KAAK,CAACd,KAAK,GAAG+E;IACpB1D,MAAMP,KAAK,CAACrB,GAAG,GAAG1B,cAAcyD,UAAU/B;IAC1C4B,MAAMP,KAAK,CAAC,gBAAgB,GAAGX;IAC/BkB,MAAMP,KAAK,CAAC,gBAAgB,GAAGV;QACA6B;IAA/BZ,MAAMP,KAAK,CAAC,gBAAgB,GAAGmB,CAAAA,+BAAAA,cAAcY,OAAO,CAAC7C,KAAK,cAA3BiC,0CAAAA,+BAA+BN;QAC9BN;IAAhCA,MAAMP,KAAK,CAAC,iBAAiB,GAAGO,CAAAA,6BAAAA,MAAMP,KAAK,CAAC,iBAAiB,cAA7BO,wCAAAA,6BAAkC,AAACrB,UAAU2B,aAAa1B,gBAAiB0B;IAC3GN,MAAMP,KAAK,CAACL,QAAQ,GAAG9C,eAAe0D,MAAMP,KAAK,CAACL,QAAQ,EAAEgD;IAC5DpC,MAAMP,KAAK,CAAC6E,OAAO,GAAGhI,eAAe0D,MAAMP,KAAK,CAAC6E,OAAO,EAAElC;IAC1DpC,MAAMP,KAAK,CAAC8E,MAAM,GAAGjI,eAAe0D,MAAMP,KAAK,CAAC8E,MAAM,EAAE3B;IACxD5C,MAAMP,KAAK,CAAC+E,SAAS,GAAGlI,eAAe0D,MAAMP,KAAK,CAAC+E,SAAS,EAAE3B;IAC9D7C,MAAMP,KAAK,CAACgF,OAAO,GAAGnI,eAAe0D,MAAMP,KAAK,CAACgF,OAAO,EAAErB;IAE1DpD,MAAMN,eAAe,CAACgF,WAAW,GAAGpI,eAAemG,0BAA0BzC,MAAMN,eAAe,CAACgF,WAAW;IAC9G1E,MAAMN,eAAe,CAACiF,SAAS,GAAGrI,eAAe0D,MAAMN,eAAe,CAACiF,SAAS,EAAEhC;IAClF3C,MAAMN,eAAe,CAACkF,YAAY,GAAGtI,eAAe0D,MAAMN,eAAe,CAACkF,YAAY,EAAEjC;IAExF3C,MAAML,eAAe,CAAC+E,WAAW,GAAGpI,eAAeoG,0BAA0B1C,MAAML,eAAe,CAAC+E,WAAW;IAC9G1E,MAAML,eAAe,CAACgF,SAAS,GAAGrI,eAAe0D,MAAML,eAAe,CAACgF,SAAS,EAAEhC;IAClF3C,MAAML,eAAe,CAACiF,YAAY,GAAGtI,eAAe0D,MAAML,eAAe,CAACiF,YAAY,EAAEjC;IAExF,OAAO3C;AACT,EAAE"}
|
|
1
|
+
{"version":3,"sources":["../src/components/SpinButton/useSpinButton.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useFieldControlProps_unstable } from '@fluentui/react-field';\nimport {\n getPartitionedNativeProps,\n mergeCallbacks,\n useControllableState,\n useTimeout,\n slot,\n useMergedRefs,\n} from '@fluentui/react-utilities';\nimport { ArrowUp, ArrowDown, End, Enter, Escape, Home, PageDown, PageUp } from '@fluentui/keyboard-keys';\nimport {\n SpinButtonBaseProps,\n SpinButtonBaseState,\n SpinButtonProps,\n SpinButtonState,\n SpinButtonSpinState,\n SpinButtonChangeEvent,\n SpinButtonBounds,\n} from './SpinButton.types';\nimport { calculatePrecision, precisionRound, getBound, clamp } from '../../utils/index';\nimport { ChevronUp16Regular, ChevronDown16Regular } from '@fluentui/react-icons';\nimport { useOverrides_unstable as useOverrides } from '@fluentui/react-shared-contexts';\n\ntype InternalState = {\n value: number | null;\n spinState: SpinButtonSpinState;\n spinTime: number;\n spinDelay: number;\n previousTextValue?: string;\n atBound: SpinButtonBounds;\n};\n\nconst DEFAULT_SPIN_DELAY_MS = 150;\nconst MIN_SPIN_DELAY_MS = 80;\nconst MAX_SPIN_TIME_MS = 1000;\n\n// This is here to give an ease for the mouse held down case.\n// Exact easing it to be defined. Once it is we'll likely\n// pull this out into a util function in the SpinButton package.\nconst lerp = (start: number, end: number, percent: number): number => start + (end - start) * percent;\n\n/**\n * Create the base state required to render SpinButton without design-specific props.\n *\n * @param props - props from this instance of SpinButton (without appearance/size)\n * @param ref - reference to root HTMLElement of SpinButton\n */\nexport const useSpinButtonBase_unstable = (\n props: SpinButtonBaseProps,\n ref: React.Ref<HTMLInputElement>,\n): SpinButtonBaseState => {\n const nativeProps = getPartitionedNativeProps({\n props,\n primarySlotTagName: 'input',\n excludedPropNames: ['defaultValue', 'max', 'min', 'onChange', 'value'],\n });\n\n const {\n value,\n displayValue,\n defaultValue,\n min,\n max,\n step = 1,\n stepPage = 1,\n precision: precisionFromProps,\n onChange,\n root,\n input,\n incrementButton,\n decrementButton,\n } = props;\n\n const precision = React.useMemo(() => {\n return precisionFromProps ?? Math.max(calculatePrecision(step), 0);\n }, [precisionFromProps, step]);\n\n const [currentValue, setCurrentValue] = useControllableState({\n state: value,\n defaultState: defaultValue,\n initialState: 0,\n });\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const isControlled = value !== undefined;\n\n const [textValue, setTextValue] = React.useState<string | undefined>(undefined);\n const [keyboardSpinState, setKeyboardSpinState] = React.useState<SpinButtonSpinState>('rest');\n\n const internalState = React.useRef<InternalState>({\n value: currentValue,\n spinState: 'rest',\n spinTime: 0,\n spinDelay: DEFAULT_SPIN_DELAY_MS,\n atBound: currentValue !== null ? getBound(precisionRound(currentValue, precision), min, max) : 'none',\n });\n\n const [setStepTimeout, clearStepTimeout] = useTimeout();\n\n const stepValue = (\n e: SpinButtonChangeEvent,\n direction: 'up' | 'down' | 'upPage' | 'downPage',\n startFrom?: string,\n ) => {\n let startValue = internalState.current.value;\n if (startFrom) {\n const num = parseFloat(startFrom);\n if (!isNaN(num)) {\n startValue = num;\n }\n }\n const val = startValue;\n const dir = direction === 'up' || direction === 'upPage' ? 1 : -1;\n const stepSize = direction === 'upPage' || direction === 'downPage' ? stepPage : step;\n\n if (val === null) {\n const stepStart = min === undefined ? 0 : min;\n const nullStep = clamp(stepStart + stepSize * dir, min, max);\n commit(e, nullStep);\n return;\n }\n\n let newValue = val + stepSize * dir;\n if (!Number.isNaN(newValue)) {\n newValue = clamp(newValue, min, max);\n }\n\n commit(e, newValue);\n\n if (internalState.current.spinState !== 'rest') {\n setStepTimeout(() => {\n // Ease the step speed a bit\n internalState.current.spinTime += internalState.current.spinDelay;\n internalState.current.spinDelay = lerp(\n DEFAULT_SPIN_DELAY_MS,\n MIN_SPIN_DELAY_MS,\n internalState.current.spinTime / MAX_SPIN_TIME_MS,\n );\n stepValue(e, direction);\n }, internalState.current.spinDelay);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!internalState.current.previousTextValue) {\n internalState.current.previousTextValue = textValue ?? String(currentValue);\n }\n const newValue = e.target.value;\n setTextValue(newValue);\n if (inputRef.current) {\n // we need to set this here using the IDL attribute directly, because otherwise the timing of the ARIA value update\n // is not in sync with the user-entered native input value, and some screen readers end up reading the wrong value.\n // eslint-disable-next-line react-compiler/react-compiler\n inputRef.current.ariaValueNow = newValue;\n }\n };\n\n const handleIncrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.spinState = 'up';\n stepValue(e, 'up');\n };\n\n const handleDecrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.spinState = 'down';\n stepValue(e, 'down');\n };\n\n const handleStepMouseUpOrLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n clearStepTimeout();\n internalState.current.spinState = 'rest';\n internalState.current.spinDelay = DEFAULT_SPIN_DELAY_MS;\n internalState.current.spinTime = 0;\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.previousTextValue = undefined;\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n let nextKeyboardSpinState: SpinButtonSpinState = 'rest';\n\n if (e.currentTarget.readOnly) {\n return;\n }\n\n if (e.key === ArrowUp) {\n stepValue(e, 'up', textValue);\n nextKeyboardSpinState = 'up';\n } else if (e.key === ArrowDown) {\n stepValue(e, 'down', textValue);\n nextKeyboardSpinState = 'down';\n } else if (e.key === PageUp) {\n e.preventDefault();\n stepValue(e, 'upPage', textValue);\n nextKeyboardSpinState = 'up';\n } else if (e.key === PageDown) {\n e.preventDefault();\n stepValue(e, 'downPage', textValue);\n nextKeyboardSpinState = 'down';\n } else if (!e.shiftKey && e.key === Home && min !== undefined) {\n commit(e, min);\n nextKeyboardSpinState = 'down';\n } else if (!e.shiftKey && e.key === End && max !== undefined) {\n commit(e, max);\n nextKeyboardSpinState = 'up';\n } else if (e.key === Enter) {\n commit(e, currentValue, textValue);\n internalState.current.previousTextValue = undefined;\n } else if (e.key === Escape) {\n if (internalState.current.previousTextValue) {\n setTextValue(undefined);\n internalState.current.previousTextValue = undefined;\n }\n }\n\n if (keyboardSpinState !== nextKeyboardSpinState) {\n setKeyboardSpinState(nextKeyboardSpinState);\n }\n };\n\n const handleKeyUp = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (keyboardSpinState !== 'rest') {\n setKeyboardSpinState('rest');\n internalState.current.spinState = 'rest';\n }\n };\n\n const commit = (e: SpinButtonChangeEvent, newValue?: number | null, newDisplayValue?: string) => {\n const valueChanged = newValue !== undefined && currentValue !== newValue;\n const displayValueChanged =\n newDisplayValue !== undefined &&\n internalState.current.previousTextValue !== undefined &&\n internalState.current.previousTextValue !== newDisplayValue;\n\n let roundedValue;\n if (valueChanged) {\n roundedValue = precisionRound(newValue!, precision);\n setCurrentValue(roundedValue);\n internalState.current.value = roundedValue;\n } else if (displayValueChanged && !isControlled) {\n const nextValue = parseFloat(newDisplayValue as string);\n if (!isNaN(nextValue)) {\n setCurrentValue(precisionRound(nextValue, precision));\n internalState.current.value = precisionRound(nextValue, precision);\n }\n }\n\n if (valueChanged || displayValueChanged) {\n onChange?.(e, { value: roundedValue, displayValue: newDisplayValue });\n }\n\n setTextValue(undefined);\n };\n\n let valueToDisplay;\n if (textValue !== undefined) {\n valueToDisplay = textValue;\n } else if (value === null || currentValue === null) {\n valueToDisplay = displayValue ?? '';\n internalState.current.value = null;\n internalState.current.atBound = 'none';\n } else {\n const roundedValue = precisionRound(currentValue, precision);\n internalState.current.value = roundedValue;\n internalState.current.atBound = getBound(roundedValue, min, max);\n if (isControlled) {\n valueToDisplay = displayValue ?? String(roundedValue);\n } else {\n valueToDisplay = String(roundedValue);\n }\n }\n\n const state: SpinButtonBaseState = {\n spinState: keyboardSpinState,\n atBound: internalState.current.atBound,\n\n components: {\n root: 'span',\n input: 'input',\n incrementButton: 'button',\n decrementButton: 'button',\n },\n root: slot.always(root, {\n defaultProps: nativeProps.root,\n elementType: 'span',\n }),\n input: slot.always(input, {\n defaultProps: {\n autoComplete: 'off',\n role: 'spinbutton',\n type: 'text',\n ...nativeProps.primary,\n },\n elementType: 'input',\n }),\n incrementButton: slot.always(incrementButton, {\n defaultProps: {\n tabIndex: -1,\n disabled:\n nativeProps.primary.readOnly ||\n nativeProps.primary.disabled ||\n internalState.current.atBound === 'max' ||\n internalState.current.atBound === 'both',\n 'aria-label': 'Increment value',\n type: 'button',\n },\n elementType: 'button',\n }),\n decrementButton: slot.always(decrementButton, {\n defaultProps: {\n tabIndex: -1,\n disabled:\n nativeProps.primary.readOnly ||\n nativeProps.primary.disabled ||\n internalState.current.atBound === 'min' ||\n internalState.current.atBound === 'both',\n 'aria-label': 'Decrement value',\n type: 'button',\n },\n elementType: 'button',\n }),\n };\n\n state.input.value = valueToDisplay;\n state.input.ref = useMergedRefs(inputRef, ref);\n state.input['aria-valuemin'] = min;\n state.input['aria-valuemax'] = max;\n state.input['aria-valuenow'] = internalState.current.value ?? undefined;\n state.input['aria-valuetext'] = state.input['aria-valuetext'] ?? ((value !== undefined && displayValue) || undefined);\n state.input.onChange = mergeCallbacks(state.input.onChange, handleInputChange);\n state.input.onInput = mergeCallbacks(state.input.onInput, handleInputChange);\n state.input.onBlur = mergeCallbacks(state.input.onBlur, handleBlur);\n state.input.onKeyDown = mergeCallbacks(state.input.onKeyDown, handleKeyDown);\n state.input.onKeyUp = mergeCallbacks(state.input.onKeyUp, handleKeyUp);\n\n state.incrementButton.onMouseDown = mergeCallbacks(handleIncrementMouseDown, state.incrementButton.onMouseDown);\n state.incrementButton.onMouseUp = mergeCallbacks(state.incrementButton.onMouseUp, handleStepMouseUpOrLeave);\n state.incrementButton.onMouseLeave = mergeCallbacks(state.incrementButton.onMouseLeave, handleStepMouseUpOrLeave);\n\n state.decrementButton.onMouseDown = mergeCallbacks(handleDecrementMouseDown, state.decrementButton.onMouseDown);\n state.decrementButton.onMouseUp = mergeCallbacks(state.decrementButton.onMouseUp, handleStepMouseUpOrLeave);\n state.decrementButton.onMouseLeave = mergeCallbacks(state.decrementButton.onMouseLeave, handleStepMouseUpOrLeave);\n\n return state;\n};\n\n/**\n * Create the state required to render SpinButton.\n *\n * The returned state can be modified with hooks such as useSpinButtonStyles_unstable,\n * before being passed to renderSpinButton_unstable.\n *\n * @param props - props from this instance of SpinButton\n * @param ref - reference to root HTMLElement of SpinButton\n */\nexport const useSpinButton_unstable = (props: SpinButtonProps, ref: React.Ref<HTMLInputElement>): SpinButtonState => {\n // Merge props from surrounding <Field>, if any\n props = useFieldControlProps_unstable(props, { supportsLabelFor: true, supportsRequired: true });\n\n const overrides = useOverrides();\n\n const { appearance = overrides.inputDefaultAppearance ?? 'outline', size = 'medium', ...baseProps } = props;\n\n const state = useSpinButtonBase_unstable(baseProps, ref);\n\n state.incrementButton.children ??= <ChevronUp16Regular />;\n state.decrementButton.children ??= <ChevronDown16Regular />;\n\n return { ...state, appearance, size };\n};\n"],"names":["React","useFieldControlProps_unstable","getPartitionedNativeProps","mergeCallbacks","useControllableState","useTimeout","slot","useMergedRefs","ArrowUp","ArrowDown","End","Enter","Escape","Home","PageDown","PageUp","calculatePrecision","precisionRound","getBound","clamp","ChevronUp16Regular","ChevronDown16Regular","useOverrides_unstable","useOverrides","DEFAULT_SPIN_DELAY_MS","MIN_SPIN_DELAY_MS","MAX_SPIN_TIME_MS","lerp","start","end","percent","useSpinButtonBase_unstable","props","ref","nativeProps","primarySlotTagName","excludedPropNames","value","displayValue","defaultValue","min","max","step","stepPage","precision","precisionFromProps","onChange","root","input","incrementButton","decrementButton","useMemo","Math","currentValue","setCurrentValue","state","defaultState","initialState","inputRef","useRef","isControlled","undefined","textValue","setTextValue","useState","keyboardSpinState","setKeyboardSpinState","internalState","spinState","spinTime","spinDelay","atBound","setStepTimeout","clearStepTimeout","stepValue","e","direction","startFrom","startValue","current","num","parseFloat","isNaN","val","dir","stepSize","stepStart","nullStep","commit","newValue","Number","handleInputChange","previousTextValue","String","target","ariaValueNow","handleIncrementMouseDown","handleDecrementMouseDown","handleStepMouseUpOrLeave","handleBlur","handleKeyDown","nextKeyboardSpinState","currentTarget","readOnly","key","preventDefault","shiftKey","handleKeyUp","newDisplayValue","valueChanged","displayValueChanged","roundedValue","nextValue","valueToDisplay","components","always","defaultProps","elementType","autoComplete","role","type","primary","tabIndex","disabled","onInput","onBlur","onKeyDown","onKeyUp","onMouseDown","onMouseUp","onMouseLeave","useSpinButton_unstable","supportsLabelFor","supportsRequired","overrides","appearance","inputDefaultAppearance","size","baseProps","children"],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SpinButton, renderSpinButton_unstable, spinButtonClassNames, useSpinButtonStyles_unstable, useSpinButton_unstable } from './SpinButton';
|
|
1
|
+
export { SpinButton, renderSpinButton_unstable, spinButtonClassNames, useSpinButtonStyles_unstable, useSpinButtonBase_unstable, useSpinButton_unstable } from './SpinButton';
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n SpinButton,\n renderSpinButton_unstable,\n spinButtonClassNames,\n useSpinButtonStyles_unstable,\n useSpinButton_unstable,\n} from './SpinButton';\nexport type {\n SpinButtonOnChangeData,\n SpinButtonChangeEvent,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonState,\n SpinButtonSpinState,\n SpinButtonBounds,\n} from './SpinButton';\n"],"names":["SpinButton","renderSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable","useSpinButton_unstable"],"mappings":"AAAA,SACEA,UAAU,EACVC,yBAAyB,EACzBC,oBAAoB,EACpBC,4BAA4B,EAC5BC,sBAAsB,QACjB,eAAe"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n SpinButton,\n renderSpinButton_unstable,\n spinButtonClassNames,\n useSpinButtonStyles_unstable,\n useSpinButtonBase_unstable,\n useSpinButton_unstable,\n} from './SpinButton';\nexport type {\n SpinButtonBaseProps,\n SpinButtonBaseState,\n SpinButtonOnChangeData,\n SpinButtonChangeEvent,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonState,\n SpinButtonSpinState,\n SpinButtonBounds,\n} from './SpinButton';\n"],"names":["SpinButton","renderSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable","useSpinButtonBase_unstable","useSpinButton_unstable"],"mappings":"AAAA,SACEA,UAAU,EACVC,yBAAyB,EACzBC,oBAAoB,EACpBC,4BAA4B,EAC5BC,0BAA0B,EAC1BC,sBAAsB,QACjB,eAAe"}
|
|
@@ -18,6 +18,9 @@ _export(exports, {
|
|
|
18
18
|
spinButtonClassNames: function() {
|
|
19
19
|
return _index.spinButtonClassNames;
|
|
20
20
|
},
|
|
21
|
+
useSpinButtonBase_unstable: function() {
|
|
22
|
+
return _index.useSpinButtonBase_unstable;
|
|
23
|
+
},
|
|
21
24
|
useSpinButtonStyles_unstable: function() {
|
|
22
25
|
return _index.useSpinButtonStyles_unstable;
|
|
23
26
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SpinButton.ts"],"sourcesContent":["export type {\n SpinButtonBounds,\n SpinButtonChangeEvent,\n SpinButtonOnChangeData,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonSpinState,\n SpinButtonState,\n} from './components/SpinButton/index';\nexport {\n SpinButton,\n renderSpinButton_unstable,\n spinButtonClassNames,\n useSpinButtonStyles_unstable,\n useSpinButton_unstable,\n} from './components/SpinButton/index';\n"],"names":["SpinButton","renderSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable","useSpinButton_unstable"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/SpinButton.ts"],"sourcesContent":["export type {\n SpinButtonBaseProps,\n SpinButtonBaseState,\n SpinButtonBounds,\n SpinButtonChangeEvent,\n SpinButtonOnChangeData,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonSpinState,\n SpinButtonState,\n} from './components/SpinButton/index';\nexport {\n SpinButton,\n renderSpinButton_unstable,\n spinButtonClassNames,\n useSpinButtonStyles_unstable,\n useSpinButtonBase_unstable,\n useSpinButton_unstable,\n} from './components/SpinButton/index';\n"],"names":["SpinButton","renderSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable","useSpinButtonBase_unstable","useSpinButton_unstable"],"mappings":";;;;;;;;;;;;eAYEA,iBAAU;;;eACVC,gCAAyB;;;eACzBC,2BAAoB;;;eAEpBE,iCAA0B;;;eAD1BD,mCAA4B;;;eAE5BE,6BAAsB;;;uBACjB,gCAAgC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SpinButton/SpinButton.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities';\nimport * as React from 'react';\n\nexport type SpinButtonSlots = {\n /**\n * The root element of SpinButton is a container `<div>`.\n * The root slot receives the `className` and `style` specified on the `<SpinButton>`.\n * All other native props are applied to the primary slot: `input`.\n */\n root: NonNullable<Slot<'span'>>;\n\n /**\n * Input that displays the current value and accepts direct input from the user.\n * Displayed value is formatted.\n *\n * This is the primary slot.\n */\n input: NonNullable<Slot<'input'>>;\n\n /**\n * Renders the increment control.\n */\n incrementButton: NonNullable<Slot<'button'>>;\n\n /**\n * Renders the decrement control.\n */\n decrementButton: NonNullable<Slot<'button'>>;\n};\n\n/**\n * SpinButton Props\n */\nexport type SpinButtonProps = Omit<\n ComponentProps<Partial<SpinButtonSlots>, 'input'>,\n 'defaultValue' | 'onChange' | 'size' | 'value'\n> & {\n /**\n * Controls the colors and borders of the input.\n * @default 'outline'\n */\n appearance?: 'outline' | 'underline' | 'filled-darker' | 'filled-lighter';\n\n /**\n * Initial value of the control (assumed to be valid). Updates to this prop will not be respected.\n *\n * Use this if you intend for the SpinButton to be an uncontrolled component which maintains its\n * own value. For a controlled component, use `value` instead. (Mutually exclusive with `value`.)\n *\n * Use `null` to indicate the control has no value.\n */\n defaultValue?: number | null;\n\n /**\n * String representation of `value`.\n *\n * Use this when displaying the value to users as something other than a plain number.\n * For example, when displaying currency values this might be \"$1.00\" when value is `1`.\n *\n * Only provide this if the SpinButton is a controlled component where you are maintaining its\n * current state and passing updates based on change events. When SpinButton is used as an\n * uncontrolled component this prop is ignored.\n */\n displayValue?: string;\n\n /**\n * Max value of the control. If not provided, the control has no maximum value.\n */\n max?: number;\n\n /**\n * Min value of the control. If not provided, the control has no minimum value.\n */\n min?: number;\n\n /**\n * Callback for when the committed value changes.\n * - User presses the up/down buttons (on single press or every spin)\n * - User presses the up/down arrow keys (on single press or every spin)\n * - User *commits* edits to the input text by focusing away (blurring) or pressing enter.\n * Note that this is NOT called for every key press while the user is editing.\n */\n // eslint-disable-next-line @nx/workspace-consistent-callback-type -- can't change type of existing callback\n onChange?: (event: SpinButtonChangeEvent, data: SpinButtonOnChangeData) => void;\n\n /**\n * How many decimal places the value should be rounded to.\n *\n * The default is calculated based on the precision of `step`: i.e. if step = 1, precision = 0.\n * step = 0.0089, precision = 4. step = 300, precision = 2. step = 23.00, precision = 2.\n */\n precision?: number;\n\n /**\n * Size of the input.\n * @default 'medium'\n */\n size?: 'small' | 'medium';\n\n /**\n * Difference between two adjacent values of the control.\n * This value is used to calculate the precision of the input if no `precision` is given.\n * The precision calculated this way will always be greater than or equal 0.\n * @default 1\n */\n step?: number;\n\n /**\n * Large difference between two values. This should be greater than `step` and is used\n * when users hit the Page Up or Page Down keys.\n * @default 1\n */\n stepPage?: number;\n\n /**\n * Current value of the control (assumed to be valid).\n *\n * Only provide this if the SpinButton is a controlled component where you are maintaining its\n * current state and passing updates based on change events; otherwise, use the `defaultValue`\n * property.\n *\n * Use `null` to indicate the control has no value.\n *\n * Mutually exclusive with `defaultValue`.\n */\n value?: number | null;\n};\n\n/**\n * State used in rendering SpinButton\n */\nexport type SpinButtonState = ComponentState<SpinButtonSlots> &\n Required<Pick<SpinButtonProps, 'appearance' | 'size'>> & {\n /**\n * State used to track which direction, if any, SpinButton is currently spinning.\n * @default 'rest'\n */\n spinState: SpinButtonSpinState;\n\n /**\n * State used to track if the value is at the range bounds of [min-max].\n * @default 'none'\n */\n atBound: SpinButtonBounds;\n };\n\nexport type SpinButtonChangeEvent =\n | React.MouseEvent<HTMLButtonElement>\n | React.ChangeEvent<HTMLElement>\n | React.FocusEvent<HTMLInputElement>\n | React.KeyboardEvent<HTMLInputElement>;\n\nexport type SpinButtonOnChangeData = {\n value?: number | null;\n displayValue?: string;\n};\n\nexport type SpinButtonSpinState = 'rest' | 'up' | 'down';\nexport type SpinButtonBounds = 'none' | 'min' | 'max' | 'both';\n"],"names":["React"],"mappings":";;;;;iEACuB,QAAQ"}
|
|
1
|
+
{"version":3,"sources":["../src/components/SpinButton/SpinButton.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, DistributiveOmit, Slot } from '@fluentui/react-utilities';\nimport * as React from 'react';\n\nexport type SpinButtonSlots = {\n /**\n * The root element of SpinButton is a container `<div>`.\n * The root slot receives the `className` and `style` specified on the `<SpinButton>`.\n * All other native props are applied to the primary slot: `input`.\n */\n root: NonNullable<Slot<'span'>>;\n\n /**\n * Input that displays the current value and accepts direct input from the user.\n * Displayed value is formatted.\n *\n * This is the primary slot.\n */\n input: NonNullable<Slot<'input'>>;\n\n /**\n * Renders the increment control.\n */\n incrementButton: NonNullable<Slot<'button'>>;\n\n /**\n * Renders the decrement control.\n */\n decrementButton: NonNullable<Slot<'button'>>;\n};\n\n/**\n * SpinButton Props\n */\nexport type SpinButtonProps = Omit<\n ComponentProps<Partial<SpinButtonSlots>, 'input'>,\n 'defaultValue' | 'onChange' | 'size' | 'value'\n> & {\n /**\n * Controls the colors and borders of the input.\n * @default 'outline'\n */\n appearance?: 'outline' | 'underline' | 'filled-darker' | 'filled-lighter';\n\n /**\n * Initial value of the control (assumed to be valid). Updates to this prop will not be respected.\n *\n * Use this if you intend for the SpinButton to be an uncontrolled component which maintains its\n * own value. For a controlled component, use `value` instead. (Mutually exclusive with `value`.)\n *\n * Use `null` to indicate the control has no value.\n */\n defaultValue?: number | null;\n\n /**\n * String representation of `value`.\n *\n * Use this when displaying the value to users as something other than a plain number.\n * For example, when displaying currency values this might be \"$1.00\" when value is `1`.\n *\n * Only provide this if the SpinButton is a controlled component where you are maintaining its\n * current state and passing updates based on change events. When SpinButton is used as an\n * uncontrolled component this prop is ignored.\n */\n displayValue?: string;\n\n /**\n * Max value of the control. If not provided, the control has no maximum value.\n */\n max?: number;\n\n /**\n * Min value of the control. If not provided, the control has no minimum value.\n */\n min?: number;\n\n /**\n * Callback for when the committed value changes.\n * - User presses the up/down buttons (on single press or every spin)\n * - User presses the up/down arrow keys (on single press or every spin)\n * - User *commits* edits to the input text by focusing away (blurring) or pressing enter.\n * Note that this is NOT called for every key press while the user is editing.\n */\n // eslint-disable-next-line @nx/workspace-consistent-callback-type -- can't change type of existing callback\n onChange?: (event: SpinButtonChangeEvent, data: SpinButtonOnChangeData) => void;\n\n /**\n * How many decimal places the value should be rounded to.\n *\n * The default is calculated based on the precision of `step`: i.e. if step = 1, precision = 0.\n * step = 0.0089, precision = 4. step = 300, precision = 2. step = 23.00, precision = 2.\n */\n precision?: number;\n\n /**\n * Size of the input.\n * @default 'medium'\n */\n size?: 'small' | 'medium';\n\n /**\n * Difference between two adjacent values of the control.\n * This value is used to calculate the precision of the input if no `precision` is given.\n * The precision calculated this way will always be greater than or equal 0.\n * @default 1\n */\n step?: number;\n\n /**\n * Large difference between two values. This should be greater than `step` and is used\n * when users hit the Page Up or Page Down keys.\n * @default 1\n */\n stepPage?: number;\n\n /**\n * Current value of the control (assumed to be valid).\n *\n * Only provide this if the SpinButton is a controlled component where you are maintaining its\n * current state and passing updates based on change events; otherwise, use the `defaultValue`\n * property.\n *\n * Use `null` to indicate the control has no value.\n *\n * Mutually exclusive with `defaultValue`.\n */\n value?: number | null;\n};\n\n/**\n * State used in rendering SpinButton\n */\nexport type SpinButtonState = ComponentState<SpinButtonSlots> &\n Required<Pick<SpinButtonProps, 'appearance' | 'size'>> & {\n /**\n * State used to track which direction, if any, SpinButton is currently spinning.\n * @default 'rest'\n */\n spinState: SpinButtonSpinState;\n\n /**\n * State used to track if the value is at the range bounds of [min-max].\n * @default 'none'\n */\n atBound: SpinButtonBounds;\n };\n\nexport type SpinButtonChangeEvent =\n | React.MouseEvent<HTMLButtonElement>\n | React.ChangeEvent<HTMLElement>\n | React.FocusEvent<HTMLInputElement>\n | React.KeyboardEvent<HTMLInputElement>;\n\nexport type SpinButtonOnChangeData = {\n value?: number | null;\n displayValue?: string;\n};\n\nexport type SpinButtonSpinState = 'rest' | 'up' | 'down';\nexport type SpinButtonBounds = 'none' | 'min' | 'max' | 'both';\n\nexport type SpinButtonBaseProps = DistributiveOmit<SpinButtonProps, 'appearance' | 'size'>;\nexport type SpinButtonBaseState = DistributiveOmit<SpinButtonState, 'appearance' | 'size'>;\n"],"names":["React"],"mappings":";;;;;iEACuB,QAAQ"}
|
|
@@ -18,6 +18,9 @@ _export(exports, {
|
|
|
18
18
|
spinButtonClassNames: function() {
|
|
19
19
|
return _useSpinButtonStylesstyles.spinButtonClassNames;
|
|
20
20
|
},
|
|
21
|
+
useSpinButtonBase_unstable: function() {
|
|
22
|
+
return _useSpinButton.useSpinButtonBase_unstable;
|
|
23
|
+
},
|
|
21
24
|
useSpinButtonStyles_unstable: function() {
|
|
22
25
|
return _useSpinButtonStylesstyles.useSpinButtonStyles_unstable;
|
|
23
26
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SpinButton/index.ts"],"sourcesContent":["export { SpinButton } from './SpinButton';\nexport type {\n SpinButtonBounds,\n SpinButtonChangeEvent,\n SpinButtonOnChangeData,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonSpinState,\n SpinButtonState,\n} from './SpinButton.types';\nexport { renderSpinButton_unstable } from './renderSpinButton';\nexport { useSpinButton_unstable } from './useSpinButton';\nexport { spinButtonClassNames, useSpinButtonStyles_unstable } from './useSpinButtonStyles.styles';\n"],"names":["SpinButton","renderSpinButton_unstable","useSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable"],"mappings":";;;;;;;;;;;;eAASA,sBAAU;;;
|
|
1
|
+
{"version":3,"sources":["../src/components/SpinButton/index.ts"],"sourcesContent":["export { SpinButton } from './SpinButton';\nexport type {\n SpinButtonBaseProps,\n SpinButtonBaseState,\n SpinButtonBounds,\n SpinButtonChangeEvent,\n SpinButtonOnChangeData,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonSpinState,\n SpinButtonState,\n} from './SpinButton.types';\nexport { renderSpinButton_unstable } from './renderSpinButton';\nexport { useSpinButtonBase_unstable, useSpinButton_unstable } from './useSpinButton';\nexport { spinButtonClassNames, useSpinButtonStyles_unstable } from './useSpinButtonStyles.styles';\n"],"names":["SpinButton","renderSpinButton_unstable","useSpinButtonBase_unstable","useSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable"],"mappings":";;;;;;;;;;;;eAASA,sBAAU;;;eAYVC,2CAAyB;;;eAEzBG,+CAAoB;;;eADpBF,yCAA0B;;;eACJG,uDAA4B;;;eADtBF,qCAAsB;;;4BAbhC,eAAe;kCAYA,qBAAqB;+BACI,kBAAkB;2CAClB,+BAA+B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SpinButton/renderSpinButton.tsx"],"sourcesContent":["/** @jsxRuntime automatic */\n/** @jsxImportSource @fluentui/react-jsx-runtime */\n\nimport { assertSlots } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport type {
|
|
1
|
+
{"version":3,"sources":["../src/components/SpinButton/renderSpinButton.tsx"],"sourcesContent":["/** @jsxRuntime automatic */\n/** @jsxImportSource @fluentui/react-jsx-runtime */\n\nimport { assertSlots } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport type { SpinButtonBaseState, SpinButtonSlots } from './SpinButton.types';\n\n/**\n * Render the final JSX of SpinButton\n */\nexport const renderSpinButton_unstable = (state: SpinButtonBaseState): JSXElement => {\n assertSlots<SpinButtonSlots>(state);\n\n return (\n <state.root>\n <state.input />\n <state.incrementButton />\n <state.decrementButton />\n </state.root>\n );\n};\n"],"names":["assertSlots","renderSpinButton_unstable","state","root","input","incrementButton","decrementButton"],"mappings":";;;;+BAUaC;;;;;;4BATb,iCAAiD;gCAErB,4BAA4B;AAOjD,kCAAkC,CAACC;QACxCF,2BAAAA,EAA6BE;IAE7B,OAAA,WAAA,OACE,gBAAA,EAACA,MAAMC,IAAI,EAAA;;8BACT,eAAA,EAACD,MAAME,KAAK,EAAA,CAAA;8BACZ,eAAA,EAACF,MAAMG,eAAe,EAAA,CAAA;8BACtB,eAAA,EAACH,MAAMI,eAAe,EAAA,CAAA;;;AAG5B,EAAE"}
|
|
@@ -3,9 +3,17 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
function _export(target, all) {
|
|
7
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: all[name]
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
_export(exports, {
|
|
13
|
+
useSpinButtonBase_unstable: function() {
|
|
14
|
+
return useSpinButtonBase_unstable;
|
|
15
|
+
},
|
|
16
|
+
useSpinButton_unstable: function() {
|
|
9
17
|
return useSpinButton_unstable;
|
|
10
18
|
}
|
|
11
19
|
});
|
|
@@ -24,12 +32,7 @@ const MAX_SPIN_TIME_MS = 1000;
|
|
|
24
32
|
// Exact easing it to be defined. Once it is we'll likely
|
|
25
33
|
// pull this out into a util function in the SpinButton package.
|
|
26
34
|
const lerp = (start, end, percent)=>start + (end - start) * percent;
|
|
27
|
-
const
|
|
28
|
-
// Merge props from surrounding <Field>, if any
|
|
29
|
-
props = (0, _reactfield.useFieldControlProps_unstable)(props, {
|
|
30
|
-
supportsLabelFor: true,
|
|
31
|
-
supportsRequired: true
|
|
32
|
-
});
|
|
35
|
+
const useSpinButtonBase_unstable = (props, ref)=>{
|
|
33
36
|
const nativeProps = (0, _reactutilities.getPartitionedNativeProps)({
|
|
34
37
|
props,
|
|
35
38
|
primarySlotTagName: 'input',
|
|
@@ -38,13 +41,10 @@ const useSpinButton_unstable = (props, ref)=>{
|
|
|
38
41
|
'max',
|
|
39
42
|
'min',
|
|
40
43
|
'onChange',
|
|
41
|
-
'size',
|
|
42
44
|
'value'
|
|
43
45
|
]
|
|
44
46
|
});
|
|
45
|
-
const
|
|
46
|
-
var _overrides_inputDefaultAppearance;
|
|
47
|
-
const { value, displayValue, defaultValue, min, max, step = 1, stepPage = 1, precision: precisionFromProps, onChange, size = 'medium', appearance = (_overrides_inputDefaultAppearance = overrides.inputDefaultAppearance) !== null && _overrides_inputDefaultAppearance !== void 0 ? _overrides_inputDefaultAppearance : 'outline', root, input, incrementButton, decrementButton } = props;
|
|
47
|
+
const { value, displayValue, defaultValue, min, max, step = 1, stepPage = 1, precision: precisionFromProps, onChange, root, input, incrementButton, decrementButton } = props;
|
|
48
48
|
const precision = _react.useMemo(()=>{
|
|
49
49
|
return precisionFromProps !== null && precisionFromProps !== void 0 ? precisionFromProps : Math.max((0, _index.calculatePrecision)(step), 0);
|
|
50
50
|
}, [
|
|
@@ -108,6 +108,7 @@ const useSpinButton_unstable = (props, ref)=>{
|
|
|
108
108
|
if (inputRef.current) {
|
|
109
109
|
// we need to set this here using the IDL attribute directly, because otherwise the timing of the ARIA value update
|
|
110
110
|
// is not in sync with the user-entered native input value, and some screen readers end up reading the wrong value.
|
|
111
|
+
// eslint-disable-next-line react-compiler/react-compiler
|
|
111
112
|
inputRef.current.ariaValueNow = newValue;
|
|
112
113
|
}
|
|
113
114
|
};
|
|
@@ -216,8 +217,6 @@ const useSpinButton_unstable = (props, ref)=>{
|
|
|
216
217
|
}
|
|
217
218
|
}
|
|
218
219
|
const state = {
|
|
219
|
-
size,
|
|
220
|
-
appearance,
|
|
221
220
|
spinState: keyboardSpinState,
|
|
222
221
|
atBound: internalState.current.atBound,
|
|
223
222
|
components: {
|
|
@@ -234,7 +233,6 @@ const useSpinButton_unstable = (props, ref)=>{
|
|
|
234
233
|
defaultProps: {
|
|
235
234
|
autoComplete: 'off',
|
|
236
235
|
role: 'spinbutton',
|
|
237
|
-
appearance,
|
|
238
236
|
type: 'text',
|
|
239
237
|
...nativeProps.primary
|
|
240
238
|
},
|
|
@@ -243,7 +241,6 @@ const useSpinButton_unstable = (props, ref)=>{
|
|
|
243
241
|
incrementButton: _reactutilities.slot.always(incrementButton, {
|
|
244
242
|
defaultProps: {
|
|
245
243
|
tabIndex: -1,
|
|
246
|
-
children: /*#__PURE__*/ _react.createElement(_reacticons.ChevronUp16Regular, null),
|
|
247
244
|
disabled: nativeProps.primary.readOnly || nativeProps.primary.disabled || internalState.current.atBound === 'max' || internalState.current.atBound === 'both',
|
|
248
245
|
'aria-label': 'Increment value',
|
|
249
246
|
type: 'button'
|
|
@@ -253,7 +250,6 @@ const useSpinButton_unstable = (props, ref)=>{
|
|
|
253
250
|
decrementButton: _reactutilities.slot.always(decrementButton, {
|
|
254
251
|
defaultProps: {
|
|
255
252
|
tabIndex: -1,
|
|
256
|
-
children: /*#__PURE__*/ _react.createElement(_reacticons.ChevronDown16Regular, null),
|
|
257
253
|
disabled: nativeProps.primary.readOnly || nativeProps.primary.disabled || internalState.current.atBound === 'min' || internalState.current.atBound === 'both',
|
|
258
254
|
'aria-label': 'Decrement value',
|
|
259
255
|
type: 'button'
|
|
@@ -282,3 +278,24 @@ const useSpinButton_unstable = (props, ref)=>{
|
|
|
282
278
|
state.decrementButton.onMouseLeave = (0, _reactutilities.mergeCallbacks)(state.decrementButton.onMouseLeave, handleStepMouseUpOrLeave);
|
|
283
279
|
return state;
|
|
284
280
|
};
|
|
281
|
+
const useSpinButton_unstable = (props, ref)=>{
|
|
282
|
+
var _state_incrementButton, _state_decrementButton;
|
|
283
|
+
// Merge props from surrounding <Field>, if any
|
|
284
|
+
props = (0, _reactfield.useFieldControlProps_unstable)(props, {
|
|
285
|
+
supportsLabelFor: true,
|
|
286
|
+
supportsRequired: true
|
|
287
|
+
});
|
|
288
|
+
const overrides = (0, _reactsharedcontexts.useOverrides_unstable)();
|
|
289
|
+
var _overrides_inputDefaultAppearance;
|
|
290
|
+
const { appearance = (_overrides_inputDefaultAppearance = overrides.inputDefaultAppearance) !== null && _overrides_inputDefaultAppearance !== void 0 ? _overrides_inputDefaultAppearance : 'outline', size = 'medium', ...baseProps } = props;
|
|
291
|
+
const state = useSpinButtonBase_unstable(baseProps, ref);
|
|
292
|
+
var _children;
|
|
293
|
+
(_children = (_state_incrementButton = state.incrementButton).children) !== null && _children !== void 0 ? _children : _state_incrementButton.children = /*#__PURE__*/ _react.createElement(_reacticons.ChevronUp16Regular, null);
|
|
294
|
+
var _children1;
|
|
295
|
+
(_children1 = (_state_decrementButton = state.decrementButton).children) !== null && _children1 !== void 0 ? _children1 : _state_decrementButton.children = /*#__PURE__*/ _react.createElement(_reacticons.ChevronDown16Regular, null);
|
|
296
|
+
return {
|
|
297
|
+
...state,
|
|
298
|
+
appearance,
|
|
299
|
+
size
|
|
300
|
+
};
|
|
301
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SpinButton/useSpinButton.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useFieldControlProps_unstable } from '@fluentui/react-field';\nimport {\n getPartitionedNativeProps,\n mergeCallbacks,\n useControllableState,\n useTimeout,\n slot,\n useMergedRefs,\n} from '@fluentui/react-utilities';\nimport { ArrowUp, ArrowDown, End, Enter, Escape, Home, PageDown, PageUp } from '@fluentui/keyboard-keys';\nimport {\n SpinButtonProps,\n SpinButtonState,\n SpinButtonSpinState,\n SpinButtonChangeEvent,\n SpinButtonBounds,\n} from './SpinButton.types';\nimport { calculatePrecision, precisionRound, getBound, clamp } from '../../utils/index';\nimport { ChevronUp16Regular, ChevronDown16Regular } from '@fluentui/react-icons';\nimport { useOverrides_unstable as useOverrides } from '@fluentui/react-shared-contexts';\n\ntype InternalState = {\n value: number | null;\n spinState: SpinButtonSpinState;\n spinTime: number;\n spinDelay: number;\n previousTextValue?: string;\n atBound: SpinButtonBounds;\n};\n\nconst DEFAULT_SPIN_DELAY_MS = 150;\nconst MIN_SPIN_DELAY_MS = 80;\nconst MAX_SPIN_TIME_MS = 1000;\n\n// This is here to give an ease for the mouse held down case.\n// Exact easing it to be defined. Once it is we'll likely\n// pull this out into a util function in the SpinButton package.\nconst lerp = (start: number, end: number, percent: number): number => start + (end - start) * percent;\n\n/**\n * Create the state required to render SpinButton.\n *\n * The returned state can be modified with hooks such as useSpinButtonStyles_unstable,\n * before being passed to renderSpinButton_unstable.\n *\n * @param props - props from this instance of SpinButton\n * @param ref - reference to root HTMLElement of SpinButton\n */\nexport const useSpinButton_unstable = (props: SpinButtonProps, ref: React.Ref<HTMLInputElement>): SpinButtonState => {\n // Merge props from surrounding <Field>, if any\n props = useFieldControlProps_unstable(props, { supportsLabelFor: true, supportsRequired: true });\n\n const nativeProps = getPartitionedNativeProps({\n props,\n primarySlotTagName: 'input',\n excludedPropNames: ['defaultValue', 'max', 'min', 'onChange', 'size', 'value'],\n });\n\n const overrides = useOverrides();\n\n const {\n value,\n displayValue,\n defaultValue,\n min,\n max,\n step = 1,\n stepPage = 1,\n precision: precisionFromProps,\n onChange,\n size = 'medium',\n appearance = overrides.inputDefaultAppearance ?? 'outline',\n root,\n input,\n incrementButton,\n decrementButton,\n } = props;\n\n const precision = React.useMemo(() => {\n return precisionFromProps ?? Math.max(calculatePrecision(step), 0);\n }, [precisionFromProps, step]);\n\n const [currentValue, setCurrentValue] = useControllableState({\n state: value,\n defaultState: defaultValue,\n initialState: 0,\n });\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const isControlled = value !== undefined;\n\n const [textValue, setTextValue] = React.useState<string | undefined>(undefined);\n const [keyboardSpinState, setKeyboardSpinState] = React.useState<SpinButtonSpinState>('rest');\n\n const internalState = React.useRef<InternalState>({\n value: currentValue,\n spinState: 'rest',\n spinTime: 0,\n spinDelay: DEFAULT_SPIN_DELAY_MS,\n atBound: currentValue !== null ? getBound(precisionRound(currentValue, precision), min, max) : 'none',\n });\n\n const [setStepTimeout, clearStepTimeout] = useTimeout();\n\n const stepValue = (\n e: SpinButtonChangeEvent,\n direction: 'up' | 'down' | 'upPage' | 'downPage',\n startFrom?: string,\n ) => {\n let startValue = internalState.current.value;\n if (startFrom) {\n const num = parseFloat(startFrom);\n if (!isNaN(num)) {\n startValue = num;\n }\n }\n const val = startValue;\n const dir = direction === 'up' || direction === 'upPage' ? 1 : -1;\n const stepSize = direction === 'upPage' || direction === 'downPage' ? stepPage : step;\n\n if (val === null) {\n const stepStart = min === undefined ? 0 : min;\n const nullStep = clamp(stepStart + stepSize * dir, min, max);\n commit(e, nullStep);\n return;\n }\n\n let newValue = val + stepSize * dir;\n if (!Number.isNaN(newValue)) {\n newValue = clamp(newValue, min, max);\n }\n\n commit(e, newValue);\n\n if (internalState.current.spinState !== 'rest') {\n setStepTimeout(() => {\n // Ease the step speed a bit\n internalState.current.spinTime += internalState.current.spinDelay;\n internalState.current.spinDelay = lerp(\n DEFAULT_SPIN_DELAY_MS,\n MIN_SPIN_DELAY_MS,\n internalState.current.spinTime / MAX_SPIN_TIME_MS,\n );\n stepValue(e, direction);\n }, internalState.current.spinDelay);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!internalState.current.previousTextValue) {\n internalState.current.previousTextValue = textValue ?? String(currentValue);\n }\n const newValue = e.target.value;\n setTextValue(newValue);\n if (inputRef.current) {\n // we need to set this here using the IDL attribute directly, because otherwise the timing of the ARIA value update\n // is not in sync with the user-entered native input value, and some screen readers end up reading the wrong value.\n inputRef.current.ariaValueNow = newValue;\n }\n };\n\n const handleIncrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.spinState = 'up';\n stepValue(e, 'up');\n };\n\n const handleDecrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.spinState = 'down';\n stepValue(e, 'down');\n };\n\n const handleStepMouseUpOrLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n clearStepTimeout();\n internalState.current.spinState = 'rest';\n internalState.current.spinDelay = DEFAULT_SPIN_DELAY_MS;\n internalState.current.spinTime = 0;\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.previousTextValue = undefined;\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n let nextKeyboardSpinState: SpinButtonSpinState = 'rest';\n\n if (e.currentTarget.readOnly) {\n return;\n }\n\n if (e.key === ArrowUp) {\n stepValue(e, 'up', textValue);\n nextKeyboardSpinState = 'up';\n } else if (e.key === ArrowDown) {\n stepValue(e, 'down', textValue);\n nextKeyboardSpinState = 'down';\n } else if (e.key === PageUp) {\n e.preventDefault();\n stepValue(e, 'upPage', textValue);\n nextKeyboardSpinState = 'up';\n } else if (e.key === PageDown) {\n e.preventDefault();\n stepValue(e, 'downPage', textValue);\n nextKeyboardSpinState = 'down';\n } else if (!e.shiftKey && e.key === Home && min !== undefined) {\n commit(e, min);\n nextKeyboardSpinState = 'down';\n } else if (!e.shiftKey && e.key === End && max !== undefined) {\n commit(e, max);\n nextKeyboardSpinState = 'up';\n } else if (e.key === Enter) {\n commit(e, currentValue, textValue);\n internalState.current.previousTextValue = undefined;\n } else if (e.key === Escape) {\n if (internalState.current.previousTextValue) {\n setTextValue(undefined);\n internalState.current.previousTextValue = undefined;\n }\n }\n\n if (keyboardSpinState !== nextKeyboardSpinState) {\n setKeyboardSpinState(nextKeyboardSpinState);\n }\n };\n\n const handleKeyUp = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (keyboardSpinState !== 'rest') {\n setKeyboardSpinState('rest');\n internalState.current.spinState = 'rest';\n }\n };\n\n const commit = (e: SpinButtonChangeEvent, newValue?: number | null, newDisplayValue?: string) => {\n const valueChanged = newValue !== undefined && currentValue !== newValue;\n const displayValueChanged =\n newDisplayValue !== undefined &&\n internalState.current.previousTextValue !== undefined &&\n internalState.current.previousTextValue !== newDisplayValue;\n\n let roundedValue;\n if (valueChanged) {\n roundedValue = precisionRound(newValue!, precision);\n setCurrentValue(roundedValue);\n internalState.current.value = roundedValue;\n } else if (displayValueChanged && !isControlled) {\n const nextValue = parseFloat(newDisplayValue as string);\n if (!isNaN(nextValue)) {\n setCurrentValue(precisionRound(nextValue, precision));\n internalState.current.value = precisionRound(nextValue, precision);\n }\n }\n\n if (valueChanged || displayValueChanged) {\n onChange?.(e, { value: roundedValue, displayValue: newDisplayValue });\n }\n\n setTextValue(undefined);\n };\n\n let valueToDisplay;\n if (textValue !== undefined) {\n valueToDisplay = textValue;\n } else if (value === null || currentValue === null) {\n valueToDisplay = displayValue ?? '';\n internalState.current.value = null;\n internalState.current.atBound = 'none';\n } else {\n const roundedValue = precisionRound(currentValue, precision);\n internalState.current.value = roundedValue;\n internalState.current.atBound = getBound(roundedValue, min, max);\n if (isControlled) {\n valueToDisplay = displayValue ?? String(roundedValue);\n } else {\n valueToDisplay = String(roundedValue);\n }\n }\n\n const state: SpinButtonState = {\n size,\n appearance,\n spinState: keyboardSpinState,\n atBound: internalState.current.atBound,\n\n components: {\n root: 'span',\n input: 'input',\n incrementButton: 'button',\n decrementButton: 'button',\n },\n root: slot.always(root, {\n defaultProps: nativeProps.root,\n elementType: 'span',\n }),\n input: slot.always(input, {\n defaultProps: {\n autoComplete: 'off',\n role: 'spinbutton',\n appearance,\n type: 'text',\n ...nativeProps.primary,\n },\n elementType: 'input',\n }),\n incrementButton: slot.always(incrementButton, {\n defaultProps: {\n tabIndex: -1,\n children: <ChevronUp16Regular />,\n disabled:\n nativeProps.primary.readOnly ||\n nativeProps.primary.disabled ||\n internalState.current.atBound === 'max' ||\n internalState.current.atBound === 'both',\n 'aria-label': 'Increment value',\n type: 'button',\n },\n elementType: 'button',\n }),\n decrementButton: slot.always(decrementButton, {\n defaultProps: {\n tabIndex: -1,\n children: <ChevronDown16Regular />,\n disabled:\n nativeProps.primary.readOnly ||\n nativeProps.primary.disabled ||\n internalState.current.atBound === 'min' ||\n internalState.current.atBound === 'both',\n 'aria-label': 'Decrement value',\n type: 'button',\n },\n elementType: 'button',\n }),\n };\n\n state.input.value = valueToDisplay;\n state.input.ref = useMergedRefs(inputRef, ref);\n state.input['aria-valuemin'] = min;\n state.input['aria-valuemax'] = max;\n state.input['aria-valuenow'] = internalState.current.value ?? undefined;\n state.input['aria-valuetext'] = state.input['aria-valuetext'] ?? ((value !== undefined && displayValue) || undefined);\n state.input.onChange = mergeCallbacks(state.input.onChange, handleInputChange);\n state.input.onInput = mergeCallbacks(state.input.onInput, handleInputChange);\n state.input.onBlur = mergeCallbacks(state.input.onBlur, handleBlur);\n state.input.onKeyDown = mergeCallbacks(state.input.onKeyDown, handleKeyDown);\n state.input.onKeyUp = mergeCallbacks(state.input.onKeyUp, handleKeyUp);\n\n state.incrementButton.onMouseDown = mergeCallbacks(handleIncrementMouseDown, state.incrementButton.onMouseDown);\n state.incrementButton.onMouseUp = mergeCallbacks(state.incrementButton.onMouseUp, handleStepMouseUpOrLeave);\n state.incrementButton.onMouseLeave = mergeCallbacks(state.incrementButton.onMouseLeave, handleStepMouseUpOrLeave);\n\n state.decrementButton.onMouseDown = mergeCallbacks(handleDecrementMouseDown, state.decrementButton.onMouseDown);\n state.decrementButton.onMouseUp = mergeCallbacks(state.decrementButton.onMouseUp, handleStepMouseUpOrLeave);\n state.decrementButton.onMouseLeave = mergeCallbacks(state.decrementButton.onMouseLeave, handleStepMouseUpOrLeave);\n\n return state;\n};\n"],"names":["React","useFieldControlProps_unstable","getPartitionedNativeProps","mergeCallbacks","useControllableState","useTimeout","slot","useMergedRefs","ArrowUp","ArrowDown","End","Enter","Escape","Home","PageDown","PageUp","calculatePrecision","precisionRound","getBound","clamp","ChevronUp16Regular","ChevronDown16Regular","useOverrides_unstable","useOverrides","DEFAULT_SPIN_DELAY_MS","MIN_SPIN_DELAY_MS","MAX_SPIN_TIME_MS","lerp","start","end","percent","useSpinButton_unstable","props","ref","supportsLabelFor","supportsRequired","nativeProps","primarySlotTagName","excludedPropNames","overrides","value","displayValue","defaultValue","min","max","step","stepPage","precision","precisionFromProps","onChange","size","appearance","inputDefaultAppearance","root","input","incrementButton","decrementButton","useMemo","Math","currentValue","setCurrentValue","state","defaultState","initialState","inputRef","useRef","isControlled","undefined","textValue","setTextValue","useState","keyboardSpinState","setKeyboardSpinState","internalState","spinState","spinTime","spinDelay","atBound","setStepTimeout","clearStepTimeout","stepValue","e","direction","startFrom","startValue","current","num","parseFloat","isNaN","val","dir","stepSize","stepStart","nullStep","commit","newValue","Number","handleInputChange","previousTextValue","String","target","ariaValueNow","handleIncrementMouseDown","handleDecrementMouseDown","handleStepMouseUpOrLeave","handleBlur","handleKeyDown","nextKeyboardSpinState","currentTarget","readOnly","key","preventDefault","shiftKey","handleKeyUp","newDisplayValue","valueChanged","displayValueChanged","roundedValue","nextValue","valueToDisplay","components","always","defaultProps","elementType","autoComplete","role","type","primary","tabIndex","children","disabled","onInput","onBlur","onKeyDown","onKeyUp","onMouseDown","onMouseUp","onMouseLeave"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/components/SpinButton/useSpinButton.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useFieldControlProps_unstable } from '@fluentui/react-field';\nimport {\n getPartitionedNativeProps,\n mergeCallbacks,\n useControllableState,\n useTimeout,\n slot,\n useMergedRefs,\n} from '@fluentui/react-utilities';\nimport { ArrowUp, ArrowDown, End, Enter, Escape, Home, PageDown, PageUp } from '@fluentui/keyboard-keys';\nimport {\n SpinButtonBaseProps,\n SpinButtonBaseState,\n SpinButtonProps,\n SpinButtonState,\n SpinButtonSpinState,\n SpinButtonChangeEvent,\n SpinButtonBounds,\n} from './SpinButton.types';\nimport { calculatePrecision, precisionRound, getBound, clamp } from '../../utils/index';\nimport { ChevronUp16Regular, ChevronDown16Regular } from '@fluentui/react-icons';\nimport { useOverrides_unstable as useOverrides } from '@fluentui/react-shared-contexts';\n\ntype InternalState = {\n value: number | null;\n spinState: SpinButtonSpinState;\n spinTime: number;\n spinDelay: number;\n previousTextValue?: string;\n atBound: SpinButtonBounds;\n};\n\nconst DEFAULT_SPIN_DELAY_MS = 150;\nconst MIN_SPIN_DELAY_MS = 80;\nconst MAX_SPIN_TIME_MS = 1000;\n\n// This is here to give an ease for the mouse held down case.\n// Exact easing it to be defined. Once it is we'll likely\n// pull this out into a util function in the SpinButton package.\nconst lerp = (start: number, end: number, percent: number): number => start + (end - start) * percent;\n\n/**\n * Create the base state required to render SpinButton without design-specific props.\n *\n * @param props - props from this instance of SpinButton (without appearance/size)\n * @param ref - reference to root HTMLElement of SpinButton\n */\nexport const useSpinButtonBase_unstable = (\n props: SpinButtonBaseProps,\n ref: React.Ref<HTMLInputElement>,\n): SpinButtonBaseState => {\n const nativeProps = getPartitionedNativeProps({\n props,\n primarySlotTagName: 'input',\n excludedPropNames: ['defaultValue', 'max', 'min', 'onChange', 'value'],\n });\n\n const {\n value,\n displayValue,\n defaultValue,\n min,\n max,\n step = 1,\n stepPage = 1,\n precision: precisionFromProps,\n onChange,\n root,\n input,\n incrementButton,\n decrementButton,\n } = props;\n\n const precision = React.useMemo(() => {\n return precisionFromProps ?? Math.max(calculatePrecision(step), 0);\n }, [precisionFromProps, step]);\n\n const [currentValue, setCurrentValue] = useControllableState({\n state: value,\n defaultState: defaultValue,\n initialState: 0,\n });\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const isControlled = value !== undefined;\n\n const [textValue, setTextValue] = React.useState<string | undefined>(undefined);\n const [keyboardSpinState, setKeyboardSpinState] = React.useState<SpinButtonSpinState>('rest');\n\n const internalState = React.useRef<InternalState>({\n value: currentValue,\n spinState: 'rest',\n spinTime: 0,\n spinDelay: DEFAULT_SPIN_DELAY_MS,\n atBound: currentValue !== null ? getBound(precisionRound(currentValue, precision), min, max) : 'none',\n });\n\n const [setStepTimeout, clearStepTimeout] = useTimeout();\n\n const stepValue = (\n e: SpinButtonChangeEvent,\n direction: 'up' | 'down' | 'upPage' | 'downPage',\n startFrom?: string,\n ) => {\n let startValue = internalState.current.value;\n if (startFrom) {\n const num = parseFloat(startFrom);\n if (!isNaN(num)) {\n startValue = num;\n }\n }\n const val = startValue;\n const dir = direction === 'up' || direction === 'upPage' ? 1 : -1;\n const stepSize = direction === 'upPage' || direction === 'downPage' ? stepPage : step;\n\n if (val === null) {\n const stepStart = min === undefined ? 0 : min;\n const nullStep = clamp(stepStart + stepSize * dir, min, max);\n commit(e, nullStep);\n return;\n }\n\n let newValue = val + stepSize * dir;\n if (!Number.isNaN(newValue)) {\n newValue = clamp(newValue, min, max);\n }\n\n commit(e, newValue);\n\n if (internalState.current.spinState !== 'rest') {\n setStepTimeout(() => {\n // Ease the step speed a bit\n internalState.current.spinTime += internalState.current.spinDelay;\n internalState.current.spinDelay = lerp(\n DEFAULT_SPIN_DELAY_MS,\n MIN_SPIN_DELAY_MS,\n internalState.current.spinTime / MAX_SPIN_TIME_MS,\n );\n stepValue(e, direction);\n }, internalState.current.spinDelay);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!internalState.current.previousTextValue) {\n internalState.current.previousTextValue = textValue ?? String(currentValue);\n }\n const newValue = e.target.value;\n setTextValue(newValue);\n if (inputRef.current) {\n // we need to set this here using the IDL attribute directly, because otherwise the timing of the ARIA value update\n // is not in sync with the user-entered native input value, and some screen readers end up reading the wrong value.\n // eslint-disable-next-line react-compiler/react-compiler\n inputRef.current.ariaValueNow = newValue;\n }\n };\n\n const handleIncrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.spinState = 'up';\n stepValue(e, 'up');\n };\n\n const handleDecrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.spinState = 'down';\n stepValue(e, 'down');\n };\n\n const handleStepMouseUpOrLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n clearStepTimeout();\n internalState.current.spinState = 'rest';\n internalState.current.spinDelay = DEFAULT_SPIN_DELAY_MS;\n internalState.current.spinTime = 0;\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n commit(e, currentValue, textValue);\n internalState.current.previousTextValue = undefined;\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n let nextKeyboardSpinState: SpinButtonSpinState = 'rest';\n\n if (e.currentTarget.readOnly) {\n return;\n }\n\n if (e.key === ArrowUp) {\n stepValue(e, 'up', textValue);\n nextKeyboardSpinState = 'up';\n } else if (e.key === ArrowDown) {\n stepValue(e, 'down', textValue);\n nextKeyboardSpinState = 'down';\n } else if (e.key === PageUp) {\n e.preventDefault();\n stepValue(e, 'upPage', textValue);\n nextKeyboardSpinState = 'up';\n } else if (e.key === PageDown) {\n e.preventDefault();\n stepValue(e, 'downPage', textValue);\n nextKeyboardSpinState = 'down';\n } else if (!e.shiftKey && e.key === Home && min !== undefined) {\n commit(e, min);\n nextKeyboardSpinState = 'down';\n } else if (!e.shiftKey && e.key === End && max !== undefined) {\n commit(e, max);\n nextKeyboardSpinState = 'up';\n } else if (e.key === Enter) {\n commit(e, currentValue, textValue);\n internalState.current.previousTextValue = undefined;\n } else if (e.key === Escape) {\n if (internalState.current.previousTextValue) {\n setTextValue(undefined);\n internalState.current.previousTextValue = undefined;\n }\n }\n\n if (keyboardSpinState !== nextKeyboardSpinState) {\n setKeyboardSpinState(nextKeyboardSpinState);\n }\n };\n\n const handleKeyUp = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (keyboardSpinState !== 'rest') {\n setKeyboardSpinState('rest');\n internalState.current.spinState = 'rest';\n }\n };\n\n const commit = (e: SpinButtonChangeEvent, newValue?: number | null, newDisplayValue?: string) => {\n const valueChanged = newValue !== undefined && currentValue !== newValue;\n const displayValueChanged =\n newDisplayValue !== undefined &&\n internalState.current.previousTextValue !== undefined &&\n internalState.current.previousTextValue !== newDisplayValue;\n\n let roundedValue;\n if (valueChanged) {\n roundedValue = precisionRound(newValue!, precision);\n setCurrentValue(roundedValue);\n internalState.current.value = roundedValue;\n } else if (displayValueChanged && !isControlled) {\n const nextValue = parseFloat(newDisplayValue as string);\n if (!isNaN(nextValue)) {\n setCurrentValue(precisionRound(nextValue, precision));\n internalState.current.value = precisionRound(nextValue, precision);\n }\n }\n\n if (valueChanged || displayValueChanged) {\n onChange?.(e, { value: roundedValue, displayValue: newDisplayValue });\n }\n\n setTextValue(undefined);\n };\n\n let valueToDisplay;\n if (textValue !== undefined) {\n valueToDisplay = textValue;\n } else if (value === null || currentValue === null) {\n valueToDisplay = displayValue ?? '';\n internalState.current.value = null;\n internalState.current.atBound = 'none';\n } else {\n const roundedValue = precisionRound(currentValue, precision);\n internalState.current.value = roundedValue;\n internalState.current.atBound = getBound(roundedValue, min, max);\n if (isControlled) {\n valueToDisplay = displayValue ?? String(roundedValue);\n } else {\n valueToDisplay = String(roundedValue);\n }\n }\n\n const state: SpinButtonBaseState = {\n spinState: keyboardSpinState,\n atBound: internalState.current.atBound,\n\n components: {\n root: 'span',\n input: 'input',\n incrementButton: 'button',\n decrementButton: 'button',\n },\n root: slot.always(root, {\n defaultProps: nativeProps.root,\n elementType: 'span',\n }),\n input: slot.always(input, {\n defaultProps: {\n autoComplete: 'off',\n role: 'spinbutton',\n type: 'text',\n ...nativeProps.primary,\n },\n elementType: 'input',\n }),\n incrementButton: slot.always(incrementButton, {\n defaultProps: {\n tabIndex: -1,\n disabled:\n nativeProps.primary.readOnly ||\n nativeProps.primary.disabled ||\n internalState.current.atBound === 'max' ||\n internalState.current.atBound === 'both',\n 'aria-label': 'Increment value',\n type: 'button',\n },\n elementType: 'button',\n }),\n decrementButton: slot.always(decrementButton, {\n defaultProps: {\n tabIndex: -1,\n disabled:\n nativeProps.primary.readOnly ||\n nativeProps.primary.disabled ||\n internalState.current.atBound === 'min' ||\n internalState.current.atBound === 'both',\n 'aria-label': 'Decrement value',\n type: 'button',\n },\n elementType: 'button',\n }),\n };\n\n state.input.value = valueToDisplay;\n state.input.ref = useMergedRefs(inputRef, ref);\n state.input['aria-valuemin'] = min;\n state.input['aria-valuemax'] = max;\n state.input['aria-valuenow'] = internalState.current.value ?? undefined;\n state.input['aria-valuetext'] = state.input['aria-valuetext'] ?? ((value !== undefined && displayValue) || undefined);\n state.input.onChange = mergeCallbacks(state.input.onChange, handleInputChange);\n state.input.onInput = mergeCallbacks(state.input.onInput, handleInputChange);\n state.input.onBlur = mergeCallbacks(state.input.onBlur, handleBlur);\n state.input.onKeyDown = mergeCallbacks(state.input.onKeyDown, handleKeyDown);\n state.input.onKeyUp = mergeCallbacks(state.input.onKeyUp, handleKeyUp);\n\n state.incrementButton.onMouseDown = mergeCallbacks(handleIncrementMouseDown, state.incrementButton.onMouseDown);\n state.incrementButton.onMouseUp = mergeCallbacks(state.incrementButton.onMouseUp, handleStepMouseUpOrLeave);\n state.incrementButton.onMouseLeave = mergeCallbacks(state.incrementButton.onMouseLeave, handleStepMouseUpOrLeave);\n\n state.decrementButton.onMouseDown = mergeCallbacks(handleDecrementMouseDown, state.decrementButton.onMouseDown);\n state.decrementButton.onMouseUp = mergeCallbacks(state.decrementButton.onMouseUp, handleStepMouseUpOrLeave);\n state.decrementButton.onMouseLeave = mergeCallbacks(state.decrementButton.onMouseLeave, handleStepMouseUpOrLeave);\n\n return state;\n};\n\n/**\n * Create the state required to render SpinButton.\n *\n * The returned state can be modified with hooks such as useSpinButtonStyles_unstable,\n * before being passed to renderSpinButton_unstable.\n *\n * @param props - props from this instance of SpinButton\n * @param ref - reference to root HTMLElement of SpinButton\n */\nexport const useSpinButton_unstable = (props: SpinButtonProps, ref: React.Ref<HTMLInputElement>): SpinButtonState => {\n // Merge props from surrounding <Field>, if any\n props = useFieldControlProps_unstable(props, { supportsLabelFor: true, supportsRequired: true });\n\n const overrides = useOverrides();\n\n const { appearance = overrides.inputDefaultAppearance ?? 'outline', size = 'medium', ...baseProps } = props;\n\n const state = useSpinButtonBase_unstable(baseProps, ref);\n\n state.incrementButton.children ??= <ChevronUp16Regular />;\n state.decrementButton.children ??= <ChevronDown16Regular />;\n\n return { ...state, appearance, size };\n};\n"],"names":["React","useFieldControlProps_unstable","getPartitionedNativeProps","mergeCallbacks","useControllableState","useTimeout","slot","useMergedRefs","ArrowUp","ArrowDown","End","Enter","Escape","Home","PageDown","PageUp","calculatePrecision","precisionRound","getBound","clamp","ChevronUp16Regular","ChevronDown16Regular","useOverrides_unstable","useOverrides","DEFAULT_SPIN_DELAY_MS","MIN_SPIN_DELAY_MS","MAX_SPIN_TIME_MS","lerp","start","end","percent","useSpinButtonBase_unstable","props","ref","nativeProps","primarySlotTagName","excludedPropNames","value","displayValue","defaultValue","min","max","step","stepPage","precision","precisionFromProps","onChange","root","input","incrementButton","decrementButton","useMemo","Math","currentValue","setCurrentValue","state","defaultState","initialState","inputRef","useRef","isControlled","undefined","textValue","setTextValue","useState","keyboardSpinState","setKeyboardSpinState","internalState","spinState","spinTime","spinDelay","atBound","setStepTimeout","clearStepTimeout","stepValue","e","direction","startFrom","startValue","current","num","parseFloat","isNaN","val","dir","stepSize","stepStart","nullStep","commit","newValue","Number","handleInputChange","previousTextValue","String","target","ariaValueNow","handleIncrementMouseDown","handleDecrementMouseDown","handleStepMouseUpOrLeave","handleBlur","handleKeyDown","nextKeyboardSpinState","currentTarget","readOnly","key","preventDefault","shiftKey","handleKeyUp","newDisplayValue","valueChanged","displayValueChanged","roundedValue","nextValue","valueToDisplay","components","always","defaultProps","elementType","autoComplete","role","type","primary","tabIndex","disabled","onInput","onBlur","onKeyDown","onKeyUp","onMouseDown","onMouseUp","onMouseLeave","useSpinButton_unstable","supportsLabelFor","supportsRequired","overrides","appearance","inputDefaultAppearance","size","baseProps","children"],"mappings":"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"}
|
package/lib-commonjs/index.js
CHANGED
|
@@ -18,6 +18,9 @@ _export(exports, {
|
|
|
18
18
|
spinButtonClassNames: function() {
|
|
19
19
|
return _SpinButton.spinButtonClassNames;
|
|
20
20
|
},
|
|
21
|
+
useSpinButtonBase_unstable: function() {
|
|
22
|
+
return _SpinButton.useSpinButtonBase_unstable;
|
|
23
|
+
},
|
|
21
24
|
useSpinButtonStyles_unstable: function() {
|
|
22
25
|
return _SpinButton.useSpinButtonStyles_unstable;
|
|
23
26
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n SpinButton,\n renderSpinButton_unstable,\n spinButtonClassNames,\n useSpinButtonStyles_unstable,\n useSpinButton_unstable,\n} from './SpinButton';\nexport type {\n SpinButtonOnChangeData,\n SpinButtonChangeEvent,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonState,\n SpinButtonSpinState,\n SpinButtonBounds,\n} from './SpinButton';\n"],"names":["SpinButton","renderSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable","useSpinButton_unstable"],"mappings":";;;;;;;;;;;;eACEA,sBAAU;;;eACVC,qCAAyB;;;eACzBC,gCAAoB;;;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n SpinButton,\n renderSpinButton_unstable,\n spinButtonClassNames,\n useSpinButtonStyles_unstable,\n useSpinButtonBase_unstable,\n useSpinButton_unstable,\n} from './SpinButton';\nexport type {\n SpinButtonBaseProps,\n SpinButtonBaseState,\n SpinButtonOnChangeData,\n SpinButtonChangeEvent,\n SpinButtonProps,\n SpinButtonSlots,\n SpinButtonState,\n SpinButtonSpinState,\n SpinButtonBounds,\n} from './SpinButton';\n"],"names":["SpinButton","renderSpinButton_unstable","spinButtonClassNames","useSpinButtonStyles_unstable","useSpinButtonBase_unstable","useSpinButton_unstable"],"mappings":";;;;;;;;;;;;eACEA,sBAAU;;;eACVC,qCAAyB;;;eACzBC,gCAAoB;;;eAEpBE,sCAA0B;;;eAD1BD,wCAA4B;;;eAE5BE,kCAAsB;;;4BACjB,eAAe"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluentui/react-spinbutton",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.6.1",
|
|
4
4
|
"description": "Fluent UI React SpinButton component.",
|
|
5
5
|
"main": "lib-commonjs/index.js",
|
|
6
6
|
"module": "lib/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@fluentui/keyboard-keys": "^9.0.8",
|
|
16
|
-
"@fluentui/react-field": "^9.
|
|
16
|
+
"@fluentui/react-field": "^9.5.0",
|
|
17
17
|
"@fluentui/react-icons": "^2.0.245",
|
|
18
18
|
"@fluentui/react-jsx-runtime": "^9.4.1",
|
|
19
19
|
"@fluentui/react-shared-contexts": "^9.26.2",
|