base-ui-vue 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/button/ToolbarButton.cjs +6 -0
- package/dist/button/ToolbarButton.js +1 -1
- package/dist/control/SliderControl.js +2 -2
- package/dist/decrement/NumberFieldDecrement.cjs +861 -0
- package/dist/decrement/NumberFieldDecrement.cjs.map +1 -0
- package/dist/decrement/NumberFieldDecrement.js +700 -0
- package/dist/decrement/NumberFieldDecrement.js.map +1 -0
- package/dist/fallback/AvatarFallback.cjs +2 -46
- package/dist/fallback/AvatarFallback.cjs.map +1 -1
- package/dist/fallback/AvatarFallback.js +3 -41
- package/dist/fallback/AvatarFallback.js.map +1 -1
- package/dist/group/NumberFieldGroup.cjs +72 -0
- package/dist/group/NumberFieldGroup.cjs.map +1 -0
- package/dist/group/NumberFieldGroup.js +67 -0
- package/dist/group/NumberFieldGroup.js.map +1 -0
- package/dist/increment/NumberFieldIncrement.cjs +112 -0
- package/dist/increment/NumberFieldIncrement.cjs.map +1 -0
- package/dist/increment/NumberFieldIncrement.js +107 -0
- package/dist/increment/NumberFieldIncrement.js.map +1 -0
- package/dist/index.cjs +20 -1
- package/dist/index.d.cts +1387 -771
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +1387 -771
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index2.cjs +4292 -2479
- package/dist/index2.cjs.map +1 -1
- package/dist/index2.js +4155 -2408
- package/dist/index2.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +3 -1
- package/src/number-field/decrement/NumberFieldDecrement.vue +109 -0
- package/src/number-field/group/NumberFieldGroup.vue +47 -0
- package/src/number-field/increment/NumberFieldIncrement.vue +109 -0
- package/src/number-field/index.ts +42 -0
- package/src/number-field/input/NumberFieldInput.vue +455 -0
- package/src/number-field/root/NumberFieldRoot.vue +626 -0
- package/src/number-field/root/NumberFieldRootContext.ts +94 -0
- package/src/number-field/root/useNumberFieldButton.ts +171 -0
- package/src/number-field/scrub-area/NumberFieldScrubArea.vue +359 -0
- package/src/number-field/scrub-area/NumberFieldScrubAreaContext.ts +26 -0
- package/src/number-field/scrub-area-cursor/NumberFieldScrubAreaCursor.vue +75 -0
- package/src/number-field/utils/constants.ts +4 -0
- package/src/number-field/utils/getViewportRect.ts +34 -0
- package/src/number-field/utils/parse.ts +248 -0
- package/src/number-field/utils/stateAttributesMapping.ts +9 -0
- package/src/number-field/utils/subscribeToVisualViewportResize.ts +27 -0
- package/src/number-field/utils/types.ts +24 -0
- package/src/number-field/utils/validate.ts +120 -0
- package/src/otp-field/index.ts +22 -0
- package/src/otp-field/input/OtpFieldInput.vue +336 -0
- package/src/otp-field/root/OtpFieldRoot.vue +583 -0
- package/src/otp-field/root/OtpFieldRootContext.ts +81 -0
- package/src/otp-field/utils/otp.ts +135 -0
- package/src/otp-field/utils/stateAttributesMapping.ts +16 -0
- package/src/utils/detectBrowser.ts +15 -0
- package/src/utils/formatNumber.ts +35 -2
- package/src/utils/useInterval.ts +45 -0
- package/src/utils/usePressAndHold.ts +260 -0
- package/src/utils/useValueChanged.ts +21 -0
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -15,11 +15,13 @@ export * from './form'
|
|
|
15
15
|
export * from './input'
|
|
16
16
|
export * from './merge-props'
|
|
17
17
|
export * from './meter'
|
|
18
|
+
export * from './number-field'
|
|
19
|
+
export * from './otp-field'
|
|
18
20
|
export * from './progress'
|
|
21
|
+
export * from './scroll-area'
|
|
19
22
|
export * from './separator'
|
|
20
23
|
export * from './slider'
|
|
21
24
|
export * from './switch'
|
|
22
|
-
export * from './scroll-area'
|
|
23
25
|
export * from './toggle'
|
|
24
26
|
export * from './toggle-group'
|
|
25
27
|
export * from './toolbar'
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { BaseUIComponentProps, NativeButtonProps } from '../../utils/types'
|
|
3
|
+
import type { NumberFieldRootState } from '../root/NumberFieldRoot.vue'
|
|
4
|
+
import { computed, useAttrs } from 'vue'
|
|
5
|
+
import { mergeProps } from '../../merge-props/mergeProps'
|
|
6
|
+
import { useButton } from '../../use-button/useButton'
|
|
7
|
+
import { useRenderElement } from '../../utils/useRenderElement'
|
|
8
|
+
import { useNumberFieldRootContext } from '../root/NumberFieldRootContext'
|
|
9
|
+
import { useNumberFieldButton } from '../root/useNumberFieldButton'
|
|
10
|
+
import { stateAttributesMapping } from '../utils/stateAttributesMapping'
|
|
11
|
+
|
|
12
|
+
export type NumberFieldDecrementState = NumberFieldRootState
|
|
13
|
+
|
|
14
|
+
export interface NumberFieldDecrementProps
|
|
15
|
+
extends NativeButtonProps, BaseUIComponentProps<NumberFieldDecrementState> {
|
|
16
|
+
disabled?: boolean
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
defineOptions({
|
|
20
|
+
name: 'NumberFieldDecrement',
|
|
21
|
+
inheritAttrs: false,
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
const props = withDefaults(defineProps<NumberFieldDecrementProps>(), {
|
|
25
|
+
as: 'button',
|
|
26
|
+
disabled: false,
|
|
27
|
+
nativeButton: true,
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const attrs = useAttrs()
|
|
31
|
+
const attrsObject = attrs as Record<string, any>
|
|
32
|
+
|
|
33
|
+
const {
|
|
34
|
+
allowInputSyncRef,
|
|
35
|
+
disabled: contextDisabled,
|
|
36
|
+
formatOptionsRef,
|
|
37
|
+
getStepAmount,
|
|
38
|
+
id,
|
|
39
|
+
incrementValue,
|
|
40
|
+
inputRef,
|
|
41
|
+
inputValue,
|
|
42
|
+
minWithDefault,
|
|
43
|
+
readOnly,
|
|
44
|
+
setValue,
|
|
45
|
+
state,
|
|
46
|
+
value,
|
|
47
|
+
valueRef,
|
|
48
|
+
locale,
|
|
49
|
+
lastChangedValueRef,
|
|
50
|
+
onValueCommitted,
|
|
51
|
+
} = useNumberFieldRootContext()
|
|
52
|
+
|
|
53
|
+
const isMin = computed(() => value.value != null && value.value <= minWithDefault.value)
|
|
54
|
+
const disabled = computed(() => props.disabled || contextDisabled.value || isMin.value)
|
|
55
|
+
|
|
56
|
+
const buttonProps = useNumberFieldButton({
|
|
57
|
+
isIncrement: false,
|
|
58
|
+
inputRef,
|
|
59
|
+
inputValue: () => inputValue.value,
|
|
60
|
+
disabled: () => disabled.value,
|
|
61
|
+
readOnly: () => readOnly.value,
|
|
62
|
+
id: () => id.value,
|
|
63
|
+
setValue,
|
|
64
|
+
getStepAmount,
|
|
65
|
+
incrementValue,
|
|
66
|
+
allowInputSyncRef,
|
|
67
|
+
formatOptionsRef,
|
|
68
|
+
valueRef,
|
|
69
|
+
locale: () => locale.value,
|
|
70
|
+
lastChangedValueRef,
|
|
71
|
+
onValueCommitted,
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
const { getButtonProps, buttonRef } = useButton({
|
|
75
|
+
disabled: () => disabled.value,
|
|
76
|
+
native: () => props.nativeButton,
|
|
77
|
+
focusableWhenDisabled: true,
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
const buttonState = computed<NumberFieldDecrementState>(() => ({
|
|
81
|
+
...state.value,
|
|
82
|
+
disabled: disabled.value,
|
|
83
|
+
}))
|
|
84
|
+
|
|
85
|
+
const combinedProps = computed(() =>
|
|
86
|
+
mergeProps(buttonProps.value, attrsObject, getButtonProps()),
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
const {
|
|
90
|
+
tag,
|
|
91
|
+
mergedProps,
|
|
92
|
+
renderless,
|
|
93
|
+
ref: renderRef,
|
|
94
|
+
} = useRenderElement({
|
|
95
|
+
componentProps: props,
|
|
96
|
+
state: buttonState,
|
|
97
|
+
props: combinedProps,
|
|
98
|
+
stateAttributesMapping,
|
|
99
|
+
defaultTagName: 'button',
|
|
100
|
+
ref: buttonRef,
|
|
101
|
+
})
|
|
102
|
+
</script>
|
|
103
|
+
|
|
104
|
+
<template>
|
|
105
|
+
<slot v-if="renderless" :ref="renderRef" :props="mergedProps" :state="buttonState" />
|
|
106
|
+
<component :is="tag" v-else :ref="renderRef" v-bind="mergedProps">
|
|
107
|
+
<slot :state="buttonState" />
|
|
108
|
+
</component>
|
|
109
|
+
</template>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { BaseUIComponentProps } from '../../utils/types'
|
|
3
|
+
import type { NumberFieldRootState } from '../root/NumberFieldRoot.vue'
|
|
4
|
+
import { computed, useAttrs } from 'vue'
|
|
5
|
+
import { mergeProps } from '../../merge-props/mergeProps'
|
|
6
|
+
import { useRenderElement } from '../../utils/useRenderElement'
|
|
7
|
+
import { useNumberFieldRootContext } from '../root/NumberFieldRootContext'
|
|
8
|
+
import { stateAttributesMapping } from '../utils/stateAttributesMapping'
|
|
9
|
+
|
|
10
|
+
export type NumberFieldGroupState = NumberFieldRootState
|
|
11
|
+
|
|
12
|
+
export interface NumberFieldGroupProps extends BaseUIComponentProps<NumberFieldGroupState> {}
|
|
13
|
+
|
|
14
|
+
defineOptions({
|
|
15
|
+
name: 'NumberFieldGroup',
|
|
16
|
+
inheritAttrs: false,
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const props = defineProps<NumberFieldGroupProps>()
|
|
20
|
+
|
|
21
|
+
const attrs = useAttrs()
|
|
22
|
+
const attrsObject = attrs as Record<string, any>
|
|
23
|
+
|
|
24
|
+
const { state } = useNumberFieldRootContext()
|
|
25
|
+
|
|
26
|
+
const groupProps = computed(() => mergeProps(attrsObject, { role: 'group' }))
|
|
27
|
+
|
|
28
|
+
const {
|
|
29
|
+
tag,
|
|
30
|
+
mergedProps,
|
|
31
|
+
renderless,
|
|
32
|
+
ref: renderRef,
|
|
33
|
+
} = useRenderElement({
|
|
34
|
+
componentProps: props,
|
|
35
|
+
state,
|
|
36
|
+
props: groupProps,
|
|
37
|
+
stateAttributesMapping,
|
|
38
|
+
defaultTagName: 'div',
|
|
39
|
+
})
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<template>
|
|
43
|
+
<slot v-if="renderless" :ref="renderRef" :props="mergedProps" :state="state" />
|
|
44
|
+
<component :is="tag" v-else :ref="renderRef" v-bind="mergedProps">
|
|
45
|
+
<slot :state="state" />
|
|
46
|
+
</component>
|
|
47
|
+
</template>
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { BaseUIComponentProps, NativeButtonProps } from '../../utils/types'
|
|
3
|
+
import type { NumberFieldRootState } from '../root/NumberFieldRoot.vue'
|
|
4
|
+
import { computed, useAttrs } from 'vue'
|
|
5
|
+
import { mergeProps } from '../../merge-props/mergeProps'
|
|
6
|
+
import { useButton } from '../../use-button/useButton'
|
|
7
|
+
import { useRenderElement } from '../../utils/useRenderElement'
|
|
8
|
+
import { useNumberFieldRootContext } from '../root/NumberFieldRootContext'
|
|
9
|
+
import { useNumberFieldButton } from '../root/useNumberFieldButton'
|
|
10
|
+
import { stateAttributesMapping } from '../utils/stateAttributesMapping'
|
|
11
|
+
|
|
12
|
+
export type NumberFieldIncrementState = NumberFieldRootState
|
|
13
|
+
|
|
14
|
+
export interface NumberFieldIncrementProps
|
|
15
|
+
extends NativeButtonProps, BaseUIComponentProps<NumberFieldIncrementState> {
|
|
16
|
+
disabled?: boolean
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
defineOptions({
|
|
20
|
+
name: 'NumberFieldIncrement',
|
|
21
|
+
inheritAttrs: false,
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
const props = withDefaults(defineProps<NumberFieldIncrementProps>(), {
|
|
25
|
+
as: 'button',
|
|
26
|
+
disabled: false,
|
|
27
|
+
nativeButton: true,
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const attrs = useAttrs()
|
|
31
|
+
const attrsObject = attrs as Record<string, any>
|
|
32
|
+
|
|
33
|
+
const {
|
|
34
|
+
allowInputSyncRef,
|
|
35
|
+
disabled: contextDisabled,
|
|
36
|
+
formatOptionsRef,
|
|
37
|
+
getStepAmount,
|
|
38
|
+
id,
|
|
39
|
+
incrementValue,
|
|
40
|
+
inputRef,
|
|
41
|
+
inputValue,
|
|
42
|
+
locale,
|
|
43
|
+
maxWithDefault,
|
|
44
|
+
readOnly,
|
|
45
|
+
setValue,
|
|
46
|
+
state,
|
|
47
|
+
value,
|
|
48
|
+
valueRef,
|
|
49
|
+
lastChangedValueRef,
|
|
50
|
+
onValueCommitted,
|
|
51
|
+
} = useNumberFieldRootContext()
|
|
52
|
+
|
|
53
|
+
const isMax = computed(() => value.value != null && value.value >= maxWithDefault.value)
|
|
54
|
+
const disabled = computed(() => props.disabled || contextDisabled.value || isMax.value)
|
|
55
|
+
|
|
56
|
+
const buttonProps = useNumberFieldButton({
|
|
57
|
+
isIncrement: true,
|
|
58
|
+
inputRef,
|
|
59
|
+
inputValue: () => inputValue.value,
|
|
60
|
+
disabled: () => disabled.value,
|
|
61
|
+
readOnly: () => readOnly.value,
|
|
62
|
+
id: () => id.value,
|
|
63
|
+
setValue,
|
|
64
|
+
getStepAmount,
|
|
65
|
+
incrementValue,
|
|
66
|
+
allowInputSyncRef,
|
|
67
|
+
formatOptionsRef,
|
|
68
|
+
valueRef,
|
|
69
|
+
locale: () => locale.value,
|
|
70
|
+
lastChangedValueRef,
|
|
71
|
+
onValueCommitted,
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
const { getButtonProps, buttonRef } = useButton({
|
|
75
|
+
disabled: () => disabled.value,
|
|
76
|
+
native: () => props.nativeButton,
|
|
77
|
+
focusableWhenDisabled: true,
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
const buttonState = computed<NumberFieldIncrementState>(() => ({
|
|
81
|
+
...state.value,
|
|
82
|
+
disabled: disabled.value,
|
|
83
|
+
}))
|
|
84
|
+
|
|
85
|
+
const combinedProps = computed(() =>
|
|
86
|
+
mergeProps(buttonProps.value, attrsObject, getButtonProps()),
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
const {
|
|
90
|
+
tag,
|
|
91
|
+
mergedProps,
|
|
92
|
+
renderless,
|
|
93
|
+
ref: renderRef,
|
|
94
|
+
} = useRenderElement({
|
|
95
|
+
componentProps: props,
|
|
96
|
+
state: buttonState,
|
|
97
|
+
props: combinedProps,
|
|
98
|
+
stateAttributesMapping,
|
|
99
|
+
defaultTagName: 'button',
|
|
100
|
+
ref: buttonRef,
|
|
101
|
+
})
|
|
102
|
+
</script>
|
|
103
|
+
|
|
104
|
+
<template>
|
|
105
|
+
<slot v-if="renderless" :ref="renderRef" :props="mergedProps" :state="buttonState" />
|
|
106
|
+
<component :is="tag" v-else :ref="renderRef" v-bind="mergedProps">
|
|
107
|
+
<slot :state="buttonState" />
|
|
108
|
+
</component>
|
|
109
|
+
</template>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export { default as NumberFieldDecrement } from './decrement/NumberFieldDecrement.vue'
|
|
2
|
+
export type { NumberFieldDecrementProps, NumberFieldDecrementState } from './decrement/NumberFieldDecrement.vue'
|
|
3
|
+
|
|
4
|
+
export { default as NumberFieldGroup } from './group/NumberFieldGroup.vue'
|
|
5
|
+
export type { NumberFieldGroupProps, NumberFieldGroupState } from './group/NumberFieldGroup.vue'
|
|
6
|
+
|
|
7
|
+
export { default as NumberFieldIncrement } from './increment/NumberFieldIncrement.vue'
|
|
8
|
+
export type { NumberFieldIncrementProps, NumberFieldIncrementState } from './increment/NumberFieldIncrement.vue'
|
|
9
|
+
|
|
10
|
+
export { default as NumberFieldInput } from './input/NumberFieldInput.vue'
|
|
11
|
+
export type { NumberFieldInputProps, NumberFieldInputState } from './input/NumberFieldInput.vue'
|
|
12
|
+
|
|
13
|
+
export { default as NumberFieldRoot } from './root/NumberFieldRoot.vue'
|
|
14
|
+
export type { NumberFieldRootProps, NumberFieldRootState } from './root/NumberFieldRoot.vue'
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
numberFieldRootContextKey,
|
|
18
|
+
useNumberFieldRootContext,
|
|
19
|
+
} from './root/NumberFieldRootContext'
|
|
20
|
+
export type {
|
|
21
|
+
InputMode,
|
|
22
|
+
NumberFieldRootChangeEventDetails,
|
|
23
|
+
NumberFieldRootChangeEventReason,
|
|
24
|
+
NumberFieldRootCommitEventDetails,
|
|
25
|
+
NumberFieldRootCommitEventReason,
|
|
26
|
+
NumberFieldRootContext,
|
|
27
|
+
} from './root/NumberFieldRootContext'
|
|
28
|
+
|
|
29
|
+
export { default as NumberFieldScrubAreaCursor } from './scrub-area-cursor/NumberFieldScrubAreaCursor.vue'
|
|
30
|
+
export type {
|
|
31
|
+
NumberFieldScrubAreaCursorProps,
|
|
32
|
+
NumberFieldScrubAreaCursorState,
|
|
33
|
+
} from './scrub-area-cursor/NumberFieldScrubAreaCursor.vue'
|
|
34
|
+
|
|
35
|
+
export { default as NumberFieldScrubArea } from './scrub-area/NumberFieldScrubArea.vue'
|
|
36
|
+
export type { NumberFieldScrubAreaProps, NumberFieldScrubAreaState } from './scrub-area/NumberFieldScrubArea.vue'
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
numberFieldScrubAreaContextKey,
|
|
40
|
+
useNumberFieldScrubAreaContext,
|
|
41
|
+
} from './scrub-area/NumberFieldScrubAreaContext'
|
|
42
|
+
export type { NumberFieldScrubAreaContext } from './scrub-area/NumberFieldScrubAreaContext'
|