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.
Files changed (60) hide show
  1. package/dist/button/ToolbarButton.cjs +6 -0
  2. package/dist/button/ToolbarButton.js +1 -1
  3. package/dist/control/SliderControl.js +2 -2
  4. package/dist/decrement/NumberFieldDecrement.cjs +861 -0
  5. package/dist/decrement/NumberFieldDecrement.cjs.map +1 -0
  6. package/dist/decrement/NumberFieldDecrement.js +700 -0
  7. package/dist/decrement/NumberFieldDecrement.js.map +1 -0
  8. package/dist/fallback/AvatarFallback.cjs +2 -46
  9. package/dist/fallback/AvatarFallback.cjs.map +1 -1
  10. package/dist/fallback/AvatarFallback.js +3 -41
  11. package/dist/fallback/AvatarFallback.js.map +1 -1
  12. package/dist/group/NumberFieldGroup.cjs +72 -0
  13. package/dist/group/NumberFieldGroup.cjs.map +1 -0
  14. package/dist/group/NumberFieldGroup.js +67 -0
  15. package/dist/group/NumberFieldGroup.js.map +1 -0
  16. package/dist/increment/NumberFieldIncrement.cjs +112 -0
  17. package/dist/increment/NumberFieldIncrement.cjs.map +1 -0
  18. package/dist/increment/NumberFieldIncrement.js +107 -0
  19. package/dist/increment/NumberFieldIncrement.js.map +1 -0
  20. package/dist/index.cjs +20 -1
  21. package/dist/index.d.cts +1387 -771
  22. package/dist/index.d.cts.map +1 -1
  23. package/dist/index.d.ts +1387 -771
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +6 -3
  26. package/dist/index2.cjs +4292 -2479
  27. package/dist/index2.cjs.map +1 -1
  28. package/dist/index2.js +4155 -2408
  29. package/dist/index2.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/index.ts +3 -1
  32. package/src/number-field/decrement/NumberFieldDecrement.vue +109 -0
  33. package/src/number-field/group/NumberFieldGroup.vue +47 -0
  34. package/src/number-field/increment/NumberFieldIncrement.vue +109 -0
  35. package/src/number-field/index.ts +42 -0
  36. package/src/number-field/input/NumberFieldInput.vue +455 -0
  37. package/src/number-field/root/NumberFieldRoot.vue +626 -0
  38. package/src/number-field/root/NumberFieldRootContext.ts +94 -0
  39. package/src/number-field/root/useNumberFieldButton.ts +171 -0
  40. package/src/number-field/scrub-area/NumberFieldScrubArea.vue +359 -0
  41. package/src/number-field/scrub-area/NumberFieldScrubAreaContext.ts +26 -0
  42. package/src/number-field/scrub-area-cursor/NumberFieldScrubAreaCursor.vue +75 -0
  43. package/src/number-field/utils/constants.ts +4 -0
  44. package/src/number-field/utils/getViewportRect.ts +34 -0
  45. package/src/number-field/utils/parse.ts +248 -0
  46. package/src/number-field/utils/stateAttributesMapping.ts +9 -0
  47. package/src/number-field/utils/subscribeToVisualViewportResize.ts +27 -0
  48. package/src/number-field/utils/types.ts +24 -0
  49. package/src/number-field/utils/validate.ts +120 -0
  50. package/src/otp-field/index.ts +22 -0
  51. package/src/otp-field/input/OtpFieldInput.vue +336 -0
  52. package/src/otp-field/root/OtpFieldRoot.vue +583 -0
  53. package/src/otp-field/root/OtpFieldRootContext.ts +81 -0
  54. package/src/otp-field/utils/otp.ts +135 -0
  55. package/src/otp-field/utils/stateAttributesMapping.ts +16 -0
  56. package/src/utils/detectBrowser.ts +15 -0
  57. package/src/utils/formatNumber.ts +35 -2
  58. package/src/utils/useInterval.ts +45 -0
  59. package/src/utils/usePressAndHold.ts +260 -0
  60. package/src/utils/useValueChanged.ts +21 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "base-ui-vue",
3
3
  "type": "module",
4
- "version": "0.3.0",
4
+ "version": "0.4.0",
5
5
  "description": "Vue port of Base UI",
6
6
  "author": "vuepont",
7
7
  "license": "MIT",
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'